@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.
- package/dist/sdk/src/ui/engine/core.ts +9 -3
- package/dist/space-harness/host.js +61 -61
- package/dist/space-sdk/dist/{chunk-ZSN57ATH.js → chunk-SVZATGZB.js} +1 -1
- package/dist/space-sdk/dist/index.js +1 -1
- package/dist/space-sdk/dist/ui.js +3 -3
- package/dist/space-sdk/src/tailwind-candidates.d.ts +5 -0
- package/dist/space-sdk/src/ui/engine/core.d.ts +1 -0
- package/dist/space-sdk/src/ui/present/screens.d.ts +2 -2
- package/dist/view-renderer/dist/host.js +111 -111
- package/package.json +3 -3
|
@@ -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
|
-
import{DOCUMENT_WORDS,Dialog,MultiSelectDragOverlay,NotisProvider,RenderChartData,SHORTCUT_SCOPE_PRIORITY,SPACE_CLOUD_COMPUTER_OPERATIONS,SPACE_VIEWER_READ_OPERATIONS,SPACE_VIEW_SPEC_VERSION,SpaceActionError,SpaceNavigationCancelled,VIEW_PERIODS,activateShortcutCollection,asRecord,blockNoteToPlainText,createPrefetchQueue,createQueryClient,createShortcutCollectionOwner,extractRichText,fillWords,getDocumentPreview,getRelationIds,getSecretValue,isEditableShortcutEvent,isInteractionElementVisible,isPresentString,isSpaceNavigationCancelled,isViewDate,isViewPeriod,markdownToPlainText,normalizeDatabaseProperty,normalizeDocumentRecord,normalizePropertyValue,optionalString,parseViewParams,pick,queryKey,releaseShortcutCollection,renderIcon,resolveViewPeriod,shortcutDisplay,spaceCloudComputerAllows,spaceQueryKey,useMarqueeSelection,useNativeDelete,useNativeDocuments,useNativeMutation,useNotisRuntime,useQuery,useQueryClient,useShortcuts,useShown,useShownAvailable,useTopBarSearch,useTopBarTitleLeaf,useViewParams}from"./chunk-ZSN57ATH.js";import{useCallback,useState}from"react";function useAction(actionId){let runtime=useNotisRuntime(),[pending,setPending]=useState(0),[error,setError]=useState(null);return{call:useCallback(async(inputs,options)=>{if(runtime?.resource?.kind!=="space"||!runtime.callAction)throw new Error("A Space action runtime is required.");setPending(value=>value+1),setError(null);try{return await runtime.callAction(actionId,inputs,options)}catch(cause){let failure=cause instanceof Error?cause:new Error(String(cause));throw setError(failure),failure}finally{setPending(value=>value-1)}},[runtime,actionId]),loading:pending>0,error}}function useActionQuery(actionId,inputs,options={readOnly:!0}){let{call}=useAction(actionId);return useQuery(["action",actionId,inputs],()=>call(inputs,{readOnly:!0,dedupe:!0}),options)}import{useCallback as useCallback2,useLayoutEffect,useRef,useState as useState2}from"react";function useNativeDocumentBody(binding,recordKey,options){let runtime=useNotisRuntime(),scope=JSON.stringify(spaceQueryKey(runtime,["native-body",binding,recordKey,options.readAction,options.writeAction])),currentScope=useRef(scope);useLayoutEffect(()=>(currentScope.current=scope,()=>{currentScope.current=null}),[scope]);let[state,setState]=useState2({scope,pending:0,error:null}),query=useQuery(["native-body",binding,recordKey,options.readAction],async()=>{if(!recordKey||runtime?.resource?.kind!=="space"||!runtime.documentBody)throw new Error("Open a Space document first.");let result=await runtime.documentBody({operation:"read",binding,recordKey,readAction:options.readAction});if(!("content_markdown"in result))throw new Error("The document response is incomplete.");return result},{readOnly:!0,enabled:!!recordKey&&options.enabled!==!1}),save=useCallback2(async draft=>{if(!recordKey||!options.writeAction||runtime?.resource?.kind!=="space"||!runtime.documentBody)throw new Error("This Space does not expose a body-edit action.");setState(previous=>({scope,pending:(previous.scope===scope?previous.pending:0)+1,error:null}));try{let result=await runtime.documentBody({operation:"save",binding,recordKey,readAction:options.readAction,writeAction:options.writeAction,...draft});if(currentScope.current!==scope)throw new SpaceActionError("This document view changed. Keep the original save request.",draft.requestId);if(!("status"in result))throw new Error("The document save receipt is incomplete.");return result}catch(cause){let error=cause instanceof Error?cause:new Error(String(cause));throw currentScope.current===scope&&setState(previous=>({...previous,error})),error}finally{currentScope.current===scope&&setState(previous=>({...previous,pending:Math.max(0,previous.pending-1)}))}},[runtime,binding,recordKey,options.readAction,options.writeAction,scope]);return{...query,body:query.data,save,saving:state.scope===scope&&state.pending>0,saveError:state.scope===scope?state.error:null}}var MAX_SKILL_PAGES=50;function useViewerReadAvailable(family){let runtime=useNotisRuntime();return runtime?.resource?.kind==="space"&&typeof runtime.viewerRead=="function"&&!!runtime.space?.viewerReads?.includes(family)}function useViewerRead(operation,input,options={}){let runtime=useNotisRuntime(),available=useViewerReadAvailable(SPACE_VIEWER_READ_OPERATIONS[operation]);return useQuery(["viewer-read",operation,input],async()=>{if(!runtime?.viewerRead)throw new Error("Viewer reads are unavailable here.");return runtime.viewerRead(operation,input)},{readOnly:!0,enabled:available&&options.enabled!==!1,staleTimeMs:options.staleTimeMs})}function useViewerDatabases(options={}){let runtime=useNotisRuntime(),available=useViewerReadAvailable("databases");return useQuery(["viewer-databases"],async()=>{if(!runtime?.viewerRead)throw new Error("Viewer reads are unavailable here.");let result=await runtime.viewerRead("list_databases",{});if(!Array.isArray(result?.databases))throw new Error("The database list is incomplete.");return result.databases},{readOnly:!0,enabled:available&&options.enabled!==!1,staleTimeMs:options.staleTimeMs})}var SKILL_CONTENT_PAGES_AT_ONCE=2;async function readAllViewerSkills(read,{includeContent,includeDisabled}){let page=(after,content)=>read({limit:100,include_content:content,include_disabled:includeDisabled,...after?{after}:{}}).then(result=>{if(!Array.isArray(result?.skills))throw new Error("The Skill list is incomplete.");return result}),skills=[],started=[],cursor=null,known=!0,pages=0;for(;;){if(known&&started.length<(includeContent?SKILL_CONTENT_PAGES_AT_ONCE:1)&&pages+started.length<MAX_SKILL_PAGES){let current={after:cursor,result:page(cursor,includeContent)};if(current.result.catch(()=>{}),started.push(current),known=!1,includeContent){let probe=await page(cursor,!1);known=!!(probe.has_more&&probe.next),cursor=probe.next??null}continue}let head=started.shift();if(!head)break;let result=await head.result;if(skills.push(...result.skills),pages+=1,!result.has_more||!result.next)return skills;if(started[0]?.after!==result.next){let dropped=started.splice(0);await Promise.allSettled(dropped.map(entry=>entry.result)),cursor=result.next,known=!0}}throw new Error("This account has more Skills than a page can read at once.")}function useViewerSkills(options={}){let runtime=useNotisRuntime(),available=useViewerReadAvailable("skills"),includeContent=options.includeContent===!0,includeDisabled=options.includeDisabled===!0;return useQuery(["viewer-skills",includeContent,includeDisabled],async()=>{if(!runtime?.viewerRead)throw new Error("Viewer reads are unavailable here.");return readAllViewerSkills(input=>runtime.viewerRead("list_skills",input),{includeContent,includeDisabled})},{readOnly:!0,enabled:available&&options.enabled!==!1,staleTimeMs:options.staleTimeMs})}function useNotis(){let runtime=useNotisRuntime();return{selection:runtime?.context?.selection??null,resource:runtime?.resource??null,app:runtime?.app??null,route:runtime?.route??null,databases:runtime?.databases??[],collectionItem:runtime?.context?.collectionItem??null,resourceId:runtime?.context?.resourceId??null,ready:runtime!==null}}function useDocuments(databaseSlug,options={}){let runtime=useNotisRuntime(),locale=runtime?.context?.locale==="fr"?"fr":"en",query=useQuery(["documents",databaseSlug,options.filter??null,options.pageSize??null,options.offset??0,!!options.fetchAll,options.includeContent!==!1,locale],async()=>{if(!runtime)throw new Error("Notis runtime not available");let allDocuments=[],offset=options.offset??0;for(;;){let result=await runtime.callTool("LOCAL_NOTIS_DATABASE_QUERY",{database_slug:databaseSlug,query:{...options.filter??{},...options.pageSize!==void 0?{page_size:options.pageSize}:{},...options.includeContent===!1?{include_content:!1}:{}},...offset>0?{offset}:{}},{dedupe:!0,readOnly:!0}),message=result.error??result.message;if(!result.documents&&message)throw new Error(message);if(allDocuments.push(...result.documents??[]),!options.fetchAll||!result.has_more)break;let nextOffset=result.next_offset;if(typeof nextOffset!="number"||nextOffset<=offset)throw new Error("Database query returned an invalid pagination offset");offset=nextOffset}return allDocuments.map(document=>normalizeDocumentRecord(document,{locale})).filter(document=>document.id)},{readOnly:!0,enabled:options.enabled});return{documents:query.data??EMPTY_DOCUMENTS,loading:query.loading,isFetching:query.isFetching,hasData:query.hasData,error:query.error,refetch:query.refetch}}var EMPTY_DOCUMENTS=[];import{useEffect,useRef as useRef2,useState as useState3}from"react";function useDatabaseSubscription(databaseSlug,options={}){let runtime=useNotisRuntime(),{subscribe=!0,...documentOptions}=options,{documents,loading,isFetching,hasData,error,refetch}=useDocuments(databaseSlug,documentOptions),[live,setLive]=useState3(!1),refetchRef=useRef2(refetch);useEffect(()=>{refetchRef.current=refetch},[refetch]);let enabled=options.enabled!==!1&&subscribe;return useEffect(()=>{if(!runtime?.subscribeDatabase||!enabled||!databaseSlug){setLive(!1);return}let cancelled=!1,unsubscribe=runtime.subscribeDatabase(databaseSlug,()=>{refetchRef.current()},{onStatusChange:isLive=>{cancelled||setLive(isLive)}});return()=>{cancelled=!0,setLive(!1),unsubscribe?.()}},[runtime,databaseSlug,enabled]),{documents,rows:documents,loading,isFetching,hasData,error,refetch,live}}var DOCUMENT_HOOK_WORDS=Object.freeze({notFound:{en:"Document not found",fr:"Document introuvable"}});function useDocument(documentId,options={}){let runtime=useNotisRuntime(),locale=runtime?.context?.locale==="fr"?"fr":"en",query=useQuery(["document",documentId??null,locale],async()=>{if(!runtime||!documentId)throw new Error(pick(DOCUMENT_HOOK_WORDS.notFound,locale));let result=await runtime.callTool("LOCAL_NOTIS_DATABASE_GET_DOCUMENT",{document_id:documentId},{dedupe:!0,readOnly:!0});if(!result.document)throw new Error(result.error??result.message??pick(DOCUMENT_HOOK_WORDS.notFound,locale));return normalizeDocumentRecord(result.document,{locale})},{readOnly:!0,enabled:options.enabled!==!1&&!!documentId});return{document:query.data??null,loading:query.loading,isFetching:query.isFetching,hasData:query.hasData,error:query.error,refetch:query.refetch}}import{useCallback as useCallback3,useState as useState4}from"react";function upsertToolName(databaseSlug){return`LOCAL_NOTIS_DATABASE_UPSERT_${databaseSlug.replace(/-/g,"_").toUpperCase()}`}function buildToolArgs(args){let payload={};return args.documentId&&(payload.document_id=args.documentId),typeof args.title=="string"&&(payload.title=args.title),args.properties&&Object.assign(payload,args.properties),"contentMarkdown"in args&&(payload.content_markdown=args.contentMarkdown??""),"contentBlocknote"in args&&(payload.content_blocknote=args.contentBlocknote??null),args.operation&&(payload.operation=args.operation),payload}function useUpsertDocument(databaseSlug){let runtime=useNotisRuntime(),[loading,setLoading]=useState4(!1),[error,setError]=useState4(null);return{upsert:useCallback3(async args=>{if(!runtime)throw new Error("Notis runtime not available. Ensure NotisProvider is mounted.");if("contentMarkdown"in args&&"contentBlocknote"in args)throw new Error("Provide contentMarkdown or contentBlocknote, not both.");setLoading(!0),setError(null);try{let result=await runtime.callTool(upsertToolName(databaseSlug),buildToolArgs(args));if(!result.document)throw new Error(result.error??result.message??"Failed to save document");return normalizeDocumentRecord(result.document,{locale:runtime.context?.locale==="fr"?"fr":"en"})}catch(err){let e=err instanceof Error?err:new Error(String(err));throw setError(e),e}finally{setLoading(!1)}},[runtime,databaseSlug]),loading,error}}function useDatabaseSchema(databaseSlug){let runtime=useNotisRuntime(),query=useQuery(["database-schema",databaseSlug],async()=>{let result=await runtime.callTool("LOCAL_NOTIS_DATABASE_GET_DATABASE",{database_slug:databaseSlug},{dedupe:!0,readOnly:!0});if(!result.database)throw new Error(result.error||result.message||"Database not found");return{name:optionalString(result.database.name),description:optionalString(result.database.description),properties:(result.database.schema?.properties??[]).map(normalizeDatabaseProperty).filter(property=>!!property)}},{readOnly:!0});return{...query,name:query.data?.name??null,description:query.data?.description??null,properties:query.data?.properties??EMPTY_PROPERTIES}}var EMPTY_PROPERTIES=[];import{useCallback as useCallback4,useState as useState5}from"react";function useTool(toolName){let runtime=useNotisRuntime(),[loading,setLoading]=useState5(!1),[error,setError]=useState5(null);return{call:useCallback4(async(args,options)=>{if(!runtime)throw new Error("Notis runtime not available. Ensure NotisProvider is mounted.");setLoading(!0),setError(null);try{return await runtime.callTool(toolName,args,options)}catch(err){let e=err instanceof Error?err:new Error(String(err));throw setError(e),e}finally{setLoading(!1)}},[runtime,toolName]),loading,error}}import{useEffect as useEffect2,useState as useState6}from"react";function useTools(){let runtime=useNotisRuntime(),[tools,setTools]=useState6([]),[loading,setLoading]=useState6(!0),[error,setError]=useState6(null);return useEffect2(()=>{if(!runtime){setLoading(!1);return}let cancelled=!1;return setLoading(!0),runtime.listTools().then(result=>{cancelled||(setTools(result),setLoading(!1))}).catch(err=>{cancelled||(setError(err instanceof Error?err:new Error(String(err))),setLoading(!1))}),()=>{cancelled=!0}},[runtime]),{tools,loading,error}}import{useCallback as useCallback5,useState as useState7}from"react";function useHandover(){let runtime=useNotisRuntime(),dispatch=runtime?.resource?.kind==="space"?runtime.draftHandover:runtime?.handover,[pending,setPending]=useState7(!1),[error,setError]=useState7(null);return{handover:useCallback5(async payload=>{if(!dispatch)throw new Error("This Notis host cannot hand work to the manager chat.");setPending(!0),setError(null);try{return await dispatch(payload)}catch(err){let e=err instanceof Error?err:new Error(String(err));throw setError(e),e}finally{setPending(!1)}},[dispatch]),pending,error,available:!!dispatch}}import{useCallback as useCallback6,useRef as useRef3}from"react";var CLOUD_COMPUTER_FACTS_KEY=["cloud-computer-facts"];function invalidateCloudComputerFacts(runtime){try{runtime?.queryClient?.invalidate(queryKey(spaceQueryKey(runtime,CLOUD_COMPUTER_FACTS_KEY)))}catch{}}var UNAVAILABLE={available:!1,reason:"unsupported_host",sandbox:null,cli_auth:{gh:{authenticated:null,account:null,checked_at:null,reason:"unsupported_host"}}};function useCloudComputer(){let runtime=useNotisRuntime(),explicitRefresh=useRef3(!1),query=useQuery(CLOUD_COMPUTER_FACTS_KEY,async()=>{let refresh2=explicitRefresh.current;return explicitRefresh.current=!1,runtime?.cloudComputerFacts?runtime.cloudComputerFacts(refresh2?{refresh:!0}:void 0):UNAVAILABLE},{readOnly:!0}),refresh=useCallback6(async()=>{explicitRefresh.current=!0,await query.refetch()},[query.refetch]),transport=runtime?.spaceCloudComputer,requestApproval=useCallback6(async()=>transport?(await transport.requestApproval())?.approved!==!0?!1:(invalidateCloudComputerFacts(runtime),await query.refetch(),!0):null,[query.refetch,runtime,transport]);return{facts:query.data??(query.error?UNAVAILABLE:null),loading:query.loading,isFetching:query.isFetching,error:query.error,refresh,requestApproval}}import{useCallback as useCallback7,useEffect as useEffect3,useRef as useRef4,useState as useState8}from"react";var unavailable=async()=>{throw new Error("The cloud computer is not available in this Space.")};function useCloudComputerShell(){let runtime=useNotisRuntime(),transport=runtime?.spaceCloudComputer,declared=runtime?.space?.cloudComputer,level=transport&&(declared==="read"||declared==="shell")?declared:null,available=level==="shell",[status,setStatus]=useState8(null),[loading,setLoading]=useState8(!!level),mounted=useRef4(!0);useEffect3(()=>()=>{mounted.current=!1},[]);let refresh=useCallback7(async()=>{if(!(!level||!transport)){setLoading(!0);try{let next=await transport.status();mounted.current&&setStatus(next)}catch{mounted.current&&setStatus(null)}finally{mounted.current&&setLoading(!1)}}},[level,transport]);useEffect3(()=>{mounted.current=!0,refresh()},[refresh]);let run=useCallback7(async(command,options={})=>!available||!transport?unavailable():transport.run({command,...options.cwd?{cwd:options.cwd}:{},...options.timeoutMs?{timeout_ms:options.timeoutMs}:{},...options.maxOutputLength?{max_output_length:options.maxOutputLength}:{},...options.requestId?{request_id:options.requestId}:{}}),[available,transport]),upload=useCallback7(async file=>!available||!transport?unavailable():transport.upload(file),[available,transport]),requestApproval=useCallback7(async()=>{if(!level||!transport)return null;let next=await transport.requestApproval();return mounted.current&&setStatus(next),next?.approved===!0&&invalidateCloudComputerFacts(runtime),next},[level,runtime,transport]);return{level,available,status,approved:status?.approved===!0,loading:!!level&&loading,run,upload,requestApproval,refresh}}import{useCallback as useCallback8}from"react";function useNotisNavigation(){let runtime=useNotisRuntime(),toNamedSpace=useCallback8(async(alias,options)=>{if(runtime?.resource?.kind!=="space"||!runtime.navigate)throw new Error("Open this Space in a current Notis host to navigate.");await runtime.navigate({kind:"space-reference",alias,documentId:options?.recordKey??null,selection:options?.selection??null,...options?.params?{params:options.params}:{}})},[runtime]),toSpace=useCallback8(async(spaceId,options)=>{if(!runtime?.navigate)throw new Error("Open this Space in a current Notis host to navigate.");await runtime.navigate({kind:"space",spaceId,documentId:options?.recordKey??null,...options?.params?{params:options.params}:{},...options?.selection?{selection:options.selection}:{}})},[runtime]),toRoute=useCallback8((path,options)=>{if(runtime?.navigate)runtime.navigate({kind:"route",path,resourceId:options?.resourceId??null});else if(typeof window<"u"){let url=new URL(path,window.location.href);options?.resourceId?url.searchParams.set("resource",options.resourceId):url.searchParams.delete("resource"),window.location.href=url.toString()}},[runtime]),toApp=useCallback8(()=>{runtime?.navigate&&runtime.navigate({kind:"app"})},[runtime]);return{toNamedSpace,toSpace,toRoute,toApp}}import{useCallback as useCallback9}from"react";function useBackend(){let runtime=useNotisRuntime();return{request:useCallback9(async(path,options)=>{if(!runtime)throw new Error("Notis runtime not available. Ensure NotisProvider is mounted.");return runtime.request(path,options)},[runtime])}}import{useCallback as useCallback12}from"react";import{useCallback as useCallback11,useEffect as useEffect5,useMemo,useRef as useRef6,useState as useState9}from"react";var ACTION_DEFAULTS={archive:{label:"Archive",shortcut:"E"},star:{label:"Star",shortcut:"S"},delete:{label:"Delete",shortcut:"#"},enable:{label:"Enable",shortcut:"E"},disable:{label:"Disable",shortcut:"D"},pause:{label:"Pause",shortcut:"P"},resume:{label:"Resume",shortcut:"R"},move:{label:"Move",shortcut:"M"},"add-to-folder":{label:"Add to folder",shortcut:"F"},complete:{label:"Mark complete",shortcut:"C"},"start-progress":{label:"Start progress",shortcut:"P"}};function collectionActionDefaults(intent){return!intent||intent==="custom"?{}:ACTION_DEFAULTS[intent]}import{useCallback as useCallback10,useEffect as useEffect4,useRef as useRef5}from"react";var LONG_PRESS_MS=500,MOVE_TOLERANCE_PX=10,INTERACTIVE_SELECTOR=["button","a[href]","input","textarea","select","summary",'[contenteditable]:not([contenteditable="false"])','[role="button"]','[role="link"]','[role="menuitem"]','[role="option"]','[role="switch"]','[role="tab"]'].join(", ");function useLongPressSelection(onSelect){let onSelectRef=useRef5(onSelect);onSelectRef.current=onSelect;let timerRef=useRef5(null),startRef=useRef5(null),suppressClickRef=useRef5(!1),cancel=useCallback10(()=>{timerRef.current!==null&&window.clearTimeout(timerRef.current),timerRef.current=null,startRef.current=null},[]);return useEffect4(()=>cancel,[cancel]),useCallback10(id=>({onPointerDown:event=>{if(event.pointerType!=="touch"||event.button!==0)return;let target=event.target;target instanceof HTMLElement&&target!==event.currentTarget&&target.closest(INTERACTIVE_SELECTOR)||(cancel(),startRef.current={x:event.clientX,y:event.clientY},timerRef.current=window.setTimeout(()=>{timerRef.current=null,startRef.current=null,suppressClickRef.current=!0,onSelectRef.current(id)},LONG_PRESS_MS))},onPointerMove:event=>{let start=startRef.current;start&&(Math.abs(event.clientX-start.x)>MOVE_TOLERANCE_PX||Math.abs(event.clientY-start.y)>MOVE_TOLERANCE_PX)&&cancel()},onPointerUp:cancel,onPointerCancel:cancel,onClickCapture:event=>suppressClickRef.current?(suppressClickRef.current=!1,event.preventDefault(),event.stopPropagation(),!0):!1}),[cancel])}var COLLECTION_ITEM_ATTRIBUTE="data-notis-collection-item-id",LEGACY_ROW_ATTRIBUTE="data-notis-row-id",INTERACTIVE_SELECTOR2='button, a, input, textarea, select, [role="button"], [contenteditable]:not([contenteditable="false"])',DEFAULT_SHORTCUTS={clear:"Escape",selectAll:"Mod+A",toggle:"X",extendNext:["Shift+ArrowDown","Shift+ArrowRight"],extendPrevious:["Shift+ArrowUp","Shift+ArrowLeft"],next:"J",previous:"K",up:"ArrowUp",down:"ArrowDown",left:!1,right:!1,activate:"Enter"};function filterShortcutKeys(keys,predicate){if(!keys)return!1;let filtered=(Array.isArray(keys)?keys:[keys]).filter(predicate);return filtered.length===0?!1:filtered.length===1?filtered[0]:filtered}function setsEqual(a,b){if(a.size!==b.size)return!1;for(let id of a)if(!b.has(id))return!1;return!0}function useCollectionInteractions(options){let{items,getId,selectionMode="multiple",selectedIds:controlledSelectedIds,defaultSelectedIds,onSelectionChange,activeId:controlledActiveId,defaultActiveId=null,onActiveIdChange,anchorId:controlledAnchorId,defaultAnchorId,onAnchorIdChange,onActivate,isItemDisabled,enabled=!0,bindKeyboardShortcuts=!0,enableDragSelect=selectionMode==="multiple",enableLongPressSelection=!1,clearSelectionOnPlainClick=!0,dragThreshold=5,shortcuts:shortcutOverrides,shortcutScope="collection",shortcutPriority=0,resolveNextId,onActiveItemChange,actions:actionDefinitions=[]}=options,[uncontrolledSelectedIds,setUncontrolledSelectedIds]=useState9(()=>new Set(defaultSelectedIds??[])),selectedIds=controlledSelectedIds??uncontrolledSelectedIds,[uncontrolledActiveId,setUncontrolledActiveId]=useState9(defaultActiveId),activeId=controlledActiveId===void 0?uncontrolledActiveId:controlledActiveId,[uncontrolledAnchorId,setUncontrolledAnchorId]=useState9(defaultAnchorId===void 0?defaultActiveId:defaultAnchorId),anchorId=controlledAnchorId===void 0?uncontrolledAnchorId:controlledAnchorId,itemsRef=useRef6(items),getIdRef=useRef6(getId),selectedIdsRef=useRef6(selectedIds),activeIdRef=useRef6(activeId),anchorIdRef=useRef6(anchorId),keyboardRangeBaseRef=useRef6(null),onSelectionChangeRef=useRef6(onSelectionChange),onActiveIdChangeRef=useRef6(onActiveIdChange),onAnchorIdChangeRef=useRef6(onAnchorIdChange),onActiveItemChangeRef=useRef6(onActiveItemChange),onActivateRef=useRef6(onActivate),resolveNextIdRef=useRef6(resolveNextId),containerRef=useRef6(null),[containerElement,setContainerElement]=useState9(null),setContainerRef=useCallback11(node=>{containerRef.current=node,setContainerElement(node)},[]),shortcutCollectionOwnerRef=useRef6(null);shortcutCollectionOwnerRef.current||(shortcutCollectionOwnerRef.current=createShortcutCollectionOwner()),itemsRef.current=items,getIdRef.current=getId,(!setsEqual(selectedIdsRef.current,selectedIds)||anchorIdRef.current!==anchorId)&&(keyboardRangeBaseRef.current=null),selectedIdsRef.current=selectedIds,activeIdRef.current=activeId,anchorIdRef.current=anchorId,onSelectionChangeRef.current=onSelectionChange,onActiveIdChangeRef.current=onActiveIdChange,onAnchorIdChangeRef.current=onAnchorIdChange,onActiveItemChangeRef.current=onActiveItemChange,onActivateRef.current=onActivate,resolveNextIdRef.current=resolveNextId;let itemById=useMemo(()=>new Map(items.map(item=>[getId(item),item])),[getId,items]),selectableIds=useMemo(()=>items.filter(item=>!isItemDisabled?.(item)).map(item=>getId(item)),[getId,isItemDisabled,items]),selectableIdsRef=useRef6(selectableIds);selectableIdsRef.current=selectableIds;let getItemsForIds=useCallback11(ids=>itemsRef.current.filter(item=>ids.has(getIdRef.current(item))),[]),commitSelection=useCallback11((next,reason)=>{let allowed=new Set(selectableIdsRef.current),normalized=selectionMode==="none"?new Set:new Set(Array.from(next).filter(id=>allowed.has(id)));if(selectionMode==="single"&&normalized.size>1){let first=normalized.values().next().value;normalized.clear(),first&&normalized.add(first)}setsEqual(normalized,selectedIdsRef.current)||(selectedIdsRef.current=normalized,controlledSelectedIds===void 0&&setUncontrolledSelectedIds(normalized),onSelectionChangeRef.current?.({reason,selectedIds:normalized,selectedItems:getItemsForIds(normalized),anchorId:anchorIdRef.current}))},[controlledSelectedIds,getItemsForIds,selectionMode]),setActive=useCallback11((id,reason="activate")=>{let next=id&&selectableIdsRef.current.includes(id)?id:null;activeIdRef.current!==next&&(activeIdRef.current=next,controlledActiveId===void 0&&setUncontrolledActiveId(next),onActiveIdChangeRef.current?.(next,reason),onActiveItemChangeRef.current?.(next))},[controlledActiveId]),setAnchor=useCallback11((id,reason)=>{anchorIdRef.current!==id&&(anchorIdRef.current=id,controlledAnchorId===void 0&&setUncontrolledAnchorId(id),onAnchorIdChangeRef.current?.(id,reason))},[controlledAnchorId]),activate=useCallback11(id=>{let item=itemsRef.current.find(candidate=>getIdRef.current(candidate)===id);!item||!selectableIdsRef.current.includes(id)||(keyboardRangeBaseRef.current=null,setActive(id,"activate"),setAnchor(id,"activate"),onActivateRef.current?.(item,id))},[setActive,setAnchor]),toggle=useCallback11(id=>{if(selectionMode==="none"||!selectableIdsRef.current.includes(id))return;keyboardRangeBaseRef.current=null;let next=new Set(selectedIdsRef.current);next.has(id)?next.delete(id):(selectionMode==="single"&&next.clear(),next.add(id)),setAnchor(id,"toggle"),commitSelection(next,"toggle")},[commitSelection,selectionMode,setAnchor]),select=useCallback11(ids=>{keyboardRangeBaseRef.current=null;let next=new Set(ids),last=ids[ids.length-1]??null;setAnchor(last,"toggle"),commitSelection(next,"toggle")},[commitSelection,setAnchor]),clear=useCallback11(()=>{keyboardRangeBaseRef.current=null,setAnchor(null,"clear"),commitSelection(new Set,"clear")},[commitSelection,setAnchor]),selectAll=useCallback11(()=>{if(selectionMode==="none")return;keyboardRangeBaseRef.current=null;let ids=selectionMode==="single"?selectableIdsRef.current.slice(0,1):selectableIdsRef.current,last=ids[ids.length-1]??null;setAnchor(last,"select-all"),commitSelection(new Set(ids),"select-all")},[commitSelection,selectionMode,setAnchor]),replaceRange=useCallback11((fromId,toId,reason)=>{let ids=selectableIdsRef.current,from=ids.indexOf(fromId),to=ids.indexOf(toId);if(from===-1||to===-1){commitSelection(new Set([toId]),reason);return}commitSelection(new Set([...keyboardRangeBaseRef.current??[],...ids.slice(Math.min(from,to),Math.max(from,to)+1)]),reason)},[commitSelection]),selectRange=useCallback11((fromId,toId)=>{let ids=selectableIdsRef.current;if(selectionMode==="none"||!ids.includes(toId))return;keyboardRangeBaseRef.current=null;let resolvedFromId=ids.includes(fromId)?fromId:activeIdRef.current&&ids.includes(activeIdRef.current)?activeIdRef.current:toId;if(setAnchor(toId,"range"),selectionMode==="single"){commitSelection(new Set([toId]),"range");return}let from=ids.indexOf(resolvedFromId),to=ids.indexOf(toId);if(from===-1||to===-1)commitSelection(new Set([toId]),"range");else{let next=new Set(selectedIdsRef.current);for(let id of ids.slice(Math.min(from,to),Math.max(from,to)+1))next.add(id);commitSelection(next,"range")}},[commitSelection,selectionMode,setAnchor]);useEffect5(()=>{let allowed=new Set(selectableIds);keyboardRangeBaseRef.current&&(keyboardRangeBaseRef.current=new Set(Array.from(keyboardRangeBaseRef.current).filter(id=>allowed.has(id))));let pruned=new Set(Array.from(selectedIdsRef.current).filter(id=>allowed.has(id)));setsEqual(pruned,selectedIdsRef.current)||commitSelection(pruned,"items-changed"),activeIdRef.current&&!allowed.has(activeIdRef.current)&&setActive(null,"items-changed"),anchorIdRef.current&&!allowed.has(anchorIdRef.current)&&setAnchor(null,"items-changed")},[commitSelection,selectableIds,setActive,setAnchor]);let focusItem=useCallback11(id=>{let nodes=containerRef.current?.querySelectorAll(`[${COLLECTION_ITEM_ATTRIBUTE}]`),node=nodes?Array.from(nodes).find(candidate=>candidate.getAttribute(COLLECTION_ITEM_ATTRIBUTE)===id&&isInteractionElementVisible(candidate)):null;node?.focus({preventScroll:!0}),node?.scrollIntoView?.({block:"nearest",inline:"nearest"})},[]),focusPointerItem=useCallback11(id=>{setActive(id,"activate"),focusItem(id)},[focusItem,setActive]),selectPointerRange=useCallback11(id=>{let rangeAnchor=anchorIdRef.current??activeIdRef.current??id,ids=selectableIdsRef.current,from=ids.indexOf(rangeAnchor),to=ids.indexOf(id),range=new Set(ids.slice(Math.min(from,to),Math.max(from,to)+1)),base=keyboardRangeBaseRef.current??new Set(Array.from(selectedIdsRef.current).filter(selected=>!range.has(selected)));keyboardRangeBaseRef.current=base,setAnchor(rangeAnchor,"range"),replaceRange(rangeAnchor,id,"range"),focusPointerItem(id)},[focusPointerItem,replaceRange,setAnchor]),moveActive=useCallback11((direction,extend=!1)=>{let ids=selectableIdsRef.current;if(ids.length===0)return;let current=activeIdRef.current,next=extend?null:resolveNextIdRef.current?.({direction,currentId:current,items:itemsRef.current,orderedIds:ids})??null;if(!next){let currentIndex=current?ids.indexOf(current):-1,forward=direction==="next"||direction==="down"||direction==="right",nextIndex=currentIndex===-1?forward?0:ids.length-1:Math.min(ids.length-1,Math.max(0,currentIndex+(forward?1:-1)));next=ids[nextIndex]??null}if(!next||next===current)return;let stableAnchor=anchorIdRef.current??current??next;extend?(keyboardRangeBaseRef.current??=new Set(Array.from(selectedIdsRef.current).filter(id=>id!==stableAnchor)),anchorIdRef.current||setAnchor(stableAnchor,"range"),replaceRange(stableAnchor,next,"range")):(keyboardRangeBaseRef.current=new Set,setAnchor(next,"navigate")),setActive(next,extend?"range":"navigate");let nextId=next;requestAnimationFrame(()=>focusItem(nextId))},[focusItem,replaceRange,setActive,setAnchor]),keyboard=useMemo(()=>({...DEFAULT_SHORTCUTS,...shortcutOverrides||{}}),[shortcutOverrides]),keyDefinitions=useMemo(()=>{let definitions=[],add=(id,label,keys,onTrigger)=>{keys&&definitions.push({id,label,keys,onTrigger})},extendRight=filterShortcutKeys(keyboard.extendNext,key=>key.toLowerCase().endsWith("arrowright")),extendDown=filterShortcutKeys(keyboard.extendNext,key=>!key.toLowerCase().endsWith("arrowright")),extendLeft=filterShortcutKeys(keyboard.extendPrevious,key=>key.toLowerCase().endsWith("arrowleft")),extendUp=filterShortcutKeys(keyboard.extendPrevious,key=>!key.toLowerCase().endsWith("arrowleft"));return add("collection.clear","Clear selection",selectedIds.size>0?keyboard.clear:!1,clear),add("collection.select-all","Select all visible items",selectionMode==="none"?!1:keyboard.selectAll,selectAll),add("collection.toggle","Toggle active item",selectionMode==="none"?!1:keyboard.toggle,()=>{let id=activeIdRef.current??anchorIdRef.current;id&&toggle(id)}),add("collection.extend-down","Extend selection down",selectionMode!=="multiple"?!1:extendDown,()=>moveActive("down",!0)),add("collection.extend-right","Extend selection right",selectionMode!=="multiple"?!1:extendRight,()=>moveActive("right",!0)),add("collection.extend-up","Extend selection up",selectionMode!=="multiple"?!1:extendUp,()=>moveActive("up",!0)),add("collection.extend-left","Extend selection left",selectionMode!=="multiple"?!1:extendLeft,()=>moveActive("left",!0)),add("collection.next","Next item",keyboard.next,()=>moveActive("next")),add("collection.previous","Previous item",keyboard.previous,()=>moveActive("previous")),add("collection.up","Move up",keyboard.up,()=>moveActive("up")),add("collection.down","Move down",keyboard.down,()=>moveActive("down")),add("collection.left","Move left",keyboard.left,()=>moveActive("left")),add("collection.right","Move right",keyboard.right,()=>moveActive("right")),add("collection.activate","Open active item",keyboard.activate,()=>{let id=activeIdRef.current??selectableIdsRef.current[0];id&&activate(id)}),definitions},[activate,clear,keyboard,moveActive,selectAll,selectedIds.size,selectionMode,toggle]),isAvailable=useCallback11(()=>isInteractionElementVisible(containerRef.current),[]);useEffect5(()=>{let owner=shortcutCollectionOwnerRef.current,container=containerElement,Observer=container?.ownerDocument.defaultView?.MutationObserver,observer=Observer?new Observer(()=>{isAvailable()||releaseShortcutCollection(owner)}):null,element=container;for(;element;){observer?.observe(element,{attributes:!0,attributeFilter:["hidden","inert","aria-hidden","style","class"]});let root=element.getRootNode();element=element.parentElement??("host"in root?root.host:null)}return()=>{observer?.disconnect(),releaseShortcutCollection(owner)}},[containerElement,isAvailable]),useShortcuts(keyDefinitions,{enabled:enabled&&bindKeyboardShortcuts,scope:shortcutScope,priority:shortcutPriority,collectionOwnerId:shortcutCollectionOwnerRef.current,isAvailable});let activateCollectionShortcuts=useCallback11(()=>{activateShortcutCollection(shortcutCollectionOwnerRef.current)},[]),marquee=useMarqueeSelection({enabled:enabled&&enableDragSelect&&selectionMode==="multiple",itemAttribute:COLLECTION_ITEM_ATTRIBUTE,isSelectable:id=>selectableIdsRef.current.includes(id),onSelect:ids=>{commitSelection(new Set(ids),"drag");let last=ids[ids.length-1]??null;setAnchor(last,"drag")},onClear:clear,threshold:dragThreshold,interactiveSelector:INTERACTIVE_SELECTOR2}),dragRect=marquee.rect,{armSuppressNextClick,onMouseDown:handleContainerMouseDown,onClickCapture:handleContainerClickCapture}=marquee,onRowMouseDown=useCallback11(id=>event=>{if(!enabled||event.button!==0||event.shiftKey||!(event.metaKey||event.ctrlKey))return;let interactiveTarget=event.target?.closest(INTERACTIVE_SELECTOR2);interactiveTarget&&interactiveTarget!==event.currentTarget||(event.preventDefault(),event.stopPropagation(),toggle(id),focusPointerItem(id),armSuppressNextClick())},[armSuppressNextClick,enabled,focusPointerItem,toggle]),onCheckboxClick=useCallback11(id=>event=>{event.stopPropagation(),enabled&&(event.shiftKey&&selectionMode==="multiple"?selectPointerRange(id):(toggle(id),focusPointerItem(id)))},[enabled,focusPointerItem,selectPointerRange,selectionMode,toggle]),getRowProps=useCallback11(id=>({[COLLECTION_ITEM_ATTRIBUTE]:id,[LEGACY_ROW_ATTRIBUTE]:id}),[]),longPress=useLongPressSelection(id=>{!enabled||selectionMode==="none"||(activateCollectionShortcuts(),toggle(id),focusPointerItem(id))}),getItemProps=useCallback11(id=>({...enableLongPressSelection?longPress(id):{},[COLLECTION_ITEM_ATTRIBUTE]:id,[LEGACY_ROW_ATTRIBUTE]:id,tabIndex:activeIdRef.current===id||!activeIdRef.current&&selectableIdsRef.current[0]===id?0:-1,"aria-selected":selectedIdsRef.current.has(id),"aria-disabled":!selectableIdsRef.current.includes(id),"data-notis-active":activeIdRef.current===id?"true":"false",onFocus:()=>{activateCollectionShortcuts(),setActive(id,"activate")},onMouseDown:onRowMouseDown(id),onClick:event=>{if(!enabled||event.defaultPrevented||!selectableIdsRef.current.includes(id))return;let interactiveTarget=event.target?.closest(INTERACTIVE_SELECTOR2);if(!(interactiveTarget&&interactiveTarget!==event.currentTarget)){if(event.shiftKey&&selectionMode==="multiple"){event.preventDefault(),selectPointerRange(id);return}event.metaKey||event.ctrlKey||(clearSelectionOnPlainClick&&clear(),activate(id))}},onKeyDown:event=>{!enabled||event.key!==" "||event.metaKey||event.ctrlKey||event.altKey||event.target===event.currentTarget&&(event.preventDefault(),selectionMode==="none"?activate(id):toggle(id))}}),[activate,activateCollectionShortcuts,clear,clearSelectionOnPlainClick,enabled,enableLongPressSelection,longPress,onRowMouseDown,selectPointerRange,selectionMode,setActive,toggle]),getCheckboxProps=useCallback11(id=>({isSelected:selectedIdsRef.current.has(id),disabled:!enabled||!selectableIdsRef.current.includes(id),onClick:onCheckboxClick(id)}),[enabled,onCheckboxClick]),getSelectedItems=useCallback11(()=>getItemsForIds(selectedIdsRef.current),[getItemsForIds]),isSelected=useCallback11(id=>selectedIds.has(id),[selectedIds]),actionContext=useMemo(()=>({selectedIds:Array.from(selectedIds),selectedItems:getItemsForIds(selectedIds),clearSelection:clear}),[clear,getItemsForIds,selectedIds]),resolvedActions=useMemo(()=>actionDefinitions.map(action=>{let defaults=collectionActionDefaults(action.intent),disabled=typeof action.disabled=="function"?action.disabled(actionContext):action.disabled,shortcut=action.shortcut===!1?void 0:action.shortcut??defaults.shortcut;return{id:action.id,label:action.label??defaults.label??action.id,icon:action.icon,shortcut,destructive:action.destructive??action.intent==="delete",disabled:!enabled||disabled,pending:action.pending,onRun:()=>{if(!(!enabled||disabled||action.pending))return action.onRun(actionContext)}}}),[actionContext,actionDefinitions,enabled]);useShortcuts(resolvedActions.flatMap(action=>action.shortcut&&(action.pending||action.disabled)?[{id:`collection.pending.${action.id}`,keys:action.shortcut,allowRepeat:!0,onTrigger:()=>{}}]:[]),{enabled:bindKeyboardShortcuts&&resolvedActions.some(action=>action.pending),scope:shortcutScope,priority:shortcutPriority+25,collectionOwnerId:shortcutCollectionOwnerRef.current,isAvailable});let getActionBarProps=useCallback11(()=>({selectedCount:selectedIds.size,actions:resolvedActions,collectionOwnerId:shortcutCollectionOwnerRef.current,isAvailable,shortcutsEnabled:bindKeyboardShortcuts&&(enabled||resolvedActions.some(action=>action.pending)),onClearSelection:enabled?clear:void 0}),[selectedIds.size,resolvedActions,isAvailable,enabled,bindKeyboardShortcuts,clear]),getContainerProps=useCallback11(()=>({ref:setContainerRef,onMouseDown:event=>{activateCollectionShortcuts(),handleContainerMouseDown(event)},onFocusCapture:activateCollectionShortcuts,onClickCapture:handleContainerClickCapture,style:{userSelect:"none"}}),[activateCollectionShortcuts,handleContainerClickCapture,handleContainerMouseDown,setContainerRef]);return{selectedIds,selectedCount:selectedIds.size,activeId,anchorId,headId:activeId,lastClickedId:anchorId,dragRect,actions:resolvedActions,getActionBarProps,isSelected,getSelectedItems,setActive,activate,toggle,select,clear,selectAll,selectRange,onCheckboxClick,onRowMouseDown,getRowProps,getItemProps,getCheckboxProps,getContainerProps}}var ROW_ATTR="data-notis-row-id";function useMultiSelect(options){let controller=useCollectionInteractions({...options,defaultActiveId:options.initialHeadId,onActiveItemChange:options.onHeadChange,shortcuts:{next:!1,previous:!1,activate:!1}}),getRowProps=useCallback12(id=>({[ROW_ATTR]:id}),[]),getItemProps=controller.getItemProps;return{selectedIds:controller.selectedIds,selectedCount:controller.selectedCount,lastClickedId:controller.lastClickedId,headId:controller.headId,dragRect:controller.dragRect,isSelected:controller.isSelected,getSelectedItems:controller.getSelectedItems,toggle:controller.toggle,select:controller.select,clear:controller.clear,selectAll:controller.selectAll,selectRange:controller.selectRange,setHead:controller.setActive,onCheckboxClick:controller.onCheckboxClick,onRowMouseDown:controller.onRowMouseDown,getRowProps,getItemProps,getCheckboxProps:controller.getCheckboxProps,getContainerProps:controller.getContainerProps}}import{useEffect as useEffect6,useMemo as useMemo2}from"react";function stableResource(resource){return JSON.stringify(resource)}function useActiveResource(resource){let runtime=useNotisRuntime(),signature=stableResource(resource),stable=useMemo2(()=>resource,[signature]);useEffect6(()=>(runtime?.publishActiveResource?.(stable),()=>runtime?.publishActiveResource?.(null)),[runtime,stable])}import ReactMarkdown from"react-markdown";import remarkGfm from"remark-gfm";import{jsx}from"react/jsx-runtime";function MarkdownLink({href,children,node:_node,...rest}){let isExternal=typeof href=="string"&&/^https?:\/\//i.test(href);return jsx("a",{href,...isExternal?{target:"_blank",rel:"noreferrer noopener"}:{},...rest,children})}function MarkdownTable({node:_node,...rest}){return jsx("div",{className:"notis-markdown-table",children:jsx("table",{...rest})})}var defaultComponents={a:MarkdownLink,table:MarkdownTable};function Markdown({value,size="base",className,components}){let classes=["notis-markdown",size==="sm"?"notis-markdown--sm":null,className].filter(Boolean).join(" ");return jsx("div",{className:classes,children:jsx(ReactMarkdown,{remarkPlugins:[remarkGfm],components:components?{...defaultComponents,...components}:defaultComponents,children:value})})}import{jsx as jsx2,jsxs}from"react/jsx-runtime";var RECORD_COMPONENT_WORDS=Object.freeze({unavailable:{en:"Open this record in Notis to use this component.",fr:"Ouvre cet enregistrement dans Notis pour utiliser ce composant."},shareUnavailable:{en:"Share unavailable",fr:"Partage indisponible"},shareUnavailableHint:{en:"Open this record in Notis to share it.",fr:"Ouvre cet enregistrement dans Notis pour le partager."},spacePageTitle:{en:"Space page",fr:"Page du Space"},spacePagePreview:{en:"This page shows here live when the Space opens in Notis.",fr:"Cette page s\u2019affiche ici en direct quand le Space est ouvert dans Notis."},spacePageOpen:{en:"Open page",fr:"Ouvrir la page"}});function useLocale(){return useNotisRuntime()?.context?.locale==="fr"?"fr":"en"}function RecordComponentUnavailable({className}){return jsx2("div",{role:"status",className,children:pick(RECORD_COMPONENT_WORDS.unavailable,useLocale())})}function RecordProperties(props){let Host=useNotisRuntime()?.ui?.RecordProperties;return Host?jsx2(Host,{...props}):jsx2(RecordComponentUnavailable,{className:props.className})}function HtmlFrame(props){let Host=useNotisRuntime()?.ui?.HtmlFrame;return Host?jsx2(Host,{...props}):jsx2(RecordComponentUnavailable,{className:props.className})}function ReportFrame(props){let Host=useNotisRuntime()?.ui?.ReportFrame;return Host?jsx2(Host,{...props}):jsx2(RecordComponentUnavailable,{className:props.className})}function ShareControl(props){let Host=useNotisRuntime()?.ui?.ShareControl,locale=useLocale();if(Host)return jsx2(Host,{...props});let hint=pick(RECORD_COMPONENT_WORDS.shareUnavailableHint,locale);return jsx2("span",{role:"status",className:props.className,title:hint,"aria-label":hint,"data-notis-share-unavailable":"",style:{display:"inline-flex",alignItems:"center",height:28,padding:"0 8px",fontSize:13,whiteSpace:"nowrap",color:"hsl(var(--muted-foreground))"},children:pick(RECORD_COMPONENT_WORDS.shareUnavailable,locale)})}function spacePageLink(href){let value=typeof href=="string"?href.trim():"";if(!value||/[\u0000-\u001f\u007f\\]/.test(value))return{path:value,openHref:null};if(value.startsWith("/")&&!value.startsWith("//"))return{path:value.split(/[?#]/,1)[0]||"/",openHref:value};try{let url=new URL(value);if((url.protocol==="https:"||url.protocol==="http:")&&!url.username&&!url.password)return{path:url.pathname,openHref:url.href}}catch{}return{path:value,openHref:null}}function SpacePageCard({href,title,className,notice}){let locale=useLocale(),{path,openHref}=spacePageLink(href),muted="hsl(var(--muted-foreground))";return jsxs("div",{role:"group","aria-label":title||pick(RECORD_COMPONENT_WORDS.spacePageTitle,locale),className,"data-notis-space-page-card":"",style:{display:"grid",alignContent:"start",gap:8,padding:16,borderRadius:10,minWidth:0,background:"hsl(var(--muted) / .5)",color:"hsl(var(--foreground))"},children:[jsx2("div",{style:{fontSize:14,fontWeight:500,overflowWrap:"anywhere"},children:title||pick(RECORD_COMPONENT_WORDS.spacePageTitle,locale)}),path?jsx2("div",{style:{fontSize:12,color:muted,overflowWrap:"anywhere",fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace"},children:path}):null,jsx2("div",{style:{fontSize:13,color:muted},children:notice??pick(RECORD_COMPONENT_WORDS.spacePagePreview,locale)}),openHref?jsx2("div",{children:jsx2("a",{className:"nui-btn",href:openHref,style:{textDecoration:"none"},children:pick(RECORD_COMPONENT_WORDS.spacePageOpen,locale)})}):null]})}function SpacePageFrame(props){let Host=useNotisRuntime()?.ui?.SpacePageFrame;return Host?jsx2(Host,{...props}):jsx2(SpacePageCard,{href:props.href,title:props.title,className:props.className})}import{Fragment,jsx as jsx3,jsxs as jsxs2}from"react/jsx-runtime";var DOCUMENT_EDITOR_WORDS=Object.freeze({loading:{en:"Loading document",fr:"Chargement du document"},readOnly:{en:"Read-only preview. Edit it in Notis.",fr:"Aper\xE7u en lecture seule. Modifie-le dans Notis."},report:{en:"Interactive report. Open it in its Space to use it.",fr:"Rapport interactif. Ouvre-le dans son Space pour l\u2019utiliser."},html:{en:"Interactive page. Open it in its Space to use it.",fr:"Page interactive. Ouvre-la dans son Space pour l\u2019utiliser."},view:{en:"View. Open it in its Space to see it.",fr:"Vue. Ouvre-la dans son Space pour la voir."},file:{en:"{type} file. Open it in Notis to see it.",fr:"Fichier {type}. Ouvre-le dans Notis pour le voir."},anyFile:{en:"File. Open it in Notis to see it.",fr:"Fichier. Ouvre-le dans Notis pour le voir."}}),fallbackNoticeStyle={marginTop:"0.75rem",fontSize:"12px",color:"hsl(var(--muted-foreground))"},fallbackFrameStyle={borderRadius:"0.5rem",background:"hsl(var(--muted) / .5)",padding:"12px 16px",fontSize:"13px",lineHeight:"20px",color:"hsl(var(--muted-foreground))"},fallbackTitleStyle={margin:"0 0 0.75rem",fontSize:"1.5rem",fontWeight:700,letterSpacing:"-0.01em",color:"hsl(var(--foreground))"};function DocumentEditorFallback({documentId,variant="full",className}){let{document,loading,error}=useDocument(documentId??null),locale=useNotisRuntime()?.context?.locale==="fr"?"fr":"en",t=words=>pick(words,locale);if(loading)return jsx3("div",{role:"status","aria-busy":"true",className,style:fallbackFrameStyle,children:t(DOCUMENT_EDITOR_WORDS.loading)});if(error||!document)return jsx3("div",{role:"status",className,style:fallbackFrameStyle,children:error?.message??t(DOCUMENT_HOOK_WORDS.notFound)});let isMarkdown=document.contentType==="markdown"||!document.contentType;return jsxs2("div",{className,children:[variant==="full"?jsx3("h1",{style:fallbackTitleStyle,children:document.title}):null,isMarkdown?jsxs2(Fragment,{children:[jsx3(Markdown,{value:document.contentMarkdown??""}),jsx3("p",{style:fallbackNoticeStyle,children:t(DOCUMENT_EDITOR_WORDS.readOnly)})]}):document.contentType==="view"?jsx3("div",{style:fallbackFrameStyle,children:t(document.viewType==="report"?DOCUMENT_EDITOR_WORDS.report:document.viewType==="html"?DOCUMENT_EDITOR_WORDS.html:DOCUMENT_EDITOR_WORDS.view)}):jsx3("div",{style:fallbackFrameStyle,children:document.fileType?t(fillWords(DOCUMENT_EDITOR_WORDS.file,{type:document.fileType.toUpperCase()})):t(DOCUMENT_EDITOR_WORDS.anyFile)})]})}function DocumentEditor(props){let runtime=useNotisRuntime(),HostEditor=runtime?.ui?.DocumentEditor;return HostEditor?jsx3(HostEditor,{...props}):runtime?.resource?.kind==="space"||props.recordKey?jsx3(RecordComponentUnavailable,{className:props.className}):jsx3(DocumentEditorFallback,{...props})}import{useCallback as useCallback13,useRef as useRef7,useState as useState10}from"react";import{jsx as jsx4,jsxs as jsxs3}from"react/jsx-runtime";var SKELETON_WORDS=Object.freeze({loading:{en:"Loading content",fr:"Chargement du contenu"}});function Skeleton({className,style}){return jsx4("span",{"aria-hidden":"true",className,style:{display:"block",height:16,borderRadius:6,background:"rgba(128,128,128,.18)",...style}})}function ViewSkeleton({variant="table",rows=5,label,locale}){let runtimeLocale=useNotisRuntime()?.context?.locale,shown=locale??(runtimeLocale==="fr"?"fr":"en");return jsxs3("div",{role:"status","aria-label":pick(label??SKELETON_WORDS.loading,shown),"aria-busy":"true","data-notis-content-skeleton":!0,style:{width:"100%",display:"grid",gap:16,padding:24},children:[jsx4(Skeleton,{style:{width:"32%",height:28}}),variant==="graph"?jsx4(Skeleton,{style:{height:420}}):jsx4("div",{style:{display:"grid",gap:12,gridTemplateColumns:variant==="cards"?"repeat(auto-fit,minmax(180px,1fr))":"1fr"},children:Array.from({length:rows},(_,index)=>jsx4(Skeleton,{style:{height:variant==="cards"?112:variant==="detail"?20:44,width:variant==="detail"&&index===rows-1?"65%":"100%"}},index))})]})}import{jsx as jsx5,jsxs as jsxs4}from"react/jsx-runtime";var copy={en:{loading:"Loading document",breadcrumb:"Breadcrumb",untitled:"Untitled"},fr:{loading:"Chargement du document",breadcrumb:"Fil d'Ariane",untitled:"Sans titre"}},DOCUMENT_PAGE_WIDTHS={standard:900,wide:1200,full:void 0},DOCUMENT_PAGE_GUTTER={narrow:16,wide:48,breakpoint:640,toolbar:57},CRUMB_MAX=160,CRUMB_MIN=72,CRUMB_PADDING="4px 6px",SKELETON="notis-document-page-skeleton",skeletonCss=`.${SKELETON}__column{padding:8px ${DOCUMENT_PAGE_GUTTER.narrow}px 0}.${SKELETON}__icon{width:44px;height:44px;margin-bottom:4px}@media (min-width:${DOCUMENT_PAGE_GUTTER.breakpoint}px){.${SKELETON}__column{padding:8px ${DOCUMENT_PAGE_GUTTER.wide}px 0}.${SKELETON}__icon{width:56px;height:56px}}`;function useCopy(){return copy[useNotisRuntime()?.context?.locale==="fr"?"fr":"en"]}function columnStyle(width="standard"){let max=DOCUMENT_PAGE_WIDTHS[width];return{width:"100%",maxWidth:max?`${max}px`:void 0,margin:"0 auto",boxSizing:"border-box"}}function DocumentPageSkeleton({width="standard",className,label}){let t=useCopy();return jsxs4("div",{role:"status","aria-busy":"true","aria-label":label||t.loading,"data-notis-skeleton":"document-page",className,style:{width:"100%",display:"flex",flexDirection:"column"},children:[jsx5("style",{children:skeletonCss}),jsxs4("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",height:DOCUMENT_PAGE_GUTTER.toolbar,padding:`0 ${DOCUMENT_PAGE_GUTTER.narrow}px`,boxSizing:"border-box"},children:[jsx5(Skeleton,{style:{width:180,height:14}}),jsx5(Skeleton,{style:{width:48,height:12}})]}),jsxs4("div",{className:`${SKELETON}__column`,style:{...columnStyle(width),display:"flex",flexDirection:"column"},children:[jsx5(Skeleton,{className:`${SKELETON}__icon`,style:{borderRadius:12,height:void 0}}),jsx5(Skeleton,{style:{width:"58%",height:36,margin:"2px 0 10px"}}),jsx5(Skeleton,{style:{width:"72%",height:14,margin:"15px 0"}}),jsx5("div",{style:{display:"grid",gap:12,marginTop:24},children:[100,96,88,100,64].map((size,index)=>jsx5(Skeleton,{style:{width:`${size}%`,height:16}},index))})]})]})}var ICON_BOX={display:"inline-flex",width:16,height:16,overflow:"hidden"};function DocumentPageFallback(props){let t=useCopy(),{recordKey,breadcrumb,actions,share=!1,aboveBody,belowBody,width,readOnly,className,menuItems=[],onSaved,onSavingChange}=props,crumbs=breadcrumb===!1?[]:breadcrumb||[],showToolbar=crumbs.length>0||!!actions||share||menuItems.length>0,saving=useRef7(!1),savingChange=useCallback13(value=>{saving.current&&!value&&onSaved?.({recordKey,title:null}),saving.current=value,onSavingChange?.(value)},[onSaved,onSavingChange,recordKey]);return jsxs4("div",{className,style:{width:"100%",display:"flex",flexDirection:"column"},children:[showToolbar?jsxs4("div",{style:{display:"flex",alignItems:"center",gap:8,minHeight:48,padding:"0 16px"},children:[jsx5("nav",{"aria-label":t.breadcrumb,style:{display:"flex",alignItems:"center",gap:4,flex:1,minWidth:CRUMB_MIN,overflow:"hidden",fontSize:14},children:crumbs.map((crumb,index)=>{let last=index===crumbs.length-1,text={display:"block",minWidth:0,maxWidth:last?"100%":CRUMB_MAX,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",color:"hsl(var(--muted-foreground))"};return jsxs4("span",{style:{display:"inline-flex",alignItems:"center",gap:4,minWidth:0,flex:"0 1 auto"},children:[crumb.onSelect?jsx5("button",{type:"button",onClick:crumb.onSelect,title:crumb.label,style:{...text,background:"none",border:0,padding:CRUMB_PADDING,borderRadius:6,cursor:"pointer",font:"inherit"},children:crumb.label}):jsx5("span",{title:crumb.label,style:{...text,padding:CRUMB_PADDING},children:crumb.label}),last?null:jsx5("span",{"aria-hidden":"true",style:{flex:"none",color:"hsl(var(--muted-foreground))"},children:"/"})]},`${crumb.label}-${index}`)})}),jsxs4("div",{"data-notis-document-page-actions":"",style:{display:"flex",alignItems:"center",gap:4,flex:"0 1 auto",minWidth:0,whiteSpace:"nowrap"},children:[actions,share?jsx5(ShareControl,{recordKey}):null,menuItems.map((item,index)=>jsx5("button",{type:"button",onClick:item.onSelect,disabled:item.disabled,title:item.label,"aria-label":item.icon?item.label:void 0,style:{display:"inline-flex",alignItems:"center",background:"none",border:0,padding:item.icon?6:"4px 8px",borderRadius:6,cursor:item.disabled?"default":"pointer",font:"inherit",fontSize:13,flex:"0 1 auto",minWidth:0,maxWidth:CRUMB_MAX,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",color:item.destructive?"hsl(var(--destructive))":"hsl(var(--muted-foreground))",opacity:item.disabled?.5:1},children:item.icon?jsx5("span",{style:ICON_BOX,children:renderIcon(item.icon)}):item.label},`${item.label}-${index}`))]})]}):null,props.viewer==="html"?jsx5(HtmlFrame,{recordKey}):jsxs4("div",{style:{...columnStyle(width),padding:"24px 16px 96px",display:"flex",flexDirection:"column",gap:20},children:[aboveBody,jsx5(DocumentEditor,{recordKey,variant:props.header===!1?"body":"full",showProperties:props.properties!=="hidden",readOnly,onDirtyChange:props.onDirtyChange,onSavingChange:savingChange}),belowBody]})]})}function DocumentPage(props){let runtime=useNotisRuntime(),Host=runtime?.ui?.DocumentPage,t=useCopy(),{recordKey,onTitle}=props,leaf=props.topBarTitle??(Array.isArray(props.breadcrumb)&&props.breadcrumb.length>0),inTopBar=!!(leaf&&Host&&runtime?.setTopBarTitleLeaf),back=Array.isArray(props.breadcrumb)?[...props.breadcrumb].reverse().find(crumb=>crumb.onSelect)?.onSelect:void 0,[reported,setReported]=useState10(null),reportTitle=useCallback13(title2=>{setReported(current=>current?.recordKey===recordKey&¤t.title===title2?current:{recordKey,title:title2}),onTitle?.(title2)},[recordKey,onTitle]),title=reported?.recordKey===recordKey?reported.title:null;return useTopBarTitleLeaf(leaf&&title!==null?title.trim()||t.untitled:null,back,{recordKey}),Host?jsx5(Host,{...props,topBarTitle:inTopBar,onTitle:reportTitle}):jsx5(DocumentPageFallback,{...props})}function usePrefetchRecord(){let prefetch=useNotisRuntime()?.ui?.prefetchRecord;return useCallback13(recordKey=>{recordKey&&prefetch?.(recordKey)},[prefetch])}import{useCallback as useCallback14,useEffect as useEffect7,useRef as useRef8,useState as useState11}from"react";import{jsx as jsx6}from"react/jsx-runtime";var MARKDOWN_EDITOR_WORDS=Object.freeze({placeholder:{en:"Write in Markdown",fr:"\xC9cris en Markdown"}}),editableStyle={minHeight:360,width:"100%",resize:"vertical",boxSizing:"border-box",padding:"12px 16px",borderRadius:8,border:"1px solid hsl(var(--border))",background:"hsl(var(--background))",color:"hsl(var(--foreground))",font:"inherit",fontSize:14,lineHeight:"22px"},readOnlyStyle={...editableStyle,resize:"none",border:"1px solid transparent",background:"hsl(var(--muted) / .4)",cursor:"default",outline:"none"};function MarkdownEditorFallback({value,revision,readOnly,autosaveMs=1500,placeholder,className,onChange,onSave,onDirtyChange,onSavingChange}){let locale=useNotisRuntime()?.context?.locale==="fr"?"fr":"en",[draft,setDraft]=useState11(value),[saveAttempt,setSaveAttempt]=useState11(0),draftRef=useRef8(value),dirtyRef=useRef8(!1),savingRef=useRef8(!1),revisionRef=useRef8(revision),onSaveRef=useRef8(onSave),readOnlyRef=useRef8(readOnly),unmountedRef=useRef8(!1),saveRef=useRef8(async()=>{});useEffect7(()=>{onSaveRef.current=onSave,readOnlyRef.current=readOnly},[onSave,readOnly]),useEffect7(()=>{dirtyRef.current||(draftRef.current=value,revisionRef.current=revision,setDraft(value))},[revision,value]);let save=useCallback14(async()=>{if(!onSave||!dirtyRef.current||readOnly||savingRef.current)return;let markdown=draftRef.current;savingRef.current=!0,unmountedRef.current||onSavingChange?.(!0);try{let result=await onSave({markdown,expectedRevision:revisionRef.current});result?.revision&&(revisionRef.current=result.revision),draftRef.current===markdown&&(dirtyRef.current=!1,unmountedRef.current||onDirtyChange?.(!1))}finally{savingRef.current=!1,unmountedRef.current||onSavingChange?.(!1),dirtyRef.current&&draftRef.current!==markdown&&(unmountedRef.current?saveRef.current().catch(error=>console.error("Could not save Markdown on unmount",error)):setSaveAttempt(attempt=>attempt+1))}},[onDirtyChange,onSave,onSavingChange,readOnly]);saveRef.current=save,useEffect7(()=>(unmountedRef.current=!1,()=>{unmountedRef.current=!0,savingRef.current||saveRef.current().catch(error=>console.error("Could not save Markdown on unmount",error))}),[]),useEffect7(()=>{if(!dirtyRef.current||!onSave||readOnly)return;let timer=window.setTimeout(()=>{save()},Math.max(250,autosaveMs));return()=>window.clearTimeout(timer)},[autosaveMs,draft,onSave,readOnly,save,saveAttempt]);let handleChange=event=>{let next=event.currentTarget.value;draftRef.current=next,setDraft(next),dirtyRef.current||(dirtyRef.current=!0,onDirtyChange?.(!0)),onChange?.(next)},handleKeyDown=event=>{(event.metaKey||event.ctrlKey)&&event.key.toLowerCase()==="s"&&(event.preventDefault(),save())};return jsx6("textarea",{value:draft,readOnly,"aria-readonly":readOnly||void 0,"data-readonly":readOnly?"":void 0,placeholder:readOnly?void 0:placeholder??pick(MARKDOWN_EDITOR_WORDS.placeholder,locale),className,onChange:handleChange,onKeyDown:handleKeyDown,style:readOnly?readOnlyStyle:editableStyle})}function MarkdownEditor(props){let HostEditor=useNotisRuntime()?.ui?.MarkdownEditor;return HostEditor?jsx6(HostEditor,{...props},props.resourceKey):jsx6(MarkdownEditorFallback,{...props},props.resourceKey)}import{useCallback as useCallback15}from"react";import{jsx as jsx7}from"react/jsx-runtime";var NOTIS_CONTEXT_CLIPBOARD_TYPE="application/x-notis-context+json";function selectionId(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`selection-${Date.now()}-${Math.random().toString(36).slice(2)}`}function NotisSelectionBoundary({resource,children,className,style}){let runtime=useNotisRuntime(),onCopy=useCallback15(event=>{if(event.target?.closest?.('input,textarea,[contenteditable="true"]'))return;let selection=event.currentTarget.getRootNode()?.getSelection?.()||window.getSelection(),text=selection?.toString()??"";if(!text.trim()||!selection||!event.currentTarget.contains(selection.anchorNode)||!event.currentTarget.contains(selection.focusNode))return;let payload={id:selectionId(),text,...runtime?.contextSource?{source:runtime.contextSource}:{},...resource?{resource:{...resource,snapshot:void 0}}:{}};event.clipboardData.setData("text/plain",text),event.clipboardData.setData(NOTIS_CONTEXT_CLIPBOARD_TYPE,JSON.stringify(payload)),event.preventDefault(),runtime?.captureContextSelection?.(payload)},[resource,runtime]);return jsx7("div",{className,style,onCopy,children})}import{useEffect as useEffect8,useMemo as useMemo3,useRef as useRef9,useState as useState12}from"react";import{jsx as jsx8,jsxs as jsxs5}from"react/jsx-runtime";var BULK_ACTION_LAYOUT_EVENT="notis:bulk-actions-layout",containerBaseStyle={position:"fixed",bottom:"calc(var(--notis-viewport-bottom, 0px) + max(1rem, var(--notis-safe-area-bottom, env(safe-area-inset-bottom, 0px))))",left:"50%",transform:"translateX(-50%)",zIndex:60,display:"flex",alignItems:"center",gap:"0.25rem",padding:"0.375rem 0.5rem",borderRadius:"0.5rem",background:"color-mix(in srgb, hsl(var(--foreground)) 95%, transparent)",color:"hsl(var(--background))",boxShadow:"0 10px 25px -10px rgba(0,0,0,0.35), 0 0 0 1px rgba(0,0,0,0.08)",backdropFilter:"blur(6px)",WebkitBackdropFilter:"blur(6px)",pointerEvents:"auto",fontSize:"13px",lineHeight:1.2,width:"max-content",maxWidth:"calc(100% - 2rem)"},countStyle={flexShrink:0,padding:"0 0.5rem",fontSize:"12px",fontWeight:500,fontVariantNumeric:"tabular-nums",whiteSpace:"nowrap",color:"color-mix(in srgb, hsl(var(--background)) 70%, transparent)"},dividerStyle={width:"1px",height:"1rem",margin:"0 0.125rem",background:"color-mix(in srgb, hsl(var(--background)) 20%, transparent)"},baseButtonStyle={flexShrink:0,display:"inline-flex",alignItems:"center",gap:"0.375rem",padding:"0.25rem 0.5rem",border:0,background:"transparent",color:"color-mix(in srgb, hsl(var(--background)) 90%, transparent)",borderRadius:"0.375rem",cursor:"pointer",fontSize:"13px",fontFamily:"inherit",whiteSpace:"nowrap",transition:"background-color 120ms ease, color 120ms ease"},keycapStyle={display:"inline-flex",alignItems:"center",justifyContent:"center",minWidth:"20px",height:"20px",padding:"0 4px",borderRadius:"4px",border:"1px solid color-mix(in srgb, hsl(var(--background)) 20%, transparent)",background:"color-mix(in srgb, hsl(var(--background)) 15%, transparent)",color:"inherit",fontSize:"11px",fontWeight:500,lineHeight:1,fontFamily:"inherit"},iconSlotStyle={display:"inline-flex",alignItems:"center",justifyContent:"center",color:"inherit"};function MultiSelectActionBar({selectedCount,actions,itemLabel,className,style,shortcutsEnabled=!0,shortcutScope="collection",collectionOwnerId,isAvailable,onClearSelection}){let barRef=useRef9(null),visible=selectedCount>0;useEffect8(()=>{let bar=barRef.current;if(!visible||!bar)return;let report=active=>{let owner=bar.ownerDocument,LayoutEvent=owner.defaultView?.CustomEvent;LayoutEvent&&owner.dispatchEvent(new LayoutEvent(BULK_ACTION_LAYOUT_EVENT,{detail:{bar,active}}))},update=()=>report(isAvailable?.()!==!1&&isInteractionElementVisible(bar));update();let observer=typeof ResizeObserver>"u"?null:new ResizeObserver(update);observer?.observe(bar);let VisibilityObserver=bar.ownerDocument.defaultView?.MutationObserver,visibilityObserver=VisibilityObserver?new VisibilityObserver(update):null,element=bar;for(;element;){visibilityObserver?.observe(element,{attributes:!0,attributeFilter:element===bar.ownerDocument.documentElement?["hidden","inert","aria-hidden","class"]:["hidden","inert","aria-hidden","style","class"]});let root=element.getRootNode();element=element.parentElement??("host"in root?root.host:null)}return()=>{observer?.disconnect(),visibilityObserver?.disconnect(),report(!1)}},[isAvailable,visible]);let actionShortcuts=useMemo3(()=>actions.flatMap(action=>action.shortcut?[{id:`collection.action.${action.id}`,keys:action.shortcut,label:action.label,allowRepeat:!!(action.disabled||action.pending),onTrigger:()=>{!action.disabled&&!action.pending&&action.onRun()}}]:[]),[actions]);if(useShortcuts(actionShortcuts,{enabled:shortcutsEnabled&&selectedCount>0,scope:shortcutScope,priority:25,collectionOwnerId,isAvailable:()=>isAvailable?.()!==!1&&isInteractionElementVisible(barRef.current)}),selectedCount===0)return null;let countWord=itemLabel?selectedCount===1?itemLabel.singular:itemLabel.plural:"selected",countLabel=itemLabel?`${selectedCount} ${countWord} selected`:`${selectedCount} selected`,composedStyle={...containerBaseStyle,...style||{}};return jsxs5("div",{ref:barRef,"data-notis-bulk-actions":!0,onFocusCapture:()=>{collectionOwnerId&&activateShortcutCollection(collectionOwnerId)},onMouseDownCapture:()=>{collectionOwnerId&&activateShortcutCollection(collectionOwnerId)},onKeyDown:event=>{event.key!=="Escape"||!shortcutsEnabled||!onClearSelection||isAvailable?.()===!1||(event.preventDefault(),event.stopPropagation(),onClearSelection())},role:"toolbar","aria-label":`Bulk actions for ${selectedCount} selected ${countWord}`,className,style:composedStyle,children:[jsx8("style",{children:`
|
|
2
|
+
import{DOCUMENT_WORDS,Dialog,MultiSelectDragOverlay,NotisProvider,RenderChartData,SHORTCUT_SCOPE_PRIORITY,SPACE_CLOUD_COMPUTER_OPERATIONS,SPACE_VIEWER_READ_OPERATIONS,SPACE_VIEW_SPEC_VERSION,SpaceActionError,SpaceNavigationCancelled,VIEW_PERIODS,activateShortcutCollection,asRecord,blockNoteToPlainText,createPrefetchQueue,createQueryClient,createShortcutCollectionOwner,extractRichText,fillWords,getDocumentPreview,getRelationIds,getSecretValue,isEditableShortcutEvent,isInteractionElementVisible,isPresentString,isSpaceNavigationCancelled,isViewDate,isViewPeriod,markdownToPlainText,normalizeDatabaseProperty,normalizeDocumentRecord,normalizePropertyValue,optionalString,parseViewParams,pick,queryKey,releaseShortcutCollection,renderIcon,resolveViewPeriod,shortcutDisplay,spaceCloudComputerAllows,spaceQueryKey,useMarqueeSelection,useNativeDelete,useNativeDocuments,useNativeMutation,useNotisRuntime,useQuery,useQueryClient,useShortcuts,useShown,useShownAvailable,useTopBarSearch,useTopBarTitleLeaf,useViewParams}from"./chunk-SVZATGZB.js";import{useCallback,useState}from"react";function useAction(actionId){let runtime=useNotisRuntime(),[pending,setPending]=useState(0),[error,setError]=useState(null);return{call:useCallback(async(inputs,options)=>{if(runtime?.resource?.kind!=="space"||!runtime.callAction)throw new Error("A Space action runtime is required.");setPending(value=>value+1),setError(null);try{return await runtime.callAction(actionId,inputs,options)}catch(cause){let failure=cause instanceof Error?cause:new Error(String(cause));throw setError(failure),failure}finally{setPending(value=>value-1)}},[runtime,actionId]),loading:pending>0,error}}function useActionQuery(actionId,inputs,options={readOnly:!0}){let{call}=useAction(actionId);return useQuery(["action",actionId,inputs],()=>call(inputs,{readOnly:!0,dedupe:!0}),options)}import{useCallback as useCallback2,useLayoutEffect,useRef,useState as useState2}from"react";function useNativeDocumentBody(binding,recordKey,options){let runtime=useNotisRuntime(),scope=JSON.stringify(spaceQueryKey(runtime,["native-body",binding,recordKey,options.readAction,options.writeAction])),currentScope=useRef(scope);useLayoutEffect(()=>(currentScope.current=scope,()=>{currentScope.current=null}),[scope]);let[state,setState]=useState2({scope,pending:0,error:null}),query=useQuery(["native-body",binding,recordKey,options.readAction],async()=>{if(!recordKey||runtime?.resource?.kind!=="space"||!runtime.documentBody)throw new Error("Open a Space document first.");let result=await runtime.documentBody({operation:"read",binding,recordKey,readAction:options.readAction});if(!("content_markdown"in result))throw new Error("The document response is incomplete.");return result},{readOnly:!0,enabled:!!recordKey&&options.enabled!==!1}),save=useCallback2(async draft=>{if(!recordKey||!options.writeAction||runtime?.resource?.kind!=="space"||!runtime.documentBody)throw new Error("This Space does not expose a body-edit action.");setState(previous=>({scope,pending:(previous.scope===scope?previous.pending:0)+1,error:null}));try{let result=await runtime.documentBody({operation:"save",binding,recordKey,readAction:options.readAction,writeAction:options.writeAction,...draft});if(currentScope.current!==scope)throw new SpaceActionError("This document view changed. Keep the original save request.",draft.requestId);if(!("status"in result))throw new Error("The document save receipt is incomplete.");return result}catch(cause){let error=cause instanceof Error?cause:new Error(String(cause));throw currentScope.current===scope&&setState(previous=>({...previous,error})),error}finally{currentScope.current===scope&&setState(previous=>({...previous,pending:Math.max(0,previous.pending-1)}))}},[runtime,binding,recordKey,options.readAction,options.writeAction,scope]);return{...query,body:query.data,save,saving:state.scope===scope&&state.pending>0,saveError:state.scope===scope?state.error:null}}var MAX_SKILL_PAGES=50;function useViewerReadAvailable(family){let runtime=useNotisRuntime();return runtime?.resource?.kind==="space"&&typeof runtime.viewerRead=="function"&&!!runtime.space?.viewerReads?.includes(family)}function useViewerRead(operation,input,options={}){let runtime=useNotisRuntime(),available=useViewerReadAvailable(SPACE_VIEWER_READ_OPERATIONS[operation]);return useQuery(["viewer-read",operation,input],async()=>{if(!runtime?.viewerRead)throw new Error("Viewer reads are unavailable here.");return runtime.viewerRead(operation,input)},{readOnly:!0,enabled:available&&options.enabled!==!1,staleTimeMs:options.staleTimeMs})}function useViewerDatabases(options={}){let runtime=useNotisRuntime(),available=useViewerReadAvailable("databases");return useQuery(["viewer-databases"],async()=>{if(!runtime?.viewerRead)throw new Error("Viewer reads are unavailable here.");let result=await runtime.viewerRead("list_databases",{});if(!Array.isArray(result?.databases))throw new Error("The database list is incomplete.");return result.databases},{readOnly:!0,enabled:available&&options.enabled!==!1,staleTimeMs:options.staleTimeMs})}var SKILL_CONTENT_PAGES_AT_ONCE=2;async function readAllViewerSkills(read,{includeContent,includeDisabled}){let page=(after,content)=>read({limit:100,include_content:content,include_disabled:includeDisabled,...after?{after}:{}}).then(result=>{if(!Array.isArray(result?.skills))throw new Error("The Skill list is incomplete.");return result}),skills=[],started=[],cursor=null,known=!0,pages=0;for(;;){if(known&&started.length<(includeContent?SKILL_CONTENT_PAGES_AT_ONCE:1)&&pages+started.length<MAX_SKILL_PAGES){let current={after:cursor,result:page(cursor,includeContent)};if(current.result.catch(()=>{}),started.push(current),known=!1,includeContent){let probe=await page(cursor,!1);known=!!(probe.has_more&&probe.next),cursor=probe.next??null}continue}let head=started.shift();if(!head)break;let result=await head.result;if(skills.push(...result.skills),pages+=1,!result.has_more||!result.next)return skills;if(started[0]?.after!==result.next){let dropped=started.splice(0);await Promise.allSettled(dropped.map(entry=>entry.result)),cursor=result.next,known=!0}}throw new Error("This account has more Skills than a page can read at once.")}function useViewerSkills(options={}){let runtime=useNotisRuntime(),available=useViewerReadAvailable("skills"),includeContent=options.includeContent===!0,includeDisabled=options.includeDisabled===!0;return useQuery(["viewer-skills",includeContent,includeDisabled],async()=>{if(!runtime?.viewerRead)throw new Error("Viewer reads are unavailable here.");return readAllViewerSkills(input=>runtime.viewerRead("list_skills",input),{includeContent,includeDisabled})},{readOnly:!0,enabled:available&&options.enabled!==!1,staleTimeMs:options.staleTimeMs})}function useNotis(){let runtime=useNotisRuntime();return{selection:runtime?.context?.selection??null,resource:runtime?.resource??null,app:runtime?.app??null,route:runtime?.route??null,databases:runtime?.databases??[],collectionItem:runtime?.context?.collectionItem??null,resourceId:runtime?.context?.resourceId??null,ready:runtime!==null}}function useDocuments(databaseSlug,options={}){let runtime=useNotisRuntime(),locale=runtime?.context?.locale==="fr"?"fr":"en",query=useQuery(["documents",databaseSlug,options.filter??null,options.pageSize??null,options.offset??0,!!options.fetchAll,options.includeContent!==!1,locale],async()=>{if(!runtime)throw new Error("Notis runtime not available");let allDocuments=[],offset=options.offset??0;for(;;){let result=await runtime.callTool("LOCAL_NOTIS_DATABASE_QUERY",{database_slug:databaseSlug,query:{...options.filter??{},...options.pageSize!==void 0?{page_size:options.pageSize}:{},...options.includeContent===!1?{include_content:!1}:{}},...offset>0?{offset}:{}},{dedupe:!0,readOnly:!0}),message=result.error??result.message;if(!result.documents&&message)throw new Error(message);if(allDocuments.push(...result.documents??[]),!options.fetchAll||!result.has_more)break;let nextOffset=result.next_offset;if(typeof nextOffset!="number"||nextOffset<=offset)throw new Error("Database query returned an invalid pagination offset");offset=nextOffset}return allDocuments.map(document=>normalizeDocumentRecord(document,{locale})).filter(document=>document.id)},{readOnly:!0,enabled:options.enabled});return{documents:query.data??EMPTY_DOCUMENTS,loading:query.loading,isFetching:query.isFetching,hasData:query.hasData,error:query.error,refetch:query.refetch}}var EMPTY_DOCUMENTS=[];import{useEffect,useRef as useRef2,useState as useState3}from"react";function useDatabaseSubscription(databaseSlug,options={}){let runtime=useNotisRuntime(),{subscribe=!0,...documentOptions}=options,{documents,loading,isFetching,hasData,error,refetch}=useDocuments(databaseSlug,documentOptions),[live,setLive]=useState3(!1),refetchRef=useRef2(refetch);useEffect(()=>{refetchRef.current=refetch},[refetch]);let enabled=options.enabled!==!1&&subscribe;return useEffect(()=>{if(!runtime?.subscribeDatabase||!enabled||!databaseSlug){setLive(!1);return}let cancelled=!1,unsubscribe=runtime.subscribeDatabase(databaseSlug,()=>{refetchRef.current()},{onStatusChange:isLive=>{cancelled||setLive(isLive)}});return()=>{cancelled=!0,setLive(!1),unsubscribe?.()}},[runtime,databaseSlug,enabled]),{documents,rows:documents,loading,isFetching,hasData,error,refetch,live}}var DOCUMENT_HOOK_WORDS=Object.freeze({notFound:{en:"Document not found",fr:"Document introuvable"}});function useDocument(documentId,options={}){let runtime=useNotisRuntime(),locale=runtime?.context?.locale==="fr"?"fr":"en",query=useQuery(["document",documentId??null,locale],async()=>{if(!runtime||!documentId)throw new Error(pick(DOCUMENT_HOOK_WORDS.notFound,locale));let result=await runtime.callTool("LOCAL_NOTIS_DATABASE_GET_DOCUMENT",{document_id:documentId},{dedupe:!0,readOnly:!0});if(!result.document)throw new Error(result.error??result.message??pick(DOCUMENT_HOOK_WORDS.notFound,locale));return normalizeDocumentRecord(result.document,{locale})},{readOnly:!0,enabled:options.enabled!==!1&&!!documentId});return{document:query.data??null,loading:query.loading,isFetching:query.isFetching,hasData:query.hasData,error:query.error,refetch:query.refetch}}import{useCallback as useCallback3,useState as useState4}from"react";function upsertToolName(databaseSlug){return`LOCAL_NOTIS_DATABASE_UPSERT_${databaseSlug.replace(/-/g,"_").toUpperCase()}`}function buildToolArgs(args){let payload={};return args.documentId&&(payload.document_id=args.documentId),typeof args.title=="string"&&(payload.title=args.title),args.properties&&Object.assign(payload,args.properties),"contentMarkdown"in args&&(payload.content_markdown=args.contentMarkdown??""),"contentBlocknote"in args&&(payload.content_blocknote=args.contentBlocknote??null),args.operation&&(payload.operation=args.operation),payload}function useUpsertDocument(databaseSlug){let runtime=useNotisRuntime(),[loading,setLoading]=useState4(!1),[error,setError]=useState4(null);return{upsert:useCallback3(async args=>{if(!runtime)throw new Error("Notis runtime not available. Ensure NotisProvider is mounted.");if("contentMarkdown"in args&&"contentBlocknote"in args)throw new Error("Provide contentMarkdown or contentBlocknote, not both.");setLoading(!0),setError(null);try{let result=await runtime.callTool(upsertToolName(databaseSlug),buildToolArgs(args));if(!result.document)throw new Error(result.error??result.message??"Failed to save document");return normalizeDocumentRecord(result.document,{locale:runtime.context?.locale==="fr"?"fr":"en"})}catch(err){let e=err instanceof Error?err:new Error(String(err));throw setError(e),e}finally{setLoading(!1)}},[runtime,databaseSlug]),loading,error}}function useDatabaseSchema(databaseSlug){let runtime=useNotisRuntime(),query=useQuery(["database-schema",databaseSlug],async()=>{let result=await runtime.callTool("LOCAL_NOTIS_DATABASE_GET_DATABASE",{database_slug:databaseSlug},{dedupe:!0,readOnly:!0});if(!result.database)throw new Error(result.error||result.message||"Database not found");return{name:optionalString(result.database.name),description:optionalString(result.database.description),properties:(result.database.schema?.properties??[]).map(normalizeDatabaseProperty).filter(property=>!!property)}},{readOnly:!0});return{...query,name:query.data?.name??null,description:query.data?.description??null,properties:query.data?.properties??EMPTY_PROPERTIES}}var EMPTY_PROPERTIES=[];import{useCallback as useCallback4,useState as useState5}from"react";function useTool(toolName){let runtime=useNotisRuntime(),[loading,setLoading]=useState5(!1),[error,setError]=useState5(null);return{call:useCallback4(async(args,options)=>{if(!runtime)throw new Error("Notis runtime not available. Ensure NotisProvider is mounted.");setLoading(!0),setError(null);try{return await runtime.callTool(toolName,args,options)}catch(err){let e=err instanceof Error?err:new Error(String(err));throw setError(e),e}finally{setLoading(!1)}},[runtime,toolName]),loading,error}}import{useEffect as useEffect2,useState as useState6}from"react";function useTools(){let runtime=useNotisRuntime(),[tools,setTools]=useState6([]),[loading,setLoading]=useState6(!0),[error,setError]=useState6(null);return useEffect2(()=>{if(!runtime){setLoading(!1);return}let cancelled=!1;return setLoading(!0),runtime.listTools().then(result=>{cancelled||(setTools(result),setLoading(!1))}).catch(err=>{cancelled||(setError(err instanceof Error?err:new Error(String(err))),setLoading(!1))}),()=>{cancelled=!0}},[runtime]),{tools,loading,error}}import{useCallback as useCallback5,useState as useState7}from"react";function useHandover(){let runtime=useNotisRuntime(),dispatch=runtime?.resource?.kind==="space"?runtime.draftHandover:runtime?.handover,[pending,setPending]=useState7(!1),[error,setError]=useState7(null);return{handover:useCallback5(async payload=>{if(!dispatch)throw new Error("This Notis host cannot hand work to the manager chat.");setPending(!0),setError(null);try{return await dispatch(payload)}catch(err){let e=err instanceof Error?err:new Error(String(err));throw setError(e),e}finally{setPending(!1)}},[dispatch]),pending,error,available:!!dispatch}}import{useCallback as useCallback6,useRef as useRef3}from"react";var CLOUD_COMPUTER_FACTS_KEY=["cloud-computer-facts"];function invalidateCloudComputerFacts(runtime){try{runtime?.queryClient?.invalidate(queryKey(spaceQueryKey(runtime,CLOUD_COMPUTER_FACTS_KEY)))}catch{}}var UNAVAILABLE={available:!1,reason:"unsupported_host",sandbox:null,cli_auth:{gh:{authenticated:null,account:null,checked_at:null,reason:"unsupported_host"}}};function useCloudComputer(){let runtime=useNotisRuntime(),explicitRefresh=useRef3(!1),query=useQuery(CLOUD_COMPUTER_FACTS_KEY,async()=>{let refresh2=explicitRefresh.current;return explicitRefresh.current=!1,runtime?.cloudComputerFacts?runtime.cloudComputerFacts(refresh2?{refresh:!0}:void 0):UNAVAILABLE},{readOnly:!0}),refresh=useCallback6(async()=>{explicitRefresh.current=!0,await query.refetch()},[query.refetch]),transport=runtime?.spaceCloudComputer,requestApproval=useCallback6(async()=>transport?(await transport.requestApproval())?.approved!==!0?!1:(invalidateCloudComputerFacts(runtime),await query.refetch(),!0):null,[query.refetch,runtime,transport]);return{facts:query.data??(query.error?UNAVAILABLE:null),loading:query.loading,isFetching:query.isFetching,error:query.error,refresh,requestApproval}}import{useCallback as useCallback7,useEffect as useEffect3,useRef as useRef4,useState as useState8}from"react";var unavailable=async()=>{throw new Error("The cloud computer is not available in this Space.")};function useCloudComputerShell(){let runtime=useNotisRuntime(),transport=runtime?.spaceCloudComputer,declared=runtime?.space?.cloudComputer,level=transport&&(declared==="read"||declared==="shell")?declared:null,available=level==="shell",[status,setStatus]=useState8(null),[loading,setLoading]=useState8(!!level),mounted=useRef4(!0);useEffect3(()=>()=>{mounted.current=!1},[]);let refresh=useCallback7(async()=>{if(!(!level||!transport)){setLoading(!0);try{let next=await transport.status();mounted.current&&setStatus(next)}catch{mounted.current&&setStatus(null)}finally{mounted.current&&setLoading(!1)}}},[level,transport]);useEffect3(()=>{mounted.current=!0,refresh()},[refresh]);let run=useCallback7(async(command,options={})=>!available||!transport?unavailable():transport.run({command,...options.cwd?{cwd:options.cwd}:{},...options.timeoutMs?{timeout_ms:options.timeoutMs}:{},...options.maxOutputLength?{max_output_length:options.maxOutputLength}:{},...options.requestId?{request_id:options.requestId}:{}}),[available,transport]),upload=useCallback7(async file=>!available||!transport?unavailable():transport.upload(file),[available,transport]),requestApproval=useCallback7(async()=>{if(!level||!transport)return null;let next=await transport.requestApproval();return mounted.current&&setStatus(next),next?.approved===!0&&invalidateCloudComputerFacts(runtime),next},[level,runtime,transport]);return{level,available,status,approved:status?.approved===!0,loading:!!level&&loading,run,upload,requestApproval,refresh}}import{useCallback as useCallback8}from"react";function useNotisNavigation(){let runtime=useNotisRuntime(),toNamedSpace=useCallback8(async(alias,options)=>{if(runtime?.resource?.kind!=="space"||!runtime.navigate)throw new Error("Open this Space in a current Notis host to navigate.");await runtime.navigate({kind:"space-reference",alias,documentId:options?.recordKey??null,selection:options?.selection??null,...options?.params?{params:options.params}:{}})},[runtime]),toSpace=useCallback8(async(spaceId,options)=>{if(!runtime?.navigate)throw new Error("Open this Space in a current Notis host to navigate.");await runtime.navigate({kind:"space",spaceId,documentId:options?.recordKey??null,...options?.params?{params:options.params}:{},...options?.selection?{selection:options.selection}:{}})},[runtime]),toRoute=useCallback8((path,options)=>{if(runtime?.navigate)runtime.navigate({kind:"route",path,resourceId:options?.resourceId??null});else if(typeof window<"u"){let url=new URL(path,window.location.href);options?.resourceId?url.searchParams.set("resource",options.resourceId):url.searchParams.delete("resource"),window.location.href=url.toString()}},[runtime]),toApp=useCallback8(()=>{runtime?.navigate&&runtime.navigate({kind:"app"})},[runtime]);return{toNamedSpace,toSpace,toRoute,toApp}}import{useCallback as useCallback9}from"react";function useBackend(){let runtime=useNotisRuntime();return{request:useCallback9(async(path,options)=>{if(!runtime)throw new Error("Notis runtime not available. Ensure NotisProvider is mounted.");return runtime.request(path,options)},[runtime])}}import{useCallback as useCallback12}from"react";import{useCallback as useCallback11,useEffect as useEffect5,useMemo,useRef as useRef6,useState as useState9}from"react";var ACTION_DEFAULTS={archive:{label:"Archive",shortcut:"E"},star:{label:"Star",shortcut:"S"},delete:{label:"Delete",shortcut:"#"},enable:{label:"Enable",shortcut:"E"},disable:{label:"Disable",shortcut:"D"},pause:{label:"Pause",shortcut:"P"},resume:{label:"Resume",shortcut:"R"},move:{label:"Move",shortcut:"M"},"add-to-folder":{label:"Add to folder",shortcut:"F"},complete:{label:"Mark complete",shortcut:"C"},"start-progress":{label:"Start progress",shortcut:"P"}};function collectionActionDefaults(intent){return!intent||intent==="custom"?{}:ACTION_DEFAULTS[intent]}import{useCallback as useCallback10,useEffect as useEffect4,useRef as useRef5}from"react";var LONG_PRESS_MS=500,MOVE_TOLERANCE_PX=10,INTERACTIVE_SELECTOR=["button","a[href]","input","textarea","select","summary",'[contenteditable]:not([contenteditable="false"])','[role="button"]','[role="link"]','[role="menuitem"]','[role="option"]','[role="switch"]','[role="tab"]'].join(", ");function useLongPressSelection(onSelect){let onSelectRef=useRef5(onSelect);onSelectRef.current=onSelect;let timerRef=useRef5(null),startRef=useRef5(null),suppressClickRef=useRef5(!1),cancel=useCallback10(()=>{timerRef.current!==null&&window.clearTimeout(timerRef.current),timerRef.current=null,startRef.current=null},[]);return useEffect4(()=>cancel,[cancel]),useCallback10(id=>({onPointerDown:event=>{if(event.pointerType!=="touch"||event.button!==0)return;let target=event.target;target instanceof HTMLElement&&target!==event.currentTarget&&target.closest(INTERACTIVE_SELECTOR)||(cancel(),startRef.current={x:event.clientX,y:event.clientY},timerRef.current=window.setTimeout(()=>{timerRef.current=null,startRef.current=null,suppressClickRef.current=!0,onSelectRef.current(id)},LONG_PRESS_MS))},onPointerMove:event=>{let start=startRef.current;start&&(Math.abs(event.clientX-start.x)>MOVE_TOLERANCE_PX||Math.abs(event.clientY-start.y)>MOVE_TOLERANCE_PX)&&cancel()},onPointerUp:cancel,onPointerCancel:cancel,onClickCapture:event=>suppressClickRef.current?(suppressClickRef.current=!1,event.preventDefault(),event.stopPropagation(),!0):!1}),[cancel])}var COLLECTION_ITEM_ATTRIBUTE="data-notis-collection-item-id",LEGACY_ROW_ATTRIBUTE="data-notis-row-id",INTERACTIVE_SELECTOR2='button, a, input, textarea, select, [role="button"], [contenteditable]:not([contenteditable="false"])',DEFAULT_SHORTCUTS={clear:"Escape",selectAll:"Mod+A",toggle:"X",extendNext:["Shift+ArrowDown","Shift+ArrowRight"],extendPrevious:["Shift+ArrowUp","Shift+ArrowLeft"],next:"J",previous:"K",up:"ArrowUp",down:"ArrowDown",left:!1,right:!1,activate:"Enter"};function filterShortcutKeys(keys,predicate){if(!keys)return!1;let filtered=(Array.isArray(keys)?keys:[keys]).filter(predicate);return filtered.length===0?!1:filtered.length===1?filtered[0]:filtered}function setsEqual(a,b){if(a.size!==b.size)return!1;for(let id of a)if(!b.has(id))return!1;return!0}function useCollectionInteractions(options){let{items,getId,selectionMode="multiple",selectedIds:controlledSelectedIds,defaultSelectedIds,onSelectionChange,activeId:controlledActiveId,defaultActiveId=null,onActiveIdChange,anchorId:controlledAnchorId,defaultAnchorId,onAnchorIdChange,onActivate,isItemDisabled,enabled=!0,bindKeyboardShortcuts=!0,enableDragSelect=selectionMode==="multiple",enableLongPressSelection=!1,clearSelectionOnPlainClick=!0,dragThreshold=5,shortcuts:shortcutOverrides,shortcutScope="collection",shortcutPriority=0,resolveNextId,onActiveItemChange,actions:actionDefinitions=[]}=options,[uncontrolledSelectedIds,setUncontrolledSelectedIds]=useState9(()=>new Set(defaultSelectedIds??[])),selectedIds=controlledSelectedIds??uncontrolledSelectedIds,[uncontrolledActiveId,setUncontrolledActiveId]=useState9(defaultActiveId),activeId=controlledActiveId===void 0?uncontrolledActiveId:controlledActiveId,[uncontrolledAnchorId,setUncontrolledAnchorId]=useState9(defaultAnchorId===void 0?defaultActiveId:defaultAnchorId),anchorId=controlledAnchorId===void 0?uncontrolledAnchorId:controlledAnchorId,itemsRef=useRef6(items),getIdRef=useRef6(getId),selectedIdsRef=useRef6(selectedIds),activeIdRef=useRef6(activeId),anchorIdRef=useRef6(anchorId),keyboardRangeBaseRef=useRef6(null),onSelectionChangeRef=useRef6(onSelectionChange),onActiveIdChangeRef=useRef6(onActiveIdChange),onAnchorIdChangeRef=useRef6(onAnchorIdChange),onActiveItemChangeRef=useRef6(onActiveItemChange),onActivateRef=useRef6(onActivate),resolveNextIdRef=useRef6(resolveNextId),containerRef=useRef6(null),[containerElement,setContainerElement]=useState9(null),setContainerRef=useCallback11(node=>{containerRef.current=node,setContainerElement(node)},[]),shortcutCollectionOwnerRef=useRef6(null);shortcutCollectionOwnerRef.current||(shortcutCollectionOwnerRef.current=createShortcutCollectionOwner()),itemsRef.current=items,getIdRef.current=getId,(!setsEqual(selectedIdsRef.current,selectedIds)||anchorIdRef.current!==anchorId)&&(keyboardRangeBaseRef.current=null),selectedIdsRef.current=selectedIds,activeIdRef.current=activeId,anchorIdRef.current=anchorId,onSelectionChangeRef.current=onSelectionChange,onActiveIdChangeRef.current=onActiveIdChange,onAnchorIdChangeRef.current=onAnchorIdChange,onActiveItemChangeRef.current=onActiveItemChange,onActivateRef.current=onActivate,resolveNextIdRef.current=resolveNextId;let itemById=useMemo(()=>new Map(items.map(item=>[getId(item),item])),[getId,items]),selectableIds=useMemo(()=>items.filter(item=>!isItemDisabled?.(item)).map(item=>getId(item)),[getId,isItemDisabled,items]),selectableIdsRef=useRef6(selectableIds);selectableIdsRef.current=selectableIds;let getItemsForIds=useCallback11(ids=>itemsRef.current.filter(item=>ids.has(getIdRef.current(item))),[]),commitSelection=useCallback11((next,reason)=>{let allowed=new Set(selectableIdsRef.current),normalized=selectionMode==="none"?new Set:new Set(Array.from(next).filter(id=>allowed.has(id)));if(selectionMode==="single"&&normalized.size>1){let first=normalized.values().next().value;normalized.clear(),first&&normalized.add(first)}setsEqual(normalized,selectedIdsRef.current)||(selectedIdsRef.current=normalized,controlledSelectedIds===void 0&&setUncontrolledSelectedIds(normalized),onSelectionChangeRef.current?.({reason,selectedIds:normalized,selectedItems:getItemsForIds(normalized),anchorId:anchorIdRef.current}))},[controlledSelectedIds,getItemsForIds,selectionMode]),setActive=useCallback11((id,reason="activate")=>{let next=id&&selectableIdsRef.current.includes(id)?id:null;activeIdRef.current!==next&&(activeIdRef.current=next,controlledActiveId===void 0&&setUncontrolledActiveId(next),onActiveIdChangeRef.current?.(next,reason),onActiveItemChangeRef.current?.(next))},[controlledActiveId]),setAnchor=useCallback11((id,reason)=>{anchorIdRef.current!==id&&(anchorIdRef.current=id,controlledAnchorId===void 0&&setUncontrolledAnchorId(id),onAnchorIdChangeRef.current?.(id,reason))},[controlledAnchorId]),activate=useCallback11(id=>{let item=itemsRef.current.find(candidate=>getIdRef.current(candidate)===id);!item||!selectableIdsRef.current.includes(id)||(keyboardRangeBaseRef.current=null,setActive(id,"activate"),setAnchor(id,"activate"),onActivateRef.current?.(item,id))},[setActive,setAnchor]),toggle=useCallback11(id=>{if(selectionMode==="none"||!selectableIdsRef.current.includes(id))return;keyboardRangeBaseRef.current=null;let next=new Set(selectedIdsRef.current);next.has(id)?next.delete(id):(selectionMode==="single"&&next.clear(),next.add(id)),setAnchor(id,"toggle"),commitSelection(next,"toggle")},[commitSelection,selectionMode,setAnchor]),select=useCallback11(ids=>{keyboardRangeBaseRef.current=null;let next=new Set(ids),last=ids[ids.length-1]??null;setAnchor(last,"toggle"),commitSelection(next,"toggle")},[commitSelection,setAnchor]),clear=useCallback11(()=>{keyboardRangeBaseRef.current=null,setAnchor(null,"clear"),commitSelection(new Set,"clear")},[commitSelection,setAnchor]),selectAll=useCallback11(()=>{if(selectionMode==="none")return;keyboardRangeBaseRef.current=null;let ids=selectionMode==="single"?selectableIdsRef.current.slice(0,1):selectableIdsRef.current,last=ids[ids.length-1]??null;setAnchor(last,"select-all"),commitSelection(new Set(ids),"select-all")},[commitSelection,selectionMode,setAnchor]),replaceRange=useCallback11((fromId,toId,reason)=>{let ids=selectableIdsRef.current,from=ids.indexOf(fromId),to=ids.indexOf(toId);if(from===-1||to===-1){commitSelection(new Set([toId]),reason);return}commitSelection(new Set([...keyboardRangeBaseRef.current??[],...ids.slice(Math.min(from,to),Math.max(from,to)+1)]),reason)},[commitSelection]),selectRange=useCallback11((fromId,toId)=>{let ids=selectableIdsRef.current;if(selectionMode==="none"||!ids.includes(toId))return;keyboardRangeBaseRef.current=null;let resolvedFromId=ids.includes(fromId)?fromId:activeIdRef.current&&ids.includes(activeIdRef.current)?activeIdRef.current:toId;if(setAnchor(toId,"range"),selectionMode==="single"){commitSelection(new Set([toId]),"range");return}let from=ids.indexOf(resolvedFromId),to=ids.indexOf(toId);if(from===-1||to===-1)commitSelection(new Set([toId]),"range");else{let next=new Set(selectedIdsRef.current);for(let id of ids.slice(Math.min(from,to),Math.max(from,to)+1))next.add(id);commitSelection(next,"range")}},[commitSelection,selectionMode,setAnchor]);useEffect5(()=>{let allowed=new Set(selectableIds);keyboardRangeBaseRef.current&&(keyboardRangeBaseRef.current=new Set(Array.from(keyboardRangeBaseRef.current).filter(id=>allowed.has(id))));let pruned=new Set(Array.from(selectedIdsRef.current).filter(id=>allowed.has(id)));setsEqual(pruned,selectedIdsRef.current)||commitSelection(pruned,"items-changed"),activeIdRef.current&&!allowed.has(activeIdRef.current)&&setActive(null,"items-changed"),anchorIdRef.current&&!allowed.has(anchorIdRef.current)&&setAnchor(null,"items-changed")},[commitSelection,selectableIds,setActive,setAnchor]);let focusItem=useCallback11(id=>{let nodes=containerRef.current?.querySelectorAll(`[${COLLECTION_ITEM_ATTRIBUTE}]`),node=nodes?Array.from(nodes).find(candidate=>candidate.getAttribute(COLLECTION_ITEM_ATTRIBUTE)===id&&isInteractionElementVisible(candidate)):null;node?.focus({preventScroll:!0}),node?.scrollIntoView?.({block:"nearest",inline:"nearest"})},[]),focusPointerItem=useCallback11(id=>{setActive(id,"activate"),focusItem(id)},[focusItem,setActive]),selectPointerRange=useCallback11(id=>{let rangeAnchor=anchorIdRef.current??activeIdRef.current??id,ids=selectableIdsRef.current,from=ids.indexOf(rangeAnchor),to=ids.indexOf(id),range=new Set(ids.slice(Math.min(from,to),Math.max(from,to)+1)),base=keyboardRangeBaseRef.current??new Set(Array.from(selectedIdsRef.current).filter(selected=>!range.has(selected)));keyboardRangeBaseRef.current=base,setAnchor(rangeAnchor,"range"),replaceRange(rangeAnchor,id,"range"),focusPointerItem(id)},[focusPointerItem,replaceRange,setAnchor]),moveActive=useCallback11((direction,extend=!1)=>{let ids=selectableIdsRef.current;if(ids.length===0)return;let current=activeIdRef.current,next=extend?null:resolveNextIdRef.current?.({direction,currentId:current,items:itemsRef.current,orderedIds:ids})??null;if(!next){let currentIndex=current?ids.indexOf(current):-1,forward=direction==="next"||direction==="down"||direction==="right",nextIndex=currentIndex===-1?forward?0:ids.length-1:Math.min(ids.length-1,Math.max(0,currentIndex+(forward?1:-1)));next=ids[nextIndex]??null}if(!next||next===current)return;let stableAnchor=anchorIdRef.current??current??next;extend?(keyboardRangeBaseRef.current??=new Set(Array.from(selectedIdsRef.current).filter(id=>id!==stableAnchor)),anchorIdRef.current||setAnchor(stableAnchor,"range"),replaceRange(stableAnchor,next,"range")):(keyboardRangeBaseRef.current=new Set,setAnchor(next,"navigate")),setActive(next,extend?"range":"navigate");let nextId=next;requestAnimationFrame(()=>focusItem(nextId))},[focusItem,replaceRange,setActive,setAnchor]),keyboard=useMemo(()=>({...DEFAULT_SHORTCUTS,...shortcutOverrides||{}}),[shortcutOverrides]),keyDefinitions=useMemo(()=>{let definitions=[],add=(id,label,keys,onTrigger)=>{keys&&definitions.push({id,label,keys,onTrigger})},extendRight=filterShortcutKeys(keyboard.extendNext,key=>key.toLowerCase().endsWith("arrowright")),extendDown=filterShortcutKeys(keyboard.extendNext,key=>!key.toLowerCase().endsWith("arrowright")),extendLeft=filterShortcutKeys(keyboard.extendPrevious,key=>key.toLowerCase().endsWith("arrowleft")),extendUp=filterShortcutKeys(keyboard.extendPrevious,key=>!key.toLowerCase().endsWith("arrowleft"));return add("collection.clear","Clear selection",selectedIds.size>0?keyboard.clear:!1,clear),add("collection.select-all","Select all visible items",selectionMode==="none"?!1:keyboard.selectAll,selectAll),add("collection.toggle","Toggle active item",selectionMode==="none"?!1:keyboard.toggle,()=>{let id=activeIdRef.current??anchorIdRef.current;id&&toggle(id)}),add("collection.extend-down","Extend selection down",selectionMode!=="multiple"?!1:extendDown,()=>moveActive("down",!0)),add("collection.extend-right","Extend selection right",selectionMode!=="multiple"?!1:extendRight,()=>moveActive("right",!0)),add("collection.extend-up","Extend selection up",selectionMode!=="multiple"?!1:extendUp,()=>moveActive("up",!0)),add("collection.extend-left","Extend selection left",selectionMode!=="multiple"?!1:extendLeft,()=>moveActive("left",!0)),add("collection.next","Next item",keyboard.next,()=>moveActive("next")),add("collection.previous","Previous item",keyboard.previous,()=>moveActive("previous")),add("collection.up","Move up",keyboard.up,()=>moveActive("up")),add("collection.down","Move down",keyboard.down,()=>moveActive("down")),add("collection.left","Move left",keyboard.left,()=>moveActive("left")),add("collection.right","Move right",keyboard.right,()=>moveActive("right")),add("collection.activate","Open active item",keyboard.activate,()=>{let id=activeIdRef.current??selectableIdsRef.current[0];id&&activate(id)}),definitions},[activate,clear,keyboard,moveActive,selectAll,selectedIds.size,selectionMode,toggle]),isAvailable=useCallback11(()=>isInteractionElementVisible(containerRef.current),[]);useEffect5(()=>{let owner=shortcutCollectionOwnerRef.current,container=containerElement,Observer=container?.ownerDocument.defaultView?.MutationObserver,observer=Observer?new Observer(()=>{isAvailable()||releaseShortcutCollection(owner)}):null,element=container;for(;element;){observer?.observe(element,{attributes:!0,attributeFilter:["hidden","inert","aria-hidden","style","class"]});let root=element.getRootNode();element=element.parentElement??("host"in root?root.host:null)}return()=>{observer?.disconnect(),releaseShortcutCollection(owner)}},[containerElement,isAvailable]),useShortcuts(keyDefinitions,{enabled:enabled&&bindKeyboardShortcuts,scope:shortcutScope,priority:shortcutPriority,collectionOwnerId:shortcutCollectionOwnerRef.current,isAvailable});let activateCollectionShortcuts=useCallback11(()=>{activateShortcutCollection(shortcutCollectionOwnerRef.current)},[]),marquee=useMarqueeSelection({enabled:enabled&&enableDragSelect&&selectionMode==="multiple",itemAttribute:COLLECTION_ITEM_ATTRIBUTE,isSelectable:id=>selectableIdsRef.current.includes(id),onSelect:ids=>{commitSelection(new Set(ids),"drag");let last=ids[ids.length-1]??null;setAnchor(last,"drag")},onClear:clear,threshold:dragThreshold,interactiveSelector:INTERACTIVE_SELECTOR2}),dragRect=marquee.rect,{armSuppressNextClick,onMouseDown:handleContainerMouseDown,onClickCapture:handleContainerClickCapture}=marquee,onRowMouseDown=useCallback11(id=>event=>{if(!enabled||event.button!==0||event.shiftKey||!(event.metaKey||event.ctrlKey))return;let interactiveTarget=event.target?.closest(INTERACTIVE_SELECTOR2);interactiveTarget&&interactiveTarget!==event.currentTarget||(event.preventDefault(),event.stopPropagation(),toggle(id),focusPointerItem(id),armSuppressNextClick())},[armSuppressNextClick,enabled,focusPointerItem,toggle]),onCheckboxClick=useCallback11(id=>event=>{event.stopPropagation(),enabled&&(event.shiftKey&&selectionMode==="multiple"?selectPointerRange(id):(toggle(id),focusPointerItem(id)))},[enabled,focusPointerItem,selectPointerRange,selectionMode,toggle]),getRowProps=useCallback11(id=>({[COLLECTION_ITEM_ATTRIBUTE]:id,[LEGACY_ROW_ATTRIBUTE]:id}),[]),longPress=useLongPressSelection(id=>{!enabled||selectionMode==="none"||(activateCollectionShortcuts(),toggle(id),focusPointerItem(id))}),getItemProps=useCallback11(id=>({...enableLongPressSelection?longPress(id):{},[COLLECTION_ITEM_ATTRIBUTE]:id,[LEGACY_ROW_ATTRIBUTE]:id,tabIndex:activeIdRef.current===id||!activeIdRef.current&&selectableIdsRef.current[0]===id?0:-1,"aria-selected":selectedIdsRef.current.has(id),"aria-disabled":!selectableIdsRef.current.includes(id),"data-notis-active":activeIdRef.current===id?"true":"false",onFocus:()=>{activateCollectionShortcuts(),setActive(id,"activate")},onMouseDown:onRowMouseDown(id),onClick:event=>{if(!enabled||event.defaultPrevented||!selectableIdsRef.current.includes(id))return;let interactiveTarget=event.target?.closest(INTERACTIVE_SELECTOR2);if(!(interactiveTarget&&interactiveTarget!==event.currentTarget)){if(event.shiftKey&&selectionMode==="multiple"){event.preventDefault(),selectPointerRange(id);return}event.metaKey||event.ctrlKey||(clearSelectionOnPlainClick&&clear(),activate(id))}},onKeyDown:event=>{!enabled||event.key!==" "||event.metaKey||event.ctrlKey||event.altKey||event.target===event.currentTarget&&(event.preventDefault(),selectionMode==="none"?activate(id):toggle(id))}}),[activate,activateCollectionShortcuts,clear,clearSelectionOnPlainClick,enabled,enableLongPressSelection,longPress,onRowMouseDown,selectPointerRange,selectionMode,setActive,toggle]),getCheckboxProps=useCallback11(id=>({isSelected:selectedIdsRef.current.has(id),disabled:!enabled||!selectableIdsRef.current.includes(id),onClick:onCheckboxClick(id)}),[enabled,onCheckboxClick]),getSelectedItems=useCallback11(()=>getItemsForIds(selectedIdsRef.current),[getItemsForIds]),isSelected=useCallback11(id=>selectedIds.has(id),[selectedIds]),actionContext=useMemo(()=>({selectedIds:Array.from(selectedIds),selectedItems:getItemsForIds(selectedIds),clearSelection:clear}),[clear,getItemsForIds,selectedIds]),resolvedActions=useMemo(()=>actionDefinitions.map(action=>{let defaults=collectionActionDefaults(action.intent),disabled=typeof action.disabled=="function"?action.disabled(actionContext):action.disabled,shortcut=action.shortcut===!1?void 0:action.shortcut??defaults.shortcut;return{id:action.id,label:action.label??defaults.label??action.id,icon:action.icon,shortcut,destructive:action.destructive??action.intent==="delete",disabled:!enabled||disabled,pending:action.pending,onRun:()=>{if(!(!enabled||disabled||action.pending))return action.onRun(actionContext)}}}),[actionContext,actionDefinitions,enabled]);useShortcuts(resolvedActions.flatMap(action=>action.shortcut&&(action.pending||action.disabled)?[{id:`collection.pending.${action.id}`,keys:action.shortcut,allowRepeat:!0,onTrigger:()=>{}}]:[]),{enabled:bindKeyboardShortcuts&&resolvedActions.some(action=>action.pending),scope:shortcutScope,priority:shortcutPriority+25,collectionOwnerId:shortcutCollectionOwnerRef.current,isAvailable});let getActionBarProps=useCallback11(()=>({selectedCount:selectedIds.size,actions:resolvedActions,collectionOwnerId:shortcutCollectionOwnerRef.current,isAvailable,shortcutsEnabled:bindKeyboardShortcuts&&(enabled||resolvedActions.some(action=>action.pending)),onClearSelection:enabled?clear:void 0}),[selectedIds.size,resolvedActions,isAvailable,enabled,bindKeyboardShortcuts,clear]),getContainerProps=useCallback11(()=>({ref:setContainerRef,onMouseDown:event=>{activateCollectionShortcuts(),handleContainerMouseDown(event)},onFocusCapture:activateCollectionShortcuts,onClickCapture:handleContainerClickCapture,style:{userSelect:"none"}}),[activateCollectionShortcuts,handleContainerClickCapture,handleContainerMouseDown,setContainerRef]);return{selectedIds,selectedCount:selectedIds.size,activeId,anchorId,headId:activeId,lastClickedId:anchorId,dragRect,actions:resolvedActions,getActionBarProps,isSelected,getSelectedItems,setActive,activate,toggle,select,clear,selectAll,selectRange,onCheckboxClick,onRowMouseDown,getRowProps,getItemProps,getCheckboxProps,getContainerProps}}var ROW_ATTR="data-notis-row-id";function useMultiSelect(options){let controller=useCollectionInteractions({...options,defaultActiveId:options.initialHeadId,onActiveItemChange:options.onHeadChange,shortcuts:{next:!1,previous:!1,activate:!1}}),getRowProps=useCallback12(id=>({[ROW_ATTR]:id}),[]),getItemProps=controller.getItemProps;return{selectedIds:controller.selectedIds,selectedCount:controller.selectedCount,lastClickedId:controller.lastClickedId,headId:controller.headId,dragRect:controller.dragRect,isSelected:controller.isSelected,getSelectedItems:controller.getSelectedItems,toggle:controller.toggle,select:controller.select,clear:controller.clear,selectAll:controller.selectAll,selectRange:controller.selectRange,setHead:controller.setActive,onCheckboxClick:controller.onCheckboxClick,onRowMouseDown:controller.onRowMouseDown,getRowProps,getItemProps,getCheckboxProps:controller.getCheckboxProps,getContainerProps:controller.getContainerProps}}import{useEffect as useEffect6,useMemo as useMemo2}from"react";function stableResource(resource){return JSON.stringify(resource)}function useActiveResource(resource){let runtime=useNotisRuntime(),signature=stableResource(resource),stable=useMemo2(()=>resource,[signature]);useEffect6(()=>(runtime?.publishActiveResource?.(stable),()=>runtime?.publishActiveResource?.(null)),[runtime,stable])}import ReactMarkdown from"react-markdown";import remarkGfm from"remark-gfm";import{jsx}from"react/jsx-runtime";function MarkdownLink({href,children,node:_node,...rest}){let isExternal=typeof href=="string"&&/^https?:\/\//i.test(href);return jsx("a",{href,...isExternal?{target:"_blank",rel:"noreferrer noopener"}:{},...rest,children})}function MarkdownTable({node:_node,...rest}){return jsx("div",{className:"notis-markdown-table",children:jsx("table",{...rest})})}var defaultComponents={a:MarkdownLink,table:MarkdownTable};function Markdown({value,size="base",className,components}){let classes=["notis-markdown",size==="sm"?"notis-markdown--sm":null,className].filter(Boolean).join(" ");return jsx("div",{className:classes,children:jsx(ReactMarkdown,{remarkPlugins:[remarkGfm],components:components?{...defaultComponents,...components}:defaultComponents,children:value})})}import{jsx as jsx2,jsxs}from"react/jsx-runtime";var RECORD_COMPONENT_WORDS=Object.freeze({unavailable:{en:"Open this record in Notis to use this component.",fr:"Ouvre cet enregistrement dans Notis pour utiliser ce composant."},shareUnavailable:{en:"Share unavailable",fr:"Partage indisponible"},shareUnavailableHint:{en:"Open this record in Notis to share it.",fr:"Ouvre cet enregistrement dans Notis pour le partager."},spacePageTitle:{en:"Space page",fr:"Page du Space"},spacePagePreview:{en:"This page shows here live when the Space opens in Notis.",fr:"Cette page s\u2019affiche ici en direct quand le Space est ouvert dans Notis."},spacePageOpen:{en:"Open page",fr:"Ouvrir la page"}});function useLocale(){return useNotisRuntime()?.context?.locale==="fr"?"fr":"en"}function RecordComponentUnavailable({className}){return jsx2("div",{role:"status",className,children:pick(RECORD_COMPONENT_WORDS.unavailable,useLocale())})}function RecordProperties(props){let Host=useNotisRuntime()?.ui?.RecordProperties;return Host?jsx2(Host,{...props}):jsx2(RecordComponentUnavailable,{className:props.className})}function HtmlFrame(props){let Host=useNotisRuntime()?.ui?.HtmlFrame;return Host?jsx2(Host,{...props}):jsx2(RecordComponentUnavailable,{className:props.className})}function ReportFrame(props){let Host=useNotisRuntime()?.ui?.ReportFrame;return Host?jsx2(Host,{...props}):jsx2(RecordComponentUnavailable,{className:props.className})}function ShareControl(props){let Host=useNotisRuntime()?.ui?.ShareControl,locale=useLocale();if(Host)return jsx2(Host,{...props});let hint=pick(RECORD_COMPONENT_WORDS.shareUnavailableHint,locale);return jsx2("span",{role:"status",className:props.className,title:hint,"aria-label":hint,"data-notis-share-unavailable":"",style:{display:"inline-flex",alignItems:"center",height:28,padding:"0 8px",fontSize:13,whiteSpace:"nowrap",color:"hsl(var(--muted-foreground))"},children:pick(RECORD_COMPONENT_WORDS.shareUnavailable,locale)})}function spacePageLink(href){let value=typeof href=="string"?href.trim():"";if(!value||/[\u0000-\u001f\u007f\\]/.test(value))return{path:value,openHref:null};if(value.startsWith("/")&&!value.startsWith("//"))return{path:value.split(/[?#]/,1)[0]||"/",openHref:value};try{let url=new URL(value);if((url.protocol==="https:"||url.protocol==="http:")&&!url.username&&!url.password)return{path:url.pathname,openHref:url.href}}catch{}return{path:value,openHref:null}}function SpacePageCard({href,title,className,notice}){let locale=useLocale(),{path,openHref}=spacePageLink(href),muted="hsl(var(--muted-foreground))";return jsxs("div",{role:"group","aria-label":title||pick(RECORD_COMPONENT_WORDS.spacePageTitle,locale),className,"data-notis-space-page-card":"",style:{display:"grid",alignContent:"start",gap:8,padding:16,borderRadius:10,minWidth:0,background:"hsl(var(--muted) / .5)",color:"hsl(var(--foreground))"},children:[jsx2("div",{style:{fontSize:14,fontWeight:500,overflowWrap:"anywhere"},children:title||pick(RECORD_COMPONENT_WORDS.spacePageTitle,locale)}),path?jsx2("div",{style:{fontSize:12,color:muted,overflowWrap:"anywhere",fontFamily:"ui-monospace, SFMono-Regular, Menlo, monospace"},children:path}):null,jsx2("div",{style:{fontSize:13,color:muted},children:notice??pick(RECORD_COMPONENT_WORDS.spacePagePreview,locale)}),openHref?jsx2("div",{children:jsx2("a",{className:"nui-btn",href:openHref,style:{textDecoration:"none"},children:pick(RECORD_COMPONENT_WORDS.spacePageOpen,locale)})}):null]})}function SpacePageFrame(props){let Host=useNotisRuntime()?.ui?.SpacePageFrame;return Host?jsx2(Host,{...props}):jsx2(SpacePageCard,{href:props.href,title:props.title,className:props.className})}import{Fragment,jsx as jsx3,jsxs as jsxs2}from"react/jsx-runtime";var DOCUMENT_EDITOR_WORDS=Object.freeze({loading:{en:"Loading document",fr:"Chargement du document"},readOnly:{en:"Read-only preview. Edit it in Notis.",fr:"Aper\xE7u en lecture seule. Modifie-le dans Notis."},report:{en:"Interactive report. Open it in its Space to use it.",fr:"Rapport interactif. Ouvre-le dans son Space pour l\u2019utiliser."},html:{en:"Interactive page. Open it in its Space to use it.",fr:"Page interactive. Ouvre-la dans son Space pour l\u2019utiliser."},view:{en:"View. Open it in its Space to see it.",fr:"Vue. Ouvre-la dans son Space pour la voir."},file:{en:"{type} file. Open it in Notis to see it.",fr:"Fichier {type}. Ouvre-le dans Notis pour le voir."},anyFile:{en:"File. Open it in Notis to see it.",fr:"Fichier. Ouvre-le dans Notis pour le voir."}}),fallbackNoticeStyle={marginTop:"0.75rem",fontSize:"12px",color:"hsl(var(--muted-foreground))"},fallbackFrameStyle={borderRadius:"0.5rem",background:"hsl(var(--muted) / .5)",padding:"12px 16px",fontSize:"13px",lineHeight:"20px",color:"hsl(var(--muted-foreground))"},fallbackTitleStyle={margin:"0 0 0.75rem",fontSize:"1.5rem",fontWeight:700,letterSpacing:"-0.01em",color:"hsl(var(--foreground))"};function DocumentEditorFallback({documentId,variant="full",className}){let{document,loading,error}=useDocument(documentId??null),locale=useNotisRuntime()?.context?.locale==="fr"?"fr":"en",t=words=>pick(words,locale);if(loading)return jsx3("div",{role:"status","aria-busy":"true",className,style:fallbackFrameStyle,children:t(DOCUMENT_EDITOR_WORDS.loading)});if(error||!document)return jsx3("div",{role:"status",className,style:fallbackFrameStyle,children:error?.message??t(DOCUMENT_HOOK_WORDS.notFound)});let isMarkdown=document.contentType==="markdown"||!document.contentType;return jsxs2("div",{className,children:[variant==="full"?jsx3("h1",{style:fallbackTitleStyle,children:document.title}):null,isMarkdown?jsxs2(Fragment,{children:[jsx3(Markdown,{value:document.contentMarkdown??""}),jsx3("p",{style:fallbackNoticeStyle,children:t(DOCUMENT_EDITOR_WORDS.readOnly)})]}):document.contentType==="view"?jsx3("div",{style:fallbackFrameStyle,children:t(document.viewType==="report"?DOCUMENT_EDITOR_WORDS.report:document.viewType==="html"?DOCUMENT_EDITOR_WORDS.html:DOCUMENT_EDITOR_WORDS.view)}):jsx3("div",{style:fallbackFrameStyle,children:document.fileType?t(fillWords(DOCUMENT_EDITOR_WORDS.file,{type:document.fileType.toUpperCase()})):t(DOCUMENT_EDITOR_WORDS.anyFile)})]})}function DocumentEditor(props){let runtime=useNotisRuntime(),HostEditor=runtime?.ui?.DocumentEditor;return HostEditor?jsx3(HostEditor,{...props}):runtime?.resource?.kind==="space"||props.recordKey?jsx3(RecordComponentUnavailable,{className:props.className}):jsx3(DocumentEditorFallback,{...props})}import{useCallback as useCallback13,useRef as useRef7,useState as useState10}from"react";import{jsx as jsx4,jsxs as jsxs3}from"react/jsx-runtime";var SKELETON_WORDS=Object.freeze({loading:{en:"Loading content",fr:"Chargement du contenu"}});function Skeleton({className,style}){return jsx4("span",{"aria-hidden":"true",className,style:{display:"block",height:16,borderRadius:6,background:"rgba(128,128,128,.18)",...style}})}function ViewSkeleton({variant="table",rows=5,label,locale}){let runtimeLocale=useNotisRuntime()?.context?.locale,shown=locale??(runtimeLocale==="fr"?"fr":"en");return jsxs3("div",{role:"status","aria-label":pick(label??SKELETON_WORDS.loading,shown),"aria-busy":"true","data-notis-content-skeleton":!0,style:{width:"100%",display:"grid",gap:16,padding:24},children:[jsx4(Skeleton,{style:{width:"32%",height:28}}),variant==="graph"?jsx4(Skeleton,{style:{height:420}}):jsx4("div",{style:{display:"grid",gap:12,gridTemplateColumns:variant==="cards"?"repeat(auto-fit,minmax(180px,1fr))":"1fr"},children:Array.from({length:rows},(_,index)=>jsx4(Skeleton,{style:{height:variant==="cards"?112:variant==="detail"?20:44,width:variant==="detail"&&index===rows-1?"65%":"100%"}},index))})]})}import{jsx as jsx5,jsxs as jsxs4}from"react/jsx-runtime";var copy={en:{loading:"Loading document",breadcrumb:"Breadcrumb",untitled:"Untitled"},fr:{loading:"Chargement du document",breadcrumb:"Fil d'Ariane",untitled:"Sans titre"}},DOCUMENT_PAGE_WIDTHS={standard:900,wide:1200,full:void 0},DOCUMENT_PAGE_GUTTER={narrow:16,wide:48,breakpoint:640,toolbar:57},CRUMB_MAX=160,CRUMB_MIN=72,CRUMB_PADDING="4px 6px",SKELETON="notis-document-page-skeleton",skeletonCss=`.${SKELETON}__column{padding:8px ${DOCUMENT_PAGE_GUTTER.narrow}px 0}.${SKELETON}__icon{width:44px;height:44px;margin-bottom:4px}@media (min-width:${DOCUMENT_PAGE_GUTTER.breakpoint}px){.${SKELETON}__column{padding:8px ${DOCUMENT_PAGE_GUTTER.wide}px 0}.${SKELETON}__icon{width:56px;height:56px}}`;function useCopy(){return copy[useNotisRuntime()?.context?.locale==="fr"?"fr":"en"]}function columnStyle(width="standard"){let max=DOCUMENT_PAGE_WIDTHS[width];return{width:"100%",maxWidth:max?`${max}px`:void 0,margin:"0 auto",boxSizing:"border-box"}}function DocumentPageSkeleton({width="standard",className,label}){let t=useCopy();return jsxs4("div",{role:"status","aria-busy":"true","aria-label":label||t.loading,"data-notis-skeleton":"document-page",className,style:{width:"100%",display:"flex",flexDirection:"column"},children:[jsx5("style",{children:skeletonCss}),jsxs4("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",height:DOCUMENT_PAGE_GUTTER.toolbar,padding:`0 ${DOCUMENT_PAGE_GUTTER.narrow}px`,boxSizing:"border-box"},children:[jsx5(Skeleton,{style:{width:180,height:14}}),jsx5(Skeleton,{style:{width:48,height:12}})]}),jsxs4("div",{className:`${SKELETON}__column`,style:{...columnStyle(width),display:"flex",flexDirection:"column"},children:[jsx5(Skeleton,{className:`${SKELETON}__icon`,style:{borderRadius:12,height:void 0}}),jsx5(Skeleton,{style:{width:"58%",height:36,margin:"2px 0 10px"}}),jsx5(Skeleton,{style:{width:"72%",height:14,margin:"15px 0"}}),jsx5("div",{style:{display:"grid",gap:12,marginTop:24},children:[100,96,88,100,64].map((size,index)=>jsx5(Skeleton,{style:{width:`${size}%`,height:16}},index))})]})]})}var ICON_BOX={display:"inline-flex",width:16,height:16,overflow:"hidden"};function DocumentPageFallback(props){let t=useCopy(),{recordKey,breadcrumb,actions,share=!1,aboveBody,belowBody,width,readOnly,className,menuItems=[],onSaved,onSavingChange}=props,crumbs=breadcrumb===!1?[]:breadcrumb||[],showToolbar=crumbs.length>0||!!actions||share||menuItems.length>0,saving=useRef7(!1),savingChange=useCallback13(value=>{saving.current&&!value&&onSaved?.({recordKey,title:null}),saving.current=value,onSavingChange?.(value)},[onSaved,onSavingChange,recordKey]);return jsxs4("div",{className,style:{width:"100%",display:"flex",flexDirection:"column"},children:[showToolbar?jsxs4("div",{style:{display:"flex",alignItems:"center",gap:8,minHeight:48,padding:"0 16px"},children:[jsx5("nav",{"aria-label":t.breadcrumb,style:{display:"flex",alignItems:"center",gap:4,flex:1,minWidth:CRUMB_MIN,overflow:"hidden",fontSize:14},children:crumbs.map((crumb,index)=>{let last=index===crumbs.length-1,text={display:"block",minWidth:0,maxWidth:last?"100%":CRUMB_MAX,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",color:"hsl(var(--muted-foreground))"};return jsxs4("span",{style:{display:"inline-flex",alignItems:"center",gap:4,minWidth:0,flex:"0 1 auto"},children:[crumb.onSelect?jsx5("button",{type:"button",onClick:crumb.onSelect,title:crumb.label,style:{...text,background:"none",border:0,padding:CRUMB_PADDING,borderRadius:6,cursor:"pointer",font:"inherit"},children:crumb.label}):jsx5("span",{title:crumb.label,style:{...text,padding:CRUMB_PADDING},children:crumb.label}),last?null:jsx5("span",{"aria-hidden":"true",style:{flex:"none",color:"hsl(var(--muted-foreground))"},children:"/"})]},`${crumb.label}-${index}`)})}),jsxs4("div",{"data-notis-document-page-actions":"",style:{display:"flex",alignItems:"center",gap:4,flex:"0 1 auto",minWidth:0,whiteSpace:"nowrap"},children:[actions,share?jsx5(ShareControl,{recordKey}):null,menuItems.map((item,index)=>jsx5("button",{type:"button",onClick:item.onSelect,disabled:item.disabled,title:item.label,"aria-label":item.icon?item.label:void 0,style:{display:"inline-flex",alignItems:"center",background:"none",border:0,padding:item.icon?6:"4px 8px",borderRadius:6,cursor:item.disabled?"default":"pointer",font:"inherit",fontSize:13,flex:"0 1 auto",minWidth:0,maxWidth:CRUMB_MAX,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",color:item.destructive?"hsl(var(--destructive))":"hsl(var(--muted-foreground))",opacity:item.disabled?.5:1},children:item.icon?jsx5("span",{style:ICON_BOX,children:renderIcon(item.icon)}):item.label},`${item.label}-${index}`))]})]}):null,props.viewer==="html"?jsx5(HtmlFrame,{recordKey}):jsxs4("div",{style:{...columnStyle(width),padding:"24px 16px 96px",display:"flex",flexDirection:"column",gap:20},children:[aboveBody,jsx5(DocumentEditor,{recordKey,variant:props.header===!1?"body":"full",showProperties:props.properties!=="hidden",readOnly,onDirtyChange:props.onDirtyChange,onSavingChange:savingChange}),belowBody]})]})}function DocumentPage(props){let runtime=useNotisRuntime(),Host=runtime?.ui?.DocumentPage,t=useCopy(),{recordKey,onTitle}=props,leaf=props.topBarTitle??(Array.isArray(props.breadcrumb)&&props.breadcrumb.length>0),inTopBar=!!(leaf&&Host&&runtime?.setTopBarTitleLeaf),back=Array.isArray(props.breadcrumb)?[...props.breadcrumb].reverse().find(crumb=>crumb.onSelect)?.onSelect:void 0,[reported,setReported]=useState10(null),reportTitle=useCallback13(title2=>{setReported(current=>current?.recordKey===recordKey&¤t.title===title2?current:{recordKey,title:title2}),onTitle?.(title2)},[recordKey,onTitle]),title=reported?.recordKey===recordKey?reported.title:null;return useTopBarTitleLeaf(leaf&&title!==null?title.trim()||t.untitled:null,back,{recordKey}),Host?jsx5(Host,{...props,topBarTitle:inTopBar,onTitle:reportTitle}):jsx5(DocumentPageFallback,{...props})}function usePrefetchRecord(){let prefetch=useNotisRuntime()?.ui?.prefetchRecord;return useCallback13(recordKey=>{recordKey&&prefetch?.(recordKey)},[prefetch])}import{useCallback as useCallback14,useEffect as useEffect7,useRef as useRef8,useState as useState11}from"react";import{jsx as jsx6}from"react/jsx-runtime";var MARKDOWN_EDITOR_WORDS=Object.freeze({placeholder:{en:"Write in Markdown",fr:"\xC9cris en Markdown"}}),editableStyle={minHeight:360,width:"100%",resize:"vertical",boxSizing:"border-box",padding:"12px 16px",borderRadius:8,border:"1px solid hsl(var(--border))",background:"hsl(var(--background))",color:"hsl(var(--foreground))",font:"inherit",fontSize:14,lineHeight:"22px"},readOnlyStyle={...editableStyle,resize:"none",border:"1px solid transparent",background:"hsl(var(--muted) / .4)",cursor:"default",outline:"none"};function MarkdownEditorFallback({value,revision,readOnly,autosaveMs=1500,placeholder,className,onChange,onSave,onDirtyChange,onSavingChange}){let locale=useNotisRuntime()?.context?.locale==="fr"?"fr":"en",[draft,setDraft]=useState11(value),[saveAttempt,setSaveAttempt]=useState11(0),draftRef=useRef8(value),dirtyRef=useRef8(!1),savingRef=useRef8(!1),revisionRef=useRef8(revision),onSaveRef=useRef8(onSave),readOnlyRef=useRef8(readOnly),unmountedRef=useRef8(!1),saveRef=useRef8(async()=>{});useEffect7(()=>{onSaveRef.current=onSave,readOnlyRef.current=readOnly},[onSave,readOnly]),useEffect7(()=>{dirtyRef.current||(draftRef.current=value,revisionRef.current=revision,setDraft(value))},[revision,value]);let save=useCallback14(async()=>{if(!onSave||!dirtyRef.current||readOnly||savingRef.current)return;let markdown=draftRef.current;savingRef.current=!0,unmountedRef.current||onSavingChange?.(!0);try{let result=await onSave({markdown,expectedRevision:revisionRef.current});result?.revision&&(revisionRef.current=result.revision),draftRef.current===markdown&&(dirtyRef.current=!1,unmountedRef.current||onDirtyChange?.(!1))}finally{savingRef.current=!1,unmountedRef.current||onSavingChange?.(!1),dirtyRef.current&&draftRef.current!==markdown&&(unmountedRef.current?saveRef.current().catch(error=>console.error("Could not save Markdown on unmount",error)):setSaveAttempt(attempt=>attempt+1))}},[onDirtyChange,onSave,onSavingChange,readOnly]);saveRef.current=save,useEffect7(()=>(unmountedRef.current=!1,()=>{unmountedRef.current=!0,savingRef.current||saveRef.current().catch(error=>console.error("Could not save Markdown on unmount",error))}),[]),useEffect7(()=>{if(!dirtyRef.current||!onSave||readOnly)return;let timer=window.setTimeout(()=>{save()},Math.max(250,autosaveMs));return()=>window.clearTimeout(timer)},[autosaveMs,draft,onSave,readOnly,save,saveAttempt]);let handleChange=event=>{let next=event.currentTarget.value;draftRef.current=next,setDraft(next),dirtyRef.current||(dirtyRef.current=!0,onDirtyChange?.(!0)),onChange?.(next)},handleKeyDown=event=>{(event.metaKey||event.ctrlKey)&&event.key.toLowerCase()==="s"&&(event.preventDefault(),save())};return jsx6("textarea",{value:draft,readOnly,"aria-readonly":readOnly||void 0,"data-readonly":readOnly?"":void 0,placeholder:readOnly?void 0:placeholder??pick(MARKDOWN_EDITOR_WORDS.placeholder,locale),className,onChange:handleChange,onKeyDown:handleKeyDown,style:readOnly?readOnlyStyle:editableStyle})}function MarkdownEditor(props){let HostEditor=useNotisRuntime()?.ui?.MarkdownEditor;return HostEditor?jsx6(HostEditor,{...props},props.resourceKey):jsx6(MarkdownEditorFallback,{...props},props.resourceKey)}import{useCallback as useCallback15}from"react";import{jsx as jsx7}from"react/jsx-runtime";var NOTIS_CONTEXT_CLIPBOARD_TYPE="application/x-notis-context+json";function selectionId(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`selection-${Date.now()}-${Math.random().toString(36).slice(2)}`}function NotisSelectionBoundary({resource,children,className,style}){let runtime=useNotisRuntime(),onCopy=useCallback15(event=>{if(event.target?.closest?.('input,textarea,[contenteditable="true"]'))return;let selection=event.currentTarget.getRootNode()?.getSelection?.()||window.getSelection(),text=selection?.toString()??"";if(!text.trim()||!selection||!event.currentTarget.contains(selection.anchorNode)||!event.currentTarget.contains(selection.focusNode))return;let payload={id:selectionId(),text,...runtime?.contextSource?{source:runtime.contextSource}:{},...resource?{resource:{...resource,snapshot:void 0}}:{}};event.clipboardData.setData("text/plain",text),event.clipboardData.setData(NOTIS_CONTEXT_CLIPBOARD_TYPE,JSON.stringify(payload)),event.preventDefault(),runtime?.captureContextSelection?.(payload)},[resource,runtime]);return jsx7("div",{className,style,onCopy,children})}import{useEffect as useEffect8,useMemo as useMemo3,useRef as useRef9,useState as useState12}from"react";import{jsx as jsx8,jsxs as jsxs5}from"react/jsx-runtime";var BULK_ACTION_LAYOUT_EVENT="notis:bulk-actions-layout",containerBaseStyle={position:"fixed",bottom:"calc(var(--notis-viewport-bottom, 0px) + max(1rem, var(--notis-safe-area-bottom, env(safe-area-inset-bottom, 0px))))",left:"50%",transform:"translateX(-50%)",zIndex:60,display:"flex",alignItems:"center",gap:"0.25rem",padding:"0.375rem 0.5rem",borderRadius:"0.5rem",background:"color-mix(in srgb, hsl(var(--foreground)) 95%, transparent)",color:"hsl(var(--background))",boxShadow:"0 10px 25px -10px rgba(0,0,0,0.35), 0 0 0 1px rgba(0,0,0,0.08)",backdropFilter:"blur(6px)",WebkitBackdropFilter:"blur(6px)",pointerEvents:"auto",fontSize:"13px",lineHeight:1.2,width:"max-content",maxWidth:"calc(100% - 2rem)"},countStyle={flexShrink:0,padding:"0 0.5rem",fontSize:"12px",fontWeight:500,fontVariantNumeric:"tabular-nums",whiteSpace:"nowrap",color:"color-mix(in srgb, hsl(var(--background)) 70%, transparent)"},dividerStyle={width:"1px",height:"1rem",margin:"0 0.125rem",background:"color-mix(in srgb, hsl(var(--background)) 20%, transparent)"},baseButtonStyle={flexShrink:0,display:"inline-flex",alignItems:"center",gap:"0.375rem",padding:"0.25rem 0.5rem",border:0,background:"transparent",color:"color-mix(in srgb, hsl(var(--background)) 90%, transparent)",borderRadius:"0.375rem",cursor:"pointer",fontSize:"13px",fontFamily:"inherit",whiteSpace:"nowrap",transition:"background-color 120ms ease, color 120ms ease"},keycapStyle={display:"inline-flex",alignItems:"center",justifyContent:"center",minWidth:"20px",height:"20px",padding:"0 4px",borderRadius:"4px",border:"1px solid color-mix(in srgb, hsl(var(--background)) 20%, transparent)",background:"color-mix(in srgb, hsl(var(--background)) 15%, transparent)",color:"inherit",fontSize:"11px",fontWeight:500,lineHeight:1,fontFamily:"inherit"},iconSlotStyle={display:"inline-flex",alignItems:"center",justifyContent:"center",color:"inherit"};function MultiSelectActionBar({selectedCount,actions,itemLabel,className,style,shortcutsEnabled=!0,shortcutScope="collection",collectionOwnerId,isAvailable,onClearSelection}){let barRef=useRef9(null),visible=selectedCount>0;useEffect8(()=>{let bar=barRef.current;if(!visible||!bar)return;let report=active=>{let owner=bar.ownerDocument,LayoutEvent=owner.defaultView?.CustomEvent;LayoutEvent&&owner.dispatchEvent(new LayoutEvent(BULK_ACTION_LAYOUT_EVENT,{detail:{bar,active}}))},update=()=>report(isAvailable?.()!==!1&&isInteractionElementVisible(bar));update();let observer=typeof ResizeObserver>"u"?null:new ResizeObserver(update);observer?.observe(bar);let VisibilityObserver=bar.ownerDocument.defaultView?.MutationObserver,visibilityObserver=VisibilityObserver?new VisibilityObserver(update):null,element=bar;for(;element;){visibilityObserver?.observe(element,{attributes:!0,attributeFilter:element===bar.ownerDocument.documentElement?["hidden","inert","aria-hidden","class"]:["hidden","inert","aria-hidden","style","class"]});let root=element.getRootNode();element=element.parentElement??("host"in root?root.host:null)}return()=>{observer?.disconnect(),visibilityObserver?.disconnect(),report(!1)}},[isAvailable,visible]);let actionShortcuts=useMemo3(()=>actions.flatMap(action=>action.shortcut?[{id:`collection.action.${action.id}`,keys:action.shortcut,label:action.label,allowRepeat:!!(action.disabled||action.pending),onTrigger:()=>{!action.disabled&&!action.pending&&action.onRun()}}]:[]),[actions]);if(useShortcuts(actionShortcuts,{enabled:shortcutsEnabled&&selectedCount>0,scope:shortcutScope,priority:25,collectionOwnerId,isAvailable:()=>isAvailable?.()!==!1&&isInteractionElementVisible(barRef.current)}),selectedCount===0)return null;let countWord=itemLabel?selectedCount===1?itemLabel.singular:itemLabel.plural:"selected",countLabel=itemLabel?`${selectedCount} ${countWord} selected`:`${selectedCount} selected`,composedStyle={...containerBaseStyle,...style||{}};return jsxs5("div",{ref:barRef,"data-notis-bulk-actions":!0,onFocusCapture:()=>{collectionOwnerId&&activateShortcutCollection(collectionOwnerId)},onMouseDownCapture:()=>{collectionOwnerId&&activateShortcutCollection(collectionOwnerId)},onKeyDown:event=>{event.key!=="Escape"||!shortcutsEnabled||!onClearSelection||isAvailable?.()===!1||(event.preventDefault(),event.stopPropagation(),onClearSelection())},role:"toolbar","aria-label":`Bulk actions for ${selectedCount} selected ${countWord}`,className,style:composedStyle,children:[jsx8("style",{children:`
|
|
3
3
|
[data-notis-bulk-action-icon][data-has-shortcut] { display: none !important; }
|
|
4
4
|
@media (max-width: 639px) {
|
|
5
5
|
[data-notis-bulk-actions] { flex-wrap: wrap; width: calc(100% - 2rem) !important; }
|