@notis_ai/cli 0.2.20 → 0.2.22

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.
@@ -1,5 +1,5 @@
1
1
  // Generated by packages/cli/scripts/build-space-sdk.js for Node tests only. A Space view always uses the Notis host SDK.
2
- var __defProp=Object.defineProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};function isInteractionElementVisible(element){if(!element?.isConnected)return!1;let current=element;for(;current;){if(current.hasAttribute("hidden")||current.hasAttribute("inert")||current.getAttribute("aria-hidden")==="true")return!1;let style=current.ownerDocument.defaultView?.getComputedStyle(current);if(style?.display==="none"||style?.visibility==="hidden")return!1;let root=current.getRootNode();current=current.parentElement??("host"in root?root.host:null)}return!0}import{createContext,useCallback,useContext,useEffect,useLayoutEffect,useMemo,useRef,useState}from"react";import{Fragment,jsx,jsxs}from"react/jsx-runtime";var SHORTCUT_SCOPE_PRIORITY={app:0,route:100,collection:200,detail:300,modal:400},SHORTCUT_CONTEXT_SYMBOL=Symbol.for("notis.sdk.shortcut_context");function getShortcutContext(){let scope=globalThis;return scope[SHORTCUT_CONTEXT_SYMBOL]||(scope[SHORTCUT_CONTEXT_SYMBOL]=createContext(null)),scope[SHORTCUT_CONTEXT_SYMBOL]}var ShortcutContext=getShortcutContext(),SHORTCUT_COLLECTION_STATE_SYMBOL=Symbol.for("notis.sdk.shortcut_collection_state");function getShortcutCollectionState(){let scope=globalThis;return scope[SHORTCUT_COLLECTION_STATE_SYMBOL]||(scope[SHORTCUT_COLLECTION_STATE_SYMBOL]={activeOwnerId:null,nextOwnerId:1}),scope[SHORTCUT_COLLECTION_STATE_SYMBOL]}function createShortcutCollectionOwner(){let state=getShortcutCollectionState();return`collection-${state.nextOwnerId++}`}function releaseShortcutCollection(ownerId){let state=getShortcutCollectionState();state.activeOwnerId===ownerId&&(state.activeOwnerId=null)}function activateShortcutCollection(ownerId){getShortcutCollectionState().activeOwnerId=ownerId}function normalizeKey(key){let lower=key.trim().toLowerCase();return lower==="esc"?"escape":lower==="return"?"enter":lower==="space"?" ":lower==="arrowup"||lower==="up"?"arrowup":lower==="arrowdown"||lower==="down"?"arrowdown":lower==="arrowleft"||lower==="left"?"arrowleft":lower==="arrowright"||lower==="right"?"arrowright":lower}function parseChord(raw){let parts=raw.split("+").map(part=>part.trim()).filter(Boolean);if(parts.length===0)return null;let key="",mod=!1,shift=!1,alt=!1;for(let part of parts){let lower=part.toLowerCase();lower==="mod"||lower==="cmd"||lower==="ctrl"||lower==="meta"?mod=!0:lower==="shift"?shift=!0:lower==="alt"||lower==="option"?alt=!0:key=normalizeKey(part)}return key?{key,mod,shift,alt}:null}function parseShortcut(definition){return(Array.isArray(definition.keys)?definition.keys:[definition.keys]).flatMap(value=>{let sequence=value.trim().split(/\s+/).map(parseChord).filter(chord=>chord!==null);return sequence.length>0?[{definition,sequence}]:[]})}function chordToken(chord){return`${chord.mod?"m":"-"}${chord.shift?"s":"-"}${chord.alt?"a":"-"}:${chord.key}`}function eventChord(event){let key=normalizeKey(event.key),shift=event.shiftKey;return key==="3"&&shift&&(key="#"),(key==="#"||key==="?")&&(shift=!1),{key,mod:!!(event.metaKey||event.ctrlKey),shift,alt:event.altKey}}function isEditableShortcutEvent(event){return(event.composedPath?.()??[event.target]).some(target=>{if(!(target instanceof HTMLElement))return!1;if(target.isContentEditable||target.getAttribute("contenteditable")==="true")return!0;let tag=target.tagName;return tag==="INPUT"||tag==="TEXTAREA"||tag==="SELECT"||tag==="BUTTON"||tag==="SUMMARY"||tag==="A"&&target.hasAttribute("href")?!0:["button","link","menuitem","separator","switch","tab"].includes(target.getAttribute("role")||"")})}function matchPrefix(tokens,candidate){return tokens.length>candidate.sequence.length?!1:tokens.every((token,index)=>token===chordToken(candidate.sequence[index]))}function consumeShortcut(event,definition){definition.preventDefault!==!1&&event.preventDefault(),definition.stopPropagation!==!1&&(event.stopPropagation(),event.stopImmediatePropagation?.()),definition.onTrigger(event)}function isEmptyCollectionClear(shortcut,ownerDocument,event){if(event.key!=="Escape"||shortcut.id!=="collection.clear")return!1;let items=collectionItems(ownerDocument).filter(item=>isInteractionElementVisible(item));return items.length>0&&!items.some(item=>item.getAttribute("aria-selected")==="true")}function collectionItems(root){let items=Array.from(root.querySelectorAll("[data-notis-collection-item-id], [data-notis-row-id]"));for(let element of Array.from(root.querySelectorAll("*")))element.shadowRoot&&items.push(...collectionItems(element.shadowRoot));return items}function isDialogEvent(event){return event.composedPath().some(target=>target instanceof HTMLElement&&target.matches("dialog.notis-dialog[open]"))}function ShortcutProvider({children,isAvailable}){return useContext(ShortcutContext)?jsx(Fragment,{children}):jsx(ShortcutProviderRoot,{isAvailable,children})}var HELP_SCOPE_LABELS={modal:"Dialog",detail:"Detail",collection:"Collection",route:"This view",app:"App"},HELP_SCOPE_ORDER=["modal","detail","collection","route","app"];function applicableRegistrations(registrations){let ordered=Array.from(registrations).filter(registration=>registration.enabled&&registration.isAvailable?.()!==!1).sort((a,b)=>b.priority-a.priority||b.order-a.order),activeCollectionOwner=getShortcutCollectionState().activeOwnerId;return!!(activeCollectionOwner&&ordered.some(registration=>registration.collectionOwnerId===activeCollectionOwner))?ordered.filter(registration=>!registration.collectionOwnerId||registration.collectionOwnerId===activeCollectionOwner):ordered}var FALLBACK_REGISTRIES_SYMBOL=Symbol.for("notis.sdk.fallback_shortcut_registries");function registerFallbackShortcut(input){let scope=globalThis,registries=scope[FALLBACK_REGISTRIES_SYMBOL]??=new WeakMap,ownerDocument=document,registry=registries.get(ownerDocument);if(!registry){let registrations=new Map;registry={registrations,nextId:1,dispatch:event=>{if(event.defaultPrevented||isDialogEvent(event))return;let editable=isEditableShortcutEvent(event),token=chordToken(eventChord(event));for(let registration of applicableRegistrations(registrations.values()))for(let shortcut of registration.getShortcuts()){if(shortcut.enabled===!1||editable&&!shortcut.allowInEditable||event.repeat&&!shortcut.allowRepeat||isEmptyCollectionClear(shortcut,ownerDocument,event))continue;if(parseShortcut(shortcut).some(candidate=>candidate.sequence.length===1&&chordToken(candidate.sequence[0])===token)){consumeShortcut(event,shortcut);return}}}},registries.set(ownerDocument,registry),ownerDocument.addEventListener("keydown",registry.dispatch,!0)}let id=registry.nextId++;return registry.registrations.set(id,{...input,id,order:id}),()=>{registry.registrations.delete(id),registry.registrations.size===0&&(ownerDocument.removeEventListener("keydown",registry.dispatch,!0),registries.delete(ownerDocument))}}function shortcutToken(raw){let parsed=parseShortcut({id:"",keys:raw,onTrigger:()=>{}})[0];return parsed?parsed.sequence.map(chordToken).join(" "):null}function collectShortcutHelpEntries(registrations){let claimed=new Set,entries=[];for(let registration of applicableRegistrations(registrations))for(let shortcut of registration.getShortcuts()){if(shortcut.enabled===!1||!shortcut.label)continue;let keys=(Array.isArray(shortcut.keys)?shortcut.keys:[shortcut.keys]).filter(value=>{let token=shortcutToken(value);return!token||claimed.has(token)?!1:(claimed.add(token),!0)});keys.length>0&&entries.push({id:shortcut.id,keys,label:shortcut.label,scope:registration.scope})}return entries}function ShortcutProviderRoot({children,isAvailable}){let registrationsRef=useRef(new Map),nextIdRef=useRef(1),nextOrderRef=useRef(1),sequenceRef=useRef({chords:[],at:0}),[helpOpen,setHelpOpen]=useState(!1),helpOpenRef=useRef(!1),[,setRegistryVersion]=useState(0),availabilityRef=useRef(isAvailable),updateHelpOpen=useCallback(open=>{helpOpenRef.current=open,setHelpOpen(open)},[]);useLayoutEffect(()=>{availabilityRef.current=isAvailable,isAvailable?.()===!1&&(sequenceRef.current={chords:[],at:0},updateHelpOpen(!1))},[isAvailable,updateHelpOpen]);let register=useCallback(input=>{let id=nextIdRef.current++;return registrationsRef.current.set(id,{...input,id,order:nextOrderRef.current++}),helpOpenRef.current&&setRegistryVersion(version=>version+1),()=>{registrationsRef.current.delete(id),helpOpenRef.current&&setRegistryVersion(version=>version+1)}},[]);useEffect(()=>{let handleKeyDown=event=>{if(availabilityRef.current?.()===!1){sequenceRef.current={chords:[],at:0};return}if(event.defaultPrevented||isDialogEvent(event))return;let editable=isEditableShortcutEvent(event);if(!editable&&!event.repeat&&event.key==="?"&&!event.metaKey&&!event.ctrlKey&&!event.altKey){event.preventDefault(),event.stopPropagation(),event.stopImmediatePropagation?.(),updateHelpOpen(!helpOpenRef.current);return}if(helpOpenRef.current){event.key==="Escape"&&(event.preventDefault(),event.stopPropagation(),event.stopImmediatePropagation?.(),updateHelpOpen(!1));return}let registrations=applicableRegistrations(registrationsRef.current.values());if(registrations.length===0)return;let token=chordToken(eventChord(event)),now=Date.now();for(let registration of registrations){let candidates=registration.getShortcuts().filter(shortcut=>shortcut.enabled!==!1).filter(shortcut=>!editable||shortcut.allowInEditable).filter(shortcut=>!event.repeat||shortcut.allowRepeat).filter(shortcut=>!isEmptyCollectionClear(shortcut,document,event)).flatMap(parseShortcut);if(candidates.length===0)continue;let previous=now-sequenceRef.current.at<=registration.sequenceTimeoutMs?sequenceRef.current.chords:[],attempts=previous.length>0?[[...previous,token],[token]]:[[token]];for(let attempt of attempts){let matches=candidates.filter(candidate=>matchPrefix(attempt,candidate));if(matches.length===0)continue;let exact=matches.find(candidate=>candidate.sequence.length===attempt.length),hasLonger=matches.some(candidate=>candidate.sequence.length>attempt.length);if(exact&&!hasLonger){sequenceRef.current={chords:[],at:0},consumeShortcut(event,exact.definition);return}sequenceRef.current={chords:attempt,at:now},event.preventDefault();return}}sequenceRef.current={chords:[],at:0}};return document.addEventListener("keydown",handleKeyDown,!0),()=>document.removeEventListener("keydown",handleKeyDown,!0)},[updateHelpOpen]);let registry=useMemo(()=>({register}),[register]),helpEntries=helpOpen?collectShortcutHelpEntries(registrationsRef.current.values()):[];return jsxs(ShortcutContext.Provider,{value:registry,children:[children,helpOpen?jsx(ShortcutHelpDialog,{entries:helpEntries,onClose:()=>updateHelpOpen(!1)}):null]})}function ShortcutHelpDialog({entries,onClose}){let closeRef=useRef(null),previousFocusRef=useRef(typeof document<"u"&&document.activeElement instanceof HTMLElement?document.activeElement:null);useEffect(()=>(closeRef.current?.focus({preventScroll:!0}),()=>previousFocusRef.current?.focus({preventScroll:!0})),[]);let grouped=HELP_SCOPE_ORDER.map(scope=>({scope,entries:entries.filter(entry2=>entry2.scope===scope)})).filter(group=>group.entries.length>0);return jsx("div",{role:"presentation","data-notis-shortcut-help-backdrop":"",onMouseDown:event=>{event.target===event.currentTarget&&onClose()},style:helpBackdropStyle,children:jsxs("section",{role:"dialog","aria-modal":"true","aria-labelledby":"notis-shortcut-help-title","data-notis-shortcut-help":"",onKeyDown:event=>{event.key==="Tab"&&(event.preventDefault(),closeRef.current?.focus({preventScroll:!0}))},style:helpDialogStyle,children:[jsxs("header",{style:helpHeaderStyle,children:[jsxs("div",{children:[jsx("h2",{id:"notis-shortcut-help-title",style:helpTitleStyle,children:"Keyboard shortcuts"}),jsx("p",{style:helpSubtitleStyle,children:"Available in this view"})]}),jsx("button",{ref:closeRef,type:"button","aria-label":"Close keyboard shortcuts",onClick:onClose,style:helpCloseStyle,children:"Esc"})]}),jsxs("div",{style:helpBodyStyle,children:[grouped.map(group=>jsxs("section",{"aria-label":HELP_SCOPE_LABELS[group.scope],children:[jsx("h3",{style:helpGroupTitleStyle,children:HELP_SCOPE_LABELS[group.scope]}),jsx("div",{style:helpListStyle,children:group.entries.map(entry2=>jsxs("div",{style:helpRowStyle,children:[jsx("span",{children:entry2.label}),jsx("span",{style:helpKeysStyle,children:entry2.keys.map(keys=>jsx("kbd",{style:helpKeyStyle,children:shortcutDisplay(keys)},keys))})]},`${group.scope}:${entry2.id}`))})]},group.scope)),jsxs("section",{"aria-label":"Help",children:[jsx("h3",{style:helpGroupTitleStyle,children:"Help"}),jsx("div",{style:helpListStyle,children:jsxs("div",{style:helpRowStyle,children:[jsx("span",{children:"Show keyboard shortcuts"}),jsx("kbd",{style:helpKeyStyle,children:"?"})]})})]})]})]})})}var helpBackdropStyle={position:"fixed",inset:0,zIndex:1e3,display:"grid",placeItems:"center",padding:"1.5rem",background:"rgba(0, 0, 0, 0.42)",backdropFilter:"blur(3px)"},helpDialogStyle={width:"min(34rem, 100%)",maxHeight:"min(42rem, calc(100dvh - 3rem))",overflow:"hidden",border:"1px solid hsl(var(--border))",borderRadius:"0.875rem",background:"hsl(var(--background))",color:"hsl(var(--foreground))",boxShadow:"0 24px 70px rgba(0, 0, 0, 0.28)",fontFamily:"inherit"},helpHeaderStyle={display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"1rem",padding:"1.25rem 1.25rem 1rem",borderBottom:"1px solid hsl(var(--border))"},helpTitleStyle={margin:0,fontSize:"1rem",fontWeight:650},helpSubtitleStyle={margin:"0.2rem 0 0",color:"hsl(var(--muted-foreground))",fontSize:"0.75rem"},helpCloseStyle={border:"1px solid hsl(var(--border))",borderRadius:"0.35rem",background:"hsl(var(--muted))",color:"hsl(var(--muted-foreground))",padding:"0.2rem 0.45rem",cursor:"pointer",font:"inherit",fontSize:"0.7rem"},helpBodyStyle={display:"grid",gap:"1.1rem",maxHeight:"calc(min(42rem, 100dvh - 3rem) - 5rem)",overflowY:"auto",padding:"1rem 1.25rem 1.25rem"},helpGroupTitleStyle={margin:"0 0 0.35rem",color:"hsl(var(--muted-foreground))",fontSize:"0.68rem",fontWeight:650,letterSpacing:"0.06em",textTransform:"uppercase"},helpListStyle={display:"grid"},helpRowStyle={display:"flex",minHeight:"2rem",alignItems:"center",justifyContent:"space-between",gap:"1rem",borderBottom:"1px solid color-mix(in srgb, hsl(var(--border)) 65%, transparent)",fontSize:"0.8rem"},helpKeysStyle={display:"inline-flex",flexWrap:"wrap",justifyContent:"flex-end",gap:"0.3rem"},helpKeyStyle={minWidth:"1.6rem",border:"1px solid hsl(var(--border))",borderBottomWidth:"2px",borderRadius:"0.35rem",background:"hsl(var(--muted))",color:"hsl(var(--foreground))",padding:"0.15rem 0.4rem",textAlign:"center",font:"inherit",fontSize:"0.72rem"};function useShortcuts(shortcuts,options={}){let registry=useContext(ShortcutContext),shortcutsRef=useRef(shortcuts);shortcutsRef.current=shortcuts;let{enabled=!0,scope="route",priority=0,sequenceTimeoutMs=1500,collectionOwnerId,isAvailable}=options,availableRef=useRef(isAvailable);availableRef.current=isAvailable,useEffect(()=>{if(!(!registry||!enabled))return registry.register({enabled,scope,priority:SHORTCUT_SCOPE_PRIORITY[scope]+priority,sequenceTimeoutMs,collectionOwnerId,isAvailable:()=>availableRef.current?.()!==!1,getShortcuts:()=>availableRef.current?.()===!1?[]:shortcutsRef.current})},[collectionOwnerId,enabled,priority,registry,scope,sequenceTimeoutMs]),useEffect(()=>{if(!(registry||!enabled))return registerFallbackShortcut({enabled,scope,priority:SHORTCUT_SCOPE_PRIORITY[scope]+priority,sequenceTimeoutMs,collectionOwnerId,isAvailable:()=>availableRef.current?.()!==!1,getShortcuts:()=>shortcutsRef.current})},[collectionOwnerId,enabled,priority,registry,scope,sequenceTimeoutMs])}function shortcutDisplay(raw){return raw.trim().split(/\s+/).map(chord=>chord.split("+").map(part=>{let lower=part.toLowerCase();return lower==="mod"||lower==="cmd"||lower==="meta"?"\u2318":lower==="ctrl"?"\u2303":lower==="shift"?"\u21E7":lower==="alt"||lower==="option"?"\u2325":lower==="arrowup"||lower==="up"?"\u2191":lower==="arrowdown"||lower==="down"?"\u2193":lower==="arrowleft"||lower==="left"?"\u2190":lower==="arrowright"||lower==="right"?"\u2192":part.length===1?part.toUpperCase():part}).join("")).join(" ")}var copy={en:{bindingUnavailable:"This Space cannot read this database yet.",actionUnavailable:"This action is unavailable in this Space.",readUnavailable:"These data cannot be read in this Space.",schemaChanged:"This database changed. Refresh the page and try again.",responseIncomplete:"This database could not be loaded. Refresh the page and try again.",listUnavailable:"This list is unavailable in this view.",timedOut:"This read took too long. Please retry.",scopeUnavailable:"App query scope is no longer available.",scopeCleared:"App query scope was cleared."},fr:{bindingUnavailable:"Ce Space ne peut pas encore lire cette base de donn\xE9es.",actionUnavailable:"Cette action n\u2019est pas disponible dans ce Space.",readUnavailable:"Ces donn\xE9es ne sont pas accessibles dans ce Space.",schemaChanged:"Cette base de donn\xE9es a chang\xE9. Actualise la page et r\xE9essaie.",responseIncomplete:"Cette base de donn\xE9es n\u2019a pas pu \xEAtre charg\xE9e. Actualise la page et r\xE9essaie.",listUnavailable:"Cette liste n\u2019est pas disponible dans cette vue.",timedOut:"Cette lecture a pris trop de temps. R\xE9essaie.",scopeUnavailable:"Les donn\xE9es de cette vue ne sont plus accessibles.",scopeCleared:"Les donn\xE9es de cette vue ont \xE9t\xE9 r\xE9initialis\xE9es."}},PREFIX="notis_sdk_query:",SdkQueryError=class extends Error{code;diagnostic;constructor(key,diagnostic,locale,cause){super(copy[locale==="fr"?"fr":"en"][key],cause?{cause}:void 0),this.name="SdkQueryError",this.code=PREFIX+key,this.diagnostic=diagnostic}};function localizeQueryError(error,locale){let failure=error;if(!failure||typeof failure.code!="string"||!failure.code.startsWith(PREFIX))return error;let key=failure.code.slice(PREFIX.length);if(!Object.hasOwn(copy.en,key))return error;let message=copy[locale==="fr"?"fr":"en"][key];return failure.message===message?error:new SdkQueryError(key,typeof failure.diagnostic=="string"?failure.diagnostic:void 0,locale,failure)}var SPACE_VIEWER_READ_OPERATIONS=Object.freeze({list_databases:"databases",get_database:"databases",query_database:"databases",list_skills:"skills",get_skill:"skills"}),SPACE_CLOUD_COMPUTER_OPERATIONS=Object.freeze({facts:"read",run:"shell",upload:"shell"});function spaceCloudComputerAllows(level,operation){let needed=SPACE_CLOUD_COMPUTER_OPERATIONS[operation];return level==="shell"||level==="read"&&needed==="read"}var SPACE_VIEW_SPEC_VERSION=2;var SpaceActionError=class extends Error{constructor(message,requestId,receiptId,status,pendingRequestIds,code){super(message);this.requestId=requestId;this.receiptId=receiptId;this.status=status;this.pendingRequestIds=pendingRequestIds;this.code=code;this.name="SpaceActionError"}requestId;receiptId;status;pendingRequestIds;code};var SpaceNavigationCancelled=class extends Error{code="space_navigation_cancelled";constructor(message="This navigation is no longer active."){super(message),this.name="SpaceNavigationCancelled"}};function isSpaceNavigationCancelled(error){return error instanceof Error&&error.name==="SpaceNavigationCancelled"&&error.code==="space_navigation_cancelled"}function spaceQueryKey(runtime,key){if(runtime?.resource?.kind!=="space")return key;let space=runtime.space;if(!space?.cacheScope||space.id!==runtime.resource.id||space.revision!==runtime.resource.revision)throw new Error("The host must provide this Space revision and access context.");return["space",space.id,space.revision,space.cacheScope,...key]}function guardSpaceRuntime(runtime,onProtocolError){if(runtime?.resource?.kind!=="space")return runtime;spaceQueryKey(runtime,[]);let protocolError=(message,key)=>{let error=key?new SdkQueryError(key,message,runtime.context?.locale):new Error(message);return onProtocolError?.(error),error},deny=async()=>{throw protocolError("Use a declared Space action; account-wide tool and backend calls are unavailable.")},callAction=runtime.callAction;if(!callAction)throw new Error("This host needs the current Space action protocol.");let viewerRead=runtime.viewerRead,shown=runtime.shown,cloudComputer=runtime.spaceCloudComputer,cloudLevel=runtime.space.cloudComputer,guardedCloud=operation=>{if(!cloudComputer||!spaceCloudComputerAllows(cloudLevel,operation))throw protocolError(operation==="facts"?"This Space does not use the cloud computer.":"This Space does not declare cloudComputer: shell.");return cloudComputer};return Object.freeze({...runtime,callTool:deny,request:deny,listTools:deny,shown:shown?async function(name,params={},options={}){let list=runtime.space.shows&&Object.hasOwn(runtime.space.shows,name)?runtime.space.shows[name]:null;if(!list||!("database"in list))throw protocolError("This view does not declare that list with a filter.","listUnavailable");return shown(name,params,options)}:void 0,handover:void 0,cloudComputerFacts:cloudComputer&&cloudLevel?async options=>guardedCloud("facts").facts(options):void 0,spaceCloudComputer:cloudComputer&&cloudLevel?Object.freeze({status:()=>cloudComputer.status(),requestApproval:()=>cloudComputer.requestApproval(),facts:async options=>guardedCloud("facts").facts(options),run:async input=>guardedCloud("run").run(input),upload:async input=>guardedCloud("upload").upload(input)}):void 0,viewerRead:viewerRead?async function(operation,input={}){let family=Object.hasOwn(SPACE_VIEWER_READ_OPERATIONS,operation)?SPACE_VIEWER_READ_OPERATIONS[operation]:null;if(!family)throw protocolError("Viewer reads never change data. Choose a supported read.","readUnavailable");if(!runtime.space.viewerReads?.includes(family))throw protocolError(`This Space does not declare viewer reads of ${family}.`,"readUnavailable");return viewerRead(operation,input)}:void 0,async callAction(id,inputs={},options={}){let descriptor=Object.hasOwn(runtime.space.actions,id)?runtime.space.actions[id]:null;if(!descriptor)throw protocolError("This action is not declared by the published Space.",options.readOnly||options.dedupe?"actionUnavailable":void 0);if((options.readOnly||options.dedupe)&&!descriptor.readOnly)throw protocolError("A write action cannot run as a cached read.","readUnavailable");return callAction(id,inputs,options)}})}import{createContext as createContext2,useContext as useContext2,useMemo as useMemo2}from"react";import{jsx as jsx2}from"react/jsx-runtime";var NOTIS_CONTEXT_SYMBOL=Symbol.for("notis.sdk.runtime_context");function getNotisContext(){let scope=globalThis;return scope[NOTIS_CONTEXT_SYMBOL]||(scope[NOTIS_CONTEXT_SYMBOL]=createContext2(null)),scope[NOTIS_CONTEXT_SYMBOL]}var NotisContext=getNotisContext();function NotisProvider({children,runtime,onProtocolError,shortcutsAvailable}){let scopedRuntime=useMemo2(()=>guardSpaceRuntime(runtime,onProtocolError),[runtime,onProtocolError]);if(runtime===void 0)throw new Error("NotisProvider requires an explicit runtime prop.");return jsx2(NotisContext.Provider,{value:scopedRuntime,children:jsx2(ShortcutProvider,{isAvailable:shortcutsAvailable,children})})}function useNotisRuntime(){return useContext2(NotisContext)}function recordKeyOf(item){if(!item||typeof item!="object")return;let record=item,key=record.record_key??record.recordKey;return typeof key=="string"?key:void 0}function withoutRecords(data,hides,removed){let filter=list=>{let kept=list.filter(item=>{let key=recordKeyOf(item);return key===void 0||!hides(key)?!0:(removed.push(key),!1)});return kept.length===list.length?list:kept};if(Array.isArray(data))return filter(data);if(!data||typeof data!="object")return data;let record=data,result=record;for(let field of["rows","documents"]){let list=record[field];if(!Array.isArray(list))continue;let kept=filter(list);kept!==list&&(result={...result,[field]:kept})}return result}var EMPTY=Object.freeze({data:void 0,hasData:!1,isFetching:!1,error:null,updatedAt:0,invalidation:0});function queryKey(value){if(value instanceof Date)return JSON.stringify(value.toISOString());if(Array.isArray(value))return`[${value.map(queryKey).join(",")}]`;if(value&&typeof value=="object"){let record=value;return`{${Object.keys(record).filter(key=>record[key]!==void 0).sort().map(key=>`${JSON.stringify(key)}:${queryKey(record[key])}`).join(",")}}`}return JSON.stringify(value)??"null"}function createPrefetchQueue(concurrency=2){let active=0,waiting=[];function drain(){for(;active<concurrency&&waiting.length;)waiting.shift()()}return read=>new Promise((resolve,reject)=>{waiting.push(()=>{active+=1,Promise.resolve().then(read).then(resolve,reject).finally(()=>{active-=1,drain()})}),drain()})}function createQueryClient(options={}){let entries=new Map,now=options.now??Date.now,maxEntries=options.maxEntries??100,schedule=options.schedule??createPrefetchQueue(2),epoch=0,disposed=!1,revision=0,seq=0,hidden=new Map;function prune(keep){for(let[oldKey,old]of entries){if(entries.size<=maxEntries)break;oldKey!==keep&&!old.listeners.size&&!old.pending&&entries.delete(oldKey)}}function entry2(key){let value=entries.get(key);return value||(value={raw:EMPTY,snapshot:EMPTY,removed:"",dataSeq:0,listeners:new Set,generation:0},entries.set(key,value)),entries.delete(key),entries.set(key,value),prune(key),value}function view(value,rawChanged){let removed=[],data=hidden.size&&value.raw.hasData?withoutRecords(value.raw.data,key=>{if(!hidden.has(key))return!1;let committed=hidden.get(key);return committed==null||value.dataSeq<committed},removed):value.raw.data,signature=removed.sort().join("\0");return!rawChanged&&value.removed===signature?!1:(value.removed=signature,value.snapshot=data===value.raw.data?value.raw:{...value.raw,data},!0)}function publish2(value,raw){value.raw=raw,view(value,!0);for(let listener of value.listeners)listener()}function sweep(){for(let[key,committed]of hidden){if(committed===null)continue;let held=!1;for(let value of entries.values()){if(value.pending&&value.pendingSeq!==void 0&&value.pendingSeq<committed){held=!0;break}if(value.dataSeq>=committed||!value.raw.hasData)continue;let found=[];if(withoutRecords(value.raw.data,candidate=>candidate===key,found),found.length){held=!0;break}}held||hidden.delete(key)}}function refresh(){for(let value of entries.values())if(view(value,!1))for(let listener of value.listeners)listener()}let client={getSnapshot(key){return entries.get(key)?.snapshot??EMPTY},subscribe(key,listener){let value=entry2(key);return value.listeners.add(listener),()=>{value.listeners.delete(listener),prune()}},fetch(key,read,fetchOptions={}){if(disposed)return Promise.reject(new SdkQueryError("scopeUnavailable"));let value=entry2(key);if(value.pending)return value.pending;if(!fetchOptions.force&&value.snapshot.hasData&&value.snapshot.updatedAt>0&&now()-value.snapshot.updatedAt<(fetchOptions.staleTimeMs??3e4))return Promise.resolve(value.snapshot.data);let generation=++value.generation,requestEpoch=epoch,startSeq=++seq,canCommit=()=>epoch===requestEpoch&&value.generation===generation&&entries.get(key)===value,timeout,deadline=new Promise((_,reject)=>{timeout=setTimeout(()=>reject(new SdkQueryError("timedOut")),options.readTimeoutMs??3e4),typeof timeout=="object"&&"unref"in timeout&&timeout.unref()}),request=Promise.race([Promise.resolve().then(read),deadline]).then(data=>(canCommit()&&(value.dataSeq=startSeq,publish2(value,{...value.raw,data,hasData:!0,isFetching:!1,error:null,updatedAt:now()}),hidden.size&&sweep()),data),reason=>{let error=reason instanceof Error?reason:new Error(String(reason));throw canCommit()&&publish2(value,{...value.raw,isFetching:!1,error}),error}).finally(()=>{clearTimeout(timeout),value.pending===request&&(value.pending=void 0,value.pendingSeq=void 0),hidden.size&&sweep(),prune()});return value.pending=request,value.pendingSeq=startSeq,publish2(value,{...value.raw,isFetching:!0,error:null}),request},prefetch(key,read,fetchOptions){let requestEpoch=epoch;return schedule(()=>{if(epoch!==requestEpoch)throw new SdkQueryError("scopeCleared");return client.fetch(key,read,fetchOptions)})},getRevision:()=>revision,invalidate(key){revision+=1;for(let[entryKey,value]of entries)key!==void 0&&entryKey!==key||(value.generation+=1,value.pending=void 0,value.pendingSeq=void 0,publish2(value,{...value.raw,updatedAt:0,isFetching:!1,invalidation:value.raw.invalidation+1}))},dispose(){disposed=!0,client.clear()},clear(){revision+=1,epoch+=1;for(let value of entries.values())value.generation+=1,value.pending=void 0,value.pendingSeq=void 0,value.dataSeq=0,publish2(value,{...EMPTY,invalidation:value.raw.invalidation+1});for(let[key,value]of entries)value.listeners.size||entries.delete(key);sweep()},hideRecords(recordKeys){let own=[...new Set(recordKeys.filter(key=>typeof key=="string"&&key))];for(let key of own)hidden.set(key,null);refresh();let pick2=keys=>keys?own.filter(key=>keys.includes(key)):own;return{commit(keys){let at=++seq;for(let key of pick2(keys))hidden.get(key)===null&&hidden.set(key,at);sweep(),refresh()},restore(keys){for(let key of pick2(keys))hidden.delete(key);refresh()}}}};return client}import{useCallback as useCallback2,useEffect as useEffect2,useLayoutEffect as useLayoutEffect2,useMemo as useMemo3,useRef as useRef2,useSyncExternalStore}from"react";function useQuery(key,read,options){let runtime=useNotisRuntime(),fallback=useMemo3(()=>createQueryClient(),[runtime]),client=runtime?.queryClient??fallback,cacheKey=queryKey(spaceQueryKey(runtime,key)),enabled=!!runtime&&options.enabled!==!1&&options.readOnly===!0,readRef=useRef2(read);useLayoutEffect2(()=>{readRef.current=read});let subscribe=useCallback2(listener=>enabled?client.subscribe(cacheKey,listener):()=>{},[cacheKey,client,enabled]),snapshot=useSyncExternalStore(subscribe,()=>client.getSnapshot(cacheKey),()=>client.getSnapshot(cacheKey)),fetch=useCallback2(()=>{let capturedRead=readRef.current;return client.fetch(cacheKey,capturedRead,{staleTimeMs:options.staleTimeMs})},[cacheKey,client,options.staleTimeMs]);useEffect2(()=>{enabled&&fetch().catch(()=>{})},[enabled,fetch,snapshot.invalidation]);let locale=runtime?.context?.locale,refetch=useCallback2(async()=>{if(!enabled)return null;client.invalidate(cacheKey);try{return await fetch(),null}catch(failure){return localizeQueryError(failure instanceof Error?failure:new Error(String(failure)),locale)}},[cacheKey,client,enabled,fetch,locale]),error=useMemo3(()=>localizeQueryError(snapshot.error,runtime?.context?.locale),[snapshot.error,runtime?.context?.locale]);return{data:enabled?snapshot.data:void 0,hasData:enabled&&snapshot.hasData,loading:enabled&&!snapshot.hasData&&!snapshot.error,isFetching:enabled&&snapshot.isFetching,error:enabled?error:null,refetch}}function useQueryClient(){let runtime=useNotisRuntime();return useMemo3(()=>({invalidate:key=>runtime?.queryClient?.invalidate(key?queryKey(spaceQueryKey(runtime,key)):void 0),prefetch:(key,read,options)=>!runtime?.queryClient||options.enabled===!1||options.readOnly!==!0?Promise.resolve(void 0):runtime.queryClient.prefetch(queryKey(spaceQueryKey(runtime,key)),read,{staleTimeMs:options.staleTimeMs})}),[runtime])}var SCOPE_ORDER=Object.freeze({app:0,route:100,collection:200,detail:300,modal:400}),SCOPES=Object.freeze(["app","route","collection","detail","modal"]);function isWords(value){return!!value&&typeof value=="object"&&typeof value.en=="string"&&typeof value.fr=="string"}function pick(words,locale){return typeof words=="string"?words:locale==="fr"?words.fr:words.en}function interpolate(template,vars){return template.replace(/\{(\w+)\}/g,(whole,name)=>Object.prototype.hasOwnProperty.call(vars,name)?String(vars[name]):whole)}function fillWords(words,vars){return{en:interpolate(words.en,vars),fr:interpolate(words.fr,vars)}}function w(en,fr){return{en,fr}}var NNBSP="\u202F";function labelValue(label,value,locale){return locale==="fr"?`${label}${NNBSP}: ${value}`:`${label}: ${value}`}var DOCUMENT_WORDS=Object.freeze({untitled:{en:"Untitled",fr:"Sans titre"}});function isPresentString(value){return typeof value=="string"&&value.trim().length>0}function asRecord(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function optionalString(value){return isPresentString(value)?value.trim():null}function extractRichText(value){return typeof value=="string"?value:Array.isArray(value)?value.map(item=>{let record=asRecord(item),text=asRecord(record?.text);return optionalString(text?.content)??optionalString(record?.plain_text)??""}).join(""):""}function getSecretValue(value){let record=asRecord(value),metadata=asRecord(record?.metadata);return{present:record?.present===!0,reference:optionalString(record?.reference),status:optionalString(record?.status),metadata}}function getRelationIds(value){return Array.isArray(value)?value.filter(item=>isPresentString(item)):[]}function normalizePropertyValue(value){let record=asRecord(value);if(!record)return value;let type=optionalString(record.type);return type?type==="title"?extractRichText(record.title):type==="rich_text"?extractRichText(record.rich_text):type==="select"||type==="status"?optionalString(asRecord(record[type])?.name)??record[type]??null:type==="multi_select"?(Array.isArray(record.multi_select)?record.multi_select:[]).map(item=>optionalString(asRecord(item)?.name)??item).filter(Boolean):type==="relation"?(Array.isArray(record.relation)?record.relation:[]).map(item=>optionalString(asRecord(item)?.id)??item).filter(Boolean):type==="date"?optionalString(asRecord(record.date)?.start)??record.date??null:type==="secret"?getSecretValue(record):type in record?record[type]:value:value}function normalizeContentType(value){return value==="markdown"||value==="file"||value==="view"?value:null}function normalizeDocumentRecord(value,options={}){let record=asRecord(value)??{},rawProperties=asRecord(record.properties)??{},properties={};for(let[key,propertyValue]of Object.entries(rawProperties))properties[key]=normalizePropertyValue(propertyValue);return{id:optionalString(record.id)??"",recordKey:optionalString(record.recordKey)??optionalString(record.record_key)??void 0,revision:typeof record.revision=="number"?record.revision:void 0,title:optionalString(record.title)??pick(DOCUMENT_WORDS.untitled,options.locale??"en"),url:optionalString(record.url),properties,icon:optionalString(record.icon),cover:optionalString(record.cover),databaseSlug:optionalString(record.databaseSlug)??optionalString(record.database_slug)??void 0,contentType:normalizeContentType(record.contentType??record.content_type),fileType:optionalString(record.fileType)??optionalString(record.file_type),contentBlocknote:Array.isArray(record.contentBlocknote)?record.contentBlocknote:Array.isArray(record.content_blocknote)?record.content_blocknote:null,contentMarkdown:optionalString(record.contentMarkdown)??optionalString(record.content_markdown),plainText:optionalString(record.plainText)??optionalString(record.plain_text),viewType:optionalString(record.viewType)??optionalString(record.view_type),viewState:asRecord(record.viewState)??asRecord(record.view_state),viewRevision:typeof(record.viewRevision??record.view_revision)=="number"?Number(record.viewRevision??record.view_revision):null,createdAt:optionalString(record.createdAt)??optionalString(record.created_at)??optionalString(record.created_time),lastEditedTime:optionalString(record.lastEditedTime)??optionalString(record.last_edited_time)??optionalString(record.updated_at)}}function normalizeDatabaseProperty(value){let record=asRecord(value),name=optionalString(record?.name);if(!record||!name)return null;let options=(Array.isArray(record.options)?record.options:[]).flatMap(option=>{let optionRecord=asRecord(option),optionName=optionalString(optionRecord?.name);return!optionRecord||!optionName?[]:[{id:optionalString(optionRecord.id),name:optionName,color:optionalString(optionRecord.color),order:typeof optionRecord.order=="number"?optionRecord.order:void 0}]});return{id:optionalString(record.id),name,type:optionalString(record.type)??"rich_text",description:optionalString(record.description),options}}function markdownToPlainText(markdown){return markdown.replace(/```[^\n]*\n?/g,"").replace(/!\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/<[^>]+>/g," ").replace(/^\s{0,3}(#{1,6}\s+|>\s?|[-*+]\s+(\[[ xX]\]\s+)?|\d+\.\s+)/gm,"").replace(/(\*\*|__|[*_~`])/g,"").replace(/^\s*\|?[-:| ]+\|?\s*$/gm,"").replace(/\|/g," ").replace(/^\s*([-*_]\s*){3,}$/gm,"").replace(/\s+/g," ").trim()}function blockNoteToPlainText(blocks){let segments=[];function visit(node){if(typeof node=="string"){node.trim()&&segments.push(node.trim());return}if(Array.isArray(node)){node.forEach(visit);return}let record=asRecord(node);record&&(typeof record.text=="string"&&record.text.trim()&&segments.push(record.text.trim()),visit(record.content),visit(record.children))}return visit(blocks),segments.join(" ").replace(/\s+/g," ").trim()}function getDocumentPreview(document2,options={}){if(isPresentString(document2.plainText))return document2.plainText.replace(/\s+/g," ").trim();if(isPresentString(document2.contentMarkdown))return markdownToPlainText(document2.contentMarkdown);let fromBlocks=blockNoteToPlainText(document2.contentBlocknote);return fromBlocks||(isPresentString(document2.title)?document2.title:pick(DOCUMENT_WORDS.untitled,options.locale??"en"))}import{useCallback as useCallback3,useEffect as useEffect3,useState as useState2}from"react";function actionFor(runtime,binding,operation){let descriptor=runtime?.space?.bindings[binding],action=descriptor?.kind==="database"?descriptor.operations?.[operation]:void 0;if(runtime?.resource?.kind!=="space"||!runtime.callAction||!action){let diagnostic=`This Space does not expose ${operation} for database binding "${binding}".`;throw operation==="query"?new SdkQueryError("bindingUnavailable",diagnostic):new Error(`This Space does not expose ${operation} for that database binding.`)}return action}function useNativeDocuments(binding,options={}){let runtime=useNotisRuntime(),[live,setLive]=useState2(!1),follow=options.subscribe===!0&&options.enabled!==!1;useEffect3(()=>{if(!follow||!runtime?.subscribeDatabase){setLive(!1);return}let cancelled=!1,stop=runtime.subscribeDatabase(binding,()=>{},{onStatusChange:value=>{cancelled||setLive(value)}});return()=>{cancelled=!0,setLive(!1),stop?.()}},[runtime,binding,follow]);let locale=runtime?.context?.locale==="fr"?"fr":"en",query=useQuery(["native-documents",binding,options.query??{},!!options.fetchAll,locale],async()=>{let action=actionFor(runtime,binding,"query");if(options.query?.mode&&!["rows","search"].includes(options.query.mode))throw new Error("Use useActionQuery for counts and aggregates.");let rows=[],offset=options.query?.offset??0,revision;for(;;){let result=await runtime.callAction(action,{request:{...options.query,offset}},{readOnly:!0,dedupe:!0,schemaRevision:revision});if(!result||!Array.isArray(result.rows)||!Number.isSafeInteger(result.schema_revision))throw new SdkQueryError("responseIncomplete","Native query must return rows and a safe integer schema_revision.");if(revision!==void 0&&revision!==result.schema_revision)throw new SdkQueryError("schemaChanged");if(revision=result.schema_revision,rows.push(...result.rows),!options.fetchAll||!result.has_more)break;if(typeof result.next_offset!="number"||result.next_offset<=offset)throw new SdkQueryError("responseIncomplete","Native query pagination did not advance next_offset.");offset=result.next_offset}return{documents:rows.map(row=>normalizeDocumentRecord(row,{locale})),schemaRevision:revision}},{readOnly:!0,enabled:options.enabled,staleTimeMs:options.staleTimeMs});return{...query,documents:query.data?.documents??EMPTY_DOCUMENTS,schemaRevision:query.data?.schemaRevision,live}}function useNativeMutation(binding,operation){let runtime=useNotisRuntime(),[pending,setPending]=useState2(0),[error,setError]=useState2(null);return{mutate:useCallback3(async(input,options)=>{let action=actionFor(runtime,binding,operation);setPending(value=>value+1),setError(null);let key=operation==="delete"&&typeof input.record_key=="string"?input.record_key:null,hidden=key?runtime?.queryClient?.hideRecords?.([key]):void 0;try{let receipt=await runtime.callAction(action,{request:input},options);return hidden?.commit(),receipt}catch(cause){hidden?.restore();let failure=cause instanceof Error?cause:new Error(String(cause));throw setError(failure),failure}finally{setPending(value=>value-1)}},[runtime,binding,operation]),loading:pending>0,error}}function useNativeDelete(binding){let runtime=useNotisRuntime(),[pending,setPending]=useState2(0),[error,setError]=useState2(null);return{deleteMany:useCallback3(async(inputs,options)=>{let action=actionFor(runtime,binding,"delete"),result={done:[],failed:[]};if(!inputs.length)return result;setPending(value=>value+1),setError(null);let hidden=runtime?.queryClient?.hideRecords?.(inputs.map(input=>input.record_key)),next=0,worker=async()=>{for(;next<inputs.length;){let input=inputs[next++];try{await runtime.callAction(action,{request:input},{schemaRevision:options.schemaRevision,requestId:`${options.requestId}:${input.record_key}`,deferRefresh:!0}),result.done.push(input)}catch(cause){result.failed.push({input,error:cause instanceof Error?cause:new Error(String(cause))})}}};try{await Promise.all(Array.from({length:Math.min(DELETE_CONCURRENCY,inputs.length)},worker))}finally{hidden?.commit(result.done.map(input=>input.record_key)),hidden?.restore(result.failed.map(item=>item.input.record_key)),runtime?.queryClient?.invalidate(),result.failed.length&&setError(result.failed[0].error),setPending(value=>value-1)}return result},[runtime,binding]),loading:pending>0,error}}var DELETE_CONCURRENCY=4,EMPTY_DOCUMENTS=[];var VIEW_PERIODS=["today","tomorrow","this_week","last_week","this_month","last_month"];function isViewDate(value){if(!/^\d{4}-\d{2}-\d{2}$/.test(value)||value.startsWith("0000-"))return!1;let parsed=new Date(`${value}T00:00:00Z`);return Number.isFinite(parsed.getTime())&&parsed.toISOString().slice(0,10)===value}function isViewPeriod(value){if(VIEW_PERIODS.includes(value))return!0;let parts=value.split("/");return parts.length===2&&parts.every(isViewDate)&&parts[0]<=parts[1]}function resolveViewPeriod(value,timeZone="UTC",now=new Date){if(!isViewPeriod(value))throw new Error("Invalid view period");if(value.includes("/")){let[start2,end2]=value.split("/");return{start:start2,end:end2}}let parts=new Intl.DateTimeFormat("en-US",{timeZone,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(now),get=type=>parts.find(part=>part.type===type).value,start=new Date(`${get("year")}-${get("month")}-${get("day")}T00:00:00Z`);value==="tomorrow"&&start.setUTCDate(start.getUTCDate()+1),value.endsWith("week")&&start.setUTCDate(start.getUTCDate()-(start.getUTCDay()+6)%7-(value==="last_week"?7:0)),value.endsWith("month")&&(start.setUTCDate(1),value==="last_month"&&start.setUTCMonth(start.getUTCMonth()-1));let end=new Date(start);return value.endsWith("week")&&end.setUTCDate(end.getUTCDate()+6),value.endsWith("month")&&(end.setUTCMonth(end.getUTCMonth()+1),end.setUTCDate(0)),{start:start.toISOString().slice(0,10),end:end.toISOString().slice(0,10)}}import{useCallback as useCallback4,useMemo as useMemo4}from"react";var RECORD_KEY=/^(?:[0-9a-f]{32}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i,NUMBER=/^-?\d+(?:\.\d+)?$/,CONTROL=/[\u0000-\u001f\u007f]/;function parseValue(declaration,raw){switch(declaration.type){case"text":return raw.length<=500&&!CONTROL.test(raw)?raw:void 0;case"enum":return declaration.values?.includes(raw)?raw:void 0;case"number":{let value=Number(raw);return NUMBER.test(raw)&&Number.isFinite(value)?value:void 0}case"boolean":return raw==="true"?!0:raw==="false"?!1:void 0;case"date":return["today","tomorrow"].includes(raw)||isViewDate(raw)?raw:void 0;case"period":return isViewPeriod(raw)?raw:void 0;case"record":{if(!RECORD_KEY.test(raw))return;let hex=raw.replaceAll("-","").toLowerCase();return`${hex.slice(0,8)}-${hex.slice(8,12)}-${hex.slice(12,16)}-${hex.slice(16,20)}-${hex.slice(20)}`}default:return}}function parseViewParams(declared,raw){let params={},invalid=[],missing=[];for(let[name,declaration]of Object.entries(declared||{})){let value=raw&&Object.hasOwn(raw,name)&&typeof raw[name]=="string"&&raw[name]!==""?raw[name]:void 0,parsed=value===void 0?void 0:parseValue(declaration,value);value!==void 0&&parsed===void 0&&invalid.push(name),parsed!==void 0?params[name]=parsed:declaration.default!==void 0?params[name]=declaration.default:declaration.required&&missing.push(name)}return{params,invalid,missing}}var pendingWrites=new WeakMap;function writeViewParams(runtime,changes,options={}){if(runtime?.resource?.kind!=="space"||typeof runtime.navigate!="function")return Promise.reject(new Error("Open this Space in a current Notis host to change its params."));let current=runtime.context?.params??null,pending=pendingWrites.get(runtime),next={...pending&&pending.base===current?pending.params:current??{}};for(let[name,value]of Object.entries(changes))value==null?delete next[name]:next[name]=String(value);pendingWrites.set(runtime,{base:current,params:next});let forget=error=>{throw pendingWrites.get(runtime)?.params===next&&pendingWrites.delete(runtime),error};try{return Promise.resolve(runtime.navigate({kind:"view-params",params:next,...options.replace?{replace:!0}:{}})).then(()=>{},forget)}catch(error){return Promise.reject(error).catch(forget)}}function useViewParams(){let runtime=useNotisRuntime(),declared=runtime?.space?.params,raw=runtime?.context?.params,setParams=useCallback4((changes,options)=>writeViewParams(runtime,changes,options),[runtime]);return useMemo4(()=>({...parseViewParams(declared,raw),declared:declared||{},ready:runtime!==null,setParams}),[declared,raw,runtime,setParams])}var SHOWN_ALL_PAGES_MAX=50,SHOWN_ALL_PAGES_SIZE=200;function useShownAvailable(name){let runtime=useNotisRuntime(),list=runtime?.space?.shows&&Object.hasOwn(runtime.space.shows,name)?runtime.space.shows[name]:null;return runtime?.resource?.kind==="space"&&typeof runtime.shown=="function"&&!!(list&&"database"in list)}function useShown(name,options={}){let runtime=useNotisRuntime(),available=useShownAvailable(name),{params,missing}=useViewParams(),{sorts,pageSize,offset,includeContent,allPages=!1}=options,list=runtime?.space?.shows&&Object.hasOwn(runtime.space.shows,name)?runtime.space.shows[name]:null,reads=list&&"database"in list&&Array.isArray(list.params)?list.params:null,keyed=useMemo4(()=>reads?Object.fromEntries(Object.entries(params).filter(([param])=>reads.includes(param))):params,[params,reads]),result=useQuery(["shown",name,keyed,sorts??null,pageSize??null,offset??null,includeContent??!1,allPages],async()=>{if(!runtime?.shown)throw new SdkQueryError("listUnavailable");if(!allPages)return runtime.shown(name,params,{sorts,pageSize,offset,includeContent});let size=pageSize??SHOWN_ALL_PAGES_SIZE,first=null,rows=[];for(let page=0;page<SHOWN_ALL_PAGES_MAX;page+=1){let answer=await runtime.shown(name,params,{sorts,pageSize:size,offset:(offset??0)+page*size,includeContent});first??=answer;let pageRows=Array.isArray(answer?.rows)?answer.rows:[];if(rows.push(...pageRows),pageRows.length<size)break}return{...first,rows}},{readOnly:!0,enabled:available&&!missing.length&&options.enabled!==!1,staleTimeMs:options.staleTimeMs}),unavailable=runtime!==null&&!available&&options.enabled!==!1,error=useMemo4(()=>unavailable?new SdkQueryError("listUnavailable",`The list "${name}" is unavailable in this view: declare it in \`shows\` with a database, or gate it on useShownAvailable("${name}").`,runtime?.context?.locale):null,[unavailable,name,runtime?.context?.locale]);return unavailable?{...result,loading:!1,isFetching:!1,error}:result}import{useCallback as useCallback5,useEffect as useEffect4,useLayoutEffect as useLayoutEffect3,useRef as useRef3}from"react";var MAX_UNSHOWN=64;function useTopBarSearch(opts){let runtime=useNotisRuntime(),{value,onChange,placeholder,onSubmit}=opts,callbacks=useRef3({onChange,onSubmit});useLayoutEffect3(()=>{callbacks.current={onChange,onSubmit}});let fromBar=useRef3([]),hasSubmit=!!onSubmit;return useEffect4(()=>{let register=runtime?.registerTopBarSearch;if(register)return register({onChange:next=>{let sent=fromBar.current;sent.push(next),sent.length>MAX_UNSHOWN&&sent.splice(0,sent.length-MAX_UNSHOWN),callbacks.current.onChange(next)},placeholder,onSubmit:hasSubmit?()=>callbacks.current.onSubmit?.():void 0}),()=>{register(null)}},[runtime,placeholder,hasSubmit]),useLayoutEffect3(()=>{let sent=fromBar.current;if(sent.length&&value===sent[sent.length-1]){sent.length=0;return}let shown=sent.indexOf(value);if(shown>=0){sent.splice(0,shown+1);return}sent.length=0,runtime?.setTopBarSearchValue?.(value)},[runtime,value]),{setLoading:useCallback5(loading=>{runtime?.setTopBarSearchLoading?.(loading)},[runtime])}}import{useEffect as useEffect5,useRef as useRef4}from"react";var ownersBySetter=new WeakMap;function publish(set,entry2){let top=entry2.owners.length?entry2.owners[entry2.owners.length-1]:null,sent=entry2.sent;if(top===sent||top&&sent&&top.label===sent.label&&top.hasBack===sent.hasBack&&top.recordKey===sent.recordKey){entry2.sent=top;return}entry2.sent=top,set(top?{label:top.label,...top.hasBack?{onBack:entry2.back}:{},...top.recordKey?{recordKey:top.recordKey}:{}}:null)}function useTopBarTitleLeaf(label,onBack,options){let runtime=useNotisRuntime(),leaf=label?.trim()||null,back=useRef4(onBack);back.current=onBack;let hasBack=!!onBack,recordKey=options?.recordKey?.trim()||null;useEffect5(()=>{let set=runtime?.setTopBarTitleLeaf;if(!set||!leaf)return;let entry2=ownersBySetter.get(set);if(!entry2){let created={owners:[],sent:null,back:()=>created.sent?.back.current?.()};entry2=created,ownersBySetter.set(set,entry2)}let owner={label:leaf,back,hasBack,recordKey};return entry2.owners.push(owner),publish(set,entry2),()=>{let current=ownersBySetter.get(set);current&&(current.owners=current.owners.filter(item=>item!==owner),publish(set,current))}},[runtime,leaf,hasBack,recordKey])}import{jsx as jsx3,jsxs as jsxs2}from"react/jsx-runtime";var S={fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"},F={fill:"currentColor",stroke:"none"},SHAPES={"arrow-left":jsx3("path",{...S,d:"M13 8H3m4-4L3 8l4 4"}),x:jsx3("path",{...S,d:"M4 4l8 8M12 4l-8 8"}),"caret-up":jsx3("path",{...S,d:"M4 10l4-4 4 4"}),"caret-down":jsx3("path",{...S,d:"M4 6l4 4 4-4"}),"caret-right":jsx3("path",{...S,d:"M6 4l4 4-4 4"}),"caret-left":jsx3("path",{...S,d:"M10 4L6 8l4 4"}),"arrows-out":jsx3("path",{...S,d:"M9.5 2.5h4v4M13.5 2.5L9 7M6.5 13.5h-4v-4M2.5 13.5L7 9"}),"dots-three":jsxs2("g",{...F,children:[jsx3("circle",{cx:"3.5",cy:"8",r:"1.25"}),jsx3("circle",{cx:"8",cy:"8",r:"1.25"}),jsx3("circle",{cx:"12.5",cy:"8",r:"1.25"})]}),"sidebar-simple":jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3",width:"12",height:"10",rx:"1.5"}),jsx3("path",{d:"M9.5 3v10"})]}),"square-center":jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3",width:"12",height:"10",rx:"1.5"}),jsx3("rect",{x:"5",y:"5.5",width:"6",height:"5",rx:".75"})]}),"corners-out":jsx3("path",{...S,d:"M2.5 6V2.5H6M10 2.5h3.5V6M13.5 10v3.5H10M6 13.5H2.5V10"}),check:jsx3("path",{...S,d:"M3 8.5l3 3 7-7"}),archive:jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3",width:"12",height:"3",rx:".75"}),jsx3("path",{d:"M3 6v6.5a.5.5 0 00.5.5h9a.5.5 0 00.5-.5V6M6.5 8.5h3"})]}),"tray-arrow-up":jsx3("path",{...S,d:"M2.5 9.5v3a.5.5 0 00.5.5h10a.5.5 0 00.5-.5v-3h-3l-1 1.5h-3l-1-1.5h-3M8 8V2.5M5.5 5L8 2.5 10.5 5"}),star:jsx3("path",{...S,d:"M8 2l1.8 3.8 4.2.5-3.1 2.9.8 4.1L8 11.3l-3.7 2 .8-4.1L2 6.3l4.2-.5z"}),"star-fill":jsx3("path",{fill:"currentColor",stroke:"currentColor",strokeWidth:.8,strokeLinejoin:"round",d:"M8 1.6l1.95 3.95 4.36.64-3.16 3.07.75 4.34L8 11.55 4.1 13.6l.75-4.34L1.69 6.19l4.36-.64z"}),clock:jsxs2("g",{...S,children:[jsx3("circle",{cx:"8",cy:"8",r:"6"}),jsx3("path",{d:"M8 4.5V8h3"})]}),"arrow-bend-up-right":jsx3("path",{...S,d:"M10 3l3 3-3 3M13 6H7a4 4 0 00-4 4v3"}),"user-plus":jsxs2("g",{...S,children:[jsx3("circle",{cx:"6.5",cy:"5.5",r:"2.75"}),jsx3("path",{d:"M1.5 13.5c.8-2.2 2.7-3.5 5-3.5s4.2 1.3 5 3.5M12.5 4v4M10.5 6h4"})]}),"envelope-open":jsx3("path",{...S,d:"M2 6.5v6a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-6L8 2.5zM2 6.5l6 4 6-4"}),"envelope-simple":jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3.5",width:"12",height:"9",rx:"1"}),jsx3("path",{d:"M2 4.5l6 4.5 6-4.5"})]}),"pencil-simple":jsx3("path",{...S,d:"M10.8 2.7l2.5 2.5L5.6 12.9 2.5 13.5l.6-3.1zM9.3 4.2l2.5 2.5"}),"file-text":jsx3("path",{...S,d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3M6 8.5h4M6 11h4"}),flask:jsx3("path",{...S,d:"M6 2h4M6.8 2v4.3l-3.6 6.2a1 1 0 00.9 1.5h7.8a1 1 0 00.9-1.5L9.2 6.3V2M4.6 10.2h6.8"}),copy:jsx3("path",{...S,d:"M6.5 5.5h5a1 1 0 011 1v5a1 1 0 01-1 1h-5a1 1 0 01-1-1v-5a1 1 0 011-1zM10.5 5.5v-1a1 1 0 00-1-1h-5a1 1 0 00-1 1v5a1 1 0 001 1h1"}),"chat-circle-text":jsx3("path",{...S,d:"M4.7 13.1A5.8 5.8 0 102.9 11.3L2.3 13.7zM6 7h4M6 9.3h3"}),trash:jsx3("path",{...S,d:"M2.5 4h11M6.5 2.5h3M4 4l.6 9a.5.5 0 00.5.5h5.8a.5.5 0 00.5-.5L12 4M6.5 6.5v4.5M9.5 6.5v4.5"}),"circle-half":jsxs2("g",{children:[jsx3("circle",{...S,cx:"8",cy:"8",r:"6"}),jsx3("path",{...F,d:"M8 2a6 6 0 010 12z"})]}),"circle-three-quarter":jsxs2("g",{children:[jsx3("circle",{...S,cx:"8",cy:"8",r:"6"}),jsx3("path",{...F,d:"M8 8V2a6 6 0 11-6 6z"})]}),pause:jsx3("path",{...S,d:"M5.5 3v10M10.5 3v10"}),play:jsx3("path",{...S,d:"M4.5 2.5v11L13 8z"}),"toggle-right":jsxs2("g",{...S,children:[jsx3("rect",{x:"1.5",y:"4",width:"13",height:"8",rx:"4"}),jsx3("circle",{cx:"10.5",cy:"8",r:"2"})]}),"toggle-left":jsxs2("g",{...S,children:[jsx3("rect",{x:"1.5",y:"4",width:"13",height:"8",rx:"4"}),jsx3("circle",{cx:"5.5",cy:"8",r:"2"})]}),hourglass:jsx3("path",{...S,d:"M4 2.5h8M4 13.5h8M5 2.5c0 3 6 3.5 6 5.5s-6 2.5-6 5.5M11 2.5c0 3-6 3.5-6 5.5s6 2.5 6 5.5"}),"arrow-counter-clockwise":jsx3("path",{...S,d:"M4.5 6H2V3.5M2.3 6A6 6 0 112 9"}),"arrow-clockwise":jsx3("path",{...S,d:"M11.5 6H14V3.5M13.7 6A6 6 0 1 0 14 9"}),"arrows-clockwise":jsx3("path",{...S,d:"M3 6a5.4 5.4 0 0110 0M13 3v3h-3M13 10a5.4 5.4 0 01-10 0M3 13v-3h3"}),plus:jsx3("path",{...S,d:"M8 3v10M3 8h10"}),"circle-dashed":jsx3("circle",{...S,cx:"8",cy:"8",r:"6",strokeDasharray:"2.2 2.2"}),circle:jsx3("circle",{...S,cx:"8",cy:"8",r:"6"}),"clock-countdown":jsxs2("g",{...S,children:[jsx3("path",{d:"M8 2a6 6 0 11-6 6",strokeDasharray:"0"}),jsx3("path",{d:"M8 5v3l2 1.5M2.6 5.3l.1-.1M4.6 3.1l.1-.1"})]}),"check-circle-fill":jsxs2("g",{children:[jsx3("circle",{...F,cx:"8",cy:"8",r:"6.5"}),jsx3("path",{d:"M5 8.2l2 2 4-4",fill:"none",stroke:"hsl(var(--background))",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),"minus-circle":jsxs2("g",{...S,children:[jsx3("circle",{cx:"8",cy:"8",r:"6"}),jsx3("path",{d:"M5.5 8h5"})]}),"paper-plane-right":jsx3("path",{...S,d:"M2.5 2.8l11 5.2-11 5.2 1.8-5.2zM4.3 8h4.7"}),paperclip:jsx3("path",{...S,d:"M10.5 5l-4.6 4.6a1.1 1.1 0 001.6 1.6l5-5a2.3 2.3 0 00-3.2-3.2l-5 5a3.4 3.4 0 004.8 4.8L13 8.9"}),"clipboard-text":jsxs2("g",{...S,children:[jsx3("path",{d:"M10.5 3h2a.5.5 0 01.5.5v10a.5.5 0 01-.5.5h-9a.5.5 0 01-.5-.5v-10a.5.5 0 01.5-.5h2"}),jsx3("rect",{x:"5.5",y:"2",width:"5",height:"2.5",rx:".75"}),jsx3("path",{d:"M6 8h4M6 10.5h4"})]}),"x-circle-fill":jsxs2("g",{children:[jsx3("circle",{...F,cx:"8",cy:"8",r:"6.5"}),jsx3("path",{d:"M5.8 5.8l4.4 4.4M10.2 5.8l-4.4 4.4",fill:"none",stroke:"hsl(var(--background))",strokeWidth:1.5,strokeLinecap:"round"})]}),"magnifying-glass-plus":jsx3("path",{...S,d:"M7 12A5 5 0 107 2a5 5 0 000 10zM10.6 10.6L14 14M5 7h4M7 5v4"}),"magnifying-glass-minus":jsx3("path",{...S,d:"M7 12A5 5 0 107 2a5 5 0 000 10zM10.6 10.6L14 14M5 7h4"}),"download-simple":jsx3("path",{...S,d:"M8 2.5v7.5M4.5 6.5L8 10l3.5-3.5M2.5 10v3a.5.5 0 00.5.5h10a.5.5 0 00.5-.5v-3"}),link:jsx3("path",{...S,d:"M6.8 9.2l2.4-2.4M7.6 4.6l1.2-1.2a2.8 2.8 0 014 4l-1.2 1.2M8.4 11.4l-1.2 1.2a2.8 2.8 0 01-4-4l1.2-1.2"}),file:jsx3("path",{...S,d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),"file-image":jsxs2("g",{...S,children:[jsx3("path",{d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),jsx3("path",{d:"M3.5 12l3-3 2 2 1.5-1.5 2.5 2.5"}),jsx3("circle",{cx:"6.5",cy:"6.75",r:".75"})]}),"file-video":jsxs2("g",{...S,children:[jsx3("path",{d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),jsx3("path",{d:"M6.5 8v3.5L9.5 9.75z"})]}),"file-audio":jsxs2("g",{...S,children:[jsx3("path",{d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),jsx3("path",{d:"M6 9.5v1.5h1.25L9 12.25v-4.5L7.25 9H6M10.5 8.5a1.8 1.8 0 010 2.5"})]})};function hasIcon(name){return Object.prototype.hasOwnProperty.call(SHAPES,name)}function Icon({name,className}){let shape=SHAPES[name];return shape?jsx3("svg",{className:className?`nui-icon ${className}`:"nui-icon",viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",children:shape}):null}function renderIcon(icon,className){return icon==null||icon===!1?null:typeof icon=="string"?jsx3(Icon,{name:icon,className}):icon}import{Fragment as Fragment2,jsx as jsx4,jsxs as jsxs3}from"react/jsx-runtime";function RenderChartData({title,columns,rows,children}){return jsxs3(Fragment2,{children:[children,jsxs3("table",{hidden:!0,"data-notis-render":"chart-data","aria-label":title,children:[jsx4("thead",{children:jsx4("tr",{children:columns.map((column,index)=>jsx4("th",{children:column},index))})}),jsx4("tbody",{children:rows.map((row,index)=>jsx4("tr",{children:columns.map((_,column)=>jsx4("td",{children:row[column]==null?"":String(row[column])},column))},index))})]})]})}var KEY_ALIASES={esc:"escape",return:"enter",up:"arrowup",down:"arrowdown",left:"arrowleft",right:"arrowright",del:"delete",spacebar:"space"," ":"space",plus:"+",pgup:"pageup",pgdn:"pagedown"},MOD_ALIASES={mod:"mod",cmd:"mod",command:"mod",meta:"mod",ctrl:"ctrl",control:"ctrl",alt:"alt",option:"alt",opt:"alt",shift:"shift"},NAMED_KEYS=new Set(["escape","enter","tab","space","backspace","delete","insert","arrowup","arrowdown","arrowleft","arrowright","home","end","pageup","pagedown","f1","f2","f3","f4","f5","f6","f7","f8","f9","f10","f11","f12"]),SYMBOL_CODES={"/":{code:"Slash",shift:!1},"?":{code:"Slash",shift:!0},"[":{code:"BracketLeft",shift:!1},"{":{code:"BracketLeft",shift:!0},"]":{code:"BracketRight",shift:!1},"}":{code:"BracketRight",shift:!0},",":{code:"Comma",shift:!1},"<":{code:"Comma",shift:!0},".":{code:"Period",shift:!1},">":{code:"Period",shift:!0},";":{code:"Semicolon",shift:!1},":":{code:"Semicolon",shift:!0},"'":{code:"Quote",shift:!1},'"':{code:"Quote",shift:!0},"`":{code:"Backquote",shift:!1},"~":{code:"Backquote",shift:!0},"-":{code:"Minus",shift:!1},_:{code:"Minus",shift:!0},"=":{code:"Equal",shift:!1},"+":{code:"Equal",shift:!0},"\\":{code:"Backslash",shift:!1},"|":{code:"Backslash",shift:!0},"!":{code:"Digit1",shift:!0},"@":{code:"Digit2",shift:!0},"#":{code:"Digit3",shift:!0},$:{code:"Digit4",shift:!0},"%":{code:"Digit5",shift:!0},"^":{code:"Digit6",shift:!0},"&":{code:"Digit7",shift:!0},"*":{code:"Digit8",shift:!0},"(":{code:"Digit9",shift:!0},")":{code:"Digit0",shift:!0}},NAMED_CODES={escape:["Escape"],enter:["Enter","NumpadEnter"],tab:["Tab"],space:["Space"],backspace:["Backspace"],delete:["Delete"],insert:["Insert"],arrowup:["ArrowUp"],arrowdown:["ArrowDown"],arrowleft:["ArrowLeft"],arrowright:["ArrowRight"],home:["Home"],end:["End"],pageup:["PageUp"],pagedown:["PageDown"]};function isLetterKey(key){return/^[a-z]$/.test(key)}function isDigitKey(key){return/^[0-9]$/.test(key)}function isSymbolKey(key){return key.length===1&&!isLetterKey(key)&&!isDigitKey(key)}function normalizeKeyName(raw){if(raw.length===1){let lower2=raw.toLowerCase();return KEY_ALIASES[raw]??lower2}let lower=raw.toLowerCase();return KEY_ALIASES[lower]??lower}var KeySpecError=class extends Error{constructor(spec,reason){super(`Invalid key spec "${spec}": ${reason}`),this.name="KeySpecError"}};function parseChord2(step,spec){let chord={key:"",mod:!1,ctrl:!1,alt:!1,shift:!1},parts;step==="+"?parts=["+"]:step.endsWith("++")?parts=[...step.slice(0,-2).split("+"),"+"]:parts=step.split("+");let rawKey=parts.pop()??"";if(!rawKey)throw new KeySpecError(spec,"missing key");for(let part of parts){let modifier=MOD_ALIASES[part.toLowerCase()];if(!modifier)throw new KeySpecError(spec,`unknown modifier "${part}"`);chord[modifier]=!0}let key=normalizeKeyName(rawKey);if(key.length!==1&&!NAMED_KEYS.has(key))throw new KeySpecError(spec,`unknown key "${rawKey}"`);return chord.key=key,isSymbolKey(key)&&!chord.alt&&(chord.shift=!1),chord}var parseCache=new Map;function parseKeySpec(spec){let cached=parseCache.get(spec);if(cached)return cached;let trimmed=spec.trim();if(!trimmed)throw new KeySpecError(spec,"empty");let parsed=(trimmed==="+"?["+"]:trimmed.split(/\s+/)).map(step=>parseChord2(step,spec));return parseCache.set(spec,parsed),parsed}function isValidKeySpec(spec){try{return parseKeySpec(spec),!0}catch{return!1}}function isSequenceSpec(spec){return parseKeySpec(spec).length>1}function keyList(keys){return keys==null?[]:typeof keys=="string"?[keys]:[...keys]}function chordToString(chord,platform){let mod=chord.mod||platform==="other"&&chord.ctrl,ctrl=platform==="mac"&&chord.ctrl,parts=[];return mod&&parts.push("mod"),ctrl&&parts.push("ctrl"),chord.alt&&parts.push("alt"),chord.shift&&parts.push("shift"),parts.push(chord.key),parts.join("+")}function canonicalKey(spec,platform="mac"){return parseKeySpec(spec).map(chord=>chordToString(chord,platform)).join(" ")}function codesFor(chord){let{key}=chord;if(isLetterKey(key))return{codes:[`Key${key.toUpperCase()}`],shift:null};if(isDigitKey(key))return{codes:[`Digit${key}`,`Numpad${key}`],shift:null};let named=NAMED_CODES[key];if(named)return{codes:[...named],shift:null};let symbol=SYMBOL_CODES[key];return symbol?{codes:[symbol.code],shift:symbol.shift}:{codes:[],shift:null}}function normalizedEventKey(key){return key===" "||key==="Spacebar"?"space":key==="Esc"?"escape":key==="Up"||key==="Down"||key==="Left"||key==="Right"?`arrow${key.toLowerCase()}`:key==="Del"?"delete":(key.length===1,key.toLowerCase())}function matchChord(event,chord,platform){let meta=!!event.metaKey,ctrl=!!event.ctrlKey,alt=!!event.altKey,shift=!!event.shiftKey,wantMeta=platform==="mac"?chord.mod:!1,wantCtrl=platform==="mac"?chord.ctrl:chord.mod||chord.ctrl;if(chord.alt){if(!alt||meta!==wantMeta||ctrl!==wantCtrl)return!1;let{codes,shift:symbolShift}=codesFor(chord);if(!event.code||!codes.includes(event.code))return!1;let wantShift=symbolShift??chord.shift;return shift===wantShift}let key=normalizedEventKey(event.key??"");return isSymbolKey(chord.key)?key!==chord.key||meta!==wantMeta?!1:platform==="other"?wantCtrl?ctrl:!ctrl||alt:ctrl===wantCtrl:alt||meta!==wantMeta||ctrl!==wantCtrl?!1:isLetterKey(chord.key)?shift!==chord.shift?!1:key===chord.key?!0:key.length===1&&/\p{L}/u.test(key)&&!/^[a-z]$/.test(key)&&event.code===`Key${chord.key.toUpperCase()}`:isDigitKey(chord.key)?key===chord.key:key===chord.key&&shift===chord.shift}function matchKey(event,spec,platform,firstStep=!1){let chords;try{chords=parseKeySpec(spec)}catch{return!1}return chords.length>1&&!firstStep?!1:matchChord(event,chords[0],platform)}function isModifierOnlyKey(key){return key==="Shift"||key==="Control"||key==="Alt"||key==="Meta"||key==="AltGraph"||key==="CapsLock"||key==="OS"||key==="Fn"||key==="Hyper"||key==="Super"}var HOST_RESERVED_KEYS=Object.freeze(["/","c","shift+c","shift+tab","mod+s","mod+d","alt+p","alt+s","?","escape","mod+k"]),reservedCanonical={mac:new Set(HOST_RESERVED_KEYS.map(spec=>canonicalKey(spec,"mac"))),other:new Set(HOST_RESERVED_KEYS.map(spec=>canonicalKey(spec,"other")))};function isHostReserved(spec){for(let platform of["mac","other"]){let canonical=canonicalKey(spec,platform),first=canonical.split(" ")[0];if(reservedCanonical[platform].has(canonical)||reservedCanonical[platform].has(first))return!0}return!1}var KEY_JOIN_WORDS=Object.freeze({then:{en:"then",fr:"puis"},or:{en:"or",fr:"ou"}}),MAC_GLYPH={ctrl:"\u2303",alt:"\u2325",shift:"\u21E7",mod:"\u2318"};function keyName(key,mac,fr){switch(key){case"enter":return mac?"\u21B5":fr?"Entr\xE9e":"Enter";case"escape":return fr?"\xC9chap":"Esc";case"space":return fr?"Espace":"Space";case"arrowdown":return"\u2193";case"arrowup":return"\u2191";case"arrowleft":return"\u2190";case"arrowright":return"\u2192";case"tab":return"Tab";case"backspace":return mac?"\u232B":fr?"Retour arri\xE8re":"Backspace";case"delete":return mac?"\u2326":fr?"Suppr":"Delete";case"insert":return fr?"Inser":"Insert";case"home":return fr?"D\xE9but":"Home";case"end":return fr?"Fin":"End";case"pagedown":return fr?"Pg suiv":"PgDn";case"pageup":return fr?"Pg pr\xE9c":"PgUp";default:return key.length===1?key.toUpperCase():key[0].toUpperCase()+key.slice(1)}}function formatChord(chord,{platform,locale}){let mac=platform==="mac",fr=locale==="fr";if(mac)return["ctrl","alt","shift","mod"].filter(m=>chord[m]).map(m=>MAC_GLYPH[m]).join("")+keyName(chord.key,mac,fr);let names=[];return(chord.mod||chord.ctrl)&&names.push("Ctrl"),chord.alt&&names.push("Alt"),chord.shift&&names.push(fr?"Maj":"Shift"),[...names,keyName(chord.key,mac,fr)].join("+")}function formatKeyParts(spec,options){return keyList(spec).map(one=>parseKeySpec(one).map(chord=>formatChord(chord,options)))}function formatKey(spec,options){let then=` ${KEY_JOIN_WORDS.then[options.locale]} `,or=` ${KEY_JOIN_WORDS.or[options.locale]} `;return formatKeyParts(spec,options).map(caps=>caps.join(then)).join(or)}var ARIA_KEY={escape:"Escape",enter:"Enter",tab:"Tab",space:"Space",backspace:"Backspace",delete:"Delete",insert:"Insert",arrowup:"ArrowUp",arrowdown:"ArrowDown",arrowleft:"ArrowLeft",arrowright:"ArrowRight",home:"Home",end:"End",pageup:"PageUp",pagedown:"PageDown"};function toAriaKeyShortcuts(spec,platform){return keyList(spec).map(one=>parseKeySpec(one)).filter(chords=>chords.length===1).map(([chord])=>{let parts=[];chord.mod&&parts.push(platform==="mac"?"Meta":"Control"),chord.ctrl&&!(chord.mod&&platform!=="mac")&&parts.push("Control"),chord.alt&&parts.push("Alt"),chord.shift&&parts.push("Shift");let key=chord.key;return parts.push(ARIA_KEY[key]??(key.length===1?key.toUpperCase():key[0].toUpperCase()+key.slice(1))),parts.join("+")}).join(" ")}var SPOKEN_KEY=Object.freeze({enter:{en:"Enter",fr:"Entr\xE9e"},escape:{en:"Escape",fr:"\xC9chap"},space:{en:"Space",fr:"Espace"},arrowdown:{en:"Down arrow",fr:"Fl\xE8che bas"},arrowup:{en:"Up arrow",fr:"Fl\xE8che haut"},arrowleft:{en:"Left arrow",fr:"Fl\xE8che gauche"},arrowright:{en:"Right arrow",fr:"Fl\xE8che droite"},backspace:{en:"Backspace",fr:"Retour arri\xE8re"},delete:{en:"Delete",fr:"Suppr"},pagedown:{en:"Page down",fr:"Page suivante"},pageup:{en:"Page up",fr:"Page pr\xE9c\xE9dente"}}),SPOKEN_MOD=Object.freeze({ctrl:{en:"Control",fr:"Contr\xF4le"},alt:{mac:{en:"Option",fr:"Option"},other:{en:"Alt",fr:"Alt"}},shift:{en:"Shift",fr:"Maj"},mod:{mac:{en:"Command",fr:"Commande"},other:{en:"Control",fr:"Contr\xF4le"}}});function formatKeySpoken(spec,{platform,locale}){let then=` ${KEY_JOIN_WORDS.then[locale]} `,or=` ${KEY_JOIN_WORDS.or[locale]} `,chordWords=chord=>{let parts=[];return chord.ctrl&&!(chord.mod&&platform!=="mac")&&parts.push(SPOKEN_MOD.ctrl[locale]),chord.alt&&parts.push(SPOKEN_MOD.alt[platform][locale]),chord.shift&&parts.push(SPOKEN_MOD.shift[locale]),chord.mod&&parts.push(SPOKEN_MOD.mod[platform][locale]),parts.push(SPOKEN_KEY[chord.key]?.[locale]??keyName(chord.key,!1,locale==="fr")),parts.join(" ")};return keyList(spec).map(one=>parseKeySpec(one).map(chordWords).join(then)).join(or)}function actionErrorReason(error){if(!error||typeof error!="object")return null;let{name,code,reason}=error;return name!=="ActionError"||code!=="notis_action_error"?null:typeof reason=="string"||isWords(reason)?reason:null}var counted=(oneEn,otherEn,oneFr,otherFr)=>({one:{en:oneEn,fr:oneFr},other:{en:otherEn,fr:otherFr}}),same=(en,fr)=>({one:{en,fr},other:{en,fr}}),STANDARD_ACTIONS=Object.freeze({complete:{id:"complete",label:{en:"Complete",fr:"Terminer"},icon:"check",key:"e",tone:"default",toast:counted("1 item completed.","{n} items completed.","1 \xE9l\xE9ment termin\xE9.","{n} \xE9l\xE9ments termin\xE9s.")},archive:{id:"archive",label:{en:"Archive",fr:"Archiver"},icon:"archive",key:"e",tone:"default",toast:counted("1 item archived.","{n} items archived.","1 \xE9l\xE9ment archiv\xE9.","{n} \xE9l\xE9ments archiv\xE9s.")},unarchive:{id:"unarchive",label:{en:"Move to triage",fr:"D\xE9placer vers le tri"},icon:"tray-arrow-up",key:"shift+e",tone:"default",toast:counted("1 item restored.","{n} items restored.","1 \xE9l\xE9ment restaur\xE9.","{n} \xE9l\xE9ments restaur\xE9s.")},star:{id:"star",label:{en:"Star",fr:"Mettre en favori"},icon:"star",key:"s",tone:"default",toggle:"unstar",toast:counted("1 item starred.","{n} items starred.","1 \xE9l\xE9ment ajout\xE9 aux favoris.","{n} \xE9l\xE9ments ajout\xE9s aux favoris.")},unstar:{id:"unstar",label:{en:"Unstar",fr:"Retirer des favoris"},icon:"star",key:"s",tone:"default",toggle:"star",toast:null},later:{id:"later",label:{en:"Later",fr:"Plus tard"},icon:"clock",key:"h",tone:"default",toast:same("Snoozed until tomorrow.","Report\xE9 \xE0 demain.")},move:{id:"move",label:{en:"Move to\u2026",fr:"D\xE9placer vers\u2026"},icon:"arrow-bend-up-right",key:"m",tone:"default",toast:null,picker:!0},assign:{id:"assign",label:{en:"Assign\u2026",fr:"Attribuer\u2026"},icon:"user-plus",key:"a",tone:"default",toast:null,picker:!0},read:{id:"read",label:{en:"Mark as read",fr:"Marquer comme lu"},icon:"envelope-open",key:"u",tone:"default",toggle:"unread",toast:null},unread:{id:"unread",label:{en:"Mark as unread",fr:"Marquer comme non lu"},icon:"envelope-simple",key:"u",tone:"default",toggle:"read",toast:null},delete:{id:"delete",label:{en:"Delete",fr:"Supprimer"},icon:"trash",key:"#",tone:"danger",toast:counted("1 item deleted.","{n} items deleted.","1 \xE9l\xE9ment supprim\xE9.","{n} \xE9l\xE9ments supprim\xE9s.")},progress:{id:"progress",label:{en:"Start progress",fr:"Passer en cours"},icon:"circle-half",key:null,tone:"default",toast:null},pause:{id:"pause",label:{en:"Pause",fr:"Mettre en pause"},icon:"pause",key:null,tone:"default",toggle:"resume",toast:null},resume:{id:"resume",label:{en:"Resume",fr:"Reprendre"},icon:"play",key:null,tone:"default",toggle:"pause",toast:null},enable:{id:"enable",label:{en:"Enable",fr:"Activer"},icon:"toggle-right",key:null,tone:"default",toggle:"disable",toast:null},disable:{id:"disable",label:{en:"Disable",fr:"D\xE9sactiver"},icon:"toggle-left",key:null,tone:"default",toggle:"enable",toast:null},waiting:{id:"waiting",label:{en:"Waiting",fr:"En attente"},icon:"hourglass",key:"w",tone:"default",toast:null,managerOnly:!0}});function isStandardActionId(id){return typeof id=="string"&&Object.prototype.hasOwnProperty.call(STANDARD_ACTIONS,id)}function actionToast(id,n){let toast=STANDARD_ACTIONS[id].toast;return toast?fillWords(n===1?toast.one:toast.other,{n}):null}function resolveActionRef(ref){if(typeof ref=="string")return standardDefaults(ref);let toastOff=Object.prototype.hasOwnProperty.call(ref,"toast")&&!ref.toast,merged=isStandardActionId(ref.id)?{...standardDefaults(ref.id),...stripUndefined(ref)}:{...ref};return toastOff&&(merged.toast=null),merged}function toWords(value){return typeof value=="string"?{en:value,fr:value}:value}function standardDefaults(id){let action=STANDARD_ACTIONS[id];return{id,label:action.label,icon:action.icon,key:action.key??void 0,tone:action.tone,toast:action.toast?n=>actionToast(id,n):void 0,...action.toggle?{toggle:action.toggle}:{}}}function stripUndefined(value){let out={};for(let[k,v]of Object.entries(value))v!==void 0&&(out[k]=v);return out}var SHELL_WORDS=Object.freeze({open:{en:"Open",fr:"Ouvrir"},back:{en:"Back",fr:"Retour"},close:{en:"Close",fr:"Fermer"},previous:{en:"Previous",fr:"Pr\xE9c\xE9dent"},next:{en:"Next",fr:"Suivant"},more:{en:"More",fr:"Plus"},clear:{en:"Clear",fr:"Effacer"},removeNamed:{en:"Remove {name}",fr:"Retirer {name}"},savingNamed:{en:"Saving {name}",fr:"Enregistrement de {name}"},clearSelection:{en:"Clear selection",fr:"Effacer la s\xE9lection"},undo:{en:"Undo",fr:"Annuler"},select:{en:"Select",fr:"S\xE9lectionner"},selectAll:{en:"Select all",fr:"Tout s\xE9lectionner"},extendSelection:{en:"Extend selection",fr:"\xC9tendre la s\xE9lection"},closeThenClear:{en:"Close, then clear selection",fr:"Fermer, puis effacer la s\xE9lection"},showShortcuts:{en:"Show shortcuts",fr:"Afficher les raccourcis"},search:{en:"Search",fr:"Rechercher"},tryAgain:{en:"Try again",fr:"R\xE9essayer"},selectedOne:{en:"1 selected",fr:"1 s\xE9lectionn\xE9"},selectedMany:{en:"{n} selected",fr:"{n} s\xE9lectionn\xE9s"},sidePeek:{en:"Side peek",fr:"Aper\xE7u lat\xE9ral"},centerPeek:{en:"Center peek",fr:"Aper\xE7u centr\xE9"},fullPage:{en:"Full page",fr:"Pleine page"},openAs:{en:"Open as",fr:"Ouvrir en"}});function selectedCount(n){return n===1?SHELL_WORDS.selectedOne:fillWords(SHELL_WORDS.selectedMany,{n})}var HELP_WORDS=Object.freeze({title:{en:"Keyboard shortcuts",fr:"Raccourcis clavier"},groupSpace:{en:"This Space",fr:"Ce Space"},groupNotis:{en:"Notis",fr:"Notis"},close:{en:"Close",fr:"Fermer"},empty:{en:"No shortcuts here.",fr:"Aucun raccourci ici."}});var entry=(id,keys,scope,en,fr,extra={})=>Object.freeze({id,keys:Object.freeze(keys),scope,label:Object.freeze({en,fr}),...extra}),DEFAULT_KEYMAP=Object.freeze({"list.next":entry("list.next",["j","arrowdown"],"collection","Next item","\xC9l\xE9ment suivant",{repeat:!0}),"list.prev":entry("list.prev",["k","arrowup"],"collection","Previous item","\xC9l\xE9ment pr\xE9c\xE9dent",{repeat:!0}),"list.extendDown":entry("list.extendDown",["shift+j","shift+arrowdown"],"collection","Extend selection down","\xC9tendre la s\xE9lection vers le bas",{repeat:!0}),"list.extendUp":entry("list.extendUp",["shift+k","shift+arrowup"],"collection","Extend selection up","\xC9tendre la s\xE9lection vers le haut",{repeat:!0}),"list.open":entry("list.open",["enter","o"],"collection","Open","Ouvrir"),"list.toggleSelect":entry("list.toggleSelect",["x"],"collection","Select","S\xE9lectionner"),"list.selectAll":entry("list.selectAll",["mod+a"],"collection","Select all","Tout s\xE9lectionner"),"period.prev":entry("period.prev",["["],"collection","Previous period","P\xE9riode pr\xE9c\xE9dente"),"period.next":entry("period.next",["]"],"collection","Next period","P\xE9riode suivante"),"period.today":entry("period.today",["t"],"collection","Today","Aujourd\u2019hui"),undo:entry("undo",["z","mod+z"],"route","Undo","Annuler"),"view.prev":entry("view.prev",["["],"route","Previous view","Vue pr\xE9c\xE9dente"),"view.next":entry("view.next",["]"],"route","Next view","Vue suivante"),"host.help":entry("host.help",["?"],"app","Show keyboard shortcuts","Afficher les raccourcis clavier",{host:!0}),"host.escape":entry("host.escape",["escape"],"app","Close, then go back","Fermer, puis revenir",{host:!0}),"host.search":entry("host.search",["/"],"app","Search","Rechercher",{host:!0}),"host.newChat":entry("host.newChat",["c"],"app","New conversation","Nouvelle conversation",{host:!0}),"host.call":entry("host.call",["shift+c"],"app","Open voice call","Ouvrir l\u2019appel vocal",{host:!0}),"host.toggleSidebar":entry("host.toggleSidebar",["mod+s"],"app","Toggle sidebar","Afficher ou masquer la barre lat\xE9rale",{host:!0}),"host.voiceMessage":entry("host.voiceMessage",["mod+d"],"app","Voice message","Message vocal",{host:!0}),"host.modelMenu":entry("host.modelMenu",["alt+p"],"app","Model menu","Menu du mod\xE8le",{host:!0}),"host.speedMenu":entry("host.speedMenu",["alt+s"],"app","Speed menu","Menu de vitesse",{host:!0}),"host.toggleVoiceCall":entry("host.toggleVoiceCall",["shift+tab"],"app","Toggle voice call in panel","Afficher ou masquer l\u2019appel vocal dans le panneau",{host:!0}),"host.commandMenu":entry("host.commandMenu",["mod+k"],"app","Command menu","Menu des commandes",{host:!0}),"host.goInbox":entry("host.goInbox",["g i"],"app","Go to Inbox","Aller \xE0 l\u2019Inbox",{host:!0,managerOnly:!0}),"host.goStarred":entry("host.goStarred",["g s"],"app","Go to Starred","Aller aux Favoris",{host:!0,managerOnly:!0}),"host.goDone":entry("host.goDone",["g d"],"app","Go to Done","Aller \xE0 Termin\xE9",{host:!0,managerOnly:!0})});var PLATFORMS=["mac","other"];function keyFingerprints(keys){let out=new Map;for(let spec of keyList(keys))for(let platform of PLATFORMS)out.set(`${platform}:${canonicalKey(spec,platform)}`,canonicalKey(spec,"mac"));return out}function ownerOf(candidate){return candidate.owner??"notis"}function ownerKindOf(candidate){return candidate.ownerKind?candidate.ownerKind:ownerOf(candidate)==="notis"?"host":"space"}function selfClashes(candidate){let clashes=[],space=ownerKindOf(candidate)==="space";for(let spec of keyList(candidate.keys)){try{parseKeySpec(spec)}catch(error){clashes.push({kind:"invalid",severity:"error",key:spec,ids:[candidate.id],scope:candidate.scope,owner:ownerOf(candidate),message:error.message});continue}space&&isHostReserved(spec)&&clashes.push({kind:"reserved",severity:"error",key:canonicalKey(spec),ids:[candidate.id],scope:candidate.scope,owner:ownerOf(candidate),message:`"${candidate.id}" uses ${canonicalKey(spec)}, which Notis keeps for itself. Pick another key.`})}return space&&candidate.scope==="app"&&clashes.push({kind:"app-scope",severity:"error",key:keyList(candidate.keys).join(", "),ids:[candidate.id],scope:"app",owner:ownerOf(candidate),message:`"${candidate.id}" registers at app scope, which only Notis uses. Use route or a lower scope.`}),clashes}function safeFingerprints(keys){try{return keyFingerprints(keys)}catch{return new Map}}function pairClashes(earlier,later){if(earlier.available===!1||later.available===!1)return[];let a=safeFingerprints(earlier.keys),b=safeFingerprints(later.keys),shared=new Set;for(let[fingerprint,key]of b)a.has(fingerprint)&&shared.add(key);let clashes=[],sameOwner=ownerOf(earlier)===ownerOf(later);for(let key of shared)if(earlier.scope===later.scope&&sameOwner)clashes.push({kind:"duplicate",severity:"error",key,ids:[earlier.id,later.id],scope:later.scope,owner:ownerOf(later),message:`NotisKeyClash: "${earlier.id}" and "${later.id}" both use ${key} in the ${later.scope} scope.`});else if(earlier.scope!==later.scope){let[low,high]=SCOPE_ORDER[earlier.scope]<SCOPE_ORDER[later.scope]?[earlier,later]:[later,earlier];clashes.push({kind:"shadowed",severity:"info",key,ids:[high.id,low.id],scopes:[high.scope,low.scope],message:`${key}: "${high.id}" (${high.scope}) is asked before "${low.id}" (${low.scope}).`})}if(earlier.scope===later.scope&&sameOwner)for(let[single,sequence]of[[earlier,later],[later,earlier]])for(let one of keyList(single.keys))for(let seq of keyList(sequence.keys)){let s,q;try{s=parseKeySpec(one),q=parseKeySpec(seq)}catch{continue}s.length!==1||q.length<2||canonicalKey(one)===canonicalKey(seq).split(" ")[0]&&clashes.push({kind:"prefix",severity:"info",key:canonicalKey(one),ids:[single.id,sequence.id],scope:single.scope,owner:ownerOf(single),message:`${canonicalKey(one)} runs "${single.id}" at once, so "${sequence.id}" (${canonicalKey(seq)}) never starts.`})}return clashes}var ROOT_OWNER="notis",NotisKeyClash=class extends Error{clash;constructor(clash){super(clash.message.startsWith("NotisKeyClash")?clash.message:`NotisKeyClash: ${clash.message}`),this.name="NotisKeyClash",this.clash=clash}},MAX_BOOST=99,ShortcutRegistry=class{entries=[];owners=new Map;seq=0;version=0;listeners=new Set;warned=new Set;options;constructor(options={}){this.options={strict:options.strict??!0,onClash:options.onClash}}subscribe(listener){return this.listeners.add(listener),()=>{this.listeners.delete(listener)}}getVersion(){return this.version}notify(){this.version+=1;for(let listener of[...this.listeners])listener()}defineOwner(id,options={}){if(id===ROOT_OWNER)return()=>{};let parent=options.parent??ROOT_OWNER,existing=this.owners.get(id);existing?(existing.refs+=1,existing.parent=parent,options.kind&&(existing.kind=options.kind),options.available!==void 0&&existing.available!==options.available&&(existing.available=options.available)):this.owners.set(id,{id,parent,kind:options.kind??this.inheritedKind(parent),available:options.available??!0,refs:1}),this.notify();let released=!1;return()=>{if(released)return;released=!0;let record=this.owners.get(id);record&&(record.refs-=1,record.refs<=0&&this.owners.delete(id),this.notify())}}setOwnerAvailable(id,available){let record=this.owners.get(id);!record||record.available===available||(record.available=available,this.notify())}inheritedKind(parent){return parent===ROOT_OWNER?"space":this.owners.get(parent)?.kind??"space"}ownerKind(id){return id===ROOT_OWNER?"host":this.owners.get(id)?.kind??"space"}isOwnerAvailable(id){let current=id,seen=new Set;for(;current&&current!==ROOT_OWNER&&!seen.has(current);){seen.add(current);let record=this.owners.get(current);if(!record)return!0;if(!record.available)return!1;current=record.parent}return!0}register(def,owner=def.owner??ROOT_OWNER){let ownerKind=this.ownerKind(owner),candidate=this.candidate(def,owner,ownerKind),errors=selfClashes(candidate).filter(clash=>clash.severity==="error");if(errors.length)return this.reject(errors[0]),null;if(this.isOwnerAvailable(owner))for(let entry3 of this.entries){if(entry3.owner!==owner||entry3.def.scope!==def.scope||!this.isOwnerAvailable(entry3.owner))continue;let duplicate=pairClashes(this.candidate(entry3.def,entry3.owner,entry3.ownerKind),candidate).find(clash=>clash.kind==="duplicate");if(duplicate)return this.reject(duplicate),null}let boost=Math.max(0,Math.min(MAX_BOOST,def.boost??0)),entry2={def,owner,ownerKind,seq:++this.seq,rank:SCOPE_ORDER[def.scope]+boost,chords:keyList(def.keys).map(spec=>parseKeySpec(spec))};this.entries.push(entry2),this.notify();let removed=!1;return()=>{if(removed)return;removed=!0;let index=this.entries.indexOf(entry2);index!==-1&&this.entries.splice(index,1),this.notify()}}candidate(def,owner,ownerKind){return{id:def.id,keys:def.keys,scope:def.scope,owner,ownerKind,available:!0}}reject(clash){if(this.options.strict)throw new NotisKeyClash(clash);if(this.warned.has(clash.message))return;this.warned.add(clash.message),(this.options.onClash??(message=>{typeof console<"u"&&console.warn(`[notis keys] ${message} The later shortcut was ignored.`)}))(clash.message)}all(){return this.entries}active(options={}){return this.entries.filter(entry2=>(!options.modalOnly||entry2.def.scope==="modal")&&this.isOwnerAvailable(entry2.owner)).sort((a,b)=>b.rank-a.rank||b.seq-a.seq)}helpEntries(){let byId=new Map,ordered=[...this.entries].sort((a,b)=>a.seq-b.seq);for(let entry2 of ordered){let{def}=entry2;if(def.hidden||def.scope==="modal"||!this.isOwnerAvailable(entry2.owner)||def.when&&!safeWhen(def.when))continue;let group=def.group??(entry2.ownerKind==="space"?"space":"notis");byId.delete(def.id),byId.set(def.id,{id:def.id,keys:keyList(def.keys),label:def.label,group,scope:def.scope,owner:entry2.owner})}let rows=[...byId.values()];return[...rows.filter(row=>row.group==="space"),...rows.filter(row=>row.group==="notis")]}helpText(locale){return this.helpEntries().map(row=>({group:row.group,label:row.label[locale],keys:row.keys}))}};function safeWhen(when){try{return when()!==!1}catch{return!1}}var NON_TEXT_INPUTS=new Set(["button","checkbox","color","file","hidden","image","radio","reset","submit"]);function isElement(value){return!!value&&typeof value.matches=="function"}function eventTarget(event){let first=(typeof event.composedPath=="function"?event.composedPath():[]).find(isElement);return first||(isElement(event.target)?event.target:null)}function closestComposed(element,selector){let current=element;for(;current;){let found=current.closest(selector);if(found)return found;let root=current.getRootNode();current="host"in root?root.host:null}return null}function containsComposed(container,element){let current=element;for(;current&&container;){if(container.contains(current))return!0;let root=current.getRootNode();current="host"in root?root.host:null}return!1}function isTextEntry(element){if(!element)return!1;let tag=element.tagName;return tag==="TEXTAREA"||tag==="SELECT"?!0:tag==="INPUT"?!NON_TEXT_INPUTS.has((element.type||"text").toLowerCase()):element.isContentEditable?!0:closestComposed(element,'[contenteditable=""], [contenteditable="true"], [contenteditable="plaintext-only"], [role="textbox"], [role="combobox"], [role="searchbox"]')!==null}function fieldOwnsEscape(element){return!element||!isTextEntry(element)?!1:closestComposed(element,"[data-notis-floating]")?element.getAttribute("aria-expanded")==="true":!0}function isInsideOpenMenu(element){if(!element)return!1;let menu=closestComposed(element,'[role="menu"], [role="listbox"], [role="menubar"]');return!menu||menu.hasAttribute("data-notis-engine-list")?!1:menu.getAttribute("data-state")!=="closed"}function blocksShortcuts(element,options){return options.inFields?!1:!!(isTextEntry(element)||!options.modal&&isInsideOpenMenu(element))}function isActivatable(element){return closestComposed(element,'button, a[href], [role="button"], [role="switch"], [role="checkbox"], [role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"], summary, input[type="checkbox"], input[type="radio"]')!==null}function ownsArrows(element){return closestComposed(element,'input[type="range"], [role="slider"], [role="tablist"], [role="radiogroup"], [role="spinbutton"], [role="separator"][tabindex], [role="tree"], [role="grid"]')!==null}function keysOff(element){return closestComposed(element,'[data-notis-keys="off"]')!==null}function isVisibleComposed(element){if(!element?.isConnected)return!1;let current=element;for(;current;){if(current.hasAttribute("hidden")||current.hasAttribute("inert")||current.getAttribute("aria-hidden")==="true")return!1;let style=current.ownerDocument.defaultView?.getComputedStyle(current);if(style?.display==="none"||style?.visibility==="hidden")return!1;let root=current.getRootNode();current=current.parentElement??("host"in root?root.host:null)}return!0}function collectRoots(doc){let roots=[doc],visit=root=>{let walker=doc.createTreeWalker(root,1);for(let node=walker.nextNode();node;node=walker.nextNode()){let shadow=node.shadowRoot;shadow&&(roots.push(shadow),visit(shadow))}};return visit(doc),roots}function queryAllComposed(doc,selector,event){let found=new Set;for(let root of collectRoots(doc))for(let el of root.querySelectorAll(selector))found.add(el);if(event&&typeof event.composedPath=="function")for(let target of event.composedPath())isElement(target)&&target.matches(selector)&&found.add(target);return[...found]}var MODAL_LAYER=['[role="dialog"][aria-modal="true"]','[role="dialog"][data-state="open"]','[role="alertdialog"]:not([data-state="closed"])',"dialog.notis-dialog[open]",'dialog[open][aria-modal="true"]','[role="menu"][data-state="open"]','[role="listbox"][data-state="open"]'].join(", ");function openModalLayers(doc,event){return queryAllComposed(doc,MODAL_LAYER,event).filter(el=>!el.closest("[data-notis-nonmodal]")&&isVisibleComposed(el))}function hasOpenModal(doc,event){return openModalLayers(doc,event).length>0}function modalLayerOf(element){let current=element;for(;current;){let layer=closestComposed(current,MODAL_LAYER);if(!layer)return null;if(!layer.closest("[data-notis-nonmodal]"))return layer;let root=layer.getRootNode();current=layer.parentElement??("host"in root?root.host:null)}return null}var FLOATING_LAYER='dialog[open], [role="dialog"]:not([data-state="closed"]), [role="alertdialog"]:not([data-state="closed"]), [role="menu"]:not([data-state="closed"]), [role="listbox"][data-state="open"]';function foreignFloatingLayers(doc,event){return queryAllComposed(doc,FLOATING_LAYER,event).filter(el=>!el.closest("[data-notis-escape-owned]")&&isVisibleComposed(el))}var ESCAPE_PRIORITY=Object.freeze({route:0,detail:100,selection:200,help:300,overlay:400}),SEQUENCE_TIMEOUT_MS=1500;function detectPlatform(){if(typeof navigator>"u")return"other";let nav=navigator,name=nav.userAgentData?.platform||nav.platform||nav.userAgent||"";return/mac|iphone|ipad|ipod/i.test(name)?"mac":"other"}function detectLocale(){if(typeof document>"u")return"en";let lang=document.querySelector("html")?.getAttribute("lang")??"";return/^fr\b/i.test(lang)?"fr":"en"}function defaultStrict(){return globalThis.process?.env?.NODE_ENV!=="production"}function consume(event,immediate=!1){event.preventDefault(),immediate?event.stopImmediatePropagation():event.stopPropagation()}function isUnmodifiedEscape(event){return event.key==="Escape"&&!event.metaKey&&!event.ctrlKey&&!event.altKey&&!event.shiftKey}var KeyboardEngineCore=class{registry;settings;mounted=0;now=()=>Date.now();layers=[];blockers=[];seq=0;held=new Set;pending=null;attached=new Map;helpOpen=!1;helpUnregister=null;forcedRepeat=new WeakSet;constructor(settings={}){this.settings={host:settings.host??"portal",locale:settings.locale??detectLocale(),platform:settings.platform??detectPlatform(),strict:settings.strict??defaultStrict(),onClash:settings.onClash},this.registry=new ShortcutRegistry({strict:this.settings.strict,onClash:this.settings.onClash})}configure(settings,options={}){let next={...this.settings};for(let[key,value]of Object.entries(settings))value!==void 0&&(next[key]=value);let changed=Object.keys(next).some(key=>next[key]!==this.settings[key]);return this.settings=next,this.registry.options={strict:next.strict,onClash:next.onClash},changed&&!options.silent&&this.registry.notify(),changed}subscribe(listener){return this.registry.subscribe(listener)}getVersion(){return this.registry.getVersion()}attach(doc){let existing=this.attached.get(doc);if(existing)existing.refs+=1;else{let onKeyDown=event=>this.handleKeyDown(event),onKeyUp=event=>this.handleKeyUp(event),onReset=()=>this.resetHeld(),onVisibility=()=>{doc.visibilityState==="hidden"&&this.resetHeld()};doc.addEventListener("keydown",onKeyDown,!0),doc.addEventListener("keyup",onKeyUp,!0),doc.addEventListener("visibilitychange",onVisibility),doc.defaultView?.addEventListener("blur",onReset),this.attached.set(doc,{refs:1,detach:()=>{doc.removeEventListener("keydown",onKeyDown,!0),doc.removeEventListener("keyup",onKeyUp,!0),doc.removeEventListener("visibilitychange",onVisibility),doc.defaultView?.removeEventListener("blur",onReset)}})}this.ensureHelpShortcut();let detached=!1;return()=>{if(detached)return;detached=!0;let record=this.attached.get(doc);record&&(record.refs-=1,record.refs<=0&&(record.detach(),this.attached.delete(doc)))}}isAttached(doc){return this.attached.has(doc)}attachedDocument(){for(let doc of this.attached.keys())return doc;return null}resetHeld(){this.held.clear(),this.pending=null}register(def,owner){return this.registry.register(def,owner??def.owner??ROOT_OWNER)}defineOwner=(id,options)=>this.registry.defineOwner(id,options);setOwnerAvailable(id,available){this.registry.setOwnerAvailable(id,available)}isOwnerAvailable(id){return this.registry.isOwnerAvailable(id)}addEscapeLayer(id,onEscape,priority=ESCAPE_PRIORITY.overlay){let layer={id,onEscape,priority,seq:++this.seq};return this.layers.push(layer),()=>{let index=this.layers.indexOf(layer);index!==-1&&this.layers.splice(index,1)}}addEscapeBlocker(priority=ESCAPE_PRIORITY.detail+50,isActive){let blocker={priority,seq:++this.seq,isActive};return this.blockers.push(blocker),()=>{let index=this.blockers.indexOf(blocker);index!==-1&&this.blockers.splice(index,1)}}escapeLayerIds(){return this.sortedLayers().map(layer=>layer.id)}sortedLayers(){return[...this.layers].sort((a,b)=>b.priority-a.priority||b.seq-a.seq)}runEscapeChain(event){let blockers=this.blockers.filter(blocker=>!blocker.isActive||blocker.isActive()),top=blockers.reduce((max,blocker)=>Math.max(max,blocker.priority),-1/0);for(let layer of this.sortedLayers()){if(layer.priority<top)return!0;let handled=!1;try{handled=layer.onEscape(event)===!0}catch(error){reportError(error),handled=!0}if(handled)return!0}return blockers.length>0}isHelpOpen(){return this.helpOpen}openHelp(){this.helpOpen||(this.helpOpen=!0,this.registry.notify())}closeHelp(){this.helpOpen&&(this.helpOpen=!1,this.registry.notify())}toggleHelp(){this.helpOpen?this.closeHelp():this.openHelp()}ensureHelpShortcut(){if(this.helpUnregister)return;let entry2=DEFAULT_KEYMAP["host.help"];this.helpUnregister=this.registry.register({id:entry2.id,keys:[...entry2.keys],scope:"app",label:entry2.label,group:"notis",run:()=>{this.toggleHelp()}},ROOT_OWNER)}isRepeat(event){return event.repeat||this.forcedRepeat.has(event)}handleKeyUp(event){if(event.key==="Meta"){this.held.clear();return}this.held.delete(event.code||event.key)}handleKeyDown(event){if(event.isComposing||event.keyCode===229)return;let key=event.key;if(!key||key==="Dead"||key==="Process"||isModifierOnlyKey(key))return;let physical=event.code||key,repeat=event.repeat||this.held.has(physical);if(event.metaKey||this.held.add(physical),repeat&&!event.repeat){this.forcedRepeat.add(event);try{Object.defineProperty(event,"repeat",{value:!0,configurable:!0})}catch{}}let target=eventTarget(event),doc=target?.ownerDocument??(typeof document<"u"?document:null);if(!doc||keysOff(target)||isUnmodifiedEscape(event)&&this.handleEscape(event,target,doc,repeat)||event.defaultPrevented)return;let lower=key.toLowerCase();if(!event.metaKey&&!event.ctrlKey&&!event.altKey&&(lower==="enter"||lower===" ")&&isActivatable(target)){this.pending=null;return}if(lower.startsWith("arrow")&&ownsArrows(target))return;let modal=null,isModal=()=>modal??=hasOpenModal(doc,event),{platform}=this.settings,eligible=entry2=>{let{def}=entry2;return!(repeat&&!def.repeat||isModal()&&def.scope!=="modal"||blocksShortcuts(target,{inFields:!!def.allowInFields,modal:def.scope==="modal"})||def.when&&!safeWhen(def.when))},pending=this.pending;if(this.pending=null,pending&&!repeat&&this.now()-pending.at<=SEQUENCE_TIMEOUT_MS){let next=pending.candidates.filter(({entry:entry2,chords})=>matchChord(event,chords[pending.step],platform)&&this.registry.all().includes(entry2)&&eligible(entry2));if(next.length){let done=next.filter(({chords})=>chords.length===pending.step+1);for(let{entry:entry2}of done)if(this.run(entry2,event)){consume(event);return}let longer=next.filter(({chords})=>chords.length>pending.step+1);if(longer.length){this.pending={candidates:longer,step:pending.step+1,at:this.now()},consume(event);return}}}let active=this.registry.active();for(let entry2 of active)if(entry2.chords.some(chords=>chords.length===1&&matchChord(event,chords[0],platform))&&eligible(entry2)&&this.run(entry2,event)){consume(event);return}if(repeat)return;let starts=[];for(let entry2 of active)for(let chords of entry2.chords)chords.length>1&&matchChord(event,chords[0],platform)&&eligible(entry2)&&starts.push({entry:entry2,chords});starts.length&&(this.pending={candidates:starts,step:1,at:this.now()},consume(event))}run(entry2,event){try{return entry2.def.run(event)!==!1}catch(error){return reportError(error),!0}}handleEscape(event,target,doc,repeat){if(this.pending=null,fieldOwnsEscape(target))return!0;let foreign=foreignFloatingLayers(doc,event);if(repeat)return(foreign.length||this.layers.length)&&consume(event,!0),!0;if(event.defaultPrevented||foreign.length)return!0;if(!this.layers.length&&!this.blockers.length)return!1;let handled=this.runEscapeChain(event);return handled&&consume(event),handled}};function reportError(error){typeof console<"u"&&console.error("[notis keys] A shortcut failed.",error)}import{createContext as createContext3}from"react";var KEY=Symbol.for("notis.sdk.ui.instance");function create(){return Object.freeze({version:1,core:new KeyboardEngineCore,EngineContext:createContext3(null),OwnerContext:createContext3(ROOT_OWNER),KeycapContext:createContext3(null)})}var local=null;function getSharedInstance(){if(local)return local;let slot=globalThis,existing=slot[KEY];if(existing&&existing.version===1)return typeof console<"u"&&console.warn("[notis keys] A second copy of the Notis toolkit loaded. It shares the first keyboard engine."),local=existing,local;local=create();try{Object.defineProperty(slot,KEY,{value:local,configurable:!0,enumerable:!1,writable:!1})}catch{}return local}import{useCallback as useCallback6,useContext as useContext3,useEffect as useEffect6,useLayoutEffect as useLayoutEffect4,useRef as useRef5,useSyncExternalStore as useSyncExternalStore2}from"react";var useIsoLayoutEffect=typeof window>"u"?useEffect6:useLayoutEffect4;function useEngineCore(){let shared=getSharedInstance();return useContext3(shared.EngineContext)??shared.core}function useShortcutOwner(){return useContext3(getSharedInstance().OwnerContext)}function useSetting(read){let core=useEngineCore(),getSnapshot=()=>read(core);return useSyncExternalStore2(useCallback6(listener=>core.subscribe(listener),[core]),getSnapshot,getSnapshot)}function useToolkitLocale(){return useSetting(core=>core.mounted>0?core.settings.locale:detectLocale())}function useToolkitPlatform(){return useSetting(core=>core.mounted>0?core.settings.platform:detectPlatform())}function useToolkitSettings(){let locale=useToolkitLocale(),platform=useToolkitPlatform(),core=useEngineCore(),host=useSetting(c=>c.settings.host),strict=useSetting(c=>c.settings.strict);return{host,locale,platform,strict,onClash:core.settings.onClash}}function defKey(def,owner){return JSON.stringify([def.id,keyList(def.keys),def.scope,def.owner??owner,def.group??"",!!def.hidden,!!def.repeat,!!def.allowInFields,def.boost??0,def.label.en,def.label.fr])}function liveDef(ref){return{...ref.current,when:()=>{let when=ref.current.when;return when?when():!0},run:event=>ref.current.run(event)}}function useShortcut(def,deps=[]){let core=useEngineCore(),owner=useShortcutOwner(),ref=useRef5(def);ref.current=def;let key=defKey(def,owner);useEffect6(()=>{let unregister=core.register(liveDef(ref),ref.current.owner??owner);return()=>{unregister?.()}},[core,owner,key,...deps])}function useShortcuts2(defs,deps=[]){let core=useEngineCore(),owner=useShortcutOwner(),ref=useRef5(defs);ref.current=defs;let key=defs.map(def=>defKey(def,owner)).join(`
2
+ var __defProp=Object.defineProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};function isInteractionElementVisible(element){if(!element?.isConnected)return!1;let current=element;for(;current;){if(current.hasAttribute("hidden")||current.hasAttribute("inert")||current.getAttribute("aria-hidden")==="true")return!1;let style=current.ownerDocument.defaultView?.getComputedStyle(current);if(style?.display==="none"||style?.visibility==="hidden")return!1;let root=current.getRootNode();current=current.parentElement??("host"in root?root.host:null)}return!0}import{createContext,useCallback,useContext,useEffect,useLayoutEffect,useMemo,useRef,useState}from"react";import{Fragment,jsx,jsxs}from"react/jsx-runtime";var SHORTCUT_SCOPE_PRIORITY={app:0,route:100,collection:200,detail:300,modal:400},SHORTCUT_CONTEXT_SYMBOL=Symbol.for("notis.sdk.shortcut_context");function getShortcutContext(){let scope=globalThis;return scope[SHORTCUT_CONTEXT_SYMBOL]||(scope[SHORTCUT_CONTEXT_SYMBOL]=createContext(null)),scope[SHORTCUT_CONTEXT_SYMBOL]}var ShortcutContext=getShortcutContext(),SHORTCUT_COLLECTION_STATE_SYMBOL=Symbol.for("notis.sdk.shortcut_collection_state");function getShortcutCollectionState(){let scope=globalThis;return scope[SHORTCUT_COLLECTION_STATE_SYMBOL]||(scope[SHORTCUT_COLLECTION_STATE_SYMBOL]={activeOwnerId:null,nextOwnerId:1}),scope[SHORTCUT_COLLECTION_STATE_SYMBOL]}function createShortcutCollectionOwner(){let state=getShortcutCollectionState();return`collection-${state.nextOwnerId++}`}function releaseShortcutCollection(ownerId){let state=getShortcutCollectionState();state.activeOwnerId===ownerId&&(state.activeOwnerId=null)}function activateShortcutCollection(ownerId){getShortcutCollectionState().activeOwnerId=ownerId}function normalizeKey(key){let lower=key.trim().toLowerCase();return lower==="esc"?"escape":lower==="return"?"enter":lower==="space"?" ":lower==="arrowup"||lower==="up"?"arrowup":lower==="arrowdown"||lower==="down"?"arrowdown":lower==="arrowleft"||lower==="left"?"arrowleft":lower==="arrowright"||lower==="right"?"arrowright":lower}function parseChord(raw){let parts=raw.split("+").map(part=>part.trim()).filter(Boolean);if(parts.length===0)return null;let key="",mod=!1,shift=!1,alt=!1;for(let part of parts){let lower=part.toLowerCase();lower==="mod"||lower==="cmd"||lower==="ctrl"||lower==="meta"?mod=!0:lower==="shift"?shift=!0:lower==="alt"||lower==="option"?alt=!0:key=normalizeKey(part)}return key?{key,mod,shift,alt}:null}function parseShortcut(definition){return(Array.isArray(definition.keys)?definition.keys:[definition.keys]).flatMap(value=>{let sequence=value.trim().split(/\s+/).map(parseChord).filter(chord=>chord!==null);return sequence.length>0?[{definition,sequence}]:[]})}function chordToken(chord){return`${chord.mod?"m":"-"}${chord.shift?"s":"-"}${chord.alt?"a":"-"}:${chord.key}`}function eventChord(event){let key=normalizeKey(event.key),shift=event.shiftKey;return key==="3"&&shift&&(key="#"),(key==="#"||key==="?")&&(shift=!1),{key,mod:!!(event.metaKey||event.ctrlKey),shift,alt:event.altKey}}function isEditableShortcutEvent(event){return(event.composedPath?.()??[event.target]).some(target=>{if(!(target instanceof HTMLElement))return!1;if(target.isContentEditable||target.getAttribute("contenteditable")==="true")return!0;let tag=target.tagName;return tag==="INPUT"||tag==="TEXTAREA"||tag==="SELECT"||tag==="BUTTON"||tag==="SUMMARY"||tag==="A"&&target.hasAttribute("href")?!0:["button","link","menuitem","separator","switch","tab"].includes(target.getAttribute("role")||"")})}function matchPrefix(tokens,candidate){return tokens.length>candidate.sequence.length?!1:tokens.every((token,index)=>token===chordToken(candidate.sequence[index]))}function consumeShortcut(event,definition){definition.preventDefault!==!1&&event.preventDefault(),definition.stopPropagation!==!1&&(event.stopPropagation(),event.stopImmediatePropagation?.()),definition.onTrigger(event)}function isEmptyCollectionClear(shortcut,ownerDocument,event){if(event.key!=="Escape"||shortcut.id!=="collection.clear")return!1;let items=collectionItems(ownerDocument).filter(item=>isInteractionElementVisible(item));return items.length>0&&!items.some(item=>item.getAttribute("aria-selected")==="true")}function collectionItems(root){let items=Array.from(root.querySelectorAll("[data-notis-collection-item-id], [data-notis-row-id]"));for(let element of Array.from(root.querySelectorAll("*")))element.shadowRoot&&items.push(...collectionItems(element.shadowRoot));return items}function isDialogEvent(event){return event.composedPath().some(target=>target instanceof HTMLElement&&target.matches("dialog.notis-dialog[open]"))}function ShortcutProvider({children,isAvailable}){return useContext(ShortcutContext)?jsx(Fragment,{children}):jsx(ShortcutProviderRoot,{isAvailable,children})}var HELP_SCOPE_LABELS={modal:"Dialog",detail:"Detail",collection:"Collection",route:"This view",app:"App"},HELP_SCOPE_ORDER=["modal","detail","collection","route","app"];function applicableRegistrations(registrations){let ordered=Array.from(registrations).filter(registration=>registration.enabled&&registration.isAvailable?.()!==!1).sort((a,b)=>b.priority-a.priority||b.order-a.order),activeCollectionOwner=getShortcutCollectionState().activeOwnerId;return!!(activeCollectionOwner&&ordered.some(registration=>registration.collectionOwnerId===activeCollectionOwner))?ordered.filter(registration=>!registration.collectionOwnerId||registration.collectionOwnerId===activeCollectionOwner):ordered}var FALLBACK_REGISTRIES_SYMBOL=Symbol.for("notis.sdk.fallback_shortcut_registries");function registerFallbackShortcut(input){let scope=globalThis,registries=scope[FALLBACK_REGISTRIES_SYMBOL]??=new WeakMap,ownerDocument=document,registry=registries.get(ownerDocument);if(!registry){let registrations=new Map;registry={registrations,nextId:1,dispatch:event=>{if(event.defaultPrevented||isDialogEvent(event))return;let editable=isEditableShortcutEvent(event),token=chordToken(eventChord(event));for(let registration of applicableRegistrations(registrations.values()))for(let shortcut of registration.getShortcuts()){if(shortcut.enabled===!1||editable&&!shortcut.allowInEditable||event.repeat&&!shortcut.allowRepeat||isEmptyCollectionClear(shortcut,ownerDocument,event))continue;if(parseShortcut(shortcut).some(candidate=>candidate.sequence.length===1&&chordToken(candidate.sequence[0])===token)){consumeShortcut(event,shortcut);return}}}},registries.set(ownerDocument,registry),ownerDocument.addEventListener("keydown",registry.dispatch,!0)}let id=registry.nextId++;return registry.registrations.set(id,{...input,id,order:id}),()=>{registry.registrations.delete(id),registry.registrations.size===0&&(ownerDocument.removeEventListener("keydown",registry.dispatch,!0),registries.delete(ownerDocument))}}function shortcutToken(raw){let parsed=parseShortcut({id:"",keys:raw,onTrigger:()=>{}})[0];return parsed?parsed.sequence.map(chordToken).join(" "):null}function collectShortcutHelpEntries(registrations){let claimed=new Set,entries=[];for(let registration of applicableRegistrations(registrations))for(let shortcut of registration.getShortcuts()){if(shortcut.enabled===!1||!shortcut.label)continue;let keys=(Array.isArray(shortcut.keys)?shortcut.keys:[shortcut.keys]).filter(value=>{let token=shortcutToken(value);return!token||claimed.has(token)?!1:(claimed.add(token),!0)});keys.length>0&&entries.push({id:shortcut.id,keys,label:shortcut.label,scope:registration.scope})}return entries}function ShortcutProviderRoot({children,isAvailable}){let registrationsRef=useRef(new Map),nextIdRef=useRef(1),nextOrderRef=useRef(1),sequenceRef=useRef({chords:[],at:0}),[helpOpen,setHelpOpen]=useState(!1),helpOpenRef=useRef(!1),[,setRegistryVersion]=useState(0),availabilityRef=useRef(isAvailable),updateHelpOpen=useCallback(open=>{helpOpenRef.current=open,setHelpOpen(open)},[]);useLayoutEffect(()=>{availabilityRef.current=isAvailable,isAvailable?.()===!1&&(sequenceRef.current={chords:[],at:0},updateHelpOpen(!1))},[isAvailable,updateHelpOpen]);let register=useCallback(input=>{let id=nextIdRef.current++;return registrationsRef.current.set(id,{...input,id,order:nextOrderRef.current++}),helpOpenRef.current&&setRegistryVersion(version=>version+1),()=>{registrationsRef.current.delete(id),helpOpenRef.current&&setRegistryVersion(version=>version+1)}},[]);useEffect(()=>{let handleKeyDown=event=>{if(availabilityRef.current?.()===!1){sequenceRef.current={chords:[],at:0};return}if(event.defaultPrevented||isDialogEvent(event))return;let editable=isEditableShortcutEvent(event);if(!editable&&!event.repeat&&event.key==="?"&&!event.metaKey&&!event.ctrlKey&&!event.altKey){event.preventDefault(),event.stopPropagation(),event.stopImmediatePropagation?.(),updateHelpOpen(!helpOpenRef.current);return}if(helpOpenRef.current){event.key==="Escape"&&(event.preventDefault(),event.stopPropagation(),event.stopImmediatePropagation?.(),updateHelpOpen(!1));return}let registrations=applicableRegistrations(registrationsRef.current.values());if(registrations.length===0)return;let token=chordToken(eventChord(event)),now=Date.now();for(let registration of registrations){let candidates=registration.getShortcuts().filter(shortcut=>shortcut.enabled!==!1).filter(shortcut=>!editable||shortcut.allowInEditable).filter(shortcut=>!event.repeat||shortcut.allowRepeat).filter(shortcut=>!isEmptyCollectionClear(shortcut,document,event)).flatMap(parseShortcut);if(candidates.length===0)continue;let previous=now-sequenceRef.current.at<=registration.sequenceTimeoutMs?sequenceRef.current.chords:[],attempts=previous.length>0?[[...previous,token],[token]]:[[token]];for(let attempt of attempts){let matches=candidates.filter(candidate=>matchPrefix(attempt,candidate));if(matches.length===0)continue;let exact=matches.find(candidate=>candidate.sequence.length===attempt.length),hasLonger=matches.some(candidate=>candidate.sequence.length>attempt.length);if(exact&&!hasLonger){sequenceRef.current={chords:[],at:0},consumeShortcut(event,exact.definition);return}sequenceRef.current={chords:attempt,at:now},event.preventDefault();return}}sequenceRef.current={chords:[],at:0}};return document.addEventListener("keydown",handleKeyDown,!0),()=>document.removeEventListener("keydown",handleKeyDown,!0)},[updateHelpOpen]);let registry=useMemo(()=>({register}),[register]),helpEntries=helpOpen?collectShortcutHelpEntries(registrationsRef.current.values()):[];return jsxs(ShortcutContext.Provider,{value:registry,children:[children,helpOpen?jsx(ShortcutHelpDialog,{entries:helpEntries,onClose:()=>updateHelpOpen(!1)}):null]})}function ShortcutHelpDialog({entries,onClose}){let closeRef=useRef(null),previousFocusRef=useRef(typeof document<"u"&&document.activeElement instanceof HTMLElement?document.activeElement:null);useEffect(()=>(closeRef.current?.focus({preventScroll:!0}),()=>previousFocusRef.current?.focus({preventScroll:!0})),[]);let grouped=HELP_SCOPE_ORDER.map(scope=>({scope,entries:entries.filter(entry2=>entry2.scope===scope)})).filter(group=>group.entries.length>0);return jsx("div",{role:"presentation","data-notis-shortcut-help-backdrop":"",onMouseDown:event=>{event.target===event.currentTarget&&onClose()},style:helpBackdropStyle,children:jsxs("section",{role:"dialog","aria-modal":"true","aria-labelledby":"notis-shortcut-help-title","data-notis-shortcut-help":"",onKeyDown:event=>{event.key==="Tab"&&(event.preventDefault(),closeRef.current?.focus({preventScroll:!0}))},style:helpDialogStyle,children:[jsxs("header",{style:helpHeaderStyle,children:[jsxs("div",{children:[jsx("h2",{id:"notis-shortcut-help-title",style:helpTitleStyle,children:"Keyboard shortcuts"}),jsx("p",{style:helpSubtitleStyle,children:"Available in this view"})]}),jsx("button",{ref:closeRef,type:"button","aria-label":"Close keyboard shortcuts",onClick:onClose,style:helpCloseStyle,children:"Esc"})]}),jsxs("div",{style:helpBodyStyle,children:[grouped.map(group=>jsxs("section",{"aria-label":HELP_SCOPE_LABELS[group.scope],children:[jsx("h3",{style:helpGroupTitleStyle,children:HELP_SCOPE_LABELS[group.scope]}),jsx("div",{style:helpListStyle,children:group.entries.map(entry2=>jsxs("div",{style:helpRowStyle,children:[jsx("span",{children:entry2.label}),jsx("span",{style:helpKeysStyle,children:entry2.keys.map(keys=>jsx("kbd",{style:helpKeyStyle,children:shortcutDisplay(keys)},keys))})]},`${group.scope}:${entry2.id}`))})]},group.scope)),jsxs("section",{"aria-label":"Help",children:[jsx("h3",{style:helpGroupTitleStyle,children:"Help"}),jsx("div",{style:helpListStyle,children:jsxs("div",{style:helpRowStyle,children:[jsx("span",{children:"Show keyboard shortcuts"}),jsx("kbd",{style:helpKeyStyle,children:"?"})]})})]})]})]})})}var helpBackdropStyle={position:"fixed",inset:0,zIndex:1e3,display:"grid",placeItems:"center",padding:"1.5rem",background:"rgba(0, 0, 0, 0.42)",backdropFilter:"blur(3px)"},helpDialogStyle={width:"min(34rem, 100%)",maxHeight:"min(42rem, calc(100dvh - 3rem))",overflow:"hidden",border:"1px solid hsl(var(--border))",borderRadius:"0.875rem",background:"hsl(var(--background))",color:"hsl(var(--foreground))",boxShadow:"0 24px 70px rgba(0, 0, 0, 0.28)",fontFamily:"inherit"},helpHeaderStyle={display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"1rem",padding:"1.25rem 1.25rem 1rem",borderBottom:"1px solid hsl(var(--border))"},helpTitleStyle={margin:0,fontSize:"1rem",fontWeight:650},helpSubtitleStyle={margin:"0.2rem 0 0",color:"hsl(var(--muted-foreground))",fontSize:"0.75rem"},helpCloseStyle={border:"1px solid hsl(var(--border))",borderRadius:"0.35rem",background:"hsl(var(--muted))",color:"hsl(var(--muted-foreground))",padding:"0.2rem 0.45rem",cursor:"pointer",font:"inherit",fontSize:"0.7rem"},helpBodyStyle={display:"grid",gap:"1.1rem",maxHeight:"calc(min(42rem, 100dvh - 3rem) - 5rem)",overflowY:"auto",padding:"1rem 1.25rem 1.25rem"},helpGroupTitleStyle={margin:"0 0 0.35rem",color:"hsl(var(--muted-foreground))",fontSize:"0.68rem",fontWeight:650,letterSpacing:"0.06em",textTransform:"uppercase"},helpListStyle={display:"grid"},helpRowStyle={display:"flex",minHeight:"2rem",alignItems:"center",justifyContent:"space-between",gap:"1rem",borderBottom:"1px solid color-mix(in srgb, hsl(var(--border)) 65%, transparent)",fontSize:"0.8rem"},helpKeysStyle={display:"inline-flex",flexWrap:"wrap",justifyContent:"flex-end",gap:"0.3rem"},helpKeyStyle={minWidth:"1.6rem",border:"1px solid hsl(var(--border))",borderBottomWidth:"2px",borderRadius:"0.35rem",background:"hsl(var(--muted))",color:"hsl(var(--foreground))",padding:"0.15rem 0.4rem",textAlign:"center",font:"inherit",fontSize:"0.72rem"};function useShortcuts(shortcuts,options={}){let registry=useContext(ShortcutContext),shortcutsRef=useRef(shortcuts);shortcutsRef.current=shortcuts;let{enabled=!0,scope="route",priority=0,sequenceTimeoutMs=1500,collectionOwnerId,isAvailable}=options,availableRef=useRef(isAvailable);availableRef.current=isAvailable,useEffect(()=>{if(!(!registry||!enabled))return registry.register({enabled,scope,priority:SHORTCUT_SCOPE_PRIORITY[scope]+priority,sequenceTimeoutMs,collectionOwnerId,isAvailable:()=>availableRef.current?.()!==!1,getShortcuts:()=>availableRef.current?.()===!1?[]:shortcutsRef.current})},[collectionOwnerId,enabled,priority,registry,scope,sequenceTimeoutMs]),useEffect(()=>{if(!(registry||!enabled))return registerFallbackShortcut({enabled,scope,priority:SHORTCUT_SCOPE_PRIORITY[scope]+priority,sequenceTimeoutMs,collectionOwnerId,isAvailable:()=>availableRef.current?.()!==!1,getShortcuts:()=>shortcutsRef.current})},[collectionOwnerId,enabled,priority,registry,scope,sequenceTimeoutMs])}function shortcutDisplay(raw){return raw.trim().split(/\s+/).map(chord=>chord.split("+").map(part=>{let lower=part.toLowerCase();return lower==="mod"||lower==="cmd"||lower==="meta"?"\u2318":lower==="ctrl"?"\u2303":lower==="shift"?"\u21E7":lower==="alt"||lower==="option"?"\u2325":lower==="arrowup"||lower==="up"?"\u2191":lower==="arrowdown"||lower==="down"?"\u2193":lower==="arrowleft"||lower==="left"?"\u2190":lower==="arrowright"||lower==="right"?"\u2192":part.length===1?part.toUpperCase():part}).join("")).join(" ")}var copy={en:{bindingUnavailable:"This Space cannot read this database yet.",actionUnavailable:"This action is unavailable in this Space.",readUnavailable:"These data cannot be read in this Space.",schemaChanged:"This database changed. Refresh the page and try again.",responseIncomplete:"This database could not be loaded. Refresh the page and try again.",listUnavailable:"This list is unavailable in this view.",timedOut:"This read took too long. Please retry.",scopeUnavailable:"App query scope is no longer available.",scopeCleared:"App query scope was cleared."},fr:{bindingUnavailable:"Ce Space ne peut pas encore lire cette base de donn\xE9es.",actionUnavailable:"Cette action n\u2019est pas disponible dans ce Space.",readUnavailable:"Ces donn\xE9es ne sont pas accessibles dans ce Space.",schemaChanged:"Cette base de donn\xE9es a chang\xE9. Actualise la page et r\xE9essaie.",responseIncomplete:"Cette base de donn\xE9es n\u2019a pas pu \xEAtre charg\xE9e. Actualise la page et r\xE9essaie.",listUnavailable:"Cette liste n\u2019est pas disponible dans cette vue.",timedOut:"Cette lecture a pris trop de temps. R\xE9essaie.",scopeUnavailable:"Les donn\xE9es de cette vue ne sont plus accessibles.",scopeCleared:"Les donn\xE9es de cette vue ont \xE9t\xE9 r\xE9initialis\xE9es."}},PREFIX="notis_sdk_query:",SdkQueryError=class extends Error{code;diagnostic;constructor(key,diagnostic,locale,cause){super(copy[locale==="fr"?"fr":"en"][key],cause?{cause}:void 0),this.name="SdkQueryError",this.code=PREFIX+key,this.diagnostic=diagnostic}};function localizeQueryError(error,locale){let failure=error;if(!failure||typeof failure.code!="string"||!failure.code.startsWith(PREFIX))return error;let key=failure.code.slice(PREFIX.length);if(!Object.hasOwn(copy.en,key))return error;let message=copy[locale==="fr"?"fr":"en"][key];return failure.message===message?error:new SdkQueryError(key,typeof failure.diagnostic=="string"?failure.diagnostic:void 0,locale,failure)}var SPACE_VIEWER_READ_OPERATIONS=Object.freeze({list_databases:"databases",get_database:"databases",query_database:"databases",list_skills:"skills",get_skill:"skills"}),SPACE_CLOUD_COMPUTER_OPERATIONS=Object.freeze({facts:"read",run:"shell",upload:"shell"});function spaceCloudComputerAllows(level,operation){let needed=SPACE_CLOUD_COMPUTER_OPERATIONS[operation];return level==="shell"||level==="read"&&needed==="read"}var SPACE_VIEW_SPEC_VERSION=2;var SpaceActionError=class extends Error{constructor(message,requestId,receiptId,status,pendingRequestIds,code){super(message);this.requestId=requestId;this.receiptId=receiptId;this.status=status;this.pendingRequestIds=pendingRequestIds;this.code=code;this.name="SpaceActionError"}requestId;receiptId;status;pendingRequestIds;code};var SpaceNavigationCancelled=class extends Error{code="space_navigation_cancelled";constructor(message="This navigation is no longer active."){super(message),this.name="SpaceNavigationCancelled"}};function isSpaceNavigationCancelled(error){return error instanceof Error&&error.name==="SpaceNavigationCancelled"&&error.code==="space_navigation_cancelled"}function spaceQueryKey(runtime,key){if(runtime?.resource?.kind!=="space")return key;let space=runtime.space;if(!space?.cacheScope||space.id!==runtime.resource.id||space.revision!==runtime.resource.revision)throw new Error("The host must provide this Space revision and access context.");return["space",space.id,space.revision,space.cacheScope,...key]}function guardSpaceRuntime(runtime,onProtocolError){if(runtime?.resource?.kind!=="space")return runtime;spaceQueryKey(runtime,[]);let protocolError=(message,key)=>{let error=key?new SdkQueryError(key,message,runtime.context?.locale):new Error(message);return onProtocolError?.(error),error},deny=async()=>{throw protocolError("Use a declared Space action; account-wide tool and backend calls are unavailable.")},callAction=runtime.callAction;if(!callAction)throw new Error("This host needs the current Space action protocol.");let viewerRead=runtime.viewerRead,shown=runtime.shown,cloudComputer=runtime.spaceCloudComputer,cloudLevel=runtime.space.cloudComputer,guardedCloud=operation=>{if(!cloudComputer||!spaceCloudComputerAllows(cloudLevel,operation))throw protocolError(operation==="facts"?"This Space does not use the cloud computer.":"This Space does not declare cloudComputer: shell.");return cloudComputer};return Object.freeze({...runtime,callTool:deny,request:deny,listTools:deny,shown:shown?async function(name,params={},options={}){let list=runtime.space.shows&&Object.hasOwn(runtime.space.shows,name)?runtime.space.shows[name]:null;if(!list||!("database"in list))throw protocolError("This view does not declare that list with a filter.","listUnavailable");return shown(name,params,options)}:void 0,handover:void 0,cloudComputerFacts:cloudComputer&&cloudLevel?async options=>guardedCloud("facts").facts(options):void 0,spaceCloudComputer:cloudComputer&&cloudLevel?Object.freeze({status:()=>cloudComputer.status(),requestApproval:()=>cloudComputer.requestApproval(),facts:async options=>guardedCloud("facts").facts(options),run:async input=>guardedCloud("run").run(input),upload:async input=>guardedCloud("upload").upload(input)}):void 0,viewerRead:viewerRead?async function(operation,input={}){let family=Object.hasOwn(SPACE_VIEWER_READ_OPERATIONS,operation)?SPACE_VIEWER_READ_OPERATIONS[operation]:null;if(!family)throw protocolError("Viewer reads never change data. Choose a supported read.","readUnavailable");if(!runtime.space.viewerReads?.includes(family))throw protocolError(`This Space does not declare viewer reads of ${family}.`,"readUnavailable");return viewerRead(operation,input)}:void 0,async callAction(id,inputs={},options={}){let descriptor=Object.hasOwn(runtime.space.actions,id)?runtime.space.actions[id]:null;if(!descriptor)throw protocolError("This action is not declared by the published Space.",options.readOnly||options.dedupe?"actionUnavailable":void 0);if((options.readOnly||options.dedupe)&&!descriptor.readOnly)throw protocolError("A write action cannot run as a cached read.","readUnavailable");return callAction(id,inputs,options)}})}import{createContext as createContext2,useContext as useContext2,useMemo as useMemo2}from"react";import{jsx as jsx2}from"react/jsx-runtime";var NOTIS_CONTEXT_SYMBOL=Symbol.for("notis.sdk.runtime_context");function getNotisContext(){let scope=globalThis;return scope[NOTIS_CONTEXT_SYMBOL]||(scope[NOTIS_CONTEXT_SYMBOL]=createContext2(null)),scope[NOTIS_CONTEXT_SYMBOL]}var NotisContext=getNotisContext();function NotisProvider({children,runtime,onProtocolError,shortcutsAvailable}){let scopedRuntime=useMemo2(()=>guardSpaceRuntime(runtime,onProtocolError),[runtime,onProtocolError]);if(runtime===void 0)throw new Error("NotisProvider requires an explicit runtime prop.");return jsx2(NotisContext.Provider,{value:scopedRuntime,children:jsx2(ShortcutProvider,{isAvailable:shortcutsAvailable,children})})}function useNotisRuntime(){return useContext2(NotisContext)}function recordKeyOf(item){if(!item||typeof item!="object")return;let record=item,key=record.record_key??record.recordKey;return typeof key=="string"?key:void 0}function withoutRecords(data,hides,removed){let filter=list=>{let kept=list.filter(item=>{let key=recordKeyOf(item);return key===void 0||!hides(key)?!0:(removed.push(key),!1)});return kept.length===list.length?list:kept};if(Array.isArray(data))return filter(data);if(!data||typeof data!="object")return data;let record=data,result=record;for(let field of["rows","documents"]){let list=record[field];if(!Array.isArray(list))continue;let kept=filter(list);kept!==list&&(result={...result,[field]:kept})}return result}var EMPTY=Object.freeze({data:void 0,hasData:!1,isFetching:!1,error:null,updatedAt:0,invalidation:0});function queryKey(value){if(value instanceof Date)return JSON.stringify(value.toISOString());if(Array.isArray(value))return`[${value.map(queryKey).join(",")}]`;if(value&&typeof value=="object"){let record=value;return`{${Object.keys(record).filter(key=>record[key]!==void 0).sort().map(key=>`${JSON.stringify(key)}:${queryKey(record[key])}`).join(",")}}`}return JSON.stringify(value)??"null"}function createPrefetchQueue(concurrency=2){let active=0,waiting=[];function drain(){for(;active<concurrency&&waiting.length;)waiting.shift()()}return read=>new Promise((resolve,reject)=>{waiting.push(()=>{active+=1,Promise.resolve().then(read).then(resolve,reject).finally(()=>{active-=1,drain()})}),drain()})}function createQueryClient(options={}){let entries=new Map,now=options.now??Date.now,maxEntries=options.maxEntries??100,schedule=options.schedule??createPrefetchQueue(2),epoch=0,disposed=!1,revision=0,seq=0,hidden=new Map;function prune(keep){for(let[oldKey,old]of entries){if(entries.size<=maxEntries)break;oldKey!==keep&&!old.listeners.size&&!old.pending&&entries.delete(oldKey)}}function entry2(key){let value=entries.get(key);return value||(value={raw:EMPTY,snapshot:EMPTY,removed:"",dataSeq:0,listeners:new Set,generation:0},entries.set(key,value)),entries.delete(key),entries.set(key,value),prune(key),value}function view(value,rawChanged){let removed=[],data=hidden.size&&value.raw.hasData?withoutRecords(value.raw.data,key=>{if(!hidden.has(key))return!1;let committed=hidden.get(key);return committed==null||value.dataSeq<committed},removed):value.raw.data,signature=removed.sort().join("\0");return!rawChanged&&value.removed===signature?!1:(value.removed=signature,value.snapshot=data===value.raw.data?value.raw:{...value.raw,data},!0)}function publish2(value,raw){value.raw=raw,view(value,!0);for(let listener of value.listeners)listener()}function sweep(){for(let[key,committed]of hidden){if(committed===null)continue;let held=!1;for(let value of entries.values()){if(value.pending&&value.pendingSeq!==void 0&&value.pendingSeq<committed){held=!0;break}if(value.dataSeq>=committed||!value.raw.hasData)continue;let found=[];if(withoutRecords(value.raw.data,candidate=>candidate===key,found),found.length){held=!0;break}}held||hidden.delete(key)}}function refresh(){for(let value of entries.values())if(view(value,!1))for(let listener of value.listeners)listener()}let client={getSnapshot(key){return entries.get(key)?.snapshot??EMPTY},subscribe(key,listener){let value=entry2(key);return value.listeners.add(listener),()=>{value.listeners.delete(listener),prune()}},fetch(key,read,fetchOptions={}){if(disposed)return Promise.reject(new SdkQueryError("scopeUnavailable"));let value=entry2(key);if(value.pending)return value.pending;if(!fetchOptions.force&&value.snapshot.hasData&&value.snapshot.updatedAt>0&&now()-value.snapshot.updatedAt<(fetchOptions.staleTimeMs??3e4))return Promise.resolve(value.snapshot.data);let generation=++value.generation,requestEpoch=epoch,startSeq=++seq,canCommit=()=>epoch===requestEpoch&&value.generation===generation&&entries.get(key)===value,timeout,deadline=new Promise((_,reject)=>{timeout=setTimeout(()=>reject(new SdkQueryError("timedOut")),options.readTimeoutMs??3e4),typeof timeout=="object"&&"unref"in timeout&&timeout.unref()}),request=Promise.race([Promise.resolve().then(read),deadline]).then(data=>(canCommit()&&(value.dataSeq=startSeq,publish2(value,{...value.raw,data,hasData:!0,isFetching:!1,error:null,updatedAt:now()}),hidden.size&&sweep()),data),reason=>{let error=reason instanceof Error?reason:new Error(String(reason));throw canCommit()&&publish2(value,{...value.raw,isFetching:!1,error}),error}).finally(()=>{clearTimeout(timeout),value.pending===request&&(value.pending=void 0,value.pendingSeq=void 0),hidden.size&&sweep(),prune()});return value.pending=request,value.pendingSeq=startSeq,publish2(value,{...value.raw,isFetching:!0,error:null}),request},prefetch(key,read,fetchOptions){let requestEpoch=epoch;return schedule(()=>{if(epoch!==requestEpoch)throw new SdkQueryError("scopeCleared");return client.fetch(key,read,fetchOptions)})},getRevision:()=>revision,invalidate(key){revision+=1;for(let[entryKey,value]of entries)key!==void 0&&entryKey!==key||(value.generation+=1,value.pending=void 0,value.pendingSeq=void 0,publish2(value,{...value.raw,updatedAt:0,isFetching:!1,invalidation:value.raw.invalidation+1}))},dispose(){disposed=!0,client.clear()},clear(){revision+=1,epoch+=1;for(let value of entries.values())value.generation+=1,value.pending=void 0,value.pendingSeq=void 0,value.dataSeq=0,publish2(value,{...EMPTY,invalidation:value.raw.invalidation+1});for(let[key,value]of entries)value.listeners.size||entries.delete(key);sweep()},hideRecords(recordKeys){let own=[...new Set(recordKeys.filter(key=>typeof key=="string"&&key))];for(let key of own)hidden.set(key,null);refresh();let pick2=keys=>keys?own.filter(key=>keys.includes(key)):own;return{commit(keys){let at=++seq;for(let key of pick2(keys))hidden.get(key)===null&&hidden.set(key,at);sweep(),refresh()},restore(keys){for(let key of pick2(keys))hidden.delete(key);refresh()}}}};return client}import{useCallback as useCallback2,useEffect as useEffect2,useLayoutEffect as useLayoutEffect2,useMemo as useMemo3,useRef as useRef2,useSyncExternalStore}from"react";function useQuery(key,read,options){let runtime=useNotisRuntime(),fallback=useMemo3(()=>createQueryClient(),[runtime]),client=runtime?.queryClient??fallback,cacheKey=queryKey(spaceQueryKey(runtime,key)),enabled=!!runtime&&options.enabled!==!1&&options.readOnly===!0,readRef=useRef2(read);useLayoutEffect2(()=>{readRef.current=read});let subscribe=useCallback2(listener=>enabled?client.subscribe(cacheKey,listener):()=>{},[cacheKey,client,enabled]),snapshot=useSyncExternalStore(subscribe,()=>client.getSnapshot(cacheKey),()=>client.getSnapshot(cacheKey)),fetch=useCallback2(()=>{let capturedRead=readRef.current;return client.fetch(cacheKey,capturedRead,{staleTimeMs:options.staleTimeMs})},[cacheKey,client,options.staleTimeMs]);useEffect2(()=>{enabled&&fetch().catch(()=>{})},[enabled,fetch,snapshot.invalidation]);let locale=runtime?.context?.locale,refetch=useCallback2(async()=>{if(!enabled)return null;client.invalidate(cacheKey);try{return await fetch(),null}catch(failure){return localizeQueryError(failure instanceof Error?failure:new Error(String(failure)),locale)}},[cacheKey,client,enabled,fetch,locale]),error=useMemo3(()=>localizeQueryError(snapshot.error,runtime?.context?.locale),[snapshot.error,runtime?.context?.locale]);return{data:enabled?snapshot.data:void 0,hasData:enabled&&snapshot.hasData,loading:enabled&&!snapshot.hasData&&!snapshot.error,isFetching:enabled&&snapshot.isFetching,error:enabled?error:null,refetch}}function useQueryClient(){let runtime=useNotisRuntime();return useMemo3(()=>({invalidate:key=>runtime?.queryClient?.invalidate(key?queryKey(spaceQueryKey(runtime,key)):void 0),prefetch:(key,read,options)=>!runtime?.queryClient||options.enabled===!1||options.readOnly!==!0?Promise.resolve(void 0):runtime.queryClient.prefetch(queryKey(spaceQueryKey(runtime,key)),read,{staleTimeMs:options.staleTimeMs})}),[runtime])}var SCOPE_ORDER=Object.freeze({app:0,route:100,collection:200,detail:300,modal:400}),SCOPES=Object.freeze(["app","route","collection","detail","modal"]);function isWords(value){return!!value&&typeof value=="object"&&typeof value.en=="string"&&typeof value.fr=="string"}function pick(words,locale){return typeof words=="string"?words:locale==="fr"?words.fr:words.en}function interpolate(template,vars){return template.replace(/\{(\w+)\}/g,(whole,name)=>Object.prototype.hasOwnProperty.call(vars,name)?String(vars[name]):whole)}function fillWords(words,vars){return{en:interpolate(words.en,vars),fr:interpolate(words.fr,vars)}}function w(en,fr){return{en,fr}}var NNBSP="\u202F";function labelValue(label,value,locale){return locale==="fr"?`${label}${NNBSP}: ${value}`:`${label}: ${value}`}var DOCUMENT_WORDS=Object.freeze({untitled:{en:"Untitled",fr:"Sans titre"}});function isPresentString(value){return typeof value=="string"&&value.trim().length>0}function asRecord(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function optionalString(value){return isPresentString(value)?value.trim():null}function extractRichText(value){return typeof value=="string"?value:Array.isArray(value)?value.map(item=>{let record=asRecord(item),text=asRecord(record?.text);return optionalString(text?.content)??optionalString(record?.plain_text)??""}).join(""):""}function getSecretValue(value){let record=asRecord(value),metadata=asRecord(record?.metadata);return{present:record?.present===!0,reference:optionalString(record?.reference),status:optionalString(record?.status),metadata}}function getRelationIds(value){return Array.isArray(value)?value.filter(item=>isPresentString(item)):[]}function normalizePropertyValue(value){let record=asRecord(value);if(!record)return value;let type=optionalString(record.type);return type?type==="title"?extractRichText(record.title):type==="rich_text"?extractRichText(record.rich_text):type==="select"||type==="status"?optionalString(asRecord(record[type])?.name)??record[type]??null:type==="multi_select"?(Array.isArray(record.multi_select)?record.multi_select:[]).map(item=>optionalString(asRecord(item)?.name)??item).filter(Boolean):type==="relation"?(Array.isArray(record.relation)?record.relation:[]).map(item=>optionalString(asRecord(item)?.id)??item).filter(Boolean):type==="date"?optionalString(asRecord(record.date)?.start)??record.date??null:type==="secret"?getSecretValue(record):type in record?record[type]:value:value}function normalizeContentType(value){return value==="markdown"||value==="file"||value==="view"?value:null}function normalizeDocumentRecord(value,options={}){let record=asRecord(value)??{},rawProperties=asRecord(record.properties)??{},properties={};for(let[key,propertyValue]of Object.entries(rawProperties))properties[key]=normalizePropertyValue(propertyValue);return{id:optionalString(record.id)??"",recordKey:optionalString(record.recordKey)??optionalString(record.record_key)??void 0,revision:typeof record.revision=="number"?record.revision:void 0,title:optionalString(record.title)??pick(DOCUMENT_WORDS.untitled,options.locale??"en"),url:optionalString(record.url),properties,icon:optionalString(record.icon),cover:optionalString(record.cover),databaseSlug:optionalString(record.databaseSlug)??optionalString(record.database_slug)??void 0,contentType:normalizeContentType(record.contentType??record.content_type),fileType:optionalString(record.fileType)??optionalString(record.file_type),contentBlocknote:Array.isArray(record.contentBlocknote)?record.contentBlocknote:Array.isArray(record.content_blocknote)?record.content_blocknote:null,contentMarkdown:optionalString(record.contentMarkdown)??optionalString(record.content_markdown),plainText:optionalString(record.plainText)??optionalString(record.plain_text),viewType:optionalString(record.viewType)??optionalString(record.view_type),viewState:asRecord(record.viewState)??asRecord(record.view_state),viewRevision:typeof(record.viewRevision??record.view_revision)=="number"?Number(record.viewRevision??record.view_revision):null,createdAt:optionalString(record.createdAt)??optionalString(record.created_at)??optionalString(record.created_time),lastEditedTime:optionalString(record.lastEditedTime)??optionalString(record.last_edited_time)??optionalString(record.updated_at)}}function normalizeDatabaseProperty(value){let record=asRecord(value),name=optionalString(record?.name);if(!record||!name)return null;let options=(Array.isArray(record.options)?record.options:[]).flatMap(option=>{let optionRecord=asRecord(option),optionName=optionalString(optionRecord?.name);return!optionRecord||!optionName?[]:[{id:optionalString(optionRecord.id),name:optionName,color:optionalString(optionRecord.color),order:typeof optionRecord.order=="number"?optionRecord.order:void 0}]});return{id:optionalString(record.id),name,type:optionalString(record.type)??"rich_text",description:optionalString(record.description),options}}function markdownToPlainText(markdown){return markdown.replace(/```[^\n]*\n?/g,"").replace(/!\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/<[^>]+>/g," ").replace(/^\s{0,3}(#{1,6}\s+|>\s?|[-*+]\s+(\[[ xX]\]\s+)?|\d+\.\s+)/gm,"").replace(/(\*\*|__|[*_~`])/g,"").replace(/^\s*\|?[-:| ]+\|?\s*$/gm,"").replace(/\|/g," ").replace(/^\s*([-*_]\s*){3,}$/gm,"").replace(/\s+/g," ").trim()}function blockNoteToPlainText(blocks){let segments=[];function visit(node){if(typeof node=="string"){node.trim()&&segments.push(node.trim());return}if(Array.isArray(node)){node.forEach(visit);return}let record=asRecord(node);record&&(typeof record.text=="string"&&record.text.trim()&&segments.push(record.text.trim()),visit(record.content),visit(record.children))}return visit(blocks),segments.join(" ").replace(/\s+/g," ").trim()}function getDocumentPreview(document2,options={}){if(isPresentString(document2.plainText))return document2.plainText.replace(/\s+/g," ").trim();if(isPresentString(document2.contentMarkdown))return markdownToPlainText(document2.contentMarkdown);let fromBlocks=blockNoteToPlainText(document2.contentBlocknote);return fromBlocks||(isPresentString(document2.title)?document2.title:pick(DOCUMENT_WORDS.untitled,options.locale??"en"))}import{useCallback as useCallback3,useEffect as useEffect3,useState as useState2}from"react";function actionFor(runtime,binding,operation){let descriptor=runtime?.space?.bindings[binding],action=descriptor?.kind==="database"?descriptor.operations?.[operation]:void 0;if(runtime?.resource?.kind!=="space"||!runtime.callAction||!action){let diagnostic=`This Space does not expose ${operation} for database binding "${binding}".`;throw operation==="query"?new SdkQueryError("bindingUnavailable",diagnostic):new Error(`This Space does not expose ${operation} for that database binding.`)}return action}function useNativeDocuments(binding,options={}){let runtime=useNotisRuntime(),[live,setLive]=useState2(!1),follow=options.subscribe===!0&&options.enabled!==!1;useEffect3(()=>{if(!follow||!runtime?.subscribeDatabase){setLive(!1);return}let cancelled=!1,stop=runtime.subscribeDatabase(binding,()=>{},{onStatusChange:value=>{cancelled||setLive(value)}});return()=>{cancelled=!0,setLive(!1),stop?.()}},[runtime,binding,follow]);let locale=runtime?.context?.locale==="fr"?"fr":"en",query=useQuery(["native-documents",binding,options.query??{},!!options.fetchAll,locale],async()=>{let action=actionFor(runtime,binding,"query");if(options.query?.mode&&!["rows","search"].includes(options.query.mode))throw new Error("Use useActionQuery for counts and aggregates.");let rows=[],offset=options.query?.offset??0,revision;for(;;){let result=await runtime.callAction(action,{request:{...options.query,offset}},{readOnly:!0,dedupe:!0,schemaRevision:revision});if(!result||!Array.isArray(result.rows)||!Number.isSafeInteger(result.schema_revision))throw new SdkQueryError("responseIncomplete","Native query must return rows and a safe integer schema_revision.");if(revision!==void 0&&revision!==result.schema_revision)throw new SdkQueryError("schemaChanged");if(revision=result.schema_revision,rows.push(...result.rows),!options.fetchAll||!result.has_more)break;if(typeof result.next_offset!="number"||result.next_offset<=offset)throw new SdkQueryError("responseIncomplete","Native query pagination did not advance next_offset.");offset=result.next_offset}return{documents:rows.map(row=>normalizeDocumentRecord(row,{locale})),schemaRevision:revision}},{readOnly:!0,enabled:options.enabled,staleTimeMs:options.staleTimeMs});return{...query,documents:query.data?.documents??EMPTY_DOCUMENTS,schemaRevision:query.data?.schemaRevision,live}}function useNativeMutation(binding,operation){let runtime=useNotisRuntime(),[pending,setPending]=useState2(0),[error,setError]=useState2(null);return{mutate:useCallback3(async(input,options)=>{let action=actionFor(runtime,binding,operation);setPending(value=>value+1),setError(null);let key=operation==="delete"&&typeof input.record_key=="string"?input.record_key:null,hidden=key?runtime?.queryClient?.hideRecords?.([key]):void 0;try{let receipt=await runtime.callAction(action,{request:input},options);return hidden?.commit(),receipt}catch(cause){hidden?.restore();let failure=cause instanceof Error?cause:new Error(String(cause));throw setError(failure),failure}finally{setPending(value=>value-1)}},[runtime,binding,operation]),loading:pending>0,error}}function useNativeDelete(binding){let runtime=useNotisRuntime(),[pending,setPending]=useState2(0),[error,setError]=useState2(null);return{deleteMany:useCallback3(async(inputs,options)=>{let action=actionFor(runtime,binding,"delete"),result={done:[],failed:[]};if(!inputs.length)return result;setPending(value=>value+1),setError(null);let hidden=runtime?.queryClient?.hideRecords?.(inputs.map(input=>input.record_key)),next=0,worker=async()=>{for(;next<inputs.length;){let input=inputs[next++];try{await runtime.callAction(action,{request:input},{schemaRevision:options.schemaRevision,requestId:`${options.requestId}:${input.record_key}`,deferRefresh:!0}),result.done.push(input)}catch(cause){result.failed.push({input,error:cause instanceof Error?cause:new Error(String(cause))})}}};try{await Promise.all(Array.from({length:Math.min(DELETE_CONCURRENCY,inputs.length)},worker))}finally{hidden?.commit(result.done.map(input=>input.record_key)),hidden?.restore(result.failed.map(item=>item.input.record_key)),runtime?.queryClient?.invalidate(),result.failed.length&&setError(result.failed[0].error),setPending(value=>value-1)}return result},[runtime,binding]),loading:pending>0,error}}var DELETE_CONCURRENCY=4,EMPTY_DOCUMENTS=[];var VIEW_PERIODS=["today","tomorrow","this_week","last_week","this_month","last_month"];function isViewDate(value){if(!/^\d{4}-\d{2}-\d{2}$/.test(value)||value.startsWith("0000-"))return!1;let parsed=new Date(`${value}T00:00:00Z`);return Number.isFinite(parsed.getTime())&&parsed.toISOString().slice(0,10)===value}function isViewPeriod(value){if(VIEW_PERIODS.includes(value))return!0;let parts=value.split("/");return parts.length===2&&parts.every(isViewDate)&&parts[0]<=parts[1]}function resolveViewPeriod(value,timeZone="UTC",now=new Date){if(!isViewPeriod(value))throw new Error("Invalid view period");if(value.includes("/")){let[start2,end2]=value.split("/");return{start:start2,end:end2}}let parts=new Intl.DateTimeFormat("en-US",{timeZone,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(now),get=type=>parts.find(part=>part.type===type).value,start=new Date(`${get("year")}-${get("month")}-${get("day")}T00:00:00Z`);value==="tomorrow"&&start.setUTCDate(start.getUTCDate()+1),value.endsWith("week")&&start.setUTCDate(start.getUTCDate()-(start.getUTCDay()+6)%7-(value==="last_week"?7:0)),value.endsWith("month")&&(start.setUTCDate(1),value==="last_month"&&start.setUTCMonth(start.getUTCMonth()-1));let end=new Date(start);return value.endsWith("week")&&end.setUTCDate(end.getUTCDate()+6),value.endsWith("month")&&(end.setUTCMonth(end.getUTCMonth()+1),end.setUTCDate(0)),{start:start.toISOString().slice(0,10),end:end.toISOString().slice(0,10)}}import{useCallback as useCallback4,useMemo as useMemo4}from"react";var RECORD_KEY=/^(?:[0-9a-f]{32}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i,NUMBER=/^-?\d+(?:\.\d+)?$/,CONTROL=/[\u0000-\u001f\u007f]/;function parseValue(declaration,raw){switch(declaration.type){case"text":return raw.length<=500&&!CONTROL.test(raw)?raw:void 0;case"enum":return declaration.values?.includes(raw)?raw:void 0;case"number":{let value=Number(raw);return NUMBER.test(raw)&&Number.isFinite(value)?value:void 0}case"boolean":return raw==="true"?!0:raw==="false"?!1:void 0;case"date":return["today","tomorrow"].includes(raw)||isViewDate(raw)?raw:void 0;case"period":return isViewPeriod(raw)?raw:void 0;case"record":{if(!RECORD_KEY.test(raw))return;let hex=raw.replaceAll("-","").toLowerCase();return`${hex.slice(0,8)}-${hex.slice(8,12)}-${hex.slice(12,16)}-${hex.slice(16,20)}-${hex.slice(20)}`}default:return}}function parseViewParams(declared,raw){let params={},invalid=[],missing=[];for(let[name,declaration]of Object.entries(declared||{})){let value=raw&&Object.hasOwn(raw,name)&&typeof raw[name]=="string"&&raw[name]!==""?raw[name]:void 0,parsed=value===void 0?void 0:parseValue(declaration,value);value!==void 0&&parsed===void 0&&invalid.push(name),parsed!==void 0?params[name]=parsed:declaration.default!==void 0?params[name]=declaration.default:declaration.required&&missing.push(name)}return{params,invalid,missing}}var pendingWrites=new WeakMap;function writeViewParams(runtime,changes,options={}){if(runtime?.resource?.kind!=="space"||typeof runtime.navigate!="function")return Promise.reject(new Error("Open this Space in a current Notis host to change its params."));let current=runtime.context?.params??null,pending=pendingWrites.get(runtime),next={...pending&&pending.base===current?pending.params:current??{}};for(let[name,value]of Object.entries(changes))value==null?delete next[name]:next[name]=String(value);pendingWrites.set(runtime,{base:current,params:next});let forget=error=>{throw pendingWrites.get(runtime)?.params===next&&pendingWrites.delete(runtime),error};try{return Promise.resolve(runtime.navigate({kind:"view-params",params:next,...options.replace?{replace:!0}:{}})).then(()=>{},forget)}catch(error){return Promise.reject(error).catch(forget)}}function useViewParams(){let runtime=useNotisRuntime(),declared=runtime?.space?.params,raw=runtime?.context?.params,setParams=useCallback4((changes,options)=>writeViewParams(runtime,changes,options),[runtime]);return useMemo4(()=>({...parseViewParams(declared,raw),declared:declared||{},ready:runtime!==null,setParams}),[declared,raw,runtime,setParams])}var SHOWN_ALL_PAGES_MAX=50,SHOWN_ALL_PAGES_SIZE=200;function useShownAvailable(name){let runtime=useNotisRuntime(),list=runtime?.space?.shows&&Object.hasOwn(runtime.space.shows,name)?runtime.space.shows[name]:null;return runtime?.resource?.kind==="space"&&typeof runtime.shown=="function"&&!!(list&&"database"in list)}function useShown(name,options={}){let runtime=useNotisRuntime(),available=useShownAvailable(name),{params,missing}=useViewParams(),{sorts,pageSize,offset,includeContent,allPages=!1}=options,list=runtime?.space?.shows&&Object.hasOwn(runtime.space.shows,name)?runtime.space.shows[name]:null,reads=list&&"database"in list&&Array.isArray(list.params)?list.params:null,keyed=useMemo4(()=>reads?Object.fromEntries(Object.entries(params).filter(([param])=>reads.includes(param))):params,[params,reads]),result=useQuery(["shown",name,keyed,sorts??null,pageSize??null,offset??null,includeContent??!1,allPages],async()=>{if(!runtime?.shown)throw new SdkQueryError("listUnavailable");if(!allPages)return runtime.shown(name,params,{sorts,pageSize,offset,includeContent});let size=pageSize??SHOWN_ALL_PAGES_SIZE,first=null,rows=[];for(let page=0;page<SHOWN_ALL_PAGES_MAX;page+=1){let answer=await runtime.shown(name,params,{sorts,pageSize:size,offset:(offset??0)+page*size,includeContent});first??=answer;let pageRows=Array.isArray(answer?.rows)?answer.rows:[];if(rows.push(...pageRows),pageRows.length<size)break}return{...first,rows}},{readOnly:!0,enabled:available&&!missing.length&&options.enabled!==!1,staleTimeMs:options.staleTimeMs}),unavailable=runtime!==null&&!available&&options.enabled!==!1,error=useMemo4(()=>unavailable?new SdkQueryError("listUnavailable",`The list "${name}" is unavailable in this view: declare it in \`shows\` with a database, or gate it on useShownAvailable("${name}").`,runtime?.context?.locale):null,[unavailable,name,runtime?.context?.locale]);return unavailable?{...result,loading:!1,isFetching:!1,error}:result}import{useCallback as useCallback5,useEffect as useEffect4,useLayoutEffect as useLayoutEffect3,useRef as useRef3}from"react";var MAX_UNSHOWN=64;function useTopBarSearch(opts){let runtime=useNotisRuntime(),{value,onChange,placeholder,onSubmit}=opts,callbacks=useRef3({onChange,onSubmit});useLayoutEffect3(()=>{callbacks.current={onChange,onSubmit}});let fromBar=useRef3([]),hasSubmit=!!onSubmit;return useEffect4(()=>{let register=runtime?.registerTopBarSearch;if(register)return register({onChange:next=>{let sent=fromBar.current;sent.push(next),sent.length>MAX_UNSHOWN&&sent.splice(0,sent.length-MAX_UNSHOWN),callbacks.current.onChange(next)},placeholder,onSubmit:hasSubmit?()=>callbacks.current.onSubmit?.():void 0}),()=>{register(null)}},[runtime,placeholder,hasSubmit]),useLayoutEffect3(()=>{let sent=fromBar.current;if(sent.length&&value===sent[sent.length-1]){sent.length=0;return}let shown=sent.indexOf(value);if(shown>=0){sent.splice(0,shown+1);return}sent.length=0,runtime?.setTopBarSearchValue?.(value)},[runtime,value]),{setLoading:useCallback5(loading=>{runtime?.setTopBarSearchLoading?.(loading)},[runtime])}}import{useEffect as useEffect5,useRef as useRef4}from"react";var ownersBySetter=new WeakMap;function publish(set,entry2){let top=entry2.owners.length?entry2.owners[entry2.owners.length-1]:null,sent=entry2.sent;if(top===sent||top&&sent&&top.label===sent.label&&top.hasBack===sent.hasBack&&top.recordKey===sent.recordKey){entry2.sent=top;return}entry2.sent=top,set(top?{label:top.label,...top.hasBack?{onBack:entry2.back}:{},...top.recordKey?{recordKey:top.recordKey}:{}}:null)}function useTopBarTitleLeaf(label,onBack,options){let runtime=useNotisRuntime(),leaf=label?.trim()||null,back=useRef4(onBack);back.current=onBack;let hasBack=!!onBack,recordKey=options?.recordKey?.trim()||null;useEffect5(()=>{let set=runtime?.setTopBarTitleLeaf;if(!set||!leaf)return;let entry2=ownersBySetter.get(set);if(!entry2){let created={owners:[],sent:null,back:()=>created.sent?.back.current?.()};entry2=created,ownersBySetter.set(set,entry2)}let owner={label:leaf,back,hasBack,recordKey};return entry2.owners.push(owner),publish(set,entry2),()=>{let current=ownersBySetter.get(set);current&&(current.owners=current.owners.filter(item=>item!==owner),publish(set,current))}},[runtime,leaf,hasBack,recordKey])}import{jsx as jsx3,jsxs as jsxs2}from"react/jsx-runtime";var S={fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"},F={fill:"currentColor",stroke:"none"},SHAPES={"arrow-left":jsx3("path",{...S,d:"M13 8H3m4-4L3 8l4 4"}),x:jsx3("path",{...S,d:"M4 4l8 8M12 4l-8 8"}),"caret-up":jsx3("path",{...S,d:"M4 10l4-4 4 4"}),"caret-down":jsx3("path",{...S,d:"M4 6l4 4 4-4"}),"caret-right":jsx3("path",{...S,d:"M6 4l4 4-4 4"}),"caret-left":jsx3("path",{...S,d:"M10 4L6 8l4 4"}),"arrows-out":jsx3("path",{...S,d:"M9.5 2.5h4v4M13.5 2.5L9 7M6.5 13.5h-4v-4M2.5 13.5L7 9"}),"dots-three":jsxs2("g",{...F,children:[jsx3("circle",{cx:"3.5",cy:"8",r:"1.25"}),jsx3("circle",{cx:"8",cy:"8",r:"1.25"}),jsx3("circle",{cx:"12.5",cy:"8",r:"1.25"})]}),"sidebar-simple":jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3",width:"12",height:"10",rx:"1.5"}),jsx3("path",{d:"M9.5 3v10"})]}),"square-center":jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3",width:"12",height:"10",rx:"1.5"}),jsx3("rect",{x:"5",y:"5.5",width:"6",height:"5",rx:".75"})]}),"corners-out":jsx3("path",{...S,d:"M2.5 6V2.5H6M10 2.5h3.5V6M13.5 10v3.5H10M6 13.5H2.5V10"}),check:jsx3("path",{...S,d:"M3 8.5l3 3 7-7"}),archive:jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3",width:"12",height:"3",rx:".75"}),jsx3("path",{d:"M3 6v6.5a.5.5 0 00.5.5h9a.5.5 0 00.5-.5V6M6.5 8.5h3"})]}),"tray-arrow-up":jsx3("path",{...S,d:"M2.5 9.5v3a.5.5 0 00.5.5h10a.5.5 0 00.5-.5v-3h-3l-1 1.5h-3l-1-1.5h-3M8 8V2.5M5.5 5L8 2.5 10.5 5"}),star:jsx3("path",{...S,d:"M8 2l1.8 3.8 4.2.5-3.1 2.9.8 4.1L8 11.3l-3.7 2 .8-4.1L2 6.3l4.2-.5z"}),"star-fill":jsx3("path",{fill:"currentColor",stroke:"currentColor",strokeWidth:.8,strokeLinejoin:"round",d:"M8 1.6l1.95 3.95 4.36.64-3.16 3.07.75 4.34L8 11.55 4.1 13.6l.75-4.34L1.69 6.19l4.36-.64z"}),clock:jsxs2("g",{...S,children:[jsx3("circle",{cx:"8",cy:"8",r:"6"}),jsx3("path",{d:"M8 4.5V8h3"})]}),"arrow-bend-up-right":jsx3("path",{...S,d:"M10 3l3 3-3 3M13 6H7a4 4 0 00-4 4v3"}),"user-plus":jsxs2("g",{...S,children:[jsx3("circle",{cx:"6.5",cy:"5.5",r:"2.75"}),jsx3("path",{d:"M1.5 13.5c.8-2.2 2.7-3.5 5-3.5s4.2 1.3 5 3.5M12.5 4v4M10.5 6h4"})]}),"envelope-open":jsx3("path",{...S,d:"M2 6.5v6a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-6L8 2.5zM2 6.5l6 4 6-4"}),"envelope-simple":jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3.5",width:"12",height:"9",rx:"1"}),jsx3("path",{d:"M2 4.5l6 4.5 6-4.5"})]}),"pencil-simple":jsx3("path",{...S,d:"M10.8 2.7l2.5 2.5L5.6 12.9 2.5 13.5l.6-3.1zM9.3 4.2l2.5 2.5"}),"file-text":jsx3("path",{...S,d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3M6 8.5h4M6 11h4"}),flask:jsx3("path",{...S,d:"M6 2h4M6.8 2v4.3l-3.6 6.2a1 1 0 00.9 1.5h7.8a1 1 0 00.9-1.5L9.2 6.3V2M4.6 10.2h6.8"}),copy:jsx3("path",{...S,d:"M6.5 5.5h5a1 1 0 011 1v5a1 1 0 01-1 1h-5a1 1 0 01-1-1v-5a1 1 0 011-1zM10.5 5.5v-1a1 1 0 00-1-1h-5a1 1 0 00-1 1v5a1 1 0 001 1h1"}),"chat-circle-text":jsx3("path",{...S,d:"M4.7 13.1A5.8 5.8 0 102.9 11.3L2.3 13.7zM6 7h4M6 9.3h3"}),trash:jsx3("path",{...S,d:"M2.5 4h11M6.5 2.5h3M4 4l.6 9a.5.5 0 00.5.5h5.8a.5.5 0 00.5-.5L12 4M6.5 6.5v4.5M9.5 6.5v4.5"}),"circle-half":jsxs2("g",{children:[jsx3("circle",{...S,cx:"8",cy:"8",r:"6"}),jsx3("path",{...F,d:"M8 2a6 6 0 010 12z"})]}),"circle-three-quarter":jsxs2("g",{children:[jsx3("circle",{...S,cx:"8",cy:"8",r:"6"}),jsx3("path",{...F,d:"M8 8V2a6 6 0 11-6 6z"})]}),pause:jsx3("path",{...S,d:"M5.5 3v10M10.5 3v10"}),play:jsx3("path",{...S,d:"M4.5 2.5v11L13 8z"}),"toggle-right":jsxs2("g",{...S,children:[jsx3("rect",{x:"1.5",y:"4",width:"13",height:"8",rx:"4"}),jsx3("circle",{cx:"10.5",cy:"8",r:"2"})]}),"toggle-left":jsxs2("g",{...S,children:[jsx3("rect",{x:"1.5",y:"4",width:"13",height:"8",rx:"4"}),jsx3("circle",{cx:"5.5",cy:"8",r:"2"})]}),hourglass:jsx3("path",{...S,d:"M4 2.5h8M4 13.5h8M5 2.5c0 3 6 3.5 6 5.5s-6 2.5-6 5.5M11 2.5c0 3-6 3.5-6 5.5s6 2.5 6 5.5"}),"arrow-counter-clockwise":jsx3("path",{...S,d:"M4.5 6H2V3.5M2.3 6A6 6 0 112 9"}),"arrow-clockwise":jsx3("path",{...S,d:"M11.5 6H14V3.5M13.7 6A6 6 0 1 0 14 9"}),"arrows-clockwise":jsx3("path",{...S,d:"M3 6a5.4 5.4 0 0110 0M13 3v3h-3M13 10a5.4 5.4 0 01-10 0M3 13v-3h3"}),plus:jsx3("path",{...S,d:"M8 3v10M3 8h10"}),"circle-dashed":jsx3("circle",{...S,cx:"8",cy:"8",r:"6",strokeDasharray:"2.2 2.2"}),circle:jsx3("circle",{...S,cx:"8",cy:"8",r:"6"}),"clock-countdown":jsxs2("g",{...S,children:[jsx3("path",{d:"M8 2a6 6 0 11-6 6",strokeDasharray:"0"}),jsx3("path",{d:"M8 5v3l2 1.5M2.6 5.3l.1-.1M4.6 3.1l.1-.1"})]}),"check-circle-fill":jsxs2("g",{children:[jsx3("circle",{...F,cx:"8",cy:"8",r:"6.5"}),jsx3("path",{d:"M5 8.2l2 2 4-4",fill:"none",stroke:"hsl(var(--background))",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),"minus-circle":jsxs2("g",{...S,children:[jsx3("circle",{cx:"8",cy:"8",r:"6"}),jsx3("path",{d:"M5.5 8h5"})]}),"paper-plane-right":jsx3("path",{...S,d:"M2.5 2.8l11 5.2-11 5.2 1.8-5.2zM4.3 8h4.7"}),paperclip:jsx3("path",{...S,d:"M10.5 5l-4.6 4.6a1.1 1.1 0 001.6 1.6l5-5a2.3 2.3 0 00-3.2-3.2l-5 5a3.4 3.4 0 004.8 4.8L13 8.9"}),"clipboard-text":jsxs2("g",{...S,children:[jsx3("path",{d:"M10.5 3h2a.5.5 0 01.5.5v10a.5.5 0 01-.5.5h-9a.5.5 0 01-.5-.5v-10a.5.5 0 01.5-.5h2"}),jsx3("rect",{x:"5.5",y:"2",width:"5",height:"2.5",rx:".75"}),jsx3("path",{d:"M6 8h4M6 10.5h4"})]}),"x-circle-fill":jsxs2("g",{children:[jsx3("circle",{...F,cx:"8",cy:"8",r:"6.5"}),jsx3("path",{d:"M5.8 5.8l4.4 4.4M10.2 5.8l-4.4 4.4",fill:"none",stroke:"hsl(var(--background))",strokeWidth:1.5,strokeLinecap:"round"})]}),"magnifying-glass-plus":jsx3("path",{...S,d:"M7 12A5 5 0 107 2a5 5 0 000 10zM10.6 10.6L14 14M5 7h4M7 5v4"}),"magnifying-glass-minus":jsx3("path",{...S,d:"M7 12A5 5 0 107 2a5 5 0 000 10zM10.6 10.6L14 14M5 7h4"}),"download-simple":jsx3("path",{...S,d:"M8 2.5v7.5M4.5 6.5L8 10l3.5-3.5M2.5 10v3a.5.5 0 00.5.5h10a.5.5 0 00.5-.5v-3"}),link:jsx3("path",{...S,d:"M6.8 9.2l2.4-2.4M7.6 4.6l1.2-1.2a2.8 2.8 0 014 4l-1.2 1.2M8.4 11.4l-1.2 1.2a2.8 2.8 0 01-4-4l1.2-1.2"}),file:jsx3("path",{...S,d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),"file-image":jsxs2("g",{...S,children:[jsx3("path",{d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),jsx3("path",{d:"M3.5 12l3-3 2 2 1.5-1.5 2.5 2.5"}),jsx3("circle",{cx:"6.5",cy:"6.75",r:".75"})]}),"file-video":jsxs2("g",{...S,children:[jsx3("path",{d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),jsx3("path",{d:"M6.5 8v3.5L9.5 9.75z"})]}),"file-audio":jsxs2("g",{...S,children:[jsx3("path",{d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),jsx3("path",{d:"M6 9.5v1.5h1.25L9 12.25v-4.5L7.25 9H6M10.5 8.5a1.8 1.8 0 010 2.5"})]})};function hasIcon(name){return Object.prototype.hasOwnProperty.call(SHAPES,name)}function Icon({name,className}){let shape=SHAPES[name];return shape?jsx3("svg",{className:className?`nui-icon ${className}`:"nui-icon",viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",children:shape}):null}function renderIcon(icon,className){return icon==null||icon===!1?null:typeof icon=="string"?jsx3(Icon,{name:icon,className}):icon}import{Fragment as Fragment2,jsx as jsx4,jsxs as jsxs3}from"react/jsx-runtime";function RenderChartData({title,columns,rows,children}){return jsxs3(Fragment2,{children:[children,jsxs3("table",{hidden:!0,"data-notis-render":"chart-data","aria-label":title,children:[jsx4("thead",{children:jsx4("tr",{children:columns.map((column,index)=>jsx4("th",{children:column},index))})}),jsx4("tbody",{children:rows.map((row,index)=>jsx4("tr",{children:columns.map((_,column)=>jsx4("td",{children:row[column]==null?"":String(row[column])},column))},index))})]})]})}var KEY_ALIASES={esc:"escape",return:"enter",up:"arrowup",down:"arrowdown",left:"arrowleft",right:"arrowright",del:"delete",spacebar:"space"," ":"space",plus:"+",pgup:"pageup",pgdn:"pagedown"},MOD_ALIASES={mod:"mod",cmd:"mod",command:"mod",meta:"mod",ctrl:"ctrl",control:"ctrl",alt:"alt",option:"alt",opt:"alt",shift:"shift"},NAMED_KEYS=new Set(["escape","enter","tab","space","backspace","delete","insert","arrowup","arrowdown","arrowleft","arrowright","home","end","pageup","pagedown","f1","f2","f3","f4","f5","f6","f7","f8","f9","f10","f11","f12"]),SYMBOL_CODES={"/":{code:"Slash",shift:!1},"?":{code:"Slash",shift:!0},"[":{code:"BracketLeft",shift:!1},"{":{code:"BracketLeft",shift:!0},"]":{code:"BracketRight",shift:!1},"}":{code:"BracketRight",shift:!0},",":{code:"Comma",shift:!1},"<":{code:"Comma",shift:!0},".":{code:"Period",shift:!1},">":{code:"Period",shift:!0},";":{code:"Semicolon",shift:!1},":":{code:"Semicolon",shift:!0},"'":{code:"Quote",shift:!1},'"':{code:"Quote",shift:!0},"`":{code:"Backquote",shift:!1},"~":{code:"Backquote",shift:!0},"-":{code:"Minus",shift:!1},_:{code:"Minus",shift:!0},"=":{code:"Equal",shift:!1},"+":{code:"Equal",shift:!0},"\\":{code:"Backslash",shift:!1},"|":{code:"Backslash",shift:!0},"!":{code:"Digit1",shift:!0},"@":{code:"Digit2",shift:!0},"#":{code:"Digit3",shift:!0},$:{code:"Digit4",shift:!0},"%":{code:"Digit5",shift:!0},"^":{code:"Digit6",shift:!0},"&":{code:"Digit7",shift:!0},"*":{code:"Digit8",shift:!0},"(":{code:"Digit9",shift:!0},")":{code:"Digit0",shift:!0}},NAMED_CODES={escape:["Escape"],enter:["Enter","NumpadEnter"],tab:["Tab"],space:["Space"],backspace:["Backspace"],delete:["Delete"],insert:["Insert"],arrowup:["ArrowUp"],arrowdown:["ArrowDown"],arrowleft:["ArrowLeft"],arrowright:["ArrowRight"],home:["Home"],end:["End"],pageup:["PageUp"],pagedown:["PageDown"]};function isLetterKey(key){return/^[a-z]$/.test(key)}function isDigitKey(key){return/^[0-9]$/.test(key)}function isSymbolKey(key){return key.length===1&&!isLetterKey(key)&&!isDigitKey(key)}function normalizeKeyName(raw){if(raw.length===1){let lower2=raw.toLowerCase();return KEY_ALIASES[raw]??lower2}let lower=raw.toLowerCase();return KEY_ALIASES[lower]??lower}var KeySpecError=class extends Error{constructor(spec,reason){super(`Invalid key spec "${spec}": ${reason}`),this.name="KeySpecError"}};function parseChord2(step,spec){let chord={key:"",mod:!1,ctrl:!1,alt:!1,shift:!1},parts;step==="+"?parts=["+"]:step.endsWith("++")?parts=[...step.slice(0,-2).split("+"),"+"]:parts=step.split("+");let rawKey=parts.pop()??"";if(!rawKey)throw new KeySpecError(spec,"missing key");for(let part of parts){let modifier=MOD_ALIASES[part.toLowerCase()];if(!modifier)throw new KeySpecError(spec,`unknown modifier "${part}"`);chord[modifier]=!0}let key=normalizeKeyName(rawKey);if(key.length!==1&&!NAMED_KEYS.has(key))throw new KeySpecError(spec,`unknown key "${rawKey}"`);return chord.key=key,isSymbolKey(key)&&!chord.alt&&(chord.shift=!1),chord}var parseCache=new Map;function parseKeySpec(spec){let cached=parseCache.get(spec);if(cached)return cached;let trimmed=spec.trim();if(!trimmed)throw new KeySpecError(spec,"empty");let parsed=(trimmed==="+"?["+"]:trimmed.split(/\s+/)).map(step=>parseChord2(step,spec));return parseCache.set(spec,parsed),parsed}function isValidKeySpec(spec){try{return parseKeySpec(spec),!0}catch{return!1}}function isSequenceSpec(spec){return parseKeySpec(spec).length>1}function keyList(keys){return keys==null?[]:typeof keys=="string"?[keys]:[...keys]}function chordToString(chord,platform){let mod=chord.mod||platform==="other"&&chord.ctrl,ctrl=platform==="mac"&&chord.ctrl,parts=[];return mod&&parts.push("mod"),ctrl&&parts.push("ctrl"),chord.alt&&parts.push("alt"),chord.shift&&parts.push("shift"),parts.push(chord.key),parts.join("+")}function canonicalKey(spec,platform="mac"){return parseKeySpec(spec).map(chord=>chordToString(chord,platform)).join(" ")}function codesFor(chord){let{key}=chord;if(isLetterKey(key))return{codes:[`Key${key.toUpperCase()}`],shift:null};if(isDigitKey(key))return{codes:[`Digit${key}`,`Numpad${key}`],shift:null};let named=NAMED_CODES[key];if(named)return{codes:[...named],shift:null};let symbol=SYMBOL_CODES[key];return symbol?{codes:[symbol.code],shift:symbol.shift}:{codes:[],shift:null}}function normalizedEventKey(key){return key===" "||key==="Spacebar"?"space":key==="Esc"?"escape":key==="Up"||key==="Down"||key==="Left"||key==="Right"?`arrow${key.toLowerCase()}`:key==="Del"?"delete":(key.length===1,key.toLowerCase())}function matchChord(event,chord,platform){let meta=!!event.metaKey,ctrl=!!event.ctrlKey,alt=!!event.altKey,shift=!!event.shiftKey,wantMeta=platform==="mac"?chord.mod:!1,wantCtrl=platform==="mac"?chord.ctrl:chord.mod||chord.ctrl;if(chord.alt){if(!alt||meta!==wantMeta||ctrl!==wantCtrl)return!1;let{codes,shift:symbolShift}=codesFor(chord);if(!event.code||!codes.includes(event.code))return!1;let wantShift=symbolShift??chord.shift;return shift===wantShift}let key=normalizedEventKey(event.key??"");return isSymbolKey(chord.key)?key!==chord.key||meta!==wantMeta?!1:platform==="other"?wantCtrl?ctrl:!ctrl||alt:ctrl===wantCtrl:alt||meta!==wantMeta||ctrl!==wantCtrl?!1:isLetterKey(chord.key)?shift!==chord.shift?!1:key===chord.key?!0:key.length===1&&/\p{L}/u.test(key)&&!/^[a-z]$/.test(key)&&event.code===`Key${chord.key.toUpperCase()}`:isDigitKey(chord.key)?key===chord.key:key===chord.key&&shift===chord.shift}function matchKey(event,spec,platform,firstStep=!1){let chords;try{chords=parseKeySpec(spec)}catch{return!1}return chords.length>1&&!firstStep?!1:matchChord(event,chords[0],platform)}function isModifierOnlyKey(key){return key==="Shift"||key==="Control"||key==="Alt"||key==="Meta"||key==="AltGraph"||key==="CapsLock"||key==="OS"||key==="Fn"||key==="Hyper"||key==="Super"}var HOST_RESERVED_KEYS=Object.freeze(["/","c","shift+c","shift+tab","mod+s","mod+d","alt+p","alt+s","?","escape","mod+k"]),reservedCanonical={mac:new Set(HOST_RESERVED_KEYS.map(spec=>canonicalKey(spec,"mac"))),other:new Set(HOST_RESERVED_KEYS.map(spec=>canonicalKey(spec,"other")))};function isHostReserved(spec){for(let platform of["mac","other"]){let canonical=canonicalKey(spec,platform),first=canonical.split(" ")[0];if(reservedCanonical[platform].has(canonical)||reservedCanonical[platform].has(first))return!0}return!1}var KEY_JOIN_WORDS=Object.freeze({then:{en:"then",fr:"puis"},or:{en:"or",fr:"ou"}}),MAC_GLYPH={ctrl:"\u2303",alt:"\u2325",shift:"\u21E7",mod:"\u2318"};function keyName(key,mac,fr){switch(key){case"enter":return mac?"\u21B5":fr?"Entr\xE9e":"Enter";case"escape":return fr?"\xC9chap":"Esc";case"space":return fr?"Espace":"Space";case"arrowdown":return"\u2193";case"arrowup":return"\u2191";case"arrowleft":return"\u2190";case"arrowright":return"\u2192";case"tab":return"Tab";case"backspace":return mac?"\u232B":fr?"Retour arri\xE8re":"Backspace";case"delete":return mac?"\u2326":fr?"Suppr":"Delete";case"insert":return fr?"Inser":"Insert";case"home":return fr?"D\xE9but":"Home";case"end":return fr?"Fin":"End";case"pagedown":return fr?"Pg suiv":"PgDn";case"pageup":return fr?"Pg pr\xE9c":"PgUp";default:return key.length===1?key.toUpperCase():key[0].toUpperCase()+key.slice(1)}}function formatChord(chord,{platform,locale}){let mac=platform==="mac",fr=locale==="fr";if(mac)return["ctrl","alt","shift","mod"].filter(m=>chord[m]).map(m=>MAC_GLYPH[m]).join("")+keyName(chord.key,mac,fr);let names=[];return(chord.mod||chord.ctrl)&&names.push("Ctrl"),chord.alt&&names.push("Alt"),chord.shift&&names.push(fr?"Maj":"Shift"),[...names,keyName(chord.key,mac,fr)].join("+")}function formatKeyParts(spec,options){return keyList(spec).map(one=>parseKeySpec(one).map(chord=>formatChord(chord,options)))}function formatKey(spec,options){let then=` ${KEY_JOIN_WORDS.then[options.locale]} `,or=` ${KEY_JOIN_WORDS.or[options.locale]} `;return formatKeyParts(spec,options).map(caps=>caps.join(then)).join(or)}var ARIA_KEY={escape:"Escape",enter:"Enter",tab:"Tab",space:"Space",backspace:"Backspace",delete:"Delete",insert:"Insert",arrowup:"ArrowUp",arrowdown:"ArrowDown",arrowleft:"ArrowLeft",arrowright:"ArrowRight",home:"Home",end:"End",pageup:"PageUp",pagedown:"PageDown"};function toAriaKeyShortcuts(spec,platform){return keyList(spec).map(one=>parseKeySpec(one)).filter(chords=>chords.length===1).map(([chord])=>{let parts=[];chord.mod&&parts.push(platform==="mac"?"Meta":"Control"),chord.ctrl&&!(chord.mod&&platform!=="mac")&&parts.push("Control"),chord.alt&&parts.push("Alt"),chord.shift&&parts.push("Shift");let key=chord.key;return parts.push(ARIA_KEY[key]??(key.length===1?key.toUpperCase():key[0].toUpperCase()+key.slice(1))),parts.join("+")}).join(" ")}var SPOKEN_KEY=Object.freeze({enter:{en:"Enter",fr:"Entr\xE9e"},escape:{en:"Escape",fr:"\xC9chap"},space:{en:"Space",fr:"Espace"},arrowdown:{en:"Down arrow",fr:"Fl\xE8che bas"},arrowup:{en:"Up arrow",fr:"Fl\xE8che haut"},arrowleft:{en:"Left arrow",fr:"Fl\xE8che gauche"},arrowright:{en:"Right arrow",fr:"Fl\xE8che droite"},backspace:{en:"Backspace",fr:"Retour arri\xE8re"},delete:{en:"Delete",fr:"Suppr"},pagedown:{en:"Page down",fr:"Page suivante"},pageup:{en:"Page up",fr:"Page pr\xE9c\xE9dente"}}),SPOKEN_MOD=Object.freeze({ctrl:{en:"Control",fr:"Contr\xF4le"},alt:{mac:{en:"Option",fr:"Option"},other:{en:"Alt",fr:"Alt"}},shift:{en:"Shift",fr:"Maj"},mod:{mac:{en:"Command",fr:"Commande"},other:{en:"Control",fr:"Contr\xF4le"}}});function formatKeySpoken(spec,{platform,locale}){let then=` ${KEY_JOIN_WORDS.then[locale]} `,or=` ${KEY_JOIN_WORDS.or[locale]} `,chordWords=chord=>{let parts=[];return chord.ctrl&&!(chord.mod&&platform!=="mac")&&parts.push(SPOKEN_MOD.ctrl[locale]),chord.alt&&parts.push(SPOKEN_MOD.alt[platform][locale]),chord.shift&&parts.push(SPOKEN_MOD.shift[locale]),chord.mod&&parts.push(SPOKEN_MOD.mod[platform][locale]),parts.push(SPOKEN_KEY[chord.key]?.[locale]??keyName(chord.key,!1,locale==="fr")),parts.join(" ")};return keyList(spec).map(one=>parseKeySpec(one).map(chordWords).join(then)).join(or)}function actionErrorReason(error){if(!error||typeof error!="object")return null;let{name,code,reason}=error;return name!=="ActionError"||code!=="notis_action_error"?null:typeof reason=="string"||isWords(reason)?reason:null}var counted=(oneEn,otherEn,oneFr,otherFr)=>({one:{en:oneEn,fr:oneFr},other:{en:otherEn,fr:otherFr}}),same=(en,fr)=>({one:{en,fr},other:{en,fr}}),STANDARD_ACTIONS=Object.freeze({complete:{id:"complete",label:{en:"Complete",fr:"Terminer"},icon:"check",key:"e",tone:"default",toast:counted("1 item completed.","{n} items completed.","1 \xE9l\xE9ment termin\xE9.","{n} \xE9l\xE9ments termin\xE9s.")},archive:{id:"archive",label:{en:"Archive",fr:"Archiver"},icon:"archive",key:"e",tone:"default",toast:counted("1 item archived.","{n} items archived.","1 \xE9l\xE9ment archiv\xE9.","{n} \xE9l\xE9ments archiv\xE9s.")},unarchive:{id:"unarchive",label:{en:"Move to triage",fr:"D\xE9placer vers le tri"},icon:"tray-arrow-up",key:"shift+e",tone:"default",toast:counted("1 item restored.","{n} items restored.","1 \xE9l\xE9ment restaur\xE9.","{n} \xE9l\xE9ments restaur\xE9s.")},star:{id:"star",label:{en:"Star",fr:"Mettre en favori"},icon:"star",key:"s",tone:"default",toggle:"unstar",toast:counted("1 item starred.","{n} items starred.","1 \xE9l\xE9ment ajout\xE9 aux favoris.","{n} \xE9l\xE9ments ajout\xE9s aux favoris.")},unstar:{id:"unstar",label:{en:"Unstar",fr:"Retirer des favoris"},icon:"star",key:"s",tone:"default",toggle:"star",toast:null},later:{id:"later",label:{en:"Later",fr:"Plus tard"},icon:"clock",key:"h",tone:"default",toast:same("Snoozed until tomorrow.","Report\xE9 \xE0 demain.")},move:{id:"move",label:{en:"Move to\u2026",fr:"D\xE9placer vers\u2026"},icon:"arrow-bend-up-right",key:"m",tone:"default",toast:null,picker:!0},assign:{id:"assign",label:{en:"Assign\u2026",fr:"Attribuer\u2026"},icon:"user-plus",key:"a",tone:"default",toast:null,picker:!0},read:{id:"read",label:{en:"Mark as read",fr:"Marquer comme lu"},icon:"envelope-open",key:"u",tone:"default",toggle:"unread",toast:null},unread:{id:"unread",label:{en:"Mark as unread",fr:"Marquer comme non lu"},icon:"envelope-simple",key:"u",tone:"default",toggle:"read",toast:null},delete:{id:"delete",label:{en:"Delete",fr:"Supprimer"},icon:"trash",key:"#",tone:"danger",toast:counted("1 item deleted.","{n} items deleted.","1 \xE9l\xE9ment supprim\xE9.","{n} \xE9l\xE9ments supprim\xE9s.")},progress:{id:"progress",label:{en:"Start progress",fr:"Passer en cours"},icon:"circle-half",key:null,tone:"default",toast:null},pause:{id:"pause",label:{en:"Pause",fr:"Mettre en pause"},icon:"pause",key:null,tone:"default",toggle:"resume",toast:null},resume:{id:"resume",label:{en:"Resume",fr:"Reprendre"},icon:"play",key:null,tone:"default",toggle:"pause",toast:null},enable:{id:"enable",label:{en:"Enable",fr:"Activer"},icon:"toggle-right",key:null,tone:"default",toggle:"disable",toast:null},disable:{id:"disable",label:{en:"Disable",fr:"D\xE9sactiver"},icon:"toggle-left",key:null,tone:"default",toggle:"enable",toast:null},waiting:{id:"waiting",label:{en:"Waiting",fr:"En attente"},icon:"hourglass",key:"w",tone:"default",toast:null,managerOnly:!0}});function isStandardActionId(id){return typeof id=="string"&&Object.prototype.hasOwnProperty.call(STANDARD_ACTIONS,id)}function actionToast(id,n){let toast=STANDARD_ACTIONS[id].toast;return toast?fillWords(n===1?toast.one:toast.other,{n}):null}function resolveActionRef(ref){if(typeof ref=="string")return standardDefaults(ref);let toastOff=Object.prototype.hasOwnProperty.call(ref,"toast")&&!ref.toast,merged=isStandardActionId(ref.id)?{...standardDefaults(ref.id),...stripUndefined(ref)}:{...ref};return toastOff&&(merged.toast=null),merged}function toWords(value){return typeof value=="string"?{en:value,fr:value}:value}function standardDefaults(id){let action=STANDARD_ACTIONS[id];return{id,label:action.label,icon:action.icon,key:action.key??void 0,tone:action.tone,toast:action.toast?n=>actionToast(id,n):void 0,...action.toggle?{toggle:action.toggle}:{}}}function stripUndefined(value){let out={};for(let[k,v]of Object.entries(value))v!==void 0&&(out[k]=v);return out}var SHELL_WORDS=Object.freeze({open:{en:"Open",fr:"Ouvrir"},back:{en:"Back",fr:"Retour"},close:{en:"Close",fr:"Fermer"},previous:{en:"Previous",fr:"Pr\xE9c\xE9dent"},next:{en:"Next",fr:"Suivant"},more:{en:"More",fr:"Plus"},clear:{en:"Clear",fr:"Effacer"},removeNamed:{en:"Remove {name}",fr:"Retirer {name}"},savingNamed:{en:"Saving {name}",fr:"Enregistrement de {name}"},clearSelection:{en:"Clear selection",fr:"Effacer la s\xE9lection"},undo:{en:"Undo",fr:"Annuler"},select:{en:"Select",fr:"S\xE9lectionner"},selectAll:{en:"Select all",fr:"Tout s\xE9lectionner"},extendSelection:{en:"Extend selection",fr:"\xC9tendre la s\xE9lection"},closeThenClear:{en:"Close, then clear selection",fr:"Fermer, puis effacer la s\xE9lection"},showShortcuts:{en:"Show shortcuts",fr:"Afficher les raccourcis"},search:{en:"Search",fr:"Rechercher"},tryAgain:{en:"Try again",fr:"R\xE9essayer"},selectedOne:{en:"1 selected",fr:"1 s\xE9lectionn\xE9"},selectedMany:{en:"{n} selected",fr:"{n} s\xE9lectionn\xE9s"},sidePeek:{en:"Side peek",fr:"Aper\xE7u lat\xE9ral"},centerPeek:{en:"Center peek",fr:"Aper\xE7u centr\xE9"},fullPage:{en:"Full page",fr:"Pleine page"},openAs:{en:"Open as",fr:"Ouvrir en"}});function selectedCount(n){return n===1?SHELL_WORDS.selectedOne:fillWords(SHELL_WORDS.selectedMany,{n})}var HELP_WORDS=Object.freeze({title:{en:"Keyboard shortcuts",fr:"Raccourcis clavier"},groupSpace:{en:"This Space",fr:"Ce Space"},groupNotis:{en:"Notis",fr:"Notis"},close:{en:"Close",fr:"Fermer"},empty:{en:"No shortcuts here.",fr:"Aucun raccourci ici."}});var entry=(id,keys,scope,en,fr,extra={})=>Object.freeze({id,keys:Object.freeze(keys),scope,label:Object.freeze({en,fr}),...extra}),DEFAULT_KEYMAP=Object.freeze({"list.next":entry("list.next",["j","arrowdown"],"collection","Next item","\xC9l\xE9ment suivant",{repeat:!0}),"list.prev":entry("list.prev",["k","arrowup"],"collection","Previous item","\xC9l\xE9ment pr\xE9c\xE9dent",{repeat:!0}),"list.extendDown":entry("list.extendDown",["shift+j","shift+arrowdown"],"collection","Extend selection down","\xC9tendre la s\xE9lection vers le bas",{repeat:!0}),"list.extendUp":entry("list.extendUp",["shift+k","shift+arrowup"],"collection","Extend selection up","\xC9tendre la s\xE9lection vers le haut",{repeat:!0}),"list.open":entry("list.open",["enter","o"],"collection","Open","Ouvrir"),"list.toggleSelect":entry("list.toggleSelect",["x"],"collection","Select","S\xE9lectionner"),"list.selectAll":entry("list.selectAll",["mod+a"],"collection","Select all","Tout s\xE9lectionner"),"period.prev":entry("period.prev",["["],"collection","Previous period","P\xE9riode pr\xE9c\xE9dente"),"period.next":entry("period.next",["]"],"collection","Next period","P\xE9riode suivante"),"period.today":entry("period.today",["t"],"collection","Today","Aujourd\u2019hui"),undo:entry("undo",["z","mod+z"],"route","Undo","Annuler"),"view.prev":entry("view.prev",["["],"route","Previous view","Vue pr\xE9c\xE9dente"),"view.next":entry("view.next",["]"],"route","Next view","Vue suivante"),"host.help":entry("host.help",["?"],"app","Show keyboard shortcuts","Afficher les raccourcis clavier",{host:!0}),"host.escape":entry("host.escape",["escape"],"app","Close, then go back","Fermer, puis revenir",{host:!0}),"host.search":entry("host.search",["/"],"app","Search","Rechercher",{host:!0}),"host.newChat":entry("host.newChat",["c"],"app","New conversation","Nouvelle conversation",{host:!0}),"host.call":entry("host.call",["shift+c"],"app","Open voice call","Ouvrir l\u2019appel vocal",{host:!0}),"host.toggleSidebar":entry("host.toggleSidebar",["mod+s"],"app","Toggle sidebar","Afficher ou masquer la barre lat\xE9rale",{host:!0}),"host.voiceMessage":entry("host.voiceMessage",["mod+d"],"app","Voice message","Message vocal",{host:!0}),"host.modelMenu":entry("host.modelMenu",["alt+p"],"app","Model menu","Menu du mod\xE8le",{host:!0}),"host.speedMenu":entry("host.speedMenu",["alt+s"],"app","Speed menu","Menu de vitesse",{host:!0}),"host.toggleVoiceCall":entry("host.toggleVoiceCall",["shift+tab"],"app","Toggle voice call in panel","Afficher ou masquer l\u2019appel vocal dans le panneau",{host:!0}),"host.commandMenu":entry("host.commandMenu",["mod+k"],"app","Command menu","Menu des commandes",{host:!0}),"host.goInbox":entry("host.goInbox",["g i"],"app","Go to Inbox","Aller \xE0 l\u2019Inbox",{host:!0,managerOnly:!0}),"host.goStarred":entry("host.goStarred",["g s"],"app","Go to Starred","Aller aux Favoris",{host:!0,managerOnly:!0}),"host.goDone":entry("host.goDone",["g d"],"app","Go to Done","Aller \xE0 Termin\xE9",{host:!0,managerOnly:!0})});var PLATFORMS=["mac","other"];function keyFingerprints(keys){let out=new Map;for(let spec of keyList(keys))for(let platform of PLATFORMS)out.set(`${platform}:${canonicalKey(spec,platform)}`,canonicalKey(spec,"mac"));return out}function ownerOf(candidate){return candidate.owner??"notis"}function ownerKindOf(candidate){return candidate.ownerKind?candidate.ownerKind:ownerOf(candidate)==="notis"?"host":"space"}function selfClashes(candidate){let clashes=[],space=ownerKindOf(candidate)==="space";for(let spec of keyList(candidate.keys)){try{parseKeySpec(spec)}catch(error){clashes.push({kind:"invalid",severity:"error",key:spec,ids:[candidate.id],scope:candidate.scope,owner:ownerOf(candidate),message:error.message});continue}space&&isHostReserved(spec)&&clashes.push({kind:"reserved",severity:"error",key:canonicalKey(spec),ids:[candidate.id],scope:candidate.scope,owner:ownerOf(candidate),message:`"${candidate.id}" uses ${canonicalKey(spec)}, which Notis keeps for itself. Pick another key.`})}return space&&candidate.scope==="app"&&clashes.push({kind:"app-scope",severity:"error",key:keyList(candidate.keys).join(", "),ids:[candidate.id],scope:"app",owner:ownerOf(candidate),message:`"${candidate.id}" registers at app scope, which only Notis uses. Use route or a lower scope.`}),clashes}function safeFingerprints(keys){try{return keyFingerprints(keys)}catch{return new Map}}function pairClashes(earlier,later){if(earlier.available===!1||later.available===!1)return[];let a=safeFingerprints(earlier.keys),b=safeFingerprints(later.keys),shared=new Set;for(let[fingerprint,key]of b)a.has(fingerprint)&&shared.add(key);let clashes=[],sameOwner=ownerOf(earlier)===ownerOf(later);for(let key of shared)if(earlier.scope===later.scope&&sameOwner)clashes.push({kind:"duplicate",severity:"error",key,ids:[earlier.id,later.id],scope:later.scope,owner:ownerOf(later),message:`NotisKeyClash: "${earlier.id}" and "${later.id}" both use ${key} in the ${later.scope} scope.`});else if(earlier.scope!==later.scope){let[low,high]=SCOPE_ORDER[earlier.scope]<SCOPE_ORDER[later.scope]?[earlier,later]:[later,earlier];clashes.push({kind:"shadowed",severity:"info",key,ids:[high.id,low.id],scopes:[high.scope,low.scope],message:`${key}: "${high.id}" (${high.scope}) is asked before "${low.id}" (${low.scope}).`})}if(earlier.scope===later.scope&&sameOwner)for(let[single,sequence]of[[earlier,later],[later,earlier]])for(let one of keyList(single.keys))for(let seq of keyList(sequence.keys)){let s,q;try{s=parseKeySpec(one),q=parseKeySpec(seq)}catch{continue}s.length!==1||q.length<2||canonicalKey(one)===canonicalKey(seq).split(" ")[0]&&clashes.push({kind:"prefix",severity:"info",key:canonicalKey(one),ids:[single.id,sequence.id],scope:single.scope,owner:ownerOf(single),message:`${canonicalKey(one)} runs "${single.id}" at once, so "${sequence.id}" (${canonicalKey(seq)}) never starts.`})}return clashes}var ROOT_OWNER="notis",NotisKeyClash=class extends Error{clash;constructor(clash){super(clash.message.startsWith("NotisKeyClash")?clash.message:`NotisKeyClash: ${clash.message}`),this.name="NotisKeyClash",this.clash=clash}},MAX_BOOST=99,ShortcutRegistry=class{entries=[];owners=new Map;seq=0;version=0;listeners=new Set;warned=new Set;options;constructor(options={}){this.options={strict:options.strict??!0,onClash:options.onClash}}subscribe(listener){return this.listeners.add(listener),()=>{this.listeners.delete(listener)}}getVersion(){return this.version}notify(){this.version+=1;for(let listener of[...this.listeners])listener()}defineOwner(id,options={}){if(id===ROOT_OWNER)return()=>{};let parent=options.parent??ROOT_OWNER,existing=this.owners.get(id);existing?(existing.refs+=1,existing.parent=parent,options.kind&&(existing.kind=options.kind),options.available!==void 0&&existing.available!==options.available&&(existing.available=options.available)):this.owners.set(id,{id,parent,kind:options.kind??this.inheritedKind(parent),available:options.available??!0,refs:1}),this.notify();let released=!1;return()=>{if(released)return;released=!0;let record=this.owners.get(id);record&&(record.refs-=1,record.refs<=0&&this.owners.delete(id),this.notify())}}setOwnerAvailable(id,available){let record=this.owners.get(id);!record||record.available===available||(record.available=available,this.notify())}inheritedKind(parent){return parent===ROOT_OWNER?"space":this.owners.get(parent)?.kind??"space"}ownerKind(id){return id===ROOT_OWNER?"host":this.owners.get(id)?.kind??"space"}isOwnerAvailable(id){let current=id,seen=new Set;for(;current&&current!==ROOT_OWNER&&!seen.has(current);){seen.add(current);let record=this.owners.get(current);if(!record)return!0;if(!record.available)return!1;current=record.parent}return!0}register(def,owner=def.owner??ROOT_OWNER){let ownerKind=this.ownerKind(owner),candidate=this.candidate(def,owner,ownerKind),errors=selfClashes(candidate).filter(clash=>clash.severity==="error");if(errors.length)return this.reject(errors[0]),null;if(this.isOwnerAvailable(owner))for(let entry3 of this.entries){if(entry3.owner!==owner||entry3.def.scope!==def.scope||!this.isOwnerAvailable(entry3.owner))continue;let duplicate=pairClashes(this.candidate(entry3.def,entry3.owner,entry3.ownerKind),candidate).find(clash=>clash.kind==="duplicate");if(duplicate)return this.reject(duplicate),null}let boost=Math.max(0,Math.min(MAX_BOOST,def.boost??0)),entry2={def,owner,ownerKind,seq:++this.seq,rank:SCOPE_ORDER[def.scope]+boost,chords:keyList(def.keys).map(spec=>parseKeySpec(spec))};this.entries.push(entry2),this.notify();let removed=!1;return()=>{if(removed)return;removed=!0;let index=this.entries.indexOf(entry2);index!==-1&&this.entries.splice(index,1),this.notify()}}candidate(def,owner,ownerKind){return{id:def.id,keys:def.keys,scope:def.scope,owner,ownerKind,available:!0}}reject(clash){if(this.options.strict)throw new NotisKeyClash(clash);if(this.warned.has(clash.message))return;this.warned.add(clash.message),(this.options.onClash??(message=>{typeof console<"u"&&console.warn(`[notis keys] ${message} The later shortcut was ignored.`)}))(clash.message)}all(){return this.entries}active(options={}){return this.entries.filter(entry2=>(!options.modalOnly||entry2.def.scope==="modal")&&this.isOwnerAvailable(entry2.owner)).sort((a,b)=>b.rank-a.rank||b.seq-a.seq)}helpEntries(){let byId=new Map,ordered=[...this.entries].sort((a,b)=>a.seq-b.seq);for(let entry2 of ordered){let{def}=entry2;if(def.hidden||def.scope==="modal"||!this.isOwnerAvailable(entry2.owner)||def.when&&!safeWhen(def.when))continue;let group=def.group??(entry2.ownerKind==="space"?"space":"notis");byId.delete(def.id),byId.set(def.id,{id:def.id,keys:keyList(def.keys),label:def.label,group,scope:def.scope,owner:entry2.owner})}let rows=[...byId.values()];return[...rows.filter(row=>row.group==="space"),...rows.filter(row=>row.group==="notis")]}helpText(locale){return this.helpEntries().map(row=>({group:row.group,label:row.label[locale],keys:row.keys}))}};function safeWhen(when){try{return when()!==!1}catch{return!1}}var NON_TEXT_INPUTS=new Set(["button","checkbox","color","file","hidden","image","radio","reset","submit"]);function isElement(value){return!!value&&typeof value.matches=="function"}function eventTarget(event){let first=(typeof event.composedPath=="function"?event.composedPath():[]).find(isElement);return first||(isElement(event.target)?event.target:null)}function closestComposed(element,selector){let current=element;for(;current;){let found=current.closest(selector);if(found)return found;let root=current.getRootNode();current="host"in root?root.host:null}return null}function containsComposed(container,element){let current=element;for(;current&&container;){if(container.contains(current))return!0;let root=current.getRootNode();current="host"in root?root.host:null}return!1}function isTextEntry(element){if(!element)return!1;let tag=element.tagName;return tag==="TEXTAREA"||tag==="SELECT"?!0:tag==="INPUT"?!NON_TEXT_INPUTS.has((element.type||"text").toLowerCase()):element.isContentEditable?!0:closestComposed(element,'[contenteditable=""], [contenteditable="true"], [contenteditable="plaintext-only"], [role="textbox"], [role="combobox"], [role="searchbox"]')!==null}function fieldOwnsEscape(element){return!element||!isTextEntry(element)?!1:closestComposed(element,"[data-notis-floating]")?element.getAttribute("aria-expanded")==="true":!0}function isInsideOpenMenu(element){if(!element)return!1;let menu=closestComposed(element,'[role="menu"], [role="listbox"], [role="menubar"]');return!menu||menu.hasAttribute("data-notis-engine-list")?!1:menu.getAttribute("data-state")!=="closed"}function blocksShortcuts(element,options){return options.inFields?!1:!!(isTextEntry(element)||!options.modal&&isInsideOpenMenu(element))}function isActivatable(element){return closestComposed(element,'button, a[href], [role="button"], [role="switch"], [role="checkbox"], [role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"], summary, input[type="checkbox"], input[type="radio"]')!==null}function ownsArrows(element){return closestComposed(element,'input[type="range"], [role="slider"], [role="tablist"], [role="radiogroup"], [role="spinbutton"], [role="separator"][tabindex], [role="tree"], [role="grid"]')!==null}function keysOff(element){return closestComposed(element,'[data-notis-keys="off"]')!==null}function isVisibleComposed(element){if(!element?.isConnected)return!1;let current=element;for(;current;){if(current.hasAttribute("hidden")||current.hasAttribute("inert")||current.getAttribute("aria-hidden")==="true")return!1;let style=current.ownerDocument.defaultView?.getComputedStyle(current);if(style?.display==="none"||style?.visibility==="hidden")return!1;let root=current.getRootNode();current=current.parentElement??("host"in root?root.host:null)}return!0}function collectRoots(doc){let roots=[doc],visit=root=>{let walker=doc.createTreeWalker(root,1);for(let node=walker.nextNode();node;node=walker.nextNode()){let shadow=node.shadowRoot;shadow&&(roots.push(shadow),visit(shadow))}};return visit(doc),roots}function queryAllComposed(doc,selector,event){let found=new Set;for(let root of collectRoots(doc))for(let el of root.querySelectorAll(selector))found.add(el);if(event&&typeof event.composedPath=="function")for(let target of event.composedPath())isElement(target)&&target.matches(selector)&&found.add(target);return[...found]}var MODAL_LAYER=['[role="dialog"][aria-modal="true"]','[role="dialog"][data-state="open"]','[role="alertdialog"]:not([data-state="closed"])',"dialog.notis-dialog[open]",'dialog[open][aria-modal="true"]','[role="menu"][data-state="open"]','[role="listbox"][data-state="open"]'].join(", ");function openModalLayers(doc,event){return queryAllComposed(doc,MODAL_LAYER,event).filter(el=>!el.closest("[data-notis-nonmodal]")&&isVisibleComposed(el))}function hasOpenModal(doc,event){return openModalLayers(doc,event).length>0}function modalLayerOf(element){let current=element;for(;current;){let layer=closestComposed(current,MODAL_LAYER);if(!layer)return null;if(!layer.closest("[data-notis-nonmodal]"))return layer;let root=layer.getRootNode();current=layer.parentElement??("host"in root?root.host:null)}return null}var FLOATING_LAYER='dialog[open], [role="dialog"]:not([data-state="closed"]), [role="alertdialog"]:not([data-state="closed"]), [role="menu"]:not([data-state="closed"]), [role="listbox"][data-state="open"]';function foreignFloatingLayers(doc,event){return queryAllComposed(doc,FLOATING_LAYER,event).filter(el=>!el.closest("[data-notis-escape-owned]")&&isVisibleComposed(el))}var ESCAPE_PRIORITY=Object.freeze({route:0,detail:100,selection:200,help:300,overlay:400}),SEQUENCE_TIMEOUT_MS=1500;function detectPlatform(){if(typeof navigator>"u")return"other";let nav=navigator,name=nav.userAgentData?.platform||nav.platform||nav.userAgent||"";return/mac|iphone|ipad|ipod/i.test(name)?"mac":"other"}function detectLocale(){if(typeof document>"u")return"en";let lang=document.querySelector("html")?.getAttribute("lang")??"";return/^fr\b/i.test(lang)?"fr":"en"}function defaultStrict(){try{return process.env.NODE_ENV!=="production"}catch{return!0}}function consume(event,immediate=!1){event.preventDefault(),immediate?event.stopImmediatePropagation():event.stopPropagation()}function isUnmodifiedEscape(event){return event.key==="Escape"&&!event.metaKey&&!event.ctrlKey&&!event.altKey&&!event.shiftKey}var KeyboardEngineCore=class{registry;settings;mounted=0;now=()=>Date.now();layers=[];blockers=[];seq=0;held=new Set;pending=null;attached=new Map;helpOpen=!1;helpUnregister=null;forcedRepeat=new WeakSet;constructor(settings={}){this.settings={host:settings.host??"portal",locale:settings.locale??detectLocale(),platform:settings.platform??detectPlatform(),strict:settings.strict??defaultStrict(),onClash:settings.onClash},this.registry=new ShortcutRegistry({strict:this.settings.strict,onClash:this.settings.onClash})}configure(settings,options={}){let next={...this.settings};for(let[key,value]of Object.entries(settings))value!==void 0&&(next[key]=value);let changed=Object.keys(next).some(key=>next[key]!==this.settings[key]);return this.settings=next,this.registry.options={strict:next.strict,onClash:next.onClash},changed&&!options.silent&&this.registry.notify(),changed}subscribe(listener){return this.registry.subscribe(listener)}getVersion(){return this.registry.getVersion()}attach(doc){let existing=this.attached.get(doc);if(existing)existing.refs+=1;else{let onKeyDown=event=>this.handleKeyDown(event),onKeyUp=event=>this.handleKeyUp(event),onReset=()=>this.resetHeld(),onVisibility=()=>{doc.visibilityState==="hidden"&&this.resetHeld()};doc.addEventListener("keydown",onKeyDown,!0),doc.addEventListener("keyup",onKeyUp,!0),doc.addEventListener("visibilitychange",onVisibility),doc.defaultView?.addEventListener("blur",onReset),this.attached.set(doc,{refs:1,detach:()=>{doc.removeEventListener("keydown",onKeyDown,!0),doc.removeEventListener("keyup",onKeyUp,!0),doc.removeEventListener("visibilitychange",onVisibility),doc.defaultView?.removeEventListener("blur",onReset)}})}this.ensureHelpShortcut();let detached=!1;return()=>{if(detached)return;detached=!0;let record=this.attached.get(doc);record&&(record.refs-=1,record.refs<=0&&(record.detach(),this.attached.delete(doc)))}}isAttached(doc){return this.attached.has(doc)}attachedDocument(){for(let doc of this.attached.keys())return doc;return null}resetHeld(){this.held.clear(),this.pending=null}register(def,owner){return this.registry.register(def,owner??def.owner??ROOT_OWNER)}defineOwner=(id,options)=>this.registry.defineOwner(id,options);setOwnerAvailable(id,available){this.registry.setOwnerAvailable(id,available)}isOwnerAvailable(id){return this.registry.isOwnerAvailable(id)}addEscapeLayer(id,onEscape,priority=ESCAPE_PRIORITY.overlay){let layer={id,onEscape,priority,seq:++this.seq};return this.layers.push(layer),()=>{let index=this.layers.indexOf(layer);index!==-1&&this.layers.splice(index,1)}}addEscapeBlocker(priority=ESCAPE_PRIORITY.detail+50,isActive){let blocker={priority,seq:++this.seq,isActive};return this.blockers.push(blocker),()=>{let index=this.blockers.indexOf(blocker);index!==-1&&this.blockers.splice(index,1)}}escapeLayerIds(){return this.sortedLayers().map(layer=>layer.id)}sortedLayers(){return[...this.layers].sort((a,b)=>b.priority-a.priority||b.seq-a.seq)}runEscapeChain(event){let blockers=this.blockers.filter(blocker=>!blocker.isActive||blocker.isActive()),top=blockers.reduce((max,blocker)=>Math.max(max,blocker.priority),-1/0);for(let layer of this.sortedLayers()){if(layer.priority<top)return!0;let handled=!1;try{handled=layer.onEscape(event)===!0}catch(error){reportError(error),handled=!0}if(handled)return!0}return blockers.length>0}isHelpOpen(){return this.helpOpen}openHelp(){this.helpOpen||(this.helpOpen=!0,this.registry.notify())}closeHelp(){this.helpOpen&&(this.helpOpen=!1,this.registry.notify())}toggleHelp(){this.helpOpen?this.closeHelp():this.openHelp()}ensureHelpShortcut(){if(this.helpUnregister)return;let entry2=DEFAULT_KEYMAP["host.help"];this.helpUnregister=this.registry.register({id:entry2.id,keys:[...entry2.keys],scope:"app",label:entry2.label,group:"notis",run:()=>{this.toggleHelp()}},ROOT_OWNER)}isRepeat(event){return event.repeat||this.forcedRepeat.has(event)}handleKeyUp(event){if(event.key==="Meta"){this.held.clear();return}this.held.delete(event.code||event.key)}handleKeyDown(event){if(event.isComposing||event.keyCode===229)return;let key=event.key;if(!key||key==="Dead"||key==="Process"||isModifierOnlyKey(key))return;let physical=event.code||key,repeat=event.repeat||this.held.has(physical);if(event.metaKey||this.held.add(physical),repeat&&!event.repeat){this.forcedRepeat.add(event);try{Object.defineProperty(event,"repeat",{value:!0,configurable:!0})}catch{}}let target=eventTarget(event),doc=target?.ownerDocument??(typeof document<"u"?document:null);if(!doc||keysOff(target)||isUnmodifiedEscape(event)&&this.handleEscape(event,target,doc,repeat)||event.defaultPrevented)return;let lower=key.toLowerCase();if(!event.metaKey&&!event.ctrlKey&&!event.altKey&&(lower==="enter"||lower===" ")&&isActivatable(target)){this.pending=null;return}if(lower.startsWith("arrow")&&ownsArrows(target))return;let modal=null,isModal=()=>modal??=hasOpenModal(doc,event),{platform}=this.settings,eligible=entry2=>{let{def}=entry2;return!(repeat&&!def.repeat||isModal()&&def.scope!=="modal"||blocksShortcuts(target,{inFields:!!def.allowInFields,modal:def.scope==="modal"})||def.when&&!safeWhen(def.when))},pending=this.pending;if(this.pending=null,pending&&!repeat&&this.now()-pending.at<=SEQUENCE_TIMEOUT_MS){let next=pending.candidates.filter(({entry:entry2,chords})=>matchChord(event,chords[pending.step],platform)&&this.registry.all().includes(entry2)&&eligible(entry2));if(next.length){let done=next.filter(({chords})=>chords.length===pending.step+1);for(let{entry:entry2}of done)if(this.run(entry2,event)){consume(event);return}let longer=next.filter(({chords})=>chords.length>pending.step+1);if(longer.length){this.pending={candidates:longer,step:pending.step+1,at:this.now()},consume(event);return}}}let active=this.registry.active();for(let entry2 of active)if(entry2.chords.some(chords=>chords.length===1&&matchChord(event,chords[0],platform))&&eligible(entry2)&&this.run(entry2,event)){consume(event);return}if(repeat)return;let starts=[];for(let entry2 of active)for(let chords of entry2.chords)chords.length>1&&matchChord(event,chords[0],platform)&&eligible(entry2)&&starts.push({entry:entry2,chords});starts.length&&(this.pending={candidates:starts,step:1,at:this.now()},consume(event))}run(entry2,event){try{return entry2.def.run(event)!==!1}catch(error){return reportError(error),!0}}handleEscape(event,target,doc,repeat){if(this.pending=null,fieldOwnsEscape(target))return!0;let foreign=foreignFloatingLayers(doc,event);if(repeat)return(foreign.length||this.layers.length)&&consume(event,!0),!0;if(event.defaultPrevented||foreign.length)return!0;if(!this.layers.length&&!this.blockers.length)return!1;let handled=this.runEscapeChain(event);return handled&&consume(event),handled}};function reportError(error){typeof console<"u"&&console.error("[notis keys] A shortcut failed.",error)}import{createContext as createContext3}from"react";var KEY=Symbol.for("notis.sdk.ui.instance");function create(){return Object.freeze({version:1,core:new KeyboardEngineCore,EngineContext:createContext3(null),OwnerContext:createContext3(ROOT_OWNER),KeycapContext:createContext3(null)})}var local=null;function getSharedInstance(){if(local)return local;let slot=globalThis,existing=slot[KEY];if(existing&&existing.version===1)return typeof console<"u"&&console.warn("[notis keys] A second copy of the Notis toolkit loaded. It shares the first keyboard engine."),local=existing,local;local=create();try{Object.defineProperty(slot,KEY,{value:local,configurable:!0,enumerable:!1,writable:!1})}catch{}return local}import{useCallback as useCallback6,useContext as useContext3,useEffect as useEffect6,useLayoutEffect as useLayoutEffect4,useRef as useRef5,useSyncExternalStore as useSyncExternalStore2}from"react";var useIsoLayoutEffect=typeof window>"u"?useEffect6:useLayoutEffect4;function useEngineCore(){let shared=getSharedInstance();return useContext3(shared.EngineContext)??shared.core}function useShortcutOwner(){return useContext3(getSharedInstance().OwnerContext)}function useSetting(read){let core=useEngineCore(),getSnapshot=()=>read(core);return useSyncExternalStore2(useCallback6(listener=>core.subscribe(listener),[core]),getSnapshot,getSnapshot)}function useToolkitLocale(){return useSetting(core=>core.mounted>0?core.settings.locale:detectLocale())}function useToolkitPlatform(){return useSetting(core=>core.mounted>0?core.settings.platform:detectPlatform())}function useToolkitSettings(){let locale=useToolkitLocale(),platform=useToolkitPlatform(),core=useEngineCore(),host=useSetting(c=>c.settings.host),strict=useSetting(c=>c.settings.strict);return{host,locale,platform,strict,onClash:core.settings.onClash}}function defKey(def,owner){return JSON.stringify([def.id,keyList(def.keys),def.scope,def.owner??owner,def.group??"",!!def.hidden,!!def.repeat,!!def.allowInFields,def.boost??0,def.label.en,def.label.fr])}function liveDef(ref){return{...ref.current,when:()=>{let when=ref.current.when;return when?when():!0},run:event=>ref.current.run(event)}}function useShortcut(def,deps=[]){let core=useEngineCore(),owner=useShortcutOwner(),ref=useRef5(def);ref.current=def;let key=defKey(def,owner);useEffect6(()=>{let unregister=core.register(liveDef(ref),ref.current.owner??owner);return()=>{unregister?.()}},[core,owner,key,...deps])}function useShortcuts2(defs,deps=[]){let core=useEngineCore(),owner=useShortcutOwner(),ref=useRef5(defs);ref.current=defs;let key=defs.map(def=>defKey(def,owner)).join(`
3
3
  `);useEffect6(()=>{let unregisters=ref.current.map((def,index)=>{let live={get current(){return ref.current[index]??def}};return core.register(liveDef(live),def.owner??owner)});return()=>{for(let unregister of unregisters)unregister?.()}},[core,owner,key,...deps])}function useShortcutScope(owner,options){let core=useEngineCore(),parent=useShortcutOwner(),{available,kind}=options,availableRef=useRef5(available);return availableRef.current=available,useIsoLayoutEffect(()=>core.defineOwner(owner,{parent,kind,available:availableRef.current}),[core,owner,parent,kind]),useIsoLayoutEffect(()=>{core.setOwnerAvailable(owner,available)},[core,owner,available]),{owner,available,isAvailable:()=>core.isOwnerAvailable(owner)}}function useEscapeLayer(id,onEscape,options={}){let core=useEngineCore(),owner=useShortcutOwner(),ref=useRef5(onEscape);ref.current=onEscape;let priority=options.priority??ESCAPE_PRIORITY.overlay,enabled=options.enabled??!0;useEffect6(()=>{if(enabled)return core.addEscapeLayer(id,event=>core.isOwnerAvailable(owner)&&ref.current(event),priority)},[core,owner,id,priority,enabled])}function useEscapeBlocker(active,options={}){let core=useEngineCore(),owner=useShortcutOwner(),priority=options.priority??ESCAPE_PRIORITY.detail+50;useEffect6(()=>active?core.addEscapeBlocker(priority,()=>core.isOwnerAvailable(owner)):void 0,[core,owner,active,priority])}function useHelpSheet(){let core=useEngineCore(),isOpen=useSetting(c=>c.isHelpOpen());return{open:useCallback6(()=>core.openHelp(),[core]),close:useCallback6(()=>core.closeHelp(),[core]),toggle:useCallback6(()=>core.toggleHelp(),[core]),isOpen}}function useRegistryVersion(){return useSetting(core=>core.getVersion())}import{useEffect as useEffect8,useId,useRef as useRef7,useState as useState3}from"react";import{useCallback as useCallback7,useEffect as useEffect7,useLayoutEffect as useLayoutEffect5,useRef as useRef6}from"react";function cx(...names){return names.filter(Boolean).join(" ")}function useT(){let locale=useToolkitLocale();return useCallback7(words=>pick(words,locale),[locale])}function useLabelValue(){let locale=useToolkitLocale();return useCallback7((label,value)=>labelValue(label,value,locale),[locale])}function flag(on){return on?"":void 0}var useIsoLayoutEffect2=typeof window>"u"?useEffect7:useLayoutEffect5;function useLatest(value){let ref=useRef6(value);return ref.current=value,ref}var idCounter=0;function useStableId(prefix){let ref=useRef6(null);return ref.current===null&&(idCounter+=1,ref.current=`${prefix}-${idCounter}`),ref.current}function eventWithin(event,elements){let path=typeof event.composedPath=="function"?event.composedPath():[];for(let element of elements)if(element&&(path.includes(element)||event.target instanceof Node&&element.contains(event.target)))return!0;return!1}function deepActiveElement(root=document){let active=root.activeElement;for(;active&&active.shadowRoot&&active.shadowRoot.activeElement;)active=active.shadowRoot.activeElement;return active}function revealInline(el){if(!(!el||typeof window>"u"))for(let box=el.parentElement;box;box=box.parentElement){if(box.scrollWidth<=box.clientWidth)continue;let overflow=window.getComputedStyle(box).overflowX;if(overflow!=="auto"&&overflow!=="scroll")continue;let boxRect=box.getBoundingClientRect(),rect=el.getBoundingClientRect();rect.left<boxRect.left?box.scrollLeft-=boxRect.left-rect.left:rect.right>boxRect.right&&(box.scrollLeft+=rect.right-boxRect.right);return}}import{jsx as jsx5,jsxs as jsxs4}from"react/jsx-runtime";var NATIVE_CONFIRM_REVEAL_MS=1500,NATIVE_CONFIRM_MISSING_MS=30;function prefersNativeConfirm(){return typeof window>"u"||typeof window.confirm!="function"||window.electronAPI?.isElectron?!1:window.matchMedia?.("(hover: none) and (pointer: coarse)").matches===!0}function nativeConfirmMessage(title,description){return[title,...description.split(/\n+/)].map(part=>part.trim()).filter(Boolean).join(`
4
4
 
5
5
  `)}function Dialog({open,onClose,title,description,role="dialog",nativeOnTouch=!1,children}){let ref=useRef7(null),titleId=useId(),descriptionId=useId(),onCloseRef=useRef7(onClose);onCloseRef.current=onClose;let[native,setNative]=useState3(!1);return useIsoLayoutEffect2(()=>{if(!open)return;let dialog=ref.current;return dialog.showModal(),setNative(nativeOnTouch&&prefersNativeConfirm()),()=>{dialog.open&&dialog.close()}},[open,nativeOnTouch]),useEffect8(()=>{if(!open||!native)return;let dialog=ref.current,reveal,ask=setTimeout(()=>{let asked=performance.now(),describedBy=dialog.querySelector(".notis-dialog-description"),confirmed=window.confirm(nativeConfirmMessage(dialog.querySelector(".notis-dialog-title")?.textContent??"",describedBy?typeof describedBy.innerText=="string"?describedBy.innerText:describedBy.textContent??"":""));if(!confirmed&&performance.now()-asked<NATIVE_CONFIRM_MISSING_MS){setNative(!1);return}if(confirmed)dialog.querySelector("[data-dialog-confirm]")?.click();else{let cancel=dialog.querySelector("[data-dialog-cancel]");cancel?cancel.click():onCloseRef.current()}reveal=setTimeout(()=>setNative(!1),confirmed?NATIVE_CONFIRM_REVEAL_MS:0)},0);return()=>{clearTimeout(ask),reveal!==void 0&&clearTimeout(reveal)}},[open,native]),jsxs4("dialog",{ref,className:"notis-dialog",role,"aria-labelledby":titleId,"aria-describedby":description==null?void 0:descriptionId,"data-native-confirm":native?"":void 0,onCancel:event=>{event.preventDefault(),onClose()},onKeyDown:event=>event.stopPropagation(),children:[jsx5("h2",{id:titleId,className:"notis-dialog-title",children:title}),description!=null&&jsx5("p",{id:descriptionId,className:"notis-dialog-description",children:description}),children]})}import{jsx as jsx6}from"react/jsx-runtime";var overlayBaseStyle={position:"fixed",borderRadius:"3px",border:"1px solid rgba(35, 131, 226, 0.3)",background:"rgba(35, 131, 226, 0.08)",pointerEvents:"none",zIndex:50};function MultiSelectDragOverlay({rect,className,style}){if(!rect||rect.width===0&&rect.height===0)return null;let merged={...overlayBaseStyle,left:rect.left,top:rect.top,width:rect.width,height:rect.height,...style||null};return jsx6("div",{"aria-hidden":!0,className,style:merged})}import{useCallback as useCallback8,useEffect as useEffect9,useRef as useRef8,useState as useState4}from"react";var MARQUEE_INTERACTIVE_SELECTOR='button, a, input, textarea, select, [role="button"], [contenteditable]:not([contenteditable="false"])';function rectsIntersect(a,b){return a.left<b.right&&a.right>b.left&&a.top<b.bottom&&a.bottom>b.top}function itemsInMarquee(container,rect,itemAttribute,isSelectable){let nodes=container?.querySelectorAll(`[${itemAttribute}]`);if(!nodes)return[];let ids=[];return nodes.forEach(node=>{if(!rectsIntersect(rect,node.getBoundingClientRect()))return;let id=node.getAttribute(itemAttribute);id&&isSelectable(id)&&ids.push(id)}),ids}function useMarqueeSelection(options){let{enabled,itemAttribute,threshold=5,interactiveSelector=MARQUEE_INTERACTIVE_SELECTOR,startSelector}=options,latest=useRef8(options);latest.current=options;let[rect,setRect]=useState4(null),containerRef=useRef8(null),pendingRef=useRef8(!1),activeRef=useRef8(!1),startRef=useRef8({x:0,y:0}),currentRef=useRef8({x:0,y:0}),clickShouldClearRef=useRef8(!1),suppressNextClickRef=useRef8(!1),armSuppressNextClick=useCallback8(()=>{suppressNextClickRef.current=!0,setTimeout(()=>{suppressNextClickRef.current=!1},0)},[]),onMouseDown=useCallback8(event=>{if(!enabled||event.button!==0)return;let target=event.target;if(!target||typeof target.closest!="function")return;let itemTarget=target.closest(`[${itemAttribute}]`),interactiveTarget=target.closest(interactiveSelector);if(interactiveTarget&&interactiveTarget!==itemTarget){clickShouldClearRef.current=!1;return}if(clickShouldClearRef.current=!itemTarget,itemTarget){let startTarget=startSelector?target.closest(startSelector):null;if(!startTarget||!itemTarget.contains(startTarget))return;event.preventDefault()}containerRef.current=event.currentTarget,pendingRef.current=!0,startRef.current={x:event.clientX,y:event.clientY},currentRef.current={x:event.clientX,y:event.clientY}},[enabled,interactiveSelector,itemAttribute,startSelector]),onClickCapture=useCallback8(event=>{suppressNextClickRef.current&&(suppressNextClickRef.current=!1,event.preventDefault(),event.stopPropagation())},[]);return useEffect9(()=>{if(!enabled){pendingRef.current=!1,activeRef.current&&(activeRef.current=!1,setRect(null));return}if(typeof document>"u")return;let doc=document,handleMouseMove=event=>{if(pendingRef.current){let dx=event.clientX-startRef.current.x,dy=event.clientY-startRef.current.y;if(Math.abs(dx)>threshold||Math.abs(dy)>threshold)pendingRef.current=!1,activeRef.current=!0,window.getSelection()?.removeAllRanges();else return}if(!activeRef.current)return;event.preventDefault(),currentRef.current={x:event.clientX,y:event.clientY};let next={left:Math.min(startRef.current.x,currentRef.current.x),top:Math.min(startRef.current.y,currentRef.current.y),width:Math.abs(currentRef.current.x-startRef.current.x),height:Math.abs(currentRef.current.y-startRef.current.y)};setRect(next);let{itemAttribute:attribute,isSelectable,onSelect}=latest.current;onSelect(itemsInMarquee(containerRef.current,{left:next.left,top:next.top,right:next.left+next.width,bottom:next.top+next.height},attribute,isSelectable))},handleMouseUp=()=>{let wasPending=pendingRef.current,wasActive=activeRef.current;pendingRef.current=!1,activeRef.current=!1,wasActive?(setRect(null),clickShouldClearRef.current=!1,armSuppressNextClick()):wasPending&&clickShouldClearRef.current&&(clickShouldClearRef.current=!1,latest.current.onClear())};return doc.addEventListener("mousemove",handleMouseMove),doc.addEventListener("mouseup",handleMouseUp),()=>{doc.removeEventListener("mousemove",handleMouseMove),doc.removeEventListener("mouseup",handleMouseUp)}},[armSuppressNextClick,enabled,threshold]),{rect,onMouseDown,onClickCapture,armSuppressNextClick}}export{__export,isInteractionElementVisible,SHORTCUT_SCOPE_PRIORITY,createShortcutCollectionOwner,releaseShortcutCollection,activateShortcutCollection,isEditableShortcutEvent,useShortcuts,shortcutDisplay,SPACE_VIEWER_READ_OPERATIONS,SPACE_CLOUD_COMPUTER_OPERATIONS,spaceCloudComputerAllows,SPACE_VIEW_SPEC_VERSION,SpaceActionError,SpaceNavigationCancelled,isSpaceNavigationCancelled,spaceQueryKey,NotisProvider,useNotisRuntime,queryKey,createPrefetchQueue,createQueryClient,useQuery,useQueryClient,isWords,pick,fillWords,w,NNBSP,DOCUMENT_WORDS,isPresentString,asRecord,optionalString,extractRichText,getSecretValue,getRelationIds,normalizePropertyValue,normalizeDocumentRecord,normalizeDatabaseProperty,markdownToPlainText,blockNoteToPlainText,getDocumentPreview,useNativeDocuments,useNativeMutation,useNativeDelete,VIEW_PERIODS,isViewDate,isViewPeriod,resolveViewPeriod,parseViewParams,writeViewParams,useViewParams,useShownAvailable,useShown,useTopBarSearch,useTopBarTitleLeaf,useMarqueeSelection,hasIcon,Icon,renderIcon,RenderChartData,isValidKeySpec,isSequenceSpec,keyList,canonicalKey,matchChord,matchKey,KEY_JOIN_WORDS,formatKeyParts,formatKey,toAriaKeyShortcuts,formatKeySpoken,actionErrorReason,STANDARD_ACTIONS,isStandardActionId,resolveActionRef,toWords,SHELL_WORDS,selectedCount,HELP_WORDS,DEFAULT_KEYMAP,keyFingerprints,selfClashes,eventTarget,closestComposed,containsComposed,keysOff,isVisibleComposed,openModalLayers,modalLayerOf,ROOT_OWNER,NotisKeyClash,ShortcutRegistry,safeWhen,ESCAPE_PRIORITY,SEQUENCE_TIMEOUT_MS,detectPlatform,detectLocale,KeyboardEngineCore,getSharedInstance,useEngineCore,useShortcutOwner,useToolkitLocale,useToolkitPlatform,useToolkitSettings,useShortcut,useShortcuts2,useShortcutScope,useEscapeLayer,useEscapeBlocker,useHelpSheet,useRegistryVersion,cx,useT,useLabelValue,flag,useIsoLayoutEffect2 as useIsoLayoutEffect,useLatest,useStableId,eventWithin,deepActiveElement,revealInline,Dialog,MultiSelectDragOverlay};