@notis_ai/cli 0.2.17 → 0.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +542 -146
- package/bin/check-runtime.js +15 -0
- package/bin/notis.js +2 -0
- package/config/notis_app_design_rules.json +320 -0
- package/config/portal-route-roots.json +45 -0
- package/dist/agent-hooks/notis-agent-hook.mjs +42323 -18258
- package/dist/base-skills/notis-cli/.notis-base-skill.json +1 -0
- package/dist/base-skills/notis-cli/SKILL.md +51 -280
- package/dist/base-skills/notis-cli/references/app-delivery.md +17 -0
- package/dist/base-skills/notis-cli/references/intelligence.md +94 -0
- package/dist/base-skills/notis-cli/references/native-databases.md +21 -0
- package/dist/base-skills/notis-cli/references/tool-examples.md +56 -0
- package/dist/base-skills/notis-cli/references/troubleshooting.md +67 -0
- package/dist/base-skills/notis-query/.notis-base-skill.json +1 -0
- package/dist/base-skills/notis-query/SKILL.md +35 -699
- package/dist/base-skills/notis-query/references/database-discovery.md +59 -0
- package/dist/base-skills/notis-query/references/documents.md +74 -0
- package/dist/base-skills/notis-query/references/query.md +76 -0
- package/dist/base-skills/notis-spaces/.notis-base-skill.json +1 -0
- package/dist/base-skills/notis-spaces/SKILL.md +218 -0
- package/dist/base-skills/notis-spaces/references/architecture.md +116 -0
- package/dist/base-skills/notis-spaces/references/context.md +81 -0
- package/dist/base-skills/notis-spaces/references/design.md +141 -0
- package/dist/base-skills/notis-spaces/references/fixtures.md +29 -0
- package/dist/base-skills/notis-spaces/references/memory.md +58 -0
- package/dist/base-skills/notis-spaces/references/reading.md +73 -0
- package/dist/base-skills/notis-spaces/references/release.md +120 -0
- package/dist/base-skills/notis-spaces/references/reports.md +77 -0
- package/dist/base-skills/notis-spaces/references/sdk.md +273 -0
- package/dist/base-skills/notis-spaces/references/store.md +118 -0
- package/dist/base-skills/notis-spaces/references/troubleshooting.md +28 -0
- package/dist/base-skills/notis-spaces/references/views.md +229 -0
- package/{template/packages → dist}/sdk/package.json +9 -10
- package/dist/sdk/src/agentContext.ts +36 -0
- package/dist/sdk/src/bundleModule.ts +175 -0
- package/dist/sdk/src/components/Dialog.tsx +103 -0
- package/dist/sdk/src/components/DocumentEditor.tsx +113 -0
- package/dist/sdk/src/components/DocumentPage.tsx +184 -0
- package/{template/packages → dist}/sdk/src/components/Markdown.tsx +9 -3
- package/{template/packages → dist}/sdk/src/components/MarkdownEditor.tsx +26 -5
- package/{template/packages → dist}/sdk/src/components/MultiSelectActionBar.tsx +95 -12
- package/{template/packages → dist}/sdk/src/components/MultiSelectCheckbox.tsx +4 -2
- package/dist/sdk/src/components/NotisCommentBoundary.tsx +172 -0
- package/{template/packages → dist}/sdk/src/components/NotisSelectionBoundary.tsx +9 -5
- package/dist/sdk/src/components/RecordComponents.tsx +111 -0
- package/dist/sdk/src/components/Skeleton.tsx +38 -0
- package/dist/sdk/src/config.ts +31 -0
- package/{template/packages → dist}/sdk/src/documents.ts +21 -6
- package/dist/sdk/src/hooks/useAction.ts +28 -0
- package/dist/sdk/src/hooks/useAgentContext.ts +23 -0
- package/{template/packages → dist}/sdk/src/hooks/useBackend.ts +3 -2
- package/dist/sdk/src/hooks/useCloudComputer.ts +94 -0
- package/dist/sdk/src/hooks/useCloudComputerShell.ts +114 -0
- package/{template/packages → dist}/sdk/src/hooks/useCollectionInteractions.ts +157 -147
- package/dist/sdk/src/hooks/useDatabaseSchema.ts +50 -0
- package/{template/packages → dist}/sdk/src/hooks/useDatabaseSubscription.ts +2 -2
- package/dist/sdk/src/hooks/useDocument.ts +51 -0
- package/{template/packages → dist}/sdk/src/hooks/useDocuments.ts +25 -59
- package/{template/packages → dist}/sdk/src/hooks/useHandover.ts +7 -7
- package/dist/sdk/src/hooks/useLongPressSelection.ts +79 -0
- package/dist/sdk/src/hooks/useMarqueeSelection.ts +194 -0
- package/{template/packages → dist}/sdk/src/hooks/useMultiSelect.ts +2 -8
- package/dist/sdk/src/hooks/useNativeDocumentBody.ts +50 -0
- package/dist/sdk/src/hooks/useNativeDocuments.ts +143 -0
- package/{template/packages → dist}/sdk/src/hooks/useNotis.ts +6 -1
- package/dist/sdk/src/hooks/useNotisNavigation.ts +70 -0
- package/dist/sdk/src/hooks/useQuery.ts +81 -0
- package/dist/sdk/src/hooks/useToolQuery.ts +12 -0
- package/dist/sdk/src/hooks/useTopBarSearch.ts +102 -0
- package/dist/sdk/src/hooks/useTopBarTitleLeaf.ts +75 -0
- package/{template/packages → dist}/sdk/src/hooks/useUpsertDocument.ts +1 -1
- package/dist/sdk/src/hooks/useViewParams.ts +195 -0
- package/dist/sdk/src/hooks/useViewerReads.ts +129 -0
- package/{template/packages → dist}/sdk/src/index.ts +64 -1
- package/{template/packages → dist}/sdk/src/interactions/actions.ts +14 -1
- package/{template/packages → dist}/sdk/src/interactions/shortcuts.tsx +129 -23
- package/dist/sdk/src/interactions/visibility.ts +13 -0
- package/{template/packages → dist}/sdk/src/interactions.ts +5 -1
- package/dist/sdk/src/nativeData.ts +39 -0
- package/{template/packages → dist}/sdk/src/provider.tsx +9 -4
- package/dist/sdk/src/queryCache.ts +292 -0
- package/dist/sdk/src/queryErrors.ts +51 -0
- package/dist/sdk/src/runtime.ts +675 -0
- package/dist/sdk/src/runtimeModules.ts +33 -0
- package/dist/sdk/src/space.ts +442 -0
- package/dist/sdk/src/standardViewParams.ts +36 -0
- package/{template/packages → dist}/sdk/src/styles.css +81 -16
- package/dist/sdk/src/tailwind.ts +66 -0
- package/dist/sdk/src/ui/charts/RenderChartData.tsx +25 -0
- package/dist/sdk/src/ui/engine/core.ts +392 -0
- package/dist/sdk/src/ui/engine/dom.ts +183 -0
- package/dist/sdk/src/ui/engine/hooks.ts +195 -0
- package/dist/sdk/src/ui/engine/instance.ts +63 -0
- package/dist/sdk/src/ui/engine/keycapContext.ts +2 -0
- package/dist/sdk/src/ui/engine/registry.ts +262 -0
- package/dist/sdk/src/ui/engine/types.ts +62 -0
- package/dist/sdk/src/ui/icons.tsx +91 -0
- package/dist/sdk/src/ui/util.ts +83 -0
- package/dist/sdk/src/viewPeriod.ts +26 -0
- package/dist/sdk/src/vite.ts +92 -0
- package/dist/sdk/src/words/actions.ts +295 -0
- package/dist/sdk/src/words/clashes.ts +158 -0
- package/dist/sdk/src/words/format.ts +136 -0
- package/dist/sdk/src/words/index.ts +13 -0
- package/dist/sdk/src/words/keymap.ts +72 -0
- package/dist/sdk/src/words/keys.ts +297 -0
- package/dist/sdk/src/words/shell.ts +46 -0
- package/dist/sdk/src/words/types.ts +65 -0
- package/dist/skill-sync/index.js +832 -151
- package/dist/skill-sync/index.js.map +4 -4
- package/dist/skill-sync-worker.mjs +3941 -0
- package/dist/space-harness/host.js +1460 -0
- package/dist/space-sdk/dist/chunk-ZSN57ATH.js +5 -0
- package/dist/space-sdk/dist/index.js +15 -0
- package/dist/space-sdk/dist/ui.js +18 -0
- package/dist/space-sdk/package.json +33 -0
- package/dist/space-sdk/src/agentContext.d.ts +36 -0
- package/dist/space-sdk/src/components/Dialog.d.ts +20 -0
- package/dist/space-sdk/src/components/DocumentEditor.d.ts +46 -0
- package/dist/space-sdk/src/components/DocumentPage.d.ts +53 -0
- package/dist/space-sdk/src/components/Markdown.d.ts +18 -0
- package/dist/space-sdk/src/components/MarkdownEditor.d.ts +11 -0
- package/dist/space-sdk/src/components/MultiSelectActionBar.d.ts +31 -0
- package/dist/space-sdk/src/components/MultiSelectCheckbox.d.ts +14 -0
- package/dist/space-sdk/src/components/MultiSelectDragOverlay.d.ts +8 -0
- package/dist/space-sdk/src/components/NotisCommentBoundary.d.ts +36 -0
- package/dist/space-sdk/src/components/NotisSelectionBoundary.d.ts +16 -0
- package/dist/space-sdk/src/components/RecordComponents.d.ts +64 -0
- package/dist/space-sdk/src/components/ShortcutHints.d.ts +12 -0
- package/dist/space-sdk/src/components/Skeleton.d.ts +23 -0
- package/dist/space-sdk/src/config.ts +31 -0
- package/dist/space-sdk/src/documents.d.ts +59 -0
- package/dist/space-sdk/src/hooks/useAction.d.ts +8 -0
- package/dist/space-sdk/src/hooks/useActiveResource.d.ts +3 -0
- package/dist/space-sdk/src/hooks/useAgentContext.d.ts +7 -0
- package/dist/space-sdk/src/hooks/useBackend.d.ts +23 -0
- package/dist/space-sdk/src/hooks/useCloudComputer.d.ts +45 -0
- package/dist/space-sdk/src/hooks/useCloudComputerShell.d.ts +49 -0
- package/dist/space-sdk/src/hooks/useCollectionInteractions.d.ts +118 -0
- package/dist/space-sdk/src/hooks/useDatabaseSchema.d.ts +14 -0
- package/dist/space-sdk/src/hooks/useDatabaseSubscription.d.ts +26 -0
- package/dist/space-sdk/src/hooks/useDocument.d.ts +22 -0
- package/dist/space-sdk/src/hooks/useDocuments.d.ts +31 -0
- package/dist/space-sdk/src/hooks/useHandover.d.ts +43 -0
- package/dist/space-sdk/src/hooks/useLongPressSelection.d.ts +9 -0
- package/dist/space-sdk/src/hooks/useMarqueeSelection.d.ts +57 -0
- package/dist/space-sdk/src/hooks/useMultiSelect.d.ts +51 -0
- package/dist/space-sdk/src/hooks/useNativeDocumentBody.d.ts +24 -0
- package/dist/space-sdk/src/hooks/useNativeDocuments.d.ts +55 -0
- package/dist/space-sdk/src/hooks/useNotis.d.ts +25 -0
- package/dist/space-sdk/src/hooks/useNotisNavigation.d.ts +33 -0
- package/dist/space-sdk/src/hooks/useQuery.d.ts +22 -0
- package/dist/space-sdk/src/hooks/useTool.d.ts +20 -0
- package/dist/space-sdk/src/hooks/useToolQuery.d.ts +3 -0
- package/dist/space-sdk/src/hooks/useTools.d.ts +15 -0
- package/dist/space-sdk/src/hooks/useTopBarSearch.d.ts +48 -0
- package/dist/space-sdk/src/hooks/useTopBarTitleLeaf.d.ts +24 -0
- package/dist/space-sdk/src/hooks/useUpsertDocument.d.ts +27 -0
- package/dist/space-sdk/src/hooks/useViewParams.d.ts +76 -0
- package/dist/space-sdk/src/hooks/useViewerReads.d.ts +38 -0
- package/dist/space-sdk/src/index.d.ts +98 -0
- package/dist/space-sdk/src/interactions/actions.d.ts +33 -0
- package/dist/space-sdk/src/interactions/shortcuts.d.ts +42 -0
- package/dist/space-sdk/src/interactions/visibility.d.ts +2 -0
- package/dist/space-sdk/src/nativeData.d.ts +66 -0
- package/dist/space-sdk/src/provider.d.ts +17 -0
- package/dist/space-sdk/src/queryCache.d.ts +45 -0
- package/dist/space-sdk/src/queryErrors.ts +51 -0
- package/dist/space-sdk/src/runtime.d.ts +615 -0
- package/dist/space-sdk/src/runtimeModules.ts +33 -0
- package/dist/space-sdk/src/space.ts +442 -0
- package/dist/space-sdk/src/standardViewParams.d.ts +15 -0
- package/dist/space-sdk/src/tailwind-candidates.d.ts +3418 -0
- package/dist/space-sdk/src/tailwind.ts +66 -0
- package/dist/space-sdk/src/ui/actions/ActionToast.d.ts +15 -0
- package/dist/space-sdk/src/ui/actions/actionWords.d.ts +16 -0
- package/dist/space-sdk/src/ui/actions/index.d.ts +7 -0
- package/dist/space-sdk/src/ui/actions/useActions.d.ts +69 -0
- package/dist/space-sdk/src/ui/actions/useToast.d.ts +41 -0
- package/dist/space-sdk/src/ui/blocks/Tabs.d.ts +139 -0
- package/dist/space-sdk/src/ui/blocks/blocks.d.ts +217 -0
- package/dist/space-sdk/src/ui/blocks/index.d.ts +4 -0
- package/dist/space-sdk/src/ui/board/BoardView.d.ts +36 -0
- package/dist/space-sdk/src/ui/board/boardModel.d.ts +46 -0
- package/dist/space-sdk/src/ui/board/boardWords.d.ts +9 -0
- package/dist/space-sdk/src/ui/board/index.d.ts +5 -0
- package/dist/space-sdk/src/ui/calendar/CalendarView.d.ts +49 -0
- package/dist/space-sdk/src/ui/calendar/DayPicker.d.ts +23 -0
- package/dist/space-sdk/src/ui/calendar/calendarMath.d.ts +81 -0
- package/dist/space-sdk/src/ui/charts/Chart.d.ts +203 -0
- package/dist/space-sdk/src/ui/charts/ChartTable.d.ts +37 -0
- package/dist/space-sdk/src/ui/charts/RenderChartData.d.ts +16 -0
- package/dist/space-sdk/src/ui/charts/StatRow.d.ts +59 -0
- package/dist/space-sdk/src/ui/charts/chartData.d.ts +84 -0
- package/dist/space-sdk/src/ui/comments/CommentPane.d.ts +58 -0
- package/dist/space-sdk/src/ui/comments/commentModel.d.ts +157 -0
- package/dist/space-sdk/src/ui/comments/commentWords.d.ts +60 -0
- package/dist/space-sdk/src/ui/comments/index.d.ts +4 -0
- package/dist/space-sdk/src/ui/comments/useComments.d.ts +146 -0
- package/dist/space-sdk/src/ui/engine/HelpSheet.d.ts +12 -0
- package/dist/space-sdk/src/ui/engine/KeyboardEngine.d.ts +27 -0
- package/dist/space-sdk/src/ui/engine/core.d.ts +73 -0
- package/dist/space-sdk/src/ui/engine/hooks.d.ts +64 -0
- package/dist/space-sdk/src/ui/engine/index.d.ts +14 -0
- package/dist/space-sdk/src/ui/engine/instance.d.ts +21 -0
- package/dist/space-sdk/src/ui/engine/keycapContext.d.ts +2 -0
- package/dist/space-sdk/src/ui/engine/registry.d.ts +77 -0
- package/dist/space-sdk/src/ui/engine/step.d.ts +11 -0
- package/dist/space-sdk/src/ui/engine/types.d.ts +54 -0
- package/dist/space-sdk/src/ui/fields/fieldWords.d.ts +56 -0
- package/dist/space-sdk/src/ui/fields/fields.d.ts +162 -0
- package/dist/space-sdk/src/ui/fields/index.d.ts +5 -0
- package/dist/space-sdk/src/ui/fields/useFieldDraft.d.ts +22 -0
- package/dist/space-sdk/src/ui/gallery/AttachmentGallery.d.ts +53 -0
- package/dist/space-sdk/src/ui/gallery/ImageViewer.d.ts +27 -0
- package/dist/space-sdk/src/ui/gallery/galleryWords.d.ts +95 -0
- package/dist/space-sdk/src/ui/gallery/index.d.ts +5 -0
- package/dist/space-sdk/src/ui/icons.d.ts +13 -0
- package/dist/space-sdk/src/ui/index.d.ts +54 -0
- package/dist/space-sdk/src/ui/keycap/Keycap.d.ts +22 -0
- package/dist/space-sdk/src/ui/keycap/index.d.ts +2 -0
- package/dist/space-sdk/src/ui/layout/Panels.d.ts +50 -0
- package/dist/space-sdk/src/ui/layout/chatPanelEdge.d.ts +77 -0
- package/dist/space-sdk/src/ui/layout/index.d.ts +5 -0
- package/dist/space-sdk/src/ui/layout/panelMath.d.ts +91 -0
- package/dist/space-sdk/src/ui/list/ListReader.d.ts +380 -0
- package/dist/space-sdk/src/ui/list/Row.d.ts +145 -0
- package/dist/space-sdk/src/ui/list/SelectionBar.d.ts +65 -0
- package/dist/space-sdk/src/ui/list/index.d.ts +14 -0
- package/dist/space-sdk/src/ui/list/rowState.d.ts +22 -0
- package/dist/space-sdk/src/ui/list/useListKeys.d.ts +89 -0
- package/dist/space-sdk/src/ui/list/useReorder.d.ts +86 -0
- package/dist/space-sdk/src/ui/list/useSelection.d.ts +90 -0
- package/dist/space-sdk/src/ui/open/OpenAsMenu.d.ts +15 -0
- package/dist/space-sdk/src/ui/open/index.d.ts +6 -0
- package/dist/space-sdk/src/ui/open/openModeStore.d.ts +39 -0
- package/dist/space-sdk/src/ui/open/useOpenMode.d.ts +17 -0
- package/dist/space-sdk/src/ui/overlay/Menu.d.ts +88 -0
- package/dist/space-sdk/src/ui/overlay/Popover.d.ts +28 -0
- package/dist/space-sdk/src/ui/overlay/Tooltip.d.ts +19 -0
- package/dist/space-sdk/src/ui/overlay/index.d.ts +9 -0
- package/dist/space-sdk/src/ui/overlay/layerRoot.d.ts +24 -0
- package/dist/space-sdk/src/ui/overlay/position.d.ts +31 -0
- package/dist/space-sdk/src/ui/period/PeriodPicker.d.ts +30 -0
- package/dist/space-sdk/src/ui/period/dateFormat.d.ts +50 -0
- package/dist/space-sdk/src/ui/period/dateWords.d.ts +88 -0
- package/dist/space-sdk/src/ui/period/periods.d.ts +70 -0
- package/dist/space-sdk/src/ui/period/usePeriod.d.ts +23 -0
- package/dist/space-sdk/src/ui/present/index.d.ts +3 -0
- package/dist/space-sdk/src/ui/present/presentWords.d.ts +27 -0
- package/dist/space-sdk/src/ui/present/screens.d.ts +36 -0
- package/dist/space-sdk/src/ui/present/useAudienceScreen.d.ts +38 -0
- package/dist/space-sdk/src/ui/styles.d.ts +21 -0
- package/dist/space-sdk/src/ui/timeline/TimelineView.d.ts +44 -0
- package/dist/space-sdk/src/ui/timeline/timelineMath.d.ts +123 -0
- package/dist/space-sdk/src/viewPeriod.d.ts +8 -0
- package/dist/space-sdk/src/vite.ts +92 -0
- package/dist/space-sdk/src/words/actions.ts +295 -0
- package/dist/space-sdk/src/words/clashes.ts +158 -0
- package/dist/space-sdk/src/words/format.ts +136 -0
- package/dist/space-sdk/src/words/index.ts +13 -0
- package/dist/space-sdk/src/words/keymap.ts +72 -0
- package/dist/space-sdk/src/words/keys.ts +297 -0
- package/dist/space-sdk/src/words/shell.ts +46 -0
- package/dist/space-sdk/src/words/types.ts +65 -0
- package/dist/view-renderer/dist/host.css +1 -0
- package/dist/view-renderer/dist/host.js +2374 -0
- package/dist/view-renderer/dist/theme.css +73 -0
- package/dist/view-renderer/src/dom.js +212 -0
- package/dist/view-renderer/src/errors.js +8 -0
- package/dist/view-renderer/src/host.tsx +250 -0
- package/dist/view-renderer/src/index.js +4 -0
- package/dist/view-renderer/src/png.js +213 -0
- package/dist/view-renderer/src/pool.js +110 -0
- package/dist/view-renderer/src/remote-broker.js +59 -0
- package/dist/view-renderer/src/renderer.js +271 -0
- package/package.json +21 -11
- package/skills/notis-cli/AGENT_INSTRUCTIONS.md +63 -12
- package/skills/notis-onboarding/BRIEF.md +14 -9
- package/skills/notis-query/cli.md +1 -1
- package/skills/notis-spaces/cli.md +540 -0
- package/src/cli.js +8 -8
- package/src/command-specs/agents.js +121 -8
- package/src/command-specs/auth.js +3 -3
- package/src/command-specs/diagnostics.js +97 -20
- package/src/command-specs/documents.js +158 -0
- package/src/command-specs/files.js +29 -0
- package/src/command-specs/handover.js +331 -79
- package/src/command-specs/helpers.js +50 -40
- package/src/command-specs/index.js +14 -5
- package/src/command-specs/meta.js +38 -9
- package/src/command-specs/onboarding.js +1 -1
- package/src/command-specs/profile.js +42 -1
- package/src/command-specs/skills.js +314 -9
- package/src/command-specs/smoke.js +16 -4
- package/src/command-specs/spaces.js +783 -0
- package/src/command-specs/tools.js +118 -21
- package/src/command-specs/version-history.js +20 -0
- package/src/command-specs/views.js +69 -0
- package/src/runtime/agent-browser.js +178 -267
- package/src/runtime/agent-setup.js +172 -13
- package/src/runtime/app-boundary-validator.js +338 -2
- package/src/runtime/app-data-literals.js +82 -0
- package/src/runtime/app-platform.js +750 -1568
- package/src/runtime/auth-recovery.js +17 -0
- package/src/runtime/base-skills.d.ts +11 -0
- package/src/runtime/base-skills.js +100 -3
- package/src/runtime/computer-identity.d.ts +30 -0
- package/src/runtime/computer-identity.js +151 -0
- package/src/runtime/config-lock.js +135 -0
- package/src/runtime/confined-space-build.js +74 -0
- package/src/runtime/confined-space-verify.js +49 -0
- package/src/runtime/delegated-context.js +5 -21
- package/src/runtime/native-record-files.js +47 -0
- package/src/runtime/oauth.js +342 -31
- package/src/runtime/profiles.js +19 -112
- package/src/runtime/retired-sdk-files.js +24 -0
- package/src/runtime/retry.js +150 -0
- package/src/runtime/skill-sync/cloud-client.ts +33 -8
- package/src/runtime/skill-sync/index.ts +443 -106
- package/src/runtime/skill-sync/local-scanner.ts +248 -32
- package/src/runtime/skill-sync/native-identity.ts +102 -0
- package/src/runtime/skill-sync/native-plan.ts +70 -0
- package/src/runtime/skill-sync/symlink-manager.ts +66 -16
- package/src/runtime/skill-sync/sync-plan.ts +34 -2
- package/src/runtime/skill-sync/types.ts +54 -0
- package/src/runtime/skill-sync/write-cloud-skill.ts +4 -4
- package/src/runtime/skill-sync-service.js +109 -0
- package/src/runtime/source-root.js +32 -0
- package/src/runtime/space-collection-scaffold.js +107 -0
- package/src/runtime/space-database-structures.js +229 -0
- package/src/runtime/space-fixture-broker.js +68 -0
- package/src/runtime/space-lock.js +337 -0
- package/src/runtime/space-platform.js +133 -0
- package/src/runtime/space-source.js +290 -0
- package/src/runtime/space-test-server.js +354 -0
- package/src/runtime/space-verification.js +94 -0
- package/src/runtime/space-verify-browser-worker.js +51 -0
- package/src/runtime/space-view-manifest.js +368 -0
- package/src/runtime/sync-skills.d.ts +5 -1
- package/src/runtime/sync-skills.js +11 -2
- package/src/runtime/tool-confirmation.js +138 -0
- package/src/runtime/transport.js +118 -24
- package/src/runtime/upsell.js +219 -0
- package/src/runtime/view-render.js +49 -0
- package/src/skill-sync-worker-entry.js +2 -0
- package/src/skill-sync-worker.js +114 -0
- package/src/space-harness-host.ts +122 -0
- package/template/.harness/index.html.tmpl +9 -352
- package/template/app/globals.css +29 -3
- package/template/app/layout.tsx +2 -6
- package/template/components/ui/badge.tsx +7 -4
- package/template/components/ui/button.tsx +1 -1
- package/template/components/ui/native-select.tsx +24 -0
- package/template/notis.config.ts +4 -36
- package/template/package-lock.json +1800 -1867
- package/template/package.json +16 -14
- package/template/postcss.config.mjs +1 -1
- package/template/tailwind.config.ts +1 -6
- package/template/tsconfig.json +1 -0
- package/template/vite.config.ts +2 -2
- package/dist/base-skills/notis-apps/SKILL.md +0 -613
- package/skills/notis-apps/cli.md +0 -285
- package/src/command-specs/apps.js +0 -3000
- package/src/runtime/app-changelog.js +0 -79
- package/src/runtime/app-dev-consumers.js +0 -154
- package/src/runtime/app-dev-host-lock.js +0 -80
- package/src/runtime/app-dev-process-identity.js +0 -111
- package/src/runtime/app-dev-roots.js +0 -284
- package/src/runtime/app-dev-server.js +0 -1140
- package/src/runtime/app-dev-sessions.js +0 -185
- package/src/runtime/app-registry-scaffolds.js +0 -367
- package/src/runtime/assets/store-screenshot-dark.png +0 -0
- package/src/runtime/cli-mode.generated.js +0 -5
- package/src/runtime/cli-mode.js +0 -34
- package/src/runtime/store-screenshot.js +0 -143
- package/template/CHANGELOG.md +0 -5
- package/template/app/page.tsx +0 -60
- package/template/components/ui/card.tsx +0 -56
- package/template/packages/sdk/src/components/DocumentEditor.tsx +0 -103
- package/template/packages/sdk/src/config.ts +0 -259
- package/template/packages/sdk/src/hooks/useCloudComputer.ts +0 -97
- package/template/packages/sdk/src/hooks/useDatabaseSchema.ts +0 -85
- package/template/packages/sdk/src/hooks/useDocument.ts +0 -78
- package/template/packages/sdk/src/hooks/useNotisNavigation.ts +0 -52
- package/template/packages/sdk/src/hooks/useTopBarSearch.ts +0 -73
- package/template/packages/sdk/src/runtime.ts +0 -439
- package/template/packages/sdk/src/vite.ts +0 -56
- package/template/packages/sdk/tsconfig.json +0 -15
- /package/{template/packages → dist}/sdk/src/components/MultiSelectDragOverlay.tsx +0 -0
- /package/{template/packages → dist}/sdk/src/components/ShortcutHints.tsx +0 -0
- /package/{template/packages → dist}/sdk/src/hooks/useActiveResource.ts +0 -0
- /package/{template/packages → dist}/sdk/src/hooks/useTool.ts +0 -0
- /package/{template/packages → dist}/sdk/src/hooks/useTools.ts +0 -0
- /package/{template/packages → dist}/sdk/src/ui.ts +0 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Generated by packages/cli/scripts/build-space-sdk.js for Node tests only. A Space view always uses the Notis host SDK.
|
|
2
|
+
var __defProp=Object.defineProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};function isInteractionElementVisible(element){if(!element?.isConnected)return!1;let current=element;for(;current;){if(current.hasAttribute("hidden")||current.hasAttribute("inert")||current.getAttribute("aria-hidden")==="true")return!1;let style=current.ownerDocument.defaultView?.getComputedStyle(current);if(style?.display==="none"||style?.visibility==="hidden")return!1;let root=current.getRootNode();current=current.parentElement??("host"in root?root.host:null)}return!0}import{createContext,useCallback,useContext,useEffect,useLayoutEffect,useMemo,useRef,useState}from"react";import{Fragment,jsx,jsxs}from"react/jsx-runtime";var SHORTCUT_SCOPE_PRIORITY={app:0,route:100,collection:200,detail:300,modal:400},SHORTCUT_CONTEXT_SYMBOL=Symbol.for("notis.sdk.shortcut_context");function getShortcutContext(){let scope=globalThis;return scope[SHORTCUT_CONTEXT_SYMBOL]||(scope[SHORTCUT_CONTEXT_SYMBOL]=createContext(null)),scope[SHORTCUT_CONTEXT_SYMBOL]}var ShortcutContext=getShortcutContext(),SHORTCUT_COLLECTION_STATE_SYMBOL=Symbol.for("notis.sdk.shortcut_collection_state");function getShortcutCollectionState(){let scope=globalThis;return scope[SHORTCUT_COLLECTION_STATE_SYMBOL]||(scope[SHORTCUT_COLLECTION_STATE_SYMBOL]={activeOwnerId:null,nextOwnerId:1}),scope[SHORTCUT_COLLECTION_STATE_SYMBOL]}function createShortcutCollectionOwner(){let state=getShortcutCollectionState();return`collection-${state.nextOwnerId++}`}function releaseShortcutCollection(ownerId){let state=getShortcutCollectionState();state.activeOwnerId===ownerId&&(state.activeOwnerId=null)}function activateShortcutCollection(ownerId){getShortcutCollectionState().activeOwnerId=ownerId}function normalizeKey(key){let lower=key.trim().toLowerCase();return lower==="esc"?"escape":lower==="return"?"enter":lower==="space"?" ":lower==="arrowup"||lower==="up"?"arrowup":lower==="arrowdown"||lower==="down"?"arrowdown":lower==="arrowleft"||lower==="left"?"arrowleft":lower==="arrowright"||lower==="right"?"arrowright":lower}function parseChord(raw){let parts=raw.split("+").map(part=>part.trim()).filter(Boolean);if(parts.length===0)return null;let key="",mod=!1,shift=!1,alt=!1;for(let part of parts){let lower=part.toLowerCase();lower==="mod"||lower==="cmd"||lower==="ctrl"||lower==="meta"?mod=!0:lower==="shift"?shift=!0:lower==="alt"||lower==="option"?alt=!0:key=normalizeKey(part)}return key?{key,mod,shift,alt}:null}function parseShortcut(definition){return(Array.isArray(definition.keys)?definition.keys:[definition.keys]).flatMap(value=>{let sequence=value.trim().split(/\s+/).map(parseChord).filter(chord=>chord!==null);return sequence.length>0?[{definition,sequence}]:[]})}function chordToken(chord){return`${chord.mod?"m":"-"}${chord.shift?"s":"-"}${chord.alt?"a":"-"}:${chord.key}`}function eventChord(event){let key=normalizeKey(event.key),shift=event.shiftKey;return key==="3"&&shift&&(key="#"),(key==="#"||key==="?")&&(shift=!1),{key,mod:!!(event.metaKey||event.ctrlKey),shift,alt:event.altKey}}function isEditableShortcutEvent(event){return(event.composedPath?.()??[event.target]).some(target=>{if(!(target instanceof HTMLElement))return!1;if(target.isContentEditable||target.getAttribute("contenteditable")==="true")return!0;let tag=target.tagName;return tag==="INPUT"||tag==="TEXTAREA"||tag==="SELECT"||tag==="BUTTON"||tag==="SUMMARY"||tag==="A"&&target.hasAttribute("href")?!0:["button","link","menuitem","separator","switch","tab"].includes(target.getAttribute("role")||"")})}function matchPrefix(tokens,candidate){return tokens.length>candidate.sequence.length?!1:tokens.every((token,index)=>token===chordToken(candidate.sequence[index]))}function consumeShortcut(event,definition){definition.preventDefault!==!1&&event.preventDefault(),definition.stopPropagation!==!1&&(event.stopPropagation(),event.stopImmediatePropagation?.()),definition.onTrigger(event)}function isEmptyCollectionClear(shortcut,ownerDocument,event){if(event.key!=="Escape"||shortcut.id!=="collection.clear")return!1;let items=collectionItems(ownerDocument).filter(item=>isInteractionElementVisible(item));return items.length>0&&!items.some(item=>item.getAttribute("aria-selected")==="true")}function collectionItems(root){let items=Array.from(root.querySelectorAll("[data-notis-collection-item-id], [data-notis-row-id]"));for(let element of Array.from(root.querySelectorAll("*")))element.shadowRoot&&items.push(...collectionItems(element.shadowRoot));return items}function isDialogEvent(event){return event.composedPath().some(target=>target instanceof HTMLElement&&target.matches("dialog.notis-dialog[open]"))}function ShortcutProvider({children,isAvailable}){return useContext(ShortcutContext)?jsx(Fragment,{children}):jsx(ShortcutProviderRoot,{isAvailable,children})}var HELP_SCOPE_LABELS={modal:"Dialog",detail:"Detail",collection:"Collection",route:"This view",app:"App"},HELP_SCOPE_ORDER=["modal","detail","collection","route","app"];function applicableRegistrations(registrations){let ordered=Array.from(registrations).filter(registration=>registration.enabled&®istration.isAvailable?.()!==!1).sort((a,b)=>b.priority-a.priority||b.order-a.order),activeCollectionOwner=getShortcutCollectionState().activeOwnerId;return!!(activeCollectionOwner&&ordered.some(registration=>registration.collectionOwnerId===activeCollectionOwner))?ordered.filter(registration=>!registration.collectionOwnerId||registration.collectionOwnerId===activeCollectionOwner):ordered}var FALLBACK_REGISTRIES_SYMBOL=Symbol.for("notis.sdk.fallback_shortcut_registries");function registerFallbackShortcut(input){let scope=globalThis,registries=scope[FALLBACK_REGISTRIES_SYMBOL]??=new WeakMap,ownerDocument=document,registry=registries.get(ownerDocument);if(!registry){let registrations=new Map;registry={registrations,nextId:1,dispatch:event=>{if(event.defaultPrevented||isDialogEvent(event))return;let editable=isEditableShortcutEvent(event),token=chordToken(eventChord(event));for(let registration of applicableRegistrations(registrations.values()))for(let shortcut of registration.getShortcuts()){if(shortcut.enabled===!1||editable&&!shortcut.allowInEditable||event.repeat&&!shortcut.allowRepeat||isEmptyCollectionClear(shortcut,ownerDocument,event))continue;if(parseShortcut(shortcut).some(candidate=>candidate.sequence.length===1&&chordToken(candidate.sequence[0])===token)){consumeShortcut(event,shortcut);return}}}},registries.set(ownerDocument,registry),ownerDocument.addEventListener("keydown",registry.dispatch,!0)}let id=registry.nextId++;return registry.registrations.set(id,{...input,id,order:id}),()=>{registry.registrations.delete(id),registry.registrations.size===0&&(ownerDocument.removeEventListener("keydown",registry.dispatch,!0),registries.delete(ownerDocument))}}function shortcutToken(raw){let parsed=parseShortcut({id:"",keys:raw,onTrigger:()=>{}})[0];return parsed?parsed.sequence.map(chordToken).join(" "):null}function collectShortcutHelpEntries(registrations){let claimed=new Set,entries=[];for(let registration of applicableRegistrations(registrations))for(let shortcut of registration.getShortcuts()){if(shortcut.enabled===!1||!shortcut.label)continue;let keys=(Array.isArray(shortcut.keys)?shortcut.keys:[shortcut.keys]).filter(value=>{let token=shortcutToken(value);return!token||claimed.has(token)?!1:(claimed.add(token),!0)});keys.length>0&&entries.push({id:shortcut.id,keys,label:shortcut.label,scope:registration.scope})}return entries}function ShortcutProviderRoot({children,isAvailable}){let registrationsRef=useRef(new Map),nextIdRef=useRef(1),nextOrderRef=useRef(1),sequenceRef=useRef({chords:[],at:0}),[helpOpen,setHelpOpen]=useState(!1),helpOpenRef=useRef(!1),[,setRegistryVersion]=useState(0),availabilityRef=useRef(isAvailable),updateHelpOpen=useCallback(open=>{helpOpenRef.current=open,setHelpOpen(open)},[]);useLayoutEffect(()=>{availabilityRef.current=isAvailable,isAvailable?.()===!1&&(sequenceRef.current={chords:[],at:0},updateHelpOpen(!1))},[isAvailable,updateHelpOpen]);let register=useCallback(input=>{let id=nextIdRef.current++;return registrationsRef.current.set(id,{...input,id,order:nextOrderRef.current++}),helpOpenRef.current&&setRegistryVersion(version=>version+1),()=>{registrationsRef.current.delete(id),helpOpenRef.current&&setRegistryVersion(version=>version+1)}},[]);useEffect(()=>{let handleKeyDown=event=>{if(availabilityRef.current?.()===!1){sequenceRef.current={chords:[],at:0};return}if(event.defaultPrevented||isDialogEvent(event))return;let editable=isEditableShortcutEvent(event);if(!editable&&!event.repeat&&event.key==="?"&&!event.metaKey&&!event.ctrlKey&&!event.altKey){event.preventDefault(),event.stopPropagation(),event.stopImmediatePropagation?.(),updateHelpOpen(!helpOpenRef.current);return}if(helpOpenRef.current){event.key==="Escape"&&(event.preventDefault(),event.stopPropagation(),event.stopImmediatePropagation?.(),updateHelpOpen(!1));return}let registrations=applicableRegistrations(registrationsRef.current.values());if(registrations.length===0)return;let token=chordToken(eventChord(event)),now=Date.now();for(let registration of registrations){let candidates=registration.getShortcuts().filter(shortcut=>shortcut.enabled!==!1).filter(shortcut=>!editable||shortcut.allowInEditable).filter(shortcut=>!event.repeat||shortcut.allowRepeat).filter(shortcut=>!isEmptyCollectionClear(shortcut,document,event)).flatMap(parseShortcut);if(candidates.length===0)continue;let previous=now-sequenceRef.current.at<=registration.sequenceTimeoutMs?sequenceRef.current.chords:[],attempts=previous.length>0?[[...previous,token],[token]]:[[token]];for(let attempt of attempts){let matches=candidates.filter(candidate=>matchPrefix(attempt,candidate));if(matches.length===0)continue;let exact=matches.find(candidate=>candidate.sequence.length===attempt.length),hasLonger=matches.some(candidate=>candidate.sequence.length>attempt.length);if(exact&&!hasLonger){sequenceRef.current={chords:[],at:0},consumeShortcut(event,exact.definition);return}sequenceRef.current={chords:attempt,at:now},event.preventDefault();return}}sequenceRef.current={chords:[],at:0}};return document.addEventListener("keydown",handleKeyDown,!0),()=>document.removeEventListener("keydown",handleKeyDown,!0)},[updateHelpOpen]);let registry=useMemo(()=>({register}),[register]),helpEntries=helpOpen?collectShortcutHelpEntries(registrationsRef.current.values()):[];return jsxs(ShortcutContext.Provider,{value:registry,children:[children,helpOpen?jsx(ShortcutHelpDialog,{entries:helpEntries,onClose:()=>updateHelpOpen(!1)}):null]})}function ShortcutHelpDialog({entries,onClose}){let closeRef=useRef(null),previousFocusRef=useRef(typeof document<"u"&&document.activeElement instanceof HTMLElement?document.activeElement:null);useEffect(()=>(closeRef.current?.focus({preventScroll:!0}),()=>previousFocusRef.current?.focus({preventScroll:!0})),[]);let grouped=HELP_SCOPE_ORDER.map(scope=>({scope,entries:entries.filter(entry2=>entry2.scope===scope)})).filter(group=>group.entries.length>0);return jsx("div",{role:"presentation","data-notis-shortcut-help-backdrop":"",onMouseDown:event=>{event.target===event.currentTarget&&onClose()},style:helpBackdropStyle,children:jsxs("section",{role:"dialog","aria-modal":"true","aria-labelledby":"notis-shortcut-help-title","data-notis-shortcut-help":"",onKeyDown:event=>{event.key==="Tab"&&(event.preventDefault(),closeRef.current?.focus({preventScroll:!0}))},style:helpDialogStyle,children:[jsxs("header",{style:helpHeaderStyle,children:[jsxs("div",{children:[jsx("h2",{id:"notis-shortcut-help-title",style:helpTitleStyle,children:"Keyboard shortcuts"}),jsx("p",{style:helpSubtitleStyle,children:"Available in this view"})]}),jsx("button",{ref:closeRef,type:"button","aria-label":"Close keyboard shortcuts",onClick:onClose,style:helpCloseStyle,children:"Esc"})]}),jsxs("div",{style:helpBodyStyle,children:[grouped.map(group=>jsxs("section",{"aria-label":HELP_SCOPE_LABELS[group.scope],children:[jsx("h3",{style:helpGroupTitleStyle,children:HELP_SCOPE_LABELS[group.scope]}),jsx("div",{style:helpListStyle,children:group.entries.map(entry2=>jsxs("div",{style:helpRowStyle,children:[jsx("span",{children:entry2.label}),jsx("span",{style:helpKeysStyle,children:entry2.keys.map(keys=>jsx("kbd",{style:helpKeyStyle,children:shortcutDisplay(keys)},keys))})]},`${group.scope}:${entry2.id}`))})]},group.scope)),jsxs("section",{"aria-label":"Help",children:[jsx("h3",{style:helpGroupTitleStyle,children:"Help"}),jsx("div",{style:helpListStyle,children:jsxs("div",{style:helpRowStyle,children:[jsx("span",{children:"Show keyboard shortcuts"}),jsx("kbd",{style:helpKeyStyle,children:"?"})]})})]})]})]})})}var helpBackdropStyle={position:"fixed",inset:0,zIndex:1e3,display:"grid",placeItems:"center",padding:"1.5rem",background:"rgba(0, 0, 0, 0.42)",backdropFilter:"blur(3px)"},helpDialogStyle={width:"min(34rem, 100%)",maxHeight:"min(42rem, calc(100dvh - 3rem))",overflow:"hidden",border:"1px solid hsl(var(--border))",borderRadius:"0.875rem",background:"hsl(var(--background))",color:"hsl(var(--foreground))",boxShadow:"0 24px 70px rgba(0, 0, 0, 0.28)",fontFamily:"inherit"},helpHeaderStyle={display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"1rem",padding:"1.25rem 1.25rem 1rem",borderBottom:"1px solid hsl(var(--border))"},helpTitleStyle={margin:0,fontSize:"1rem",fontWeight:650},helpSubtitleStyle={margin:"0.2rem 0 0",color:"hsl(var(--muted-foreground))",fontSize:"0.75rem"},helpCloseStyle={border:"1px solid hsl(var(--border))",borderRadius:"0.35rem",background:"hsl(var(--muted))",color:"hsl(var(--muted-foreground))",padding:"0.2rem 0.45rem",cursor:"pointer",font:"inherit",fontSize:"0.7rem"},helpBodyStyle={display:"grid",gap:"1.1rem",maxHeight:"calc(min(42rem, 100dvh - 3rem) - 5rem)",overflowY:"auto",padding:"1rem 1.25rem 1.25rem"},helpGroupTitleStyle={margin:"0 0 0.35rem",color:"hsl(var(--muted-foreground))",fontSize:"0.68rem",fontWeight:650,letterSpacing:"0.06em",textTransform:"uppercase"},helpListStyle={display:"grid"},helpRowStyle={display:"flex",minHeight:"2rem",alignItems:"center",justifyContent:"space-between",gap:"1rem",borderBottom:"1px solid color-mix(in srgb, hsl(var(--border)) 65%, transparent)",fontSize:"0.8rem"},helpKeysStyle={display:"inline-flex",flexWrap:"wrap",justifyContent:"flex-end",gap:"0.3rem"},helpKeyStyle={minWidth:"1.6rem",border:"1px solid hsl(var(--border))",borderBottomWidth:"2px",borderRadius:"0.35rem",background:"hsl(var(--muted))",color:"hsl(var(--foreground))",padding:"0.15rem 0.4rem",textAlign:"center",font:"inherit",fontSize:"0.72rem"};function useShortcuts(shortcuts,options={}){let registry=useContext(ShortcutContext),shortcutsRef=useRef(shortcuts);shortcutsRef.current=shortcuts;let{enabled=!0,scope="route",priority=0,sequenceTimeoutMs=1500,collectionOwnerId,isAvailable}=options,availableRef=useRef(isAvailable);availableRef.current=isAvailable,useEffect(()=>{if(!(!registry||!enabled))return registry.register({enabled,scope,priority:SHORTCUT_SCOPE_PRIORITY[scope]+priority,sequenceTimeoutMs,collectionOwnerId,isAvailable:()=>availableRef.current?.()!==!1,getShortcuts:()=>availableRef.current?.()===!1?[]:shortcutsRef.current})},[collectionOwnerId,enabled,priority,registry,scope,sequenceTimeoutMs]),useEffect(()=>{if(!(registry||!enabled))return registerFallbackShortcut({enabled,scope,priority:SHORTCUT_SCOPE_PRIORITY[scope]+priority,sequenceTimeoutMs,collectionOwnerId,isAvailable:()=>availableRef.current?.()!==!1,getShortcuts:()=>shortcutsRef.current})},[collectionOwnerId,enabled,priority,registry,scope,sequenceTimeoutMs])}function shortcutDisplay(raw){return raw.trim().split(/\s+/).map(chord=>chord.split("+").map(part=>{let lower=part.toLowerCase();return lower==="mod"||lower==="cmd"||lower==="meta"?"\u2318":lower==="ctrl"?"\u2303":lower==="shift"?"\u21E7":lower==="alt"||lower==="option"?"\u2325":lower==="arrowup"||lower==="up"?"\u2191":lower==="arrowdown"||lower==="down"?"\u2193":lower==="arrowleft"||lower==="left"?"\u2190":lower==="arrowright"||lower==="right"?"\u2192":part.length===1?part.toUpperCase():part}).join("")).join(" ")}var copy={en:{bindingUnavailable:"This Space cannot read this database yet.",actionUnavailable:"This action is unavailable in this Space.",readUnavailable:"These data cannot be read in this Space.",schemaChanged:"This database changed. Refresh the page and try again.",responseIncomplete:"This database could not be loaded. Refresh the page and try again.",listUnavailable:"This list is unavailable in this view.",timedOut:"This read took too long. Please retry.",scopeUnavailable:"App query scope is no longer available.",scopeCleared:"App query scope was cleared."},fr:{bindingUnavailable:"Ce Space ne peut pas encore lire cette base de donn\xE9es.",actionUnavailable:"Cette action n\u2019est pas disponible dans ce Space.",readUnavailable:"Ces donn\xE9es ne sont pas accessibles dans ce Space.",schemaChanged:"Cette base de donn\xE9es a chang\xE9. Actualise la page et r\xE9essaie.",responseIncomplete:"Cette base de donn\xE9es n\u2019a pas pu \xEAtre charg\xE9e. Actualise la page et r\xE9essaie.",listUnavailable:"Cette liste n\u2019est pas disponible dans cette vue.",timedOut:"Cette lecture a pris trop de temps. R\xE9essaie.",scopeUnavailable:"Les donn\xE9es de cette vue ne sont plus accessibles.",scopeCleared:"Les donn\xE9es de cette vue ont \xE9t\xE9 r\xE9initialis\xE9es."}},PREFIX="notis_sdk_query:",SdkQueryError=class extends Error{code;diagnostic;constructor(key,diagnostic,locale,cause){super(copy[locale==="fr"?"fr":"en"][key],cause?{cause}:void 0),this.name="SdkQueryError",this.code=PREFIX+key,this.diagnostic=diagnostic}};function localizeQueryError(error,locale){let failure=error;if(!failure||typeof failure.code!="string"||!failure.code.startsWith(PREFIX))return error;let key=failure.code.slice(PREFIX.length);if(!Object.hasOwn(copy.en,key))return error;let message=copy[locale==="fr"?"fr":"en"][key];return failure.message===message?error:new SdkQueryError(key,typeof failure.diagnostic=="string"?failure.diagnostic:void 0,locale,failure)}var SPACE_VIEWER_READ_OPERATIONS=Object.freeze({list_databases:"databases",get_database:"databases",query_database:"databases",list_skills:"skills",get_skill:"skills"}),SPACE_CLOUD_COMPUTER_OPERATIONS=Object.freeze({facts:"read",run:"shell",upload:"shell"});function spaceCloudComputerAllows(level,operation){let needed=SPACE_CLOUD_COMPUTER_OPERATIONS[operation];return level==="shell"||level==="read"&&needed==="read"}var SPACE_VIEW_SPEC_VERSION=2;var SpaceActionError=class extends Error{constructor(message,requestId,receiptId,status,pendingRequestIds,code){super(message);this.requestId=requestId;this.receiptId=receiptId;this.status=status;this.pendingRequestIds=pendingRequestIds;this.code=code;this.name="SpaceActionError"}requestId;receiptId;status;pendingRequestIds;code};var SpaceNavigationCancelled=class extends Error{code="space_navigation_cancelled";constructor(message="This navigation is no longer active."){super(message),this.name="SpaceNavigationCancelled"}};function isSpaceNavigationCancelled(error){return error instanceof Error&&error.name==="SpaceNavigationCancelled"&&error.code==="space_navigation_cancelled"}function spaceQueryKey(runtime,key){if(runtime?.resource?.kind!=="space")return key;let space=runtime.space;if(!space?.cacheScope||space.id!==runtime.resource.id||space.revision!==runtime.resource.revision)throw new Error("The host must provide this Space revision and access context.");return["space",space.id,space.revision,space.cacheScope,...key]}function guardSpaceRuntime(runtime,onProtocolError){if(runtime?.resource?.kind!=="space")return runtime;spaceQueryKey(runtime,[]);let protocolError=(message,key)=>{let error=key?new SdkQueryError(key,message,runtime.context?.locale):new Error(message);return onProtocolError?.(error),error},deny=async()=>{throw protocolError("Use a declared Space action; account-wide tool and backend calls are unavailable.")},callAction=runtime.callAction;if(!callAction)throw new Error("This host needs the current Space action protocol.");let viewerRead=runtime.viewerRead,shown=runtime.shown,cloudComputer=runtime.spaceCloudComputer,cloudLevel=runtime.space.cloudComputer,guardedCloud=operation=>{if(!cloudComputer||!spaceCloudComputerAllows(cloudLevel,operation))throw protocolError(operation==="facts"?"This Space does not use the cloud computer.":"This Space does not declare cloudComputer: shell.");return cloudComputer};return Object.freeze({...runtime,callTool:deny,request:deny,listTools:deny,shown:shown?async function(name,params={},options={}){let list=runtime.space.shows&&Object.hasOwn(runtime.space.shows,name)?runtime.space.shows[name]:null;if(!list||!("database"in list))throw protocolError("This view does not declare that list with a filter.","listUnavailable");return shown(name,params,options)}:void 0,handover:void 0,cloudComputerFacts:cloudComputer&&cloudLevel?async options=>guardedCloud("facts").facts(options):void 0,spaceCloudComputer:cloudComputer&&cloudLevel?Object.freeze({status:()=>cloudComputer.status(),requestApproval:()=>cloudComputer.requestApproval(),facts:async options=>guardedCloud("facts").facts(options),run:async input=>guardedCloud("run").run(input),upload:async input=>guardedCloud("upload").upload(input)}):void 0,viewerRead:viewerRead?async function(operation,input={}){let family=Object.hasOwn(SPACE_VIEWER_READ_OPERATIONS,operation)?SPACE_VIEWER_READ_OPERATIONS[operation]:null;if(!family)throw protocolError("Viewer reads never change data. Choose a supported read.","readUnavailable");if(!runtime.space.viewerReads?.includes(family))throw protocolError(`This Space does not declare viewer reads of ${family}.`,"readUnavailable");return viewerRead(operation,input)}:void 0,async callAction(id,inputs={},options={}){let descriptor=Object.hasOwn(runtime.space.actions,id)?runtime.space.actions[id]:null;if(!descriptor)throw protocolError("This action is not declared by the published Space.",options.readOnly||options.dedupe?"actionUnavailable":void 0);if((options.readOnly||options.dedupe)&&!descriptor.readOnly)throw protocolError("A write action cannot run as a cached read.","readUnavailable");return callAction(id,inputs,options)}})}import{createContext as createContext2,useContext as useContext2,useMemo as useMemo2}from"react";import{jsx as jsx2}from"react/jsx-runtime";var NOTIS_CONTEXT_SYMBOL=Symbol.for("notis.sdk.runtime_context");function getNotisContext(){let scope=globalThis;return scope[NOTIS_CONTEXT_SYMBOL]||(scope[NOTIS_CONTEXT_SYMBOL]=createContext2(null)),scope[NOTIS_CONTEXT_SYMBOL]}var NotisContext=getNotisContext();function NotisProvider({children,runtime,onProtocolError,shortcutsAvailable}){let scopedRuntime=useMemo2(()=>guardSpaceRuntime(runtime,onProtocolError),[runtime,onProtocolError]);if(runtime===void 0)throw new Error("NotisProvider requires an explicit runtime prop.");return jsx2(NotisContext.Provider,{value:scopedRuntime,children:jsx2(ShortcutProvider,{isAvailable:shortcutsAvailable,children})})}function useNotisRuntime(){return useContext2(NotisContext)}function recordKeyOf(item){if(!item||typeof item!="object")return;let record=item,key=record.record_key??record.recordKey;return typeof key=="string"?key:void 0}function withoutRecords(data,hides,removed){let filter=list=>{let kept=list.filter(item=>{let key=recordKeyOf(item);return key===void 0||!hides(key)?!0:(removed.push(key),!1)});return kept.length===list.length?list:kept};if(Array.isArray(data))return filter(data);if(!data||typeof data!="object")return data;let record=data,result=record;for(let field of["rows","documents"]){let list=record[field];if(!Array.isArray(list))continue;let kept=filter(list);kept!==list&&(result={...result,[field]:kept})}return result}var EMPTY=Object.freeze({data:void 0,hasData:!1,isFetching:!1,error:null,updatedAt:0,invalidation:0});function queryKey(value){if(value instanceof Date)return JSON.stringify(value.toISOString());if(Array.isArray(value))return`[${value.map(queryKey).join(",")}]`;if(value&&typeof value=="object"){let record=value;return`{${Object.keys(record).filter(key=>record[key]!==void 0).sort().map(key=>`${JSON.stringify(key)}:${queryKey(record[key])}`).join(",")}}`}return JSON.stringify(value)??"null"}function createPrefetchQueue(concurrency=2){let active=0,waiting=[];function drain(){for(;active<concurrency&&waiting.length;)waiting.shift()()}return read=>new Promise((resolve,reject)=>{waiting.push(()=>{active+=1,Promise.resolve().then(read).then(resolve,reject).finally(()=>{active-=1,drain()})}),drain()})}function createQueryClient(options={}){let entries=new Map,now=options.now??Date.now,maxEntries=options.maxEntries??100,schedule=options.schedule??createPrefetchQueue(2),epoch=0,disposed=!1,revision=0,seq=0,hidden=new Map;function prune(keep){for(let[oldKey,old]of entries){if(entries.size<=maxEntries)break;oldKey!==keep&&!old.listeners.size&&!old.pending&&entries.delete(oldKey)}}function entry2(key){let value=entries.get(key);return value||(value={raw:EMPTY,snapshot:EMPTY,removed:"",dataSeq:0,listeners:new Set,generation:0},entries.set(key,value)),entries.delete(key),entries.set(key,value),prune(key),value}function view(value,rawChanged){let removed=[],data=hidden.size&&value.raw.hasData?withoutRecords(value.raw.data,key=>{if(!hidden.has(key))return!1;let committed=hidden.get(key);return committed==null||value.dataSeq<committed},removed):value.raw.data,signature=removed.sort().join("\0");return!rawChanged&&value.removed===signature?!1:(value.removed=signature,value.snapshot=data===value.raw.data?value.raw:{...value.raw,data},!0)}function publish2(value,raw){value.raw=raw,view(value,!0);for(let listener of value.listeners)listener()}function sweep(){for(let[key,committed]of hidden){if(committed===null)continue;let held=!1;for(let value of entries.values()){if(value.pending&&value.pendingSeq!==void 0&&value.pendingSeq<committed){held=!0;break}if(value.dataSeq>=committed||!value.raw.hasData)continue;let found=[];if(withoutRecords(value.raw.data,candidate=>candidate===key,found),found.length){held=!0;break}}held||hidden.delete(key)}}function refresh(){for(let value of entries.values())if(view(value,!1))for(let listener of value.listeners)listener()}let client={getSnapshot(key){return entries.get(key)?.snapshot??EMPTY},subscribe(key,listener){let value=entry2(key);return value.listeners.add(listener),()=>{value.listeners.delete(listener),prune()}},fetch(key,read,fetchOptions={}){if(disposed)return Promise.reject(new SdkQueryError("scopeUnavailable"));let value=entry2(key);if(value.pending)return value.pending;if(!fetchOptions.force&&value.snapshot.hasData&&value.snapshot.updatedAt>0&&now()-value.snapshot.updatedAt<(fetchOptions.staleTimeMs??3e4))return Promise.resolve(value.snapshot.data);let generation=++value.generation,requestEpoch=epoch,startSeq=++seq,canCommit=()=>epoch===requestEpoch&&value.generation===generation&&entries.get(key)===value,timeout,deadline=new Promise((_,reject)=>{timeout=setTimeout(()=>reject(new SdkQueryError("timedOut")),options.readTimeoutMs??3e4),typeof timeout=="object"&&"unref"in timeout&&timeout.unref()}),request=Promise.race([Promise.resolve().then(read),deadline]).then(data=>(canCommit()&&(value.dataSeq=startSeq,publish2(value,{...value.raw,data,hasData:!0,isFetching:!1,error:null,updatedAt:now()}),hidden.size&&sweep()),data),reason=>{let error=reason instanceof Error?reason:new Error(String(reason));throw canCommit()&&publish2(value,{...value.raw,isFetching:!1,error}),error}).finally(()=>{clearTimeout(timeout),value.pending===request&&(value.pending=void 0,value.pendingSeq=void 0),hidden.size&&sweep(),prune()});return value.pending=request,value.pendingSeq=startSeq,publish2(value,{...value.raw,isFetching:!0,error:null}),request},prefetch(key,read,fetchOptions){let requestEpoch=epoch;return schedule(()=>{if(epoch!==requestEpoch)throw new SdkQueryError("scopeCleared");return client.fetch(key,read,fetchOptions)})},getRevision:()=>revision,invalidate(key){revision+=1;for(let[entryKey,value]of entries)key!==void 0&&entryKey!==key||(value.generation+=1,value.pending=void 0,value.pendingSeq=void 0,publish2(value,{...value.raw,updatedAt:0,isFetching:!1,invalidation:value.raw.invalidation+1}))},dispose(){disposed=!0,client.clear()},clear(){revision+=1,epoch+=1;for(let value of entries.values())value.generation+=1,value.pending=void 0,value.pendingSeq=void 0,value.dataSeq=0,publish2(value,{...EMPTY,invalidation:value.raw.invalidation+1});for(let[key,value]of entries)value.listeners.size||entries.delete(key);sweep()},hideRecords(recordKeys){let own=[...new Set(recordKeys.filter(key=>typeof key=="string"&&key))];for(let key of own)hidden.set(key,null);refresh();let pick2=keys=>keys?own.filter(key=>keys.includes(key)):own;return{commit(keys){let at=++seq;for(let key of pick2(keys))hidden.get(key)===null&&hidden.set(key,at);sweep(),refresh()},restore(keys){for(let key of pick2(keys))hidden.delete(key);refresh()}}}};return client}import{useCallback as useCallback2,useEffect as useEffect2,useLayoutEffect as useLayoutEffect2,useMemo as useMemo3,useRef as useRef2,useSyncExternalStore}from"react";function useQuery(key,read,options){let runtime=useNotisRuntime(),fallback=useMemo3(()=>createQueryClient(),[runtime]),client=runtime?.queryClient??fallback,cacheKey=queryKey(spaceQueryKey(runtime,key)),enabled=!!runtime&&options.enabled!==!1&&options.readOnly===!0,readRef=useRef2(read);useLayoutEffect2(()=>{readRef.current=read});let subscribe=useCallback2(listener=>enabled?client.subscribe(cacheKey,listener):()=>{},[cacheKey,client,enabled]),snapshot=useSyncExternalStore(subscribe,()=>client.getSnapshot(cacheKey),()=>client.getSnapshot(cacheKey)),fetch=useCallback2(()=>{let capturedRead=readRef.current;return client.fetch(cacheKey,capturedRead,{staleTimeMs:options.staleTimeMs})},[cacheKey,client,options.staleTimeMs]);useEffect2(()=>{enabled&&fetch().catch(()=>{})},[enabled,fetch,snapshot.invalidation]);let locale=runtime?.context?.locale,refetch=useCallback2(async()=>{if(!enabled)return null;client.invalidate(cacheKey);try{return await fetch(),null}catch(failure){return localizeQueryError(failure instanceof Error?failure:new Error(String(failure)),locale)}},[cacheKey,client,enabled,fetch,locale]),error=useMemo3(()=>localizeQueryError(snapshot.error,runtime?.context?.locale),[snapshot.error,runtime?.context?.locale]);return{data:enabled?snapshot.data:void 0,hasData:enabled&&snapshot.hasData,loading:enabled&&!snapshot.hasData&&!snapshot.error,isFetching:enabled&&snapshot.isFetching,error:enabled?error:null,refetch}}function useQueryClient(){let runtime=useNotisRuntime();return useMemo3(()=>({invalidate:key=>runtime?.queryClient?.invalidate(key?queryKey(spaceQueryKey(runtime,key)):void 0),prefetch:(key,read,options)=>!runtime?.queryClient||options.enabled===!1||options.readOnly!==!0?Promise.resolve(void 0):runtime.queryClient.prefetch(queryKey(spaceQueryKey(runtime,key)),read,{staleTimeMs:options.staleTimeMs})}),[runtime])}var SCOPE_ORDER=Object.freeze({app:0,route:100,collection:200,detail:300,modal:400}),SCOPES=Object.freeze(["app","route","collection","detail","modal"]);function isWords(value){return!!value&&typeof value=="object"&&typeof value.en=="string"&&typeof value.fr=="string"}function pick(words,locale){return typeof words=="string"?words:locale==="fr"?words.fr:words.en}function interpolate(template,vars){return template.replace(/\{(\w+)\}/g,(whole,name)=>Object.prototype.hasOwnProperty.call(vars,name)?String(vars[name]):whole)}function fillWords(words,vars){return{en:interpolate(words.en,vars),fr:interpolate(words.fr,vars)}}function w(en,fr){return{en,fr}}var NNBSP="\u202F";function labelValue(label,value,locale){return locale==="fr"?`${label}${NNBSP}: ${value}`:`${label}: ${value}`}var DOCUMENT_WORDS=Object.freeze({untitled:{en:"Untitled",fr:"Sans titre"}});function isPresentString(value){return typeof value=="string"&&value.trim().length>0}function asRecord(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function optionalString(value){return isPresentString(value)?value.trim():null}function extractRichText(value){return typeof value=="string"?value:Array.isArray(value)?value.map(item=>{let record=asRecord(item),text=asRecord(record?.text);return optionalString(text?.content)??optionalString(record?.plain_text)??""}).join(""):""}function getSecretValue(value){let record=asRecord(value),metadata=asRecord(record?.metadata);return{present:record?.present===!0,reference:optionalString(record?.reference),status:optionalString(record?.status),metadata}}function getRelationIds(value){return Array.isArray(value)?value.filter(item=>isPresentString(item)):[]}function normalizePropertyValue(value){let record=asRecord(value);if(!record)return value;let type=optionalString(record.type);return type?type==="title"?extractRichText(record.title):type==="rich_text"?extractRichText(record.rich_text):type==="select"||type==="status"?optionalString(asRecord(record[type])?.name)??record[type]??null:type==="multi_select"?(Array.isArray(record.multi_select)?record.multi_select:[]).map(item=>optionalString(asRecord(item)?.name)??item).filter(Boolean):type==="relation"?(Array.isArray(record.relation)?record.relation:[]).map(item=>optionalString(asRecord(item)?.id)??item).filter(Boolean):type==="date"?optionalString(asRecord(record.date)?.start)??record.date??null:type==="secret"?getSecretValue(record):type in record?record[type]:value:value}function normalizeContentType(value){return value==="markdown"||value==="file"||value==="view"?value:null}function normalizeDocumentRecord(value,options={}){let record=asRecord(value)??{},rawProperties=asRecord(record.properties)??{},properties={};for(let[key,propertyValue]of Object.entries(rawProperties))properties[key]=normalizePropertyValue(propertyValue);return{id:optionalString(record.id)??"",recordKey:optionalString(record.recordKey)??optionalString(record.record_key)??void 0,revision:typeof record.revision=="number"?record.revision:void 0,title:optionalString(record.title)??pick(DOCUMENT_WORDS.untitled,options.locale??"en"),url:optionalString(record.url),properties,icon:optionalString(record.icon),cover:optionalString(record.cover),databaseSlug:optionalString(record.databaseSlug)??optionalString(record.database_slug)??void 0,contentType:normalizeContentType(record.contentType??record.content_type),fileType:optionalString(record.fileType)??optionalString(record.file_type),contentBlocknote:Array.isArray(record.contentBlocknote)?record.contentBlocknote:Array.isArray(record.content_blocknote)?record.content_blocknote:null,contentMarkdown:optionalString(record.contentMarkdown)??optionalString(record.content_markdown),plainText:optionalString(record.plainText)??optionalString(record.plain_text),viewType:optionalString(record.viewType)??optionalString(record.view_type),viewState:asRecord(record.viewState)??asRecord(record.view_state),viewRevision:typeof(record.viewRevision??record.view_revision)=="number"?Number(record.viewRevision??record.view_revision):null,createdAt:optionalString(record.createdAt)??optionalString(record.created_at)??optionalString(record.created_time),lastEditedTime:optionalString(record.lastEditedTime)??optionalString(record.last_edited_time)??optionalString(record.updated_at)}}function normalizeDatabaseProperty(value){let record=asRecord(value),name=optionalString(record?.name);if(!record||!name)return null;let options=(Array.isArray(record.options)?record.options:[]).flatMap(option=>{let optionRecord=asRecord(option),optionName=optionalString(optionRecord?.name);return!optionRecord||!optionName?[]:[{id:optionalString(optionRecord.id),name:optionName,color:optionalString(optionRecord.color),order:typeof optionRecord.order=="number"?optionRecord.order:void 0}]});return{id:optionalString(record.id),name,type:optionalString(record.type)??"rich_text",description:optionalString(record.description),options}}function markdownToPlainText(markdown){return markdown.replace(/```[^\n]*\n?/g,"").replace(/!\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/<[^>]+>/g," ").replace(/^\s{0,3}(#{1,6}\s+|>\s?|[-*+]\s+(\[[ xX]\]\s+)?|\d+\.\s+)/gm,"").replace(/(\*\*|__|[*_~`])/g,"").replace(/^\s*\|?[-:| ]+\|?\s*$/gm,"").replace(/\|/g," ").replace(/^\s*([-*_]\s*){3,}$/gm,"").replace(/\s+/g," ").trim()}function blockNoteToPlainText(blocks){let segments=[];function visit(node){if(typeof node=="string"){node.trim()&&segments.push(node.trim());return}if(Array.isArray(node)){node.forEach(visit);return}let record=asRecord(node);record&&(typeof record.text=="string"&&record.text.trim()&&segments.push(record.text.trim()),visit(record.content),visit(record.children))}return visit(blocks),segments.join(" ").replace(/\s+/g," ").trim()}function getDocumentPreview(document2,options={}){if(isPresentString(document2.plainText))return document2.plainText.replace(/\s+/g," ").trim();if(isPresentString(document2.contentMarkdown))return markdownToPlainText(document2.contentMarkdown);let fromBlocks=blockNoteToPlainText(document2.contentBlocknote);return fromBlocks||(isPresentString(document2.title)?document2.title:pick(DOCUMENT_WORDS.untitled,options.locale??"en"))}import{useCallback as useCallback3,useEffect as useEffect3,useState as useState2}from"react";function actionFor(runtime,binding,operation){let descriptor=runtime?.space?.bindings[binding],action=descriptor?.kind==="database"?descriptor.operations?.[operation]:void 0;if(runtime?.resource?.kind!=="space"||!runtime.callAction||!action){let diagnostic=`This Space does not expose ${operation} for database binding "${binding}".`;throw operation==="query"?new SdkQueryError("bindingUnavailable",diagnostic):new Error(`This Space does not expose ${operation} for that database binding.`)}return action}function useNativeDocuments(binding,options={}){let runtime=useNotisRuntime(),[live,setLive]=useState2(!1),follow=options.subscribe===!0&&options.enabled!==!1;useEffect3(()=>{if(!follow||!runtime?.subscribeDatabase){setLive(!1);return}let cancelled=!1,stop=runtime.subscribeDatabase(binding,()=>{},{onStatusChange:value=>{cancelled||setLive(value)}});return()=>{cancelled=!0,setLive(!1),stop?.()}},[runtime,binding,follow]);let locale=runtime?.context?.locale==="fr"?"fr":"en",query=useQuery(["native-documents",binding,options.query??{},!!options.fetchAll,locale],async()=>{let action=actionFor(runtime,binding,"query");if(options.query?.mode&&!["rows","search"].includes(options.query.mode))throw new Error("Use useActionQuery for counts and aggregates.");let rows=[],offset=options.query?.offset??0,revision;for(;;){let result=await runtime.callAction(action,{request:{...options.query,offset}},{readOnly:!0,dedupe:!0,schemaRevision:revision});if(!result||!Array.isArray(result.rows)||!Number.isSafeInteger(result.schema_revision))throw new SdkQueryError("responseIncomplete","Native query must return rows and a safe integer schema_revision.");if(revision!==void 0&&revision!==result.schema_revision)throw new SdkQueryError("schemaChanged");if(revision=result.schema_revision,rows.push(...result.rows),!options.fetchAll||!result.has_more)break;if(typeof result.next_offset!="number"||result.next_offset<=offset)throw new SdkQueryError("responseIncomplete","Native query pagination did not advance next_offset.");offset=result.next_offset}return{documents:rows.map(row=>normalizeDocumentRecord(row,{locale})),schemaRevision:revision}},{readOnly:!0,enabled:options.enabled,staleTimeMs:options.staleTimeMs});return{...query,documents:query.data?.documents??EMPTY_DOCUMENTS,schemaRevision:query.data?.schemaRevision,live}}function useNativeMutation(binding,operation){let runtime=useNotisRuntime(),[pending,setPending]=useState2(0),[error,setError]=useState2(null);return{mutate:useCallback3(async(input,options)=>{let action=actionFor(runtime,binding,operation);setPending(value=>value+1),setError(null);let key=operation==="delete"&&typeof input.record_key=="string"?input.record_key:null,hidden=key?runtime?.queryClient?.hideRecords?.([key]):void 0;try{let receipt=await runtime.callAction(action,{request:input},options);return hidden?.commit(),receipt}catch(cause){hidden?.restore();let failure=cause instanceof Error?cause:new Error(String(cause));throw setError(failure),failure}finally{setPending(value=>value-1)}},[runtime,binding,operation]),loading:pending>0,error}}function useNativeDelete(binding){let runtime=useNotisRuntime(),[pending,setPending]=useState2(0),[error,setError]=useState2(null);return{deleteMany:useCallback3(async(inputs,options)=>{let action=actionFor(runtime,binding,"delete"),result={done:[],failed:[]};if(!inputs.length)return result;setPending(value=>value+1),setError(null);let hidden=runtime?.queryClient?.hideRecords?.(inputs.map(input=>input.record_key)),next=0,worker=async()=>{for(;next<inputs.length;){let input=inputs[next++];try{await runtime.callAction(action,{request:input},{schemaRevision:options.schemaRevision,requestId:`${options.requestId}:${input.record_key}`,deferRefresh:!0}),result.done.push(input)}catch(cause){result.failed.push({input,error:cause instanceof Error?cause:new Error(String(cause))})}}};try{await Promise.all(Array.from({length:Math.min(DELETE_CONCURRENCY,inputs.length)},worker))}finally{hidden?.commit(result.done.map(input=>input.record_key)),hidden?.restore(result.failed.map(item=>item.input.record_key)),runtime?.queryClient?.invalidate(),result.failed.length&&setError(result.failed[0].error),setPending(value=>value-1)}return result},[runtime,binding]),loading:pending>0,error}}var DELETE_CONCURRENCY=4,EMPTY_DOCUMENTS=[];var VIEW_PERIODS=["today","tomorrow","this_week","last_week","this_month","last_month"];function isViewDate(value){if(!/^\d{4}-\d{2}-\d{2}$/.test(value)||value.startsWith("0000-"))return!1;let parsed=new Date(`${value}T00:00:00Z`);return Number.isFinite(parsed.getTime())&&parsed.toISOString().slice(0,10)===value}function isViewPeriod(value){if(VIEW_PERIODS.includes(value))return!0;let parts=value.split("/");return parts.length===2&&parts.every(isViewDate)&&parts[0]<=parts[1]}function resolveViewPeriod(value,timeZone="UTC",now=new Date){if(!isViewPeriod(value))throw new Error("Invalid view period");if(value.includes("/")){let[start2,end2]=value.split("/");return{start:start2,end:end2}}let parts=new Intl.DateTimeFormat("en-US",{timeZone,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(now),get=type=>parts.find(part=>part.type===type).value,start=new Date(`${get("year")}-${get("month")}-${get("day")}T00:00:00Z`);value==="tomorrow"&&start.setUTCDate(start.getUTCDate()+1),value.endsWith("week")&&start.setUTCDate(start.getUTCDate()-(start.getUTCDay()+6)%7-(value==="last_week"?7:0)),value.endsWith("month")&&(start.setUTCDate(1),value==="last_month"&&start.setUTCMonth(start.getUTCMonth()-1));let end=new Date(start);return value.endsWith("week")&&end.setUTCDate(end.getUTCDate()+6),value.endsWith("month")&&(end.setUTCMonth(end.getUTCMonth()+1),end.setUTCDate(0)),{start:start.toISOString().slice(0,10),end:end.toISOString().slice(0,10)}}import{useCallback as useCallback4,useMemo as useMemo4}from"react";var RECORD_KEY=/^(?:[0-9a-f]{32}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i,NUMBER=/^-?\d+(?:\.\d+)?$/,CONTROL=/[\u0000-\u001f\u007f]/;function parseValue(declaration,raw){switch(declaration.type){case"text":return raw.length<=500&&!CONTROL.test(raw)?raw:void 0;case"enum":return declaration.values?.includes(raw)?raw:void 0;case"number":{let value=Number(raw);return NUMBER.test(raw)&&Number.isFinite(value)?value:void 0}case"boolean":return raw==="true"?!0:raw==="false"?!1:void 0;case"date":return["today","tomorrow"].includes(raw)||isViewDate(raw)?raw:void 0;case"period":return isViewPeriod(raw)?raw:void 0;case"record":{if(!RECORD_KEY.test(raw))return;let hex=raw.replaceAll("-","").toLowerCase();return`${hex.slice(0,8)}-${hex.slice(8,12)}-${hex.slice(12,16)}-${hex.slice(16,20)}-${hex.slice(20)}`}default:return}}function parseViewParams(declared,raw){let params={},invalid=[],missing=[];for(let[name,declaration]of Object.entries(declared||{})){let value=raw&&Object.hasOwn(raw,name)&&typeof raw[name]=="string"&&raw[name]!==""?raw[name]:void 0,parsed=value===void 0?void 0:parseValue(declaration,value);value!==void 0&&parsed===void 0&&invalid.push(name),parsed!==void 0?params[name]=parsed:declaration.default!==void 0?params[name]=declaration.default:declaration.required&&missing.push(name)}return{params,invalid,missing}}var pendingWrites=new WeakMap;function writeViewParams(runtime,changes,options={}){if(runtime?.resource?.kind!=="space"||typeof runtime.navigate!="function")return Promise.reject(new Error("Open this Space in a current Notis host to change its params."));let current=runtime.context?.params??null,pending=pendingWrites.get(runtime),next={...pending&&pending.base===current?pending.params:current??{}};for(let[name,value]of Object.entries(changes))value==null?delete next[name]:next[name]=String(value);pendingWrites.set(runtime,{base:current,params:next});let forget=error=>{throw pendingWrites.get(runtime)?.params===next&&pendingWrites.delete(runtime),error};try{return Promise.resolve(runtime.navigate({kind:"view-params",params:next,...options.replace?{replace:!0}:{}})).then(()=>{},forget)}catch(error){return Promise.reject(error).catch(forget)}}function useViewParams(){let runtime=useNotisRuntime(),declared=runtime?.space?.params,raw=runtime?.context?.params,setParams=useCallback4((changes,options)=>writeViewParams(runtime,changes,options),[runtime]);return useMemo4(()=>({...parseViewParams(declared,raw),declared:declared||{},ready:runtime!==null,setParams}),[declared,raw,runtime,setParams])}var SHOWN_ALL_PAGES_MAX=50,SHOWN_ALL_PAGES_SIZE=200;function useShownAvailable(name){let runtime=useNotisRuntime(),list=runtime?.space?.shows&&Object.hasOwn(runtime.space.shows,name)?runtime.space.shows[name]:null;return runtime?.resource?.kind==="space"&&typeof runtime.shown=="function"&&!!(list&&"database"in list)}function useShown(name,options={}){let runtime=useNotisRuntime(),available=useShownAvailable(name),{params,missing}=useViewParams(),{sorts,pageSize,offset,includeContent,allPages=!1}=options,list=runtime?.space?.shows&&Object.hasOwn(runtime.space.shows,name)?runtime.space.shows[name]:null,reads=list&&"database"in list&&Array.isArray(list.params)?list.params:null,keyed=useMemo4(()=>reads?Object.fromEntries(Object.entries(params).filter(([param])=>reads.includes(param))):params,[params,reads]),result=useQuery(["shown",name,keyed,sorts??null,pageSize??null,offset??null,includeContent??!1,allPages],async()=>{if(!runtime?.shown)throw new SdkQueryError("listUnavailable");if(!allPages)return runtime.shown(name,params,{sorts,pageSize,offset,includeContent});let size=pageSize??SHOWN_ALL_PAGES_SIZE,first=null,rows=[];for(let page=0;page<SHOWN_ALL_PAGES_MAX;page+=1){let answer=await runtime.shown(name,params,{sorts,pageSize:size,offset:(offset??0)+page*size,includeContent});first??=answer;let pageRows=Array.isArray(answer?.rows)?answer.rows:[];if(rows.push(...pageRows),pageRows.length<size)break}return{...first,rows}},{readOnly:!0,enabled:available&&!missing.length&&options.enabled!==!1,staleTimeMs:options.staleTimeMs}),unavailable=runtime!==null&&!available&&options.enabled!==!1,error=useMemo4(()=>unavailable?new SdkQueryError("listUnavailable",`The list "${name}" is unavailable in this view: declare it in \`shows\` with a database, or gate it on useShownAvailable("${name}").`,runtime?.context?.locale):null,[unavailable,name,runtime?.context?.locale]);return unavailable?{...result,loading:!1,isFetching:!1,error}:result}import{useCallback as useCallback5,useEffect as useEffect4,useLayoutEffect as useLayoutEffect3,useRef as useRef3}from"react";var MAX_UNSHOWN=64;function useTopBarSearch(opts){let runtime=useNotisRuntime(),{value,onChange,placeholder,onSubmit}=opts,callbacks=useRef3({onChange,onSubmit});useLayoutEffect3(()=>{callbacks.current={onChange,onSubmit}});let fromBar=useRef3([]),hasSubmit=!!onSubmit;return useEffect4(()=>{let register=runtime?.registerTopBarSearch;if(register)return register({onChange:next=>{let sent=fromBar.current;sent.push(next),sent.length>MAX_UNSHOWN&&sent.splice(0,sent.length-MAX_UNSHOWN),callbacks.current.onChange(next)},placeholder,onSubmit:hasSubmit?()=>callbacks.current.onSubmit?.():void 0}),()=>{register(null)}},[runtime,placeholder,hasSubmit]),useLayoutEffect3(()=>{let sent=fromBar.current;if(sent.length&&value===sent[sent.length-1]){sent.length=0;return}let shown=sent.indexOf(value);if(shown>=0){sent.splice(0,shown+1);return}sent.length=0,runtime?.setTopBarSearchValue?.(value)},[runtime,value]),{setLoading:useCallback5(loading=>{runtime?.setTopBarSearchLoading?.(loading)},[runtime])}}import{useEffect as useEffect5,useRef as useRef4}from"react";var ownersBySetter=new WeakMap;function publish(set,entry2){let top=entry2.owners.length?entry2.owners[entry2.owners.length-1]:null,sent=entry2.sent;if(top===sent||top&&sent&&top.label===sent.label&&top.hasBack===sent.hasBack&&top.recordKey===sent.recordKey){entry2.sent=top;return}entry2.sent=top,set(top?{label:top.label,...top.hasBack?{onBack:entry2.back}:{},...top.recordKey?{recordKey:top.recordKey}:{}}:null)}function useTopBarTitleLeaf(label,onBack,options){let runtime=useNotisRuntime(),leaf=label?.trim()||null,back=useRef4(onBack);back.current=onBack;let hasBack=!!onBack,recordKey=options?.recordKey?.trim()||null;useEffect5(()=>{let set=runtime?.setTopBarTitleLeaf;if(!set||!leaf)return;let entry2=ownersBySetter.get(set);if(!entry2){let created={owners:[],sent:null,back:()=>created.sent?.back.current?.()};entry2=created,ownersBySetter.set(set,entry2)}let owner={label:leaf,back,hasBack,recordKey};return entry2.owners.push(owner),publish(set,entry2),()=>{let current=ownersBySetter.get(set);current&&(current.owners=current.owners.filter(item=>item!==owner),publish(set,current))}},[runtime,leaf,hasBack,recordKey])}import{jsx as jsx3,jsxs as jsxs2}from"react/jsx-runtime";var S={fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"},F={fill:"currentColor",stroke:"none"},SHAPES={"arrow-left":jsx3("path",{...S,d:"M13 8H3m4-4L3 8l4 4"}),x:jsx3("path",{...S,d:"M4 4l8 8M12 4l-8 8"}),"caret-up":jsx3("path",{...S,d:"M4 10l4-4 4 4"}),"caret-down":jsx3("path",{...S,d:"M4 6l4 4 4-4"}),"caret-right":jsx3("path",{...S,d:"M6 4l4 4-4 4"}),"caret-left":jsx3("path",{...S,d:"M10 4L6 8l4 4"}),"arrows-out":jsx3("path",{...S,d:"M9.5 2.5h4v4M13.5 2.5L9 7M6.5 13.5h-4v-4M2.5 13.5L7 9"}),"dots-three":jsxs2("g",{...F,children:[jsx3("circle",{cx:"3.5",cy:"8",r:"1.25"}),jsx3("circle",{cx:"8",cy:"8",r:"1.25"}),jsx3("circle",{cx:"12.5",cy:"8",r:"1.25"})]}),"sidebar-simple":jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3",width:"12",height:"10",rx:"1.5"}),jsx3("path",{d:"M9.5 3v10"})]}),"square-center":jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3",width:"12",height:"10",rx:"1.5"}),jsx3("rect",{x:"5",y:"5.5",width:"6",height:"5",rx:".75"})]}),"corners-out":jsx3("path",{...S,d:"M2.5 6V2.5H6M10 2.5h3.5V6M13.5 10v3.5H10M6 13.5H2.5V10"}),check:jsx3("path",{...S,d:"M3 8.5l3 3 7-7"}),archive:jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3",width:"12",height:"3",rx:".75"}),jsx3("path",{d:"M3 6v6.5a.5.5 0 00.5.5h9a.5.5 0 00.5-.5V6M6.5 8.5h3"})]}),"tray-arrow-up":jsx3("path",{...S,d:"M2.5 9.5v3a.5.5 0 00.5.5h10a.5.5 0 00.5-.5v-3h-3l-1 1.5h-3l-1-1.5h-3M8 8V2.5M5.5 5L8 2.5 10.5 5"}),star:jsx3("path",{...S,d:"M8 2l1.8 3.8 4.2.5-3.1 2.9.8 4.1L8 11.3l-3.7 2 .8-4.1L2 6.3l4.2-.5z"}),"star-fill":jsx3("path",{fill:"currentColor",stroke:"currentColor",strokeWidth:.8,strokeLinejoin:"round",d:"M8 1.6l1.95 3.95 4.36.64-3.16 3.07.75 4.34L8 11.55 4.1 13.6l.75-4.34L1.69 6.19l4.36-.64z"}),clock:jsxs2("g",{...S,children:[jsx3("circle",{cx:"8",cy:"8",r:"6"}),jsx3("path",{d:"M8 4.5V8h3"})]}),"arrow-bend-up-right":jsx3("path",{...S,d:"M10 3l3 3-3 3M13 6H7a4 4 0 00-4 4v3"}),"user-plus":jsxs2("g",{...S,children:[jsx3("circle",{cx:"6.5",cy:"5.5",r:"2.75"}),jsx3("path",{d:"M1.5 13.5c.8-2.2 2.7-3.5 5-3.5s4.2 1.3 5 3.5M12.5 4v4M10.5 6h4"})]}),"envelope-open":jsx3("path",{...S,d:"M2 6.5v6a.5.5 0 00.5.5h11a.5.5 0 00.5-.5v-6L8 2.5zM2 6.5l6 4 6-4"}),"envelope-simple":jsxs2("g",{...S,children:[jsx3("rect",{x:"2",y:"3.5",width:"12",height:"9",rx:"1"}),jsx3("path",{d:"M2 4.5l6 4.5 6-4.5"})]}),"pencil-simple":jsx3("path",{...S,d:"M10.8 2.7l2.5 2.5L5.6 12.9 2.5 13.5l.6-3.1zM9.3 4.2l2.5 2.5"}),"file-text":jsx3("path",{...S,d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3M6 8.5h4M6 11h4"}),flask:jsx3("path",{...S,d:"M6 2h4M6.8 2v4.3l-3.6 6.2a1 1 0 00.9 1.5h7.8a1 1 0 00.9-1.5L9.2 6.3V2M4.6 10.2h6.8"}),copy:jsx3("path",{...S,d:"M6.5 5.5h5a1 1 0 011 1v5a1 1 0 01-1 1h-5a1 1 0 01-1-1v-5a1 1 0 011-1zM10.5 5.5v-1a1 1 0 00-1-1h-5a1 1 0 00-1 1v5a1 1 0 001 1h1"}),"chat-circle-text":jsx3("path",{...S,d:"M4.7 13.1A5.8 5.8 0 102.9 11.3L2.3 13.7zM6 7h4M6 9.3h3"}),trash:jsx3("path",{...S,d:"M2.5 4h11M6.5 2.5h3M4 4l.6 9a.5.5 0 00.5.5h5.8a.5.5 0 00.5-.5L12 4M6.5 6.5v4.5M9.5 6.5v4.5"}),"circle-half":jsxs2("g",{children:[jsx3("circle",{...S,cx:"8",cy:"8",r:"6"}),jsx3("path",{...F,d:"M8 2a6 6 0 010 12z"})]}),"circle-three-quarter":jsxs2("g",{children:[jsx3("circle",{...S,cx:"8",cy:"8",r:"6"}),jsx3("path",{...F,d:"M8 8V2a6 6 0 11-6 6z"})]}),pause:jsx3("path",{...S,d:"M5.5 3v10M10.5 3v10"}),play:jsx3("path",{...S,d:"M4.5 2.5v11L13 8z"}),"toggle-right":jsxs2("g",{...S,children:[jsx3("rect",{x:"1.5",y:"4",width:"13",height:"8",rx:"4"}),jsx3("circle",{cx:"10.5",cy:"8",r:"2"})]}),"toggle-left":jsxs2("g",{...S,children:[jsx3("rect",{x:"1.5",y:"4",width:"13",height:"8",rx:"4"}),jsx3("circle",{cx:"5.5",cy:"8",r:"2"})]}),hourglass:jsx3("path",{...S,d:"M4 2.5h8M4 13.5h8M5 2.5c0 3 6 3.5 6 5.5s-6 2.5-6 5.5M11 2.5c0 3-6 3.5-6 5.5s6 2.5 6 5.5"}),"arrow-counter-clockwise":jsx3("path",{...S,d:"M4.5 6H2V3.5M2.3 6A6 6 0 112 9"}),"arrow-clockwise":jsx3("path",{...S,d:"M11.5 6H14V3.5M13.7 6A6 6 0 1 0 14 9"}),"arrows-clockwise":jsx3("path",{...S,d:"M3 6a5.4 5.4 0 0110 0M13 3v3h-3M13 10a5.4 5.4 0 01-10 0M3 13v-3h3"}),plus:jsx3("path",{...S,d:"M8 3v10M3 8h10"}),"circle-dashed":jsx3("circle",{...S,cx:"8",cy:"8",r:"6",strokeDasharray:"2.2 2.2"}),circle:jsx3("circle",{...S,cx:"8",cy:"8",r:"6"}),"clock-countdown":jsxs2("g",{...S,children:[jsx3("path",{d:"M8 2a6 6 0 11-6 6",strokeDasharray:"0"}),jsx3("path",{d:"M8 5v3l2 1.5M2.6 5.3l.1-.1M4.6 3.1l.1-.1"})]}),"check-circle-fill":jsxs2("g",{children:[jsx3("circle",{...F,cx:"8",cy:"8",r:"6.5"}),jsx3("path",{d:"M5 8.2l2 2 4-4",fill:"none",stroke:"hsl(var(--background))",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),"minus-circle":jsxs2("g",{...S,children:[jsx3("circle",{cx:"8",cy:"8",r:"6"}),jsx3("path",{d:"M5.5 8h5"})]}),"paper-plane-right":jsx3("path",{...S,d:"M2.5 2.8l11 5.2-11 5.2 1.8-5.2zM4.3 8h4.7"}),paperclip:jsx3("path",{...S,d:"M10.5 5l-4.6 4.6a1.1 1.1 0 001.6 1.6l5-5a2.3 2.3 0 00-3.2-3.2l-5 5a3.4 3.4 0 004.8 4.8L13 8.9"}),"clipboard-text":jsxs2("g",{...S,children:[jsx3("path",{d:"M10.5 3h2a.5.5 0 01.5.5v10a.5.5 0 01-.5.5h-9a.5.5 0 01-.5-.5v-10a.5.5 0 01.5-.5h2"}),jsx3("rect",{x:"5.5",y:"2",width:"5",height:"2.5",rx:".75"}),jsx3("path",{d:"M6 8h4M6 10.5h4"})]}),"x-circle-fill":jsxs2("g",{children:[jsx3("circle",{...F,cx:"8",cy:"8",r:"6.5"}),jsx3("path",{d:"M5.8 5.8l4.4 4.4M10.2 5.8l-4.4 4.4",fill:"none",stroke:"hsl(var(--background))",strokeWidth:1.5,strokeLinecap:"round"})]}),"magnifying-glass-plus":jsx3("path",{...S,d:"M7 12A5 5 0 107 2a5 5 0 000 10zM10.6 10.6L14 14M5 7h4M7 5v4"}),"magnifying-glass-minus":jsx3("path",{...S,d:"M7 12A5 5 0 107 2a5 5 0 000 10zM10.6 10.6L14 14M5 7h4"}),"download-simple":jsx3("path",{...S,d:"M8 2.5v7.5M4.5 6.5L8 10l3.5-3.5M2.5 10v3a.5.5 0 00.5.5h10a.5.5 0 00.5-.5v-3"}),link:jsx3("path",{...S,d:"M6.8 9.2l2.4-2.4M7.6 4.6l1.2-1.2a2.8 2.8 0 014 4l-1.2 1.2M8.4 11.4l-1.2 1.2a2.8 2.8 0 01-4-4l1.2-1.2"}),file:jsx3("path",{...S,d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),"file-image":jsxs2("g",{...S,children:[jsx3("path",{d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),jsx3("path",{d:"M3.5 12l3-3 2 2 1.5-1.5 2.5 2.5"}),jsx3("circle",{cx:"6.5",cy:"6.75",r:".75"})]}),"file-video":jsxs2("g",{...S,children:[jsx3("path",{d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),jsx3("path",{d:"M6.5 8v3.5L9.5 9.75z"})]}),"file-audio":jsxs2("g",{...S,children:[jsx3("path",{d:"M9.5 2H4a.5.5 0 00-.5.5v11a.5.5 0 00.5.5h8a.5.5 0 00.5-.5V5zM9.5 2v3h3"}),jsx3("path",{d:"M6 9.5v1.5h1.25L9 12.25v-4.5L7.25 9H6M10.5 8.5a1.8 1.8 0 010 2.5"})]})};function hasIcon(name){return Object.prototype.hasOwnProperty.call(SHAPES,name)}function Icon({name,className}){let shape=SHAPES[name];return shape?jsx3("svg",{className:className?`nui-icon ${className}`:"nui-icon",viewBox:"0 0 16 16","aria-hidden":"true",focusable:"false",children:shape}):null}function renderIcon(icon,className){return icon==null||icon===!1?null:typeof icon=="string"?jsx3(Icon,{name:icon,className}):icon}import{Fragment as Fragment2,jsx as jsx4,jsxs as jsxs3}from"react/jsx-runtime";function RenderChartData({title,columns,rows,children}){return jsxs3(Fragment2,{children:[children,jsxs3("table",{hidden:!0,"data-notis-render":"chart-data","aria-label":title,children:[jsx4("thead",{children:jsx4("tr",{children:columns.map((column,index)=>jsx4("th",{children:column},index))})}),jsx4("tbody",{children:rows.map((row,index)=>jsx4("tr",{children:columns.map((_,column)=>jsx4("td",{children:row[column]==null?"":String(row[column])},column))},index))})]})]})}var KEY_ALIASES={esc:"escape",return:"enter",up:"arrowup",down:"arrowdown",left:"arrowleft",right:"arrowright",del:"delete",spacebar:"space"," ":"space",plus:"+",pgup:"pageup",pgdn:"pagedown"},MOD_ALIASES={mod:"mod",cmd:"mod",command:"mod",meta:"mod",ctrl:"ctrl",control:"ctrl",alt:"alt",option:"alt",opt:"alt",shift:"shift"},NAMED_KEYS=new Set(["escape","enter","tab","space","backspace","delete","insert","arrowup","arrowdown","arrowleft","arrowright","home","end","pageup","pagedown","f1","f2","f3","f4","f5","f6","f7","f8","f9","f10","f11","f12"]),SYMBOL_CODES={"/":{code:"Slash",shift:!1},"?":{code:"Slash",shift:!0},"[":{code:"BracketLeft",shift:!1},"{":{code:"BracketLeft",shift:!0},"]":{code:"BracketRight",shift:!1},"}":{code:"BracketRight",shift:!0},",":{code:"Comma",shift:!1},"<":{code:"Comma",shift:!0},".":{code:"Period",shift:!1},">":{code:"Period",shift:!0},";":{code:"Semicolon",shift:!1},":":{code:"Semicolon",shift:!0},"'":{code:"Quote",shift:!1},'"':{code:"Quote",shift:!0},"`":{code:"Backquote",shift:!1},"~":{code:"Backquote",shift:!0},"-":{code:"Minus",shift:!1},_:{code:"Minus",shift:!0},"=":{code:"Equal",shift:!1},"+":{code:"Equal",shift:!0},"\\":{code:"Backslash",shift:!1},"|":{code:"Backslash",shift:!0},"!":{code:"Digit1",shift:!0},"@":{code:"Digit2",shift:!0},"#":{code:"Digit3",shift:!0},$:{code:"Digit4",shift:!0},"%":{code:"Digit5",shift:!0},"^":{code:"Digit6",shift:!0},"&":{code:"Digit7",shift:!0},"*":{code:"Digit8",shift:!0},"(":{code:"Digit9",shift:!0},")":{code:"Digit0",shift:!0}},NAMED_CODES={escape:["Escape"],enter:["Enter","NumpadEnter"],tab:["Tab"],space:["Space"],backspace:["Backspace"],delete:["Delete"],insert:["Insert"],arrowup:["ArrowUp"],arrowdown:["ArrowDown"],arrowleft:["ArrowLeft"],arrowright:["ArrowRight"],home:["Home"],end:["End"],pageup:["PageUp"],pagedown:["PageDown"]};function isLetterKey(key){return/^[a-z]$/.test(key)}function isDigitKey(key){return/^[0-9]$/.test(key)}function isSymbolKey(key){return key.length===1&&!isLetterKey(key)&&!isDigitKey(key)}function normalizeKeyName(raw){if(raw.length===1){let lower2=raw.toLowerCase();return KEY_ALIASES[raw]??lower2}let lower=raw.toLowerCase();return KEY_ALIASES[lower]??lower}var KeySpecError=class extends Error{constructor(spec,reason){super(`Invalid key spec "${spec}": ${reason}`),this.name="KeySpecError"}};function parseChord2(step,spec){let chord={key:"",mod:!1,ctrl:!1,alt:!1,shift:!1},parts;step==="+"?parts=["+"]:step.endsWith("++")?parts=[...step.slice(0,-2).split("+"),"+"]:parts=step.split("+");let rawKey=parts.pop()??"";if(!rawKey)throw new KeySpecError(spec,"missing key");for(let part of parts){let modifier=MOD_ALIASES[part.toLowerCase()];if(!modifier)throw new KeySpecError(spec,`unknown modifier "${part}"`);chord[modifier]=!0}let key=normalizeKeyName(rawKey);if(key.length!==1&&!NAMED_KEYS.has(key))throw new KeySpecError(spec,`unknown key "${rawKey}"`);return chord.key=key,isSymbolKey(key)&&!chord.alt&&(chord.shift=!1),chord}var parseCache=new Map;function parseKeySpec(spec){let cached=parseCache.get(spec);if(cached)return cached;let trimmed=spec.trim();if(!trimmed)throw new KeySpecError(spec,"empty");let parsed=(trimmed==="+"?["+"]:trimmed.split(/\s+/)).map(step=>parseChord2(step,spec));return parseCache.set(spec,parsed),parsed}function isValidKeySpec(spec){try{return parseKeySpec(spec),!0}catch{return!1}}function isSequenceSpec(spec){return parseKeySpec(spec).length>1}function keyList(keys){return keys==null?[]:typeof keys=="string"?[keys]:[...keys]}function chordToString(chord,platform){let mod=chord.mod||platform==="other"&&chord.ctrl,ctrl=platform==="mac"&&chord.ctrl,parts=[];return mod&&parts.push("mod"),ctrl&&parts.push("ctrl"),chord.alt&&parts.push("alt"),chord.shift&&parts.push("shift"),parts.push(chord.key),parts.join("+")}function canonicalKey(spec,platform="mac"){return parseKeySpec(spec).map(chord=>chordToString(chord,platform)).join(" ")}function codesFor(chord){let{key}=chord;if(isLetterKey(key))return{codes:[`Key${key.toUpperCase()}`],shift:null};if(isDigitKey(key))return{codes:[`Digit${key}`,`Numpad${key}`],shift:null};let named=NAMED_CODES[key];if(named)return{codes:[...named],shift:null};let symbol=SYMBOL_CODES[key];return symbol?{codes:[symbol.code],shift:symbol.shift}:{codes:[],shift:null}}function normalizedEventKey(key){return key===" "||key==="Spacebar"?"space":key==="Esc"?"escape":key==="Up"||key==="Down"||key==="Left"||key==="Right"?`arrow${key.toLowerCase()}`:key==="Del"?"delete":(key.length===1,key.toLowerCase())}function matchChord(event,chord,platform){let meta=!!event.metaKey,ctrl=!!event.ctrlKey,alt=!!event.altKey,shift=!!event.shiftKey,wantMeta=platform==="mac"?chord.mod:!1,wantCtrl=platform==="mac"?chord.ctrl:chord.mod||chord.ctrl;if(chord.alt){if(!alt||meta!==wantMeta||ctrl!==wantCtrl)return!1;let{codes,shift:symbolShift}=codesFor(chord);if(!event.code||!codes.includes(event.code))return!1;let wantShift=symbolShift??chord.shift;return shift===wantShift}let key=normalizedEventKey(event.key??"");return isSymbolKey(chord.key)?key!==chord.key||meta!==wantMeta?!1:platform==="other"?wantCtrl?ctrl:!ctrl||alt:ctrl===wantCtrl:alt||meta!==wantMeta||ctrl!==wantCtrl?!1:isLetterKey(chord.key)?shift!==chord.shift?!1:key===chord.key?!0:key.length===1&&/\p{L}/u.test(key)&&!/^[a-z]$/.test(key)&&event.code===`Key${chord.key.toUpperCase()}`:isDigitKey(chord.key)?key===chord.key:key===chord.key&&shift===chord.shift}function matchKey(event,spec,platform,firstStep=!1){let chords;try{chords=parseKeySpec(spec)}catch{return!1}return chords.length>1&&!firstStep?!1:matchChord(event,chords[0],platform)}function isModifierOnlyKey(key){return key==="Shift"||key==="Control"||key==="Alt"||key==="Meta"||key==="AltGraph"||key==="CapsLock"||key==="OS"||key==="Fn"||key==="Hyper"||key==="Super"}var HOST_RESERVED_KEYS=Object.freeze(["/","c","shift+c","shift+tab","mod+s","mod+d","alt+p","alt+s","?","escape","mod+k"]),reservedCanonical={mac:new Set(HOST_RESERVED_KEYS.map(spec=>canonicalKey(spec,"mac"))),other:new Set(HOST_RESERVED_KEYS.map(spec=>canonicalKey(spec,"other")))};function isHostReserved(spec){for(let platform of["mac","other"]){let canonical=canonicalKey(spec,platform),first=canonical.split(" ")[0];if(reservedCanonical[platform].has(canonical)||reservedCanonical[platform].has(first))return!0}return!1}var KEY_JOIN_WORDS=Object.freeze({then:{en:"then",fr:"puis"},or:{en:"or",fr:"ou"}}),MAC_GLYPH={ctrl:"\u2303",alt:"\u2325",shift:"\u21E7",mod:"\u2318"};function keyName(key,mac,fr){switch(key){case"enter":return mac?"\u21B5":fr?"Entr\xE9e":"Enter";case"escape":return fr?"\xC9chap":"Esc";case"space":return fr?"Espace":"Space";case"arrowdown":return"\u2193";case"arrowup":return"\u2191";case"arrowleft":return"\u2190";case"arrowright":return"\u2192";case"tab":return"Tab";case"backspace":return mac?"\u232B":fr?"Retour arri\xE8re":"Backspace";case"delete":return mac?"\u2326":fr?"Suppr":"Delete";case"insert":return fr?"Inser":"Insert";case"home":return fr?"D\xE9but":"Home";case"end":return fr?"Fin":"End";case"pagedown":return fr?"Pg suiv":"PgDn";case"pageup":return fr?"Pg pr\xE9c":"PgUp";default:return key.length===1?key.toUpperCase():key[0].toUpperCase()+key.slice(1)}}function formatChord(chord,{platform,locale}){let mac=platform==="mac",fr=locale==="fr";if(mac)return["ctrl","alt","shift","mod"].filter(m=>chord[m]).map(m=>MAC_GLYPH[m]).join("")+keyName(chord.key,mac,fr);let names=[];return(chord.mod||chord.ctrl)&&names.push("Ctrl"),chord.alt&&names.push("Alt"),chord.shift&&names.push(fr?"Maj":"Shift"),[...names,keyName(chord.key,mac,fr)].join("+")}function formatKeyParts(spec,options){return keyList(spec).map(one=>parseKeySpec(one).map(chord=>formatChord(chord,options)))}function formatKey(spec,options){let then=` ${KEY_JOIN_WORDS.then[options.locale]} `,or=` ${KEY_JOIN_WORDS.or[options.locale]} `;return formatKeyParts(spec,options).map(caps=>caps.join(then)).join(or)}var ARIA_KEY={escape:"Escape",enter:"Enter",tab:"Tab",space:"Space",backspace:"Backspace",delete:"Delete",insert:"Insert",arrowup:"ArrowUp",arrowdown:"ArrowDown",arrowleft:"ArrowLeft",arrowright:"ArrowRight",home:"Home",end:"End",pageup:"PageUp",pagedown:"PageDown"};function toAriaKeyShortcuts(spec,platform){return keyList(spec).map(one=>parseKeySpec(one)).filter(chords=>chords.length===1).map(([chord])=>{let parts=[];chord.mod&&parts.push(platform==="mac"?"Meta":"Control"),chord.ctrl&&!(chord.mod&&platform!=="mac")&&parts.push("Control"),chord.alt&&parts.push("Alt"),chord.shift&&parts.push("Shift");let key=chord.key;return parts.push(ARIA_KEY[key]??(key.length===1?key.toUpperCase():key[0].toUpperCase()+key.slice(1))),parts.join("+")}).join(" ")}var SPOKEN_KEY=Object.freeze({enter:{en:"Enter",fr:"Entr\xE9e"},escape:{en:"Escape",fr:"\xC9chap"},space:{en:"Space",fr:"Espace"},arrowdown:{en:"Down arrow",fr:"Fl\xE8che bas"},arrowup:{en:"Up arrow",fr:"Fl\xE8che haut"},arrowleft:{en:"Left arrow",fr:"Fl\xE8che gauche"},arrowright:{en:"Right arrow",fr:"Fl\xE8che droite"},backspace:{en:"Backspace",fr:"Retour arri\xE8re"},delete:{en:"Delete",fr:"Suppr"},pagedown:{en:"Page down",fr:"Page suivante"},pageup:{en:"Page up",fr:"Page pr\xE9c\xE9dente"}}),SPOKEN_MOD=Object.freeze({ctrl:{en:"Control",fr:"Contr\xF4le"},alt:{mac:{en:"Option",fr:"Option"},other:{en:"Alt",fr:"Alt"}},shift:{en:"Shift",fr:"Maj"},mod:{mac:{en:"Command",fr:"Commande"},other:{en:"Control",fr:"Contr\xF4le"}}});function formatKeySpoken(spec,{platform,locale}){let then=` ${KEY_JOIN_WORDS.then[locale]} `,or=` ${KEY_JOIN_WORDS.or[locale]} `,chordWords=chord=>{let parts=[];return chord.ctrl&&!(chord.mod&&platform!=="mac")&&parts.push(SPOKEN_MOD.ctrl[locale]),chord.alt&&parts.push(SPOKEN_MOD.alt[platform][locale]),chord.shift&&parts.push(SPOKEN_MOD.shift[locale]),chord.mod&&parts.push(SPOKEN_MOD.mod[platform][locale]),parts.push(SPOKEN_KEY[chord.key]?.[locale]??keyName(chord.key,!1,locale==="fr")),parts.join(" ")};return keyList(spec).map(one=>parseKeySpec(one).map(chordWords).join(then)).join(or)}function actionErrorReason(error){if(!error||typeof error!="object")return null;let{name,code,reason}=error;return name!=="ActionError"||code!=="notis_action_error"?null:typeof reason=="string"||isWords(reason)?reason:null}var counted=(oneEn,otherEn,oneFr,otherFr)=>({one:{en:oneEn,fr:oneFr},other:{en:otherEn,fr:otherFr}}),same=(en,fr)=>({one:{en,fr},other:{en,fr}}),STANDARD_ACTIONS=Object.freeze({complete:{id:"complete",label:{en:"Complete",fr:"Terminer"},icon:"check",key:"e",tone:"default",toast:counted("1 item completed.","{n} items completed.","1 \xE9l\xE9ment termin\xE9.","{n} \xE9l\xE9ments termin\xE9s.")},archive:{id:"archive",label:{en:"Archive",fr:"Archiver"},icon:"archive",key:"e",tone:"default",toast:counted("1 item archived.","{n} items archived.","1 \xE9l\xE9ment archiv\xE9.","{n} \xE9l\xE9ments archiv\xE9s.")},unarchive:{id:"unarchive",label:{en:"Move to triage",fr:"D\xE9placer vers le tri"},icon:"tray-arrow-up",key:"shift+e",tone:"default",toast:counted("1 item restored.","{n} items restored.","1 \xE9l\xE9ment restaur\xE9.","{n} \xE9l\xE9ments restaur\xE9s.")},star:{id:"star",label:{en:"Star",fr:"Mettre en favori"},icon:"star",key:"s",tone:"default",toggle:"unstar",toast:counted("1 item starred.","{n} items starred.","1 \xE9l\xE9ment ajout\xE9 aux favoris.","{n} \xE9l\xE9ments ajout\xE9s aux favoris.")},unstar:{id:"unstar",label:{en:"Unstar",fr:"Retirer des favoris"},icon:"star",key:"s",tone:"default",toggle:"star",toast:null},later:{id:"later",label:{en:"Later",fr:"Plus tard"},icon:"clock",key:"h",tone:"default",toast:same("Snoozed until tomorrow.","Report\xE9 \xE0 demain.")},move:{id:"move",label:{en:"Move to\u2026",fr:"D\xE9placer vers\u2026"},icon:"arrow-bend-up-right",key:"m",tone:"default",toast:null,picker:!0},assign:{id:"assign",label:{en:"Assign\u2026",fr:"Attribuer\u2026"},icon:"user-plus",key:"a",tone:"default",toast:null,picker:!0},read:{id:"read",label:{en:"Mark as read",fr:"Marquer comme lu"},icon:"envelope-open",key:"u",tone:"default",toggle:"unread",toast:null},unread:{id:"unread",label:{en:"Mark as unread",fr:"Marquer comme non lu"},icon:"envelope-simple",key:"u",tone:"default",toggle:"read",toast:null},delete:{id:"delete",label:{en:"Delete",fr:"Supprimer"},icon:"trash",key:"#",tone:"danger",toast:counted("1 item deleted.","{n} items deleted.","1 \xE9l\xE9ment supprim\xE9.","{n} \xE9l\xE9ments supprim\xE9s.")},progress:{id:"progress",label:{en:"Start progress",fr:"Passer en cours"},icon:"circle-half",key:null,tone:"default",toast:null},pause:{id:"pause",label:{en:"Pause",fr:"Mettre en pause"},icon:"pause",key:null,tone:"default",toggle:"resume",toast:null},resume:{id:"resume",label:{en:"Resume",fr:"Reprendre"},icon:"play",key:null,tone:"default",toggle:"pause",toast:null},enable:{id:"enable",label:{en:"Enable",fr:"Activer"},icon:"toggle-right",key:null,tone:"default",toggle:"disable",toast:null},disable:{id:"disable",label:{en:"Disable",fr:"D\xE9sactiver"},icon:"toggle-left",key:null,tone:"default",toggle:"enable",toast:null},waiting:{id:"waiting",label:{en:"Waiting",fr:"En attente"},icon:"hourglass",key:"w",tone:"default",toast:null,managerOnly:!0}});function isStandardActionId(id){return typeof id=="string"&&Object.prototype.hasOwnProperty.call(STANDARD_ACTIONS,id)}function actionToast(id,n){let toast=STANDARD_ACTIONS[id].toast;return toast?fillWords(n===1?toast.one:toast.other,{n}):null}function resolveActionRef(ref){if(typeof ref=="string")return standardDefaults(ref);let toastOff=Object.prototype.hasOwnProperty.call(ref,"toast")&&!ref.toast,merged=isStandardActionId(ref.id)?{...standardDefaults(ref.id),...stripUndefined(ref)}:{...ref};return toastOff&&(merged.toast=null),merged}function toWords(value){return typeof value=="string"?{en:value,fr:value}:value}function standardDefaults(id){let action=STANDARD_ACTIONS[id];return{id,label:action.label,icon:action.icon,key:action.key??void 0,tone:action.tone,toast:action.toast?n=>actionToast(id,n):void 0,...action.toggle?{toggle:action.toggle}:{}}}function stripUndefined(value){let out={};for(let[k,v]of Object.entries(value))v!==void 0&&(out[k]=v);return out}var SHELL_WORDS=Object.freeze({open:{en:"Open",fr:"Ouvrir"},back:{en:"Back",fr:"Retour"},close:{en:"Close",fr:"Fermer"},previous:{en:"Previous",fr:"Pr\xE9c\xE9dent"},next:{en:"Next",fr:"Suivant"},more:{en:"More",fr:"Plus"},clear:{en:"Clear",fr:"Effacer"},removeNamed:{en:"Remove {name}",fr:"Retirer {name}"},savingNamed:{en:"Saving {name}",fr:"Enregistrement de {name}"},clearSelection:{en:"Clear selection",fr:"Effacer la s\xE9lection"},undo:{en:"Undo",fr:"Annuler"},select:{en:"Select",fr:"S\xE9lectionner"},selectAll:{en:"Select all",fr:"Tout s\xE9lectionner"},extendSelection:{en:"Extend selection",fr:"\xC9tendre la s\xE9lection"},closeThenClear:{en:"Close, then clear selection",fr:"Fermer, puis effacer la s\xE9lection"},showShortcuts:{en:"Show shortcuts",fr:"Afficher les raccourcis"},search:{en:"Search",fr:"Rechercher"},tryAgain:{en:"Try again",fr:"R\xE9essayer"},selectedOne:{en:"1 selected",fr:"1 s\xE9lectionn\xE9"},selectedMany:{en:"{n} selected",fr:"{n} s\xE9lectionn\xE9s"},sidePeek:{en:"Side peek",fr:"Aper\xE7u lat\xE9ral"},centerPeek:{en:"Center peek",fr:"Aper\xE7u centr\xE9"},fullPage:{en:"Full page",fr:"Pleine page"},openAs:{en:"Open as",fr:"Ouvrir en"}});function selectedCount(n){return n===1?SHELL_WORDS.selectedOne:fillWords(SHELL_WORDS.selectedMany,{n})}var HELP_WORDS=Object.freeze({title:{en:"Keyboard shortcuts",fr:"Raccourcis clavier"},groupSpace:{en:"This Space",fr:"Ce Space"},groupNotis:{en:"Notis",fr:"Notis"},close:{en:"Close",fr:"Fermer"},empty:{en:"No shortcuts here.",fr:"Aucun raccourci ici."}});var entry=(id,keys,scope,en,fr,extra={})=>Object.freeze({id,keys:Object.freeze(keys),scope,label:Object.freeze({en,fr}),...extra}),DEFAULT_KEYMAP=Object.freeze({"list.next":entry("list.next",["j","arrowdown"],"collection","Next item","\xC9l\xE9ment suivant",{repeat:!0}),"list.prev":entry("list.prev",["k","arrowup"],"collection","Previous item","\xC9l\xE9ment pr\xE9c\xE9dent",{repeat:!0}),"list.extendDown":entry("list.extendDown",["shift+j","shift+arrowdown"],"collection","Extend selection down","\xC9tendre la s\xE9lection vers le bas",{repeat:!0}),"list.extendUp":entry("list.extendUp",["shift+k","shift+arrowup"],"collection","Extend selection up","\xC9tendre la s\xE9lection vers le haut",{repeat:!0}),"list.open":entry("list.open",["enter","o"],"collection","Open","Ouvrir"),"list.toggleSelect":entry("list.toggleSelect",["x"],"collection","Select","S\xE9lectionner"),"list.selectAll":entry("list.selectAll",["mod+a"],"collection","Select all","Tout s\xE9lectionner"),"period.prev":entry("period.prev",["["],"collection","Previous period","P\xE9riode pr\xE9c\xE9dente"),"period.next":entry("period.next",["]"],"collection","Next period","P\xE9riode suivante"),"period.today":entry("period.today",["t"],"collection","Today","Aujourd\u2019hui"),undo:entry("undo",["z","mod+z"],"route","Undo","Annuler"),"view.prev":entry("view.prev",["["],"route","Previous view","Vue pr\xE9c\xE9dente"),"view.next":entry("view.next",["]"],"route","Next view","Vue suivante"),"host.help":entry("host.help",["?"],"app","Show keyboard shortcuts","Afficher les raccourcis clavier",{host:!0}),"host.escape":entry("host.escape",["escape"],"app","Close, then go back","Fermer, puis revenir",{host:!0}),"host.search":entry("host.search",["/"],"app","Search","Rechercher",{host:!0}),"host.newChat":entry("host.newChat",["c"],"app","New conversation","Nouvelle conversation",{host:!0}),"host.call":entry("host.call",["shift+c"],"app","Open voice call","Ouvrir l\u2019appel vocal",{host:!0}),"host.toggleSidebar":entry("host.toggleSidebar",["mod+s"],"app","Toggle sidebar","Afficher ou masquer la barre lat\xE9rale",{host:!0}),"host.voiceMessage":entry("host.voiceMessage",["mod+d"],"app","Voice message","Message vocal",{host:!0}),"host.modelMenu":entry("host.modelMenu",["alt+p"],"app","Model menu","Menu du mod\xE8le",{host:!0}),"host.speedMenu":entry("host.speedMenu",["alt+s"],"app","Speed menu","Menu de vitesse",{host:!0}),"host.toggleVoiceCall":entry("host.toggleVoiceCall",["shift+tab"],"app","Toggle voice call in panel","Afficher ou masquer l\u2019appel vocal dans le panneau",{host:!0}),"host.commandMenu":entry("host.commandMenu",["mod+k"],"app","Command menu","Menu des commandes",{host:!0}),"host.goInbox":entry("host.goInbox",["g i"],"app","Go to Inbox","Aller \xE0 l\u2019Inbox",{host:!0,managerOnly:!0}),"host.goStarred":entry("host.goStarred",["g s"],"app","Go to Starred","Aller aux Favoris",{host:!0,managerOnly:!0}),"host.goDone":entry("host.goDone",["g d"],"app","Go to Done","Aller \xE0 Termin\xE9",{host:!0,managerOnly:!0})});var PLATFORMS=["mac","other"];function keyFingerprints(keys){let out=new Map;for(let spec of keyList(keys))for(let platform of PLATFORMS)out.set(`${platform}:${canonicalKey(spec,platform)}`,canonicalKey(spec,"mac"));return out}function ownerOf(candidate){return candidate.owner??"notis"}function ownerKindOf(candidate){return candidate.ownerKind?candidate.ownerKind:ownerOf(candidate)==="notis"?"host":"space"}function selfClashes(candidate){let clashes=[],space=ownerKindOf(candidate)==="space";for(let spec of keyList(candidate.keys)){try{parseKeySpec(spec)}catch(error){clashes.push({kind:"invalid",severity:"error",key:spec,ids:[candidate.id],scope:candidate.scope,owner:ownerOf(candidate),message:error.message});continue}space&&isHostReserved(spec)&&clashes.push({kind:"reserved",severity:"error",key:canonicalKey(spec),ids:[candidate.id],scope:candidate.scope,owner:ownerOf(candidate),message:`"${candidate.id}" uses ${canonicalKey(spec)}, which Notis keeps for itself. Pick another key.`})}return space&&candidate.scope==="app"&&clashes.push({kind:"app-scope",severity:"error",key:keyList(candidate.keys).join(", "),ids:[candidate.id],scope:"app",owner:ownerOf(candidate),message:`"${candidate.id}" registers at app scope, which only Notis uses. Use route or a lower scope.`}),clashes}function safeFingerprints(keys){try{return keyFingerprints(keys)}catch{return new Map}}function pairClashes(earlier,later){if(earlier.available===!1||later.available===!1)return[];let a=safeFingerprints(earlier.keys),b=safeFingerprints(later.keys),shared=new Set;for(let[fingerprint,key]of b)a.has(fingerprint)&&shared.add(key);let clashes=[],sameOwner=ownerOf(earlier)===ownerOf(later);for(let key of shared)if(earlier.scope===later.scope&&sameOwner)clashes.push({kind:"duplicate",severity:"error",key,ids:[earlier.id,later.id],scope:later.scope,owner:ownerOf(later),message:`NotisKeyClash: "${earlier.id}" and "${later.id}" both use ${key} in the ${later.scope} scope.`});else if(earlier.scope!==later.scope){let[low,high]=SCOPE_ORDER[earlier.scope]<SCOPE_ORDER[later.scope]?[earlier,later]:[later,earlier];clashes.push({kind:"shadowed",severity:"info",key,ids:[high.id,low.id],scopes:[high.scope,low.scope],message:`${key}: "${high.id}" (${high.scope}) is asked before "${low.id}" (${low.scope}).`})}if(earlier.scope===later.scope&&sameOwner)for(let[single,sequence]of[[earlier,later],[later,earlier]])for(let one of keyList(single.keys))for(let seq of keyList(sequence.keys)){let s,q;try{s=parseKeySpec(one),q=parseKeySpec(seq)}catch{continue}s.length!==1||q.length<2||canonicalKey(one)===canonicalKey(seq).split(" ")[0]&&clashes.push({kind:"prefix",severity:"info",key:canonicalKey(one),ids:[single.id,sequence.id],scope:single.scope,owner:ownerOf(single),message:`${canonicalKey(one)} runs "${single.id}" at once, so "${sequence.id}" (${canonicalKey(seq)}) never starts.`})}return clashes}var ROOT_OWNER="notis",NotisKeyClash=class extends Error{clash;constructor(clash){super(clash.message.startsWith("NotisKeyClash")?clash.message:`NotisKeyClash: ${clash.message}`),this.name="NotisKeyClash",this.clash=clash}},MAX_BOOST=99,ShortcutRegistry=class{entries=[];owners=new Map;seq=0;version=0;listeners=new Set;warned=new Set;options;constructor(options={}){this.options={strict:options.strict??!0,onClash:options.onClash}}subscribe(listener){return this.listeners.add(listener),()=>{this.listeners.delete(listener)}}getVersion(){return this.version}notify(){this.version+=1;for(let listener of[...this.listeners])listener()}defineOwner(id,options={}){if(id===ROOT_OWNER)return()=>{};let parent=options.parent??ROOT_OWNER,existing=this.owners.get(id);existing?(existing.refs+=1,existing.parent=parent,options.kind&&(existing.kind=options.kind),options.available!==void 0&&existing.available!==options.available&&(existing.available=options.available)):this.owners.set(id,{id,parent,kind:options.kind??this.inheritedKind(parent),available:options.available??!0,refs:1}),this.notify();let released=!1;return()=>{if(released)return;released=!0;let record=this.owners.get(id);record&&(record.refs-=1,record.refs<=0&&this.owners.delete(id),this.notify())}}setOwnerAvailable(id,available){let record=this.owners.get(id);!record||record.available===available||(record.available=available,this.notify())}inheritedKind(parent){return parent===ROOT_OWNER?"space":this.owners.get(parent)?.kind??"space"}ownerKind(id){return id===ROOT_OWNER?"host":this.owners.get(id)?.kind??"space"}isOwnerAvailable(id){let current=id,seen=new Set;for(;current&¤t!==ROOT_OWNER&&!seen.has(current);){seen.add(current);let record=this.owners.get(current);if(!record)return!0;if(!record.available)return!1;current=record.parent}return!0}register(def,owner=def.owner??ROOT_OWNER){let ownerKind=this.ownerKind(owner),candidate=this.candidate(def,owner,ownerKind),errors=selfClashes(candidate).filter(clash=>clash.severity==="error");if(errors.length)return this.reject(errors[0]),null;if(this.isOwnerAvailable(owner))for(let entry3 of this.entries){if(entry3.owner!==owner||entry3.def.scope!==def.scope||!this.isOwnerAvailable(entry3.owner))continue;let duplicate=pairClashes(this.candidate(entry3.def,entry3.owner,entry3.ownerKind),candidate).find(clash=>clash.kind==="duplicate");if(duplicate)return this.reject(duplicate),null}let boost=Math.max(0,Math.min(MAX_BOOST,def.boost??0)),entry2={def,owner,ownerKind,seq:++this.seq,rank:SCOPE_ORDER[def.scope]+boost,chords:keyList(def.keys).map(spec=>parseKeySpec(spec))};this.entries.push(entry2),this.notify();let removed=!1;return()=>{if(removed)return;removed=!0;let index=this.entries.indexOf(entry2);index!==-1&&this.entries.splice(index,1),this.notify()}}candidate(def,owner,ownerKind){return{id:def.id,keys:def.keys,scope:def.scope,owner,ownerKind,available:!0}}reject(clash){if(this.options.strict)throw new NotisKeyClash(clash);if(this.warned.has(clash.message))return;this.warned.add(clash.message),(this.options.onClash??(message=>{typeof console<"u"&&console.warn(`[notis keys] ${message} The later shortcut was ignored.`)}))(clash.message)}all(){return this.entries}active(options={}){return this.entries.filter(entry2=>(!options.modalOnly||entry2.def.scope==="modal")&&this.isOwnerAvailable(entry2.owner)).sort((a,b)=>b.rank-a.rank||b.seq-a.seq)}helpEntries(){let byId=new Map,ordered=[...this.entries].sort((a,b)=>a.seq-b.seq);for(let entry2 of ordered){let{def}=entry2;if(def.hidden||def.scope==="modal"||!this.isOwnerAvailable(entry2.owner)||def.when&&!safeWhen(def.when))continue;let group=def.group??(entry2.ownerKind==="space"?"space":"notis");byId.delete(def.id),byId.set(def.id,{id:def.id,keys:keyList(def.keys),label:def.label,group,scope:def.scope,owner:entry2.owner})}let rows=[...byId.values()];return[...rows.filter(row=>row.group==="space"),...rows.filter(row=>row.group==="notis")]}helpText(locale){return this.helpEntries().map(row=>({group:row.group,label:row.label[locale],keys:row.keys}))}};function safeWhen(when){try{return when()!==!1}catch{return!1}}var NON_TEXT_INPUTS=new Set(["button","checkbox","color","file","hidden","image","radio","reset","submit"]);function isElement(value){return!!value&&typeof value.matches=="function"}function eventTarget(event){let first=(typeof event.composedPath=="function"?event.composedPath():[]).find(isElement);return first||(isElement(event.target)?event.target:null)}function closestComposed(element,selector){let current=element;for(;current;){let found=current.closest(selector);if(found)return found;let root=current.getRootNode();current="host"in root?root.host:null}return null}function containsComposed(container,element){let current=element;for(;current&&container;){if(container.contains(current))return!0;let root=current.getRootNode();current="host"in root?root.host:null}return!1}function isTextEntry(element){if(!element)return!1;let tag=element.tagName;return tag==="TEXTAREA"||tag==="SELECT"?!0:tag==="INPUT"?!NON_TEXT_INPUTS.has((element.type||"text").toLowerCase()):element.isContentEditable?!0:closestComposed(element,'[contenteditable=""], [contenteditable="true"], [contenteditable="plaintext-only"], [role="textbox"], [role="combobox"], [role="searchbox"]')!==null}function fieldOwnsEscape(element){return!element||!isTextEntry(element)?!1:closestComposed(element,"[data-notis-floating]")?element.getAttribute("aria-expanded")==="true":!0}function isInsideOpenMenu(element){if(!element)return!1;let menu=closestComposed(element,'[role="menu"], [role="listbox"], [role="menubar"]');return!menu||menu.hasAttribute("data-notis-engine-list")?!1:menu.getAttribute("data-state")!=="closed"}function blocksShortcuts(element,options){return options.inFields?!1:!!(isTextEntry(element)||!options.modal&&isInsideOpenMenu(element))}function isActivatable(element){return closestComposed(element,'button, a[href], [role="button"], [role="switch"], [role="checkbox"], [role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"], summary, input[type="checkbox"], input[type="radio"]')!==null}function ownsArrows(element){return closestComposed(element,'input[type="range"], [role="slider"], [role="tablist"], [role="radiogroup"], [role="spinbutton"], [role="separator"][tabindex], [role="tree"], [role="grid"]')!==null}function keysOff(element){return closestComposed(element,'[data-notis-keys="off"]')!==null}function isVisibleComposed(element){if(!element?.isConnected)return!1;let current=element;for(;current;){if(current.hasAttribute("hidden")||current.hasAttribute("inert")||current.getAttribute("aria-hidden")==="true")return!1;let style=current.ownerDocument.defaultView?.getComputedStyle(current);if(style?.display==="none"||style?.visibility==="hidden")return!1;let root=current.getRootNode();current=current.parentElement??("host"in root?root.host:null)}return!0}function collectRoots(doc){let roots=[doc],visit=root=>{let walker=doc.createTreeWalker(root,1);for(let node=walker.nextNode();node;node=walker.nextNode()){let shadow=node.shadowRoot;shadow&&(roots.push(shadow),visit(shadow))}};return visit(doc),roots}function queryAllComposed(doc,selector,event){let found=new Set;for(let root of collectRoots(doc))for(let el of root.querySelectorAll(selector))found.add(el);if(event&&typeof event.composedPath=="function")for(let target of event.composedPath())isElement(target)&&target.matches(selector)&&found.add(target);return[...found]}var MODAL_LAYER=['[role="dialog"][aria-modal="true"]','[role="dialog"][data-state="open"]','[role="alertdialog"]:not([data-state="closed"])',"dialog.notis-dialog[open]",'dialog[open][aria-modal="true"]','[role="menu"][data-state="open"]','[role="listbox"][data-state="open"]'].join(", ");function openModalLayers(doc,event){return queryAllComposed(doc,MODAL_LAYER,event).filter(el=>!el.closest("[data-notis-nonmodal]")&&isVisibleComposed(el))}function hasOpenModal(doc,event){return openModalLayers(doc,event).length>0}function modalLayerOf(element){let current=element;for(;current;){let layer=closestComposed(current,MODAL_LAYER);if(!layer)return null;if(!layer.closest("[data-notis-nonmodal]"))return layer;let root=layer.getRootNode();current=layer.parentElement??("host"in root?root.host:null)}return null}var FLOATING_LAYER='dialog[open], [role="dialog"]:not([data-state="closed"]), [role="alertdialog"]:not([data-state="closed"]), [role="menu"]:not([data-state="closed"]), [role="listbox"][data-state="open"]';function foreignFloatingLayers(doc,event){return queryAllComposed(doc,FLOATING_LAYER,event).filter(el=>!el.closest("[data-notis-escape-owned]")&&isVisibleComposed(el))}var ESCAPE_PRIORITY=Object.freeze({route:0,detail:100,selection:200,help:300,overlay:400}),SEQUENCE_TIMEOUT_MS=1500;function detectPlatform(){if(typeof navigator>"u")return"other";let nav=navigator,name=nav.userAgentData?.platform||nav.platform||nav.userAgent||"";return/mac|iphone|ipad|ipod/i.test(name)?"mac":"other"}function detectLocale(){if(typeof document>"u")return"en";let lang=document.querySelector("html")?.getAttribute("lang")??"";return/^fr\b/i.test(lang)?"fr":"en"}function defaultStrict(){return globalThis.process?.env?.NODE_ENV!=="production"}function consume(event,immediate=!1){event.preventDefault(),immediate?event.stopImmediatePropagation():event.stopPropagation()}function isUnmodifiedEscape(event){return event.key==="Escape"&&!event.metaKey&&!event.ctrlKey&&!event.altKey&&!event.shiftKey}var KeyboardEngineCore=class{registry;settings;mounted=0;now=()=>Date.now();layers=[];blockers=[];seq=0;held=new Set;pending=null;attached=new Map;helpOpen=!1;helpUnregister=null;forcedRepeat=new WeakSet;constructor(settings={}){this.settings={host:settings.host??"portal",locale:settings.locale??detectLocale(),platform:settings.platform??detectPlatform(),strict:settings.strict??defaultStrict(),onClash:settings.onClash},this.registry=new ShortcutRegistry({strict:this.settings.strict,onClash:this.settings.onClash})}configure(settings,options={}){let next={...this.settings};for(let[key,value]of Object.entries(settings))value!==void 0&&(next[key]=value);let changed=Object.keys(next).some(key=>next[key]!==this.settings[key]);return this.settings=next,this.registry.options={strict:next.strict,onClash:next.onClash},changed&&!options.silent&&this.registry.notify(),changed}subscribe(listener){return this.registry.subscribe(listener)}getVersion(){return this.registry.getVersion()}attach(doc){let existing=this.attached.get(doc);if(existing)existing.refs+=1;else{let onKeyDown=event=>this.handleKeyDown(event),onKeyUp=event=>this.handleKeyUp(event),onReset=()=>this.resetHeld(),onVisibility=()=>{doc.visibilityState==="hidden"&&this.resetHeld()};doc.addEventListener("keydown",onKeyDown,!0),doc.addEventListener("keyup",onKeyUp,!0),doc.addEventListener("visibilitychange",onVisibility),doc.defaultView?.addEventListener("blur",onReset),this.attached.set(doc,{refs:1,detach:()=>{doc.removeEventListener("keydown",onKeyDown,!0),doc.removeEventListener("keyup",onKeyUp,!0),doc.removeEventListener("visibilitychange",onVisibility),doc.defaultView?.removeEventListener("blur",onReset)}})}this.ensureHelpShortcut();let detached=!1;return()=>{if(detached)return;detached=!0;let record=this.attached.get(doc);record&&(record.refs-=1,record.refs<=0&&(record.detach(),this.attached.delete(doc)))}}isAttached(doc){return this.attached.has(doc)}attachedDocument(){for(let doc of this.attached.keys())return doc;return null}resetHeld(){this.held.clear(),this.pending=null}register(def,owner){return this.registry.register(def,owner??def.owner??ROOT_OWNER)}defineOwner=(id,options)=>this.registry.defineOwner(id,options);setOwnerAvailable(id,available){this.registry.setOwnerAvailable(id,available)}isOwnerAvailable(id){return this.registry.isOwnerAvailable(id)}addEscapeLayer(id,onEscape,priority=ESCAPE_PRIORITY.overlay){let layer={id,onEscape,priority,seq:++this.seq};return this.layers.push(layer),()=>{let index=this.layers.indexOf(layer);index!==-1&&this.layers.splice(index,1)}}addEscapeBlocker(priority=ESCAPE_PRIORITY.detail+50,isActive){let blocker={priority,seq:++this.seq,isActive};return this.blockers.push(blocker),()=>{let index=this.blockers.indexOf(blocker);index!==-1&&this.blockers.splice(index,1)}}escapeLayerIds(){return this.sortedLayers().map(layer=>layer.id)}sortedLayers(){return[...this.layers].sort((a,b)=>b.priority-a.priority||b.seq-a.seq)}runEscapeChain(event){let blockers=this.blockers.filter(blocker=>!blocker.isActive||blocker.isActive()),top=blockers.reduce((max,blocker)=>Math.max(max,blocker.priority),-1/0);for(let layer of this.sortedLayers()){if(layer.priority<top)return!0;let handled=!1;try{handled=layer.onEscape(event)===!0}catch(error){reportError(error),handled=!0}if(handled)return!0}return blockers.length>0}isHelpOpen(){return this.helpOpen}openHelp(){this.helpOpen||(this.helpOpen=!0,this.registry.notify())}closeHelp(){this.helpOpen&&(this.helpOpen=!1,this.registry.notify())}toggleHelp(){this.helpOpen?this.closeHelp():this.openHelp()}ensureHelpShortcut(){if(this.helpUnregister)return;let entry2=DEFAULT_KEYMAP["host.help"];this.helpUnregister=this.registry.register({id:entry2.id,keys:[...entry2.keys],scope:"app",label:entry2.label,group:"notis",run:()=>{this.toggleHelp()}},ROOT_OWNER)}isRepeat(event){return event.repeat||this.forcedRepeat.has(event)}handleKeyUp(event){if(event.key==="Meta"){this.held.clear();return}this.held.delete(event.code||event.key)}handleKeyDown(event){if(event.isComposing||event.keyCode===229)return;let key=event.key;if(!key||key==="Dead"||key==="Process"||isModifierOnlyKey(key))return;let physical=event.code||key,repeat=event.repeat||this.held.has(physical);if(event.metaKey||this.held.add(physical),repeat&&!event.repeat){this.forcedRepeat.add(event);try{Object.defineProperty(event,"repeat",{value:!0,configurable:!0})}catch{}}let target=eventTarget(event),doc=target?.ownerDocument??(typeof document<"u"?document:null);if(!doc||keysOff(target)||isUnmodifiedEscape(event)&&this.handleEscape(event,target,doc,repeat)||event.defaultPrevented)return;let lower=key.toLowerCase();if(!event.metaKey&&!event.ctrlKey&&!event.altKey&&(lower==="enter"||lower===" ")&&isActivatable(target)){this.pending=null;return}if(lower.startsWith("arrow")&&ownsArrows(target))return;let modal=null,isModal=()=>modal??=hasOpenModal(doc,event),{platform}=this.settings,eligible=entry2=>{let{def}=entry2;return!(repeat&&!def.repeat||isModal()&&def.scope!=="modal"||blocksShortcuts(target,{inFields:!!def.allowInFields,modal:def.scope==="modal"})||def.when&&!safeWhen(def.when))},pending=this.pending;if(this.pending=null,pending&&!repeat&&this.now()-pending.at<=SEQUENCE_TIMEOUT_MS){let next=pending.candidates.filter(({entry:entry2,chords})=>matchChord(event,chords[pending.step],platform)&&this.registry.all().includes(entry2)&&eligible(entry2));if(next.length){let done=next.filter(({chords})=>chords.length===pending.step+1);for(let{entry:entry2}of done)if(this.run(entry2,event)){consume(event);return}let longer=next.filter(({chords})=>chords.length>pending.step+1);if(longer.length){this.pending={candidates:longer,step:pending.step+1,at:this.now()},consume(event);return}}}let active=this.registry.active();for(let entry2 of active)if(entry2.chords.some(chords=>chords.length===1&&matchChord(event,chords[0],platform))&&eligible(entry2)&&this.run(entry2,event)){consume(event);return}if(repeat)return;let starts=[];for(let entry2 of active)for(let chords of entry2.chords)chords.length>1&&matchChord(event,chords[0],platform)&&eligible(entry2)&&starts.push({entry:entry2,chords});starts.length&&(this.pending={candidates:starts,step:1,at:this.now()},consume(event))}run(entry2,event){try{return entry2.def.run(event)!==!1}catch(error){return reportError(error),!0}}handleEscape(event,target,doc,repeat){if(this.pending=null,fieldOwnsEscape(target))return!0;let foreign=foreignFloatingLayers(doc,event);if(repeat)return(foreign.length||this.layers.length)&&consume(event,!0),!0;if(event.defaultPrevented||foreign.length)return!0;if(!this.layers.length&&!this.blockers.length)return!1;let handled=this.runEscapeChain(event);return handled&&consume(event),handled}};function reportError(error){typeof console<"u"&&console.error("[notis keys] A shortcut failed.",error)}import{createContext as createContext3}from"react";var KEY=Symbol.for("notis.sdk.ui.instance");function create(){return Object.freeze({version:1,core:new KeyboardEngineCore,EngineContext:createContext3(null),OwnerContext:createContext3(ROOT_OWNER),KeycapContext:createContext3(null)})}var local=null;function getSharedInstance(){if(local)return local;let slot=globalThis,existing=slot[KEY];if(existing&&existing.version===1)return typeof console<"u"&&console.warn("[notis keys] A second copy of the Notis toolkit loaded. It shares the first keyboard engine."),local=existing,local;local=create();try{Object.defineProperty(slot,KEY,{value:local,configurable:!0,enumerable:!1,writable:!1})}catch{}return local}import{useCallback as useCallback6,useContext as useContext3,useEffect as useEffect6,useLayoutEffect as useLayoutEffect4,useRef as useRef5,useSyncExternalStore as useSyncExternalStore2}from"react";var useIsoLayoutEffect=typeof window>"u"?useEffect6:useLayoutEffect4;function useEngineCore(){let shared=getSharedInstance();return useContext3(shared.EngineContext)??shared.core}function useShortcutOwner(){return useContext3(getSharedInstance().OwnerContext)}function useSetting(read){let core=useEngineCore(),getSnapshot=()=>read(core);return useSyncExternalStore2(useCallback6(listener=>core.subscribe(listener),[core]),getSnapshot,getSnapshot)}function useToolkitLocale(){return useSetting(core=>core.mounted>0?core.settings.locale:detectLocale())}function useToolkitPlatform(){return useSetting(core=>core.mounted>0?core.settings.platform:detectPlatform())}function useToolkitSettings(){let locale=useToolkitLocale(),platform=useToolkitPlatform(),core=useEngineCore(),host=useSetting(c=>c.settings.host),strict=useSetting(c=>c.settings.strict);return{host,locale,platform,strict,onClash:core.settings.onClash}}function defKey(def,owner){return JSON.stringify([def.id,keyList(def.keys),def.scope,def.owner??owner,def.group??"",!!def.hidden,!!def.repeat,!!def.allowInFields,def.boost??0,def.label.en,def.label.fr])}function liveDef(ref){return{...ref.current,when:()=>{let when=ref.current.when;return when?when():!0},run:event=>ref.current.run(event)}}function useShortcut(def,deps=[]){let core=useEngineCore(),owner=useShortcutOwner(),ref=useRef5(def);ref.current=def;let key=defKey(def,owner);useEffect6(()=>{let unregister=core.register(liveDef(ref),ref.current.owner??owner);return()=>{unregister?.()}},[core,owner,key,...deps])}function useShortcuts2(defs,deps=[]){let core=useEngineCore(),owner=useShortcutOwner(),ref=useRef5(defs);ref.current=defs;let key=defs.map(def=>defKey(def,owner)).join(`
|
|
3
|
+
`);useEffect6(()=>{let unregisters=ref.current.map((def,index)=>{let live={get current(){return ref.current[index]??def}};return core.register(liveDef(live),def.owner??owner)});return()=>{for(let unregister of unregisters)unregister?.()}},[core,owner,key,...deps])}function useShortcutScope(owner,options){let core=useEngineCore(),parent=useShortcutOwner(),{available,kind}=options,availableRef=useRef5(available);return availableRef.current=available,useIsoLayoutEffect(()=>core.defineOwner(owner,{parent,kind,available:availableRef.current}),[core,owner,parent,kind]),useIsoLayoutEffect(()=>{core.setOwnerAvailable(owner,available)},[core,owner,available]),{owner,available,isAvailable:()=>core.isOwnerAvailable(owner)}}function useEscapeLayer(id,onEscape,options={}){let core=useEngineCore(),owner=useShortcutOwner(),ref=useRef5(onEscape);ref.current=onEscape;let priority=options.priority??ESCAPE_PRIORITY.overlay,enabled=options.enabled??!0;useEffect6(()=>{if(enabled)return core.addEscapeLayer(id,event=>core.isOwnerAvailable(owner)&&ref.current(event),priority)},[core,owner,id,priority,enabled])}function useEscapeBlocker(active,options={}){let core=useEngineCore(),owner=useShortcutOwner(),priority=options.priority??ESCAPE_PRIORITY.detail+50;useEffect6(()=>active?core.addEscapeBlocker(priority,()=>core.isOwnerAvailable(owner)):void 0,[core,owner,active,priority])}function useHelpSheet(){let core=useEngineCore(),isOpen=useSetting(c=>c.isHelpOpen());return{open:useCallback6(()=>core.openHelp(),[core]),close:useCallback6(()=>core.closeHelp(),[core]),toggle:useCallback6(()=>core.toggleHelp(),[core]),isOpen}}function useRegistryVersion(){return useSetting(core=>core.getVersion())}import{useEffect as useEffect8,useId,useRef as useRef7,useState as useState3}from"react";import{useCallback as useCallback7,useEffect as useEffect7,useLayoutEffect as useLayoutEffect5,useRef as useRef6}from"react";function cx(...names){return names.filter(Boolean).join(" ")}function useT(){let locale=useToolkitLocale();return useCallback7(words=>pick(words,locale),[locale])}function useLabelValue(){let locale=useToolkitLocale();return useCallback7((label,value)=>labelValue(label,value,locale),[locale])}function flag(on){return on?"":void 0}var useIsoLayoutEffect2=typeof window>"u"?useEffect7:useLayoutEffect5;function useLatest(value){let ref=useRef6(value);return ref.current=value,ref}var idCounter=0;function useStableId(prefix){let ref=useRef6(null);return ref.current===null&&(idCounter+=1,ref.current=`${prefix}-${idCounter}`),ref.current}function eventWithin(event,elements){let path=typeof event.composedPath=="function"?event.composedPath():[];for(let element of elements)if(element&&(path.includes(element)||event.target instanceof Node&&element.contains(event.target)))return!0;return!1}function deepActiveElement(root=document){let active=root.activeElement;for(;active&&active.shadowRoot&&active.shadowRoot.activeElement;)active=active.shadowRoot.activeElement;return active}function revealInline(el){if(!(!el||typeof window>"u"))for(let box=el.parentElement;box;box=box.parentElement){if(box.scrollWidth<=box.clientWidth)continue;let overflow=window.getComputedStyle(box).overflowX;if(overflow!=="auto"&&overflow!=="scroll")continue;let boxRect=box.getBoundingClientRect(),rect=el.getBoundingClientRect();rect.left<boxRect.left?box.scrollLeft-=boxRect.left-rect.left:rect.right>boxRect.right&&(box.scrollLeft+=rect.right-boxRect.right);return}}import{jsx as jsx5,jsxs as jsxs4}from"react/jsx-runtime";var NATIVE_CONFIRM_REVEAL_MS=1500,NATIVE_CONFIRM_MISSING_MS=30;function prefersNativeConfirm(){return typeof window>"u"||typeof window.confirm!="function"||window.electronAPI?.isElectron?!1:window.matchMedia?.("(hover: none) and (pointer: coarse)").matches===!0}function nativeConfirmMessage(title,description){return[title,...description.split(/\n+/)].map(part=>part.trim()).filter(Boolean).join(`
|
|
4
|
+
|
|
5
|
+
`)}function Dialog({open,onClose,title,description,role="dialog",nativeOnTouch=!1,children}){let ref=useRef7(null),titleId=useId(),descriptionId=useId(),onCloseRef=useRef7(onClose);onCloseRef.current=onClose;let[native,setNative]=useState3(!1);return useIsoLayoutEffect2(()=>{if(!open)return;let dialog=ref.current;return dialog.showModal(),setNative(nativeOnTouch&&prefersNativeConfirm()),()=>{dialog.open&&dialog.close()}},[open,nativeOnTouch]),useEffect8(()=>{if(!open||!native)return;let dialog=ref.current,reveal,ask=setTimeout(()=>{let asked=performance.now(),describedBy=dialog.querySelector(".notis-dialog-description"),confirmed=window.confirm(nativeConfirmMessage(dialog.querySelector(".notis-dialog-title")?.textContent??"",describedBy?typeof describedBy.innerText=="string"?describedBy.innerText:describedBy.textContent??"":""));if(!confirmed&&performance.now()-asked<NATIVE_CONFIRM_MISSING_MS){setNative(!1);return}if(confirmed)dialog.querySelector("[data-dialog-confirm]")?.click();else{let cancel=dialog.querySelector("[data-dialog-cancel]");cancel?cancel.click():onCloseRef.current()}reveal=setTimeout(()=>setNative(!1),confirmed?NATIVE_CONFIRM_REVEAL_MS:0)},0);return()=>{clearTimeout(ask),reveal!==void 0&&clearTimeout(reveal)}},[open,native]),jsxs4("dialog",{ref,className:"notis-dialog",role,"aria-labelledby":titleId,"aria-describedby":description==null?void 0:descriptionId,"data-native-confirm":native?"":void 0,onCancel:event=>{event.preventDefault(),onClose()},onKeyDown:event=>event.stopPropagation(),children:[jsx5("h2",{id:titleId,className:"notis-dialog-title",children:title}),description!=null&&jsx5("p",{id:descriptionId,className:"notis-dialog-description",children:description}),children]})}import{jsx as jsx6}from"react/jsx-runtime";var overlayBaseStyle={position:"fixed",borderRadius:"3px",border:"1px solid rgba(35, 131, 226, 0.3)",background:"rgba(35, 131, 226, 0.08)",pointerEvents:"none",zIndex:50};function MultiSelectDragOverlay({rect,className,style}){if(!rect||rect.width===0&&rect.height===0)return null;let merged={...overlayBaseStyle,left:rect.left,top:rect.top,width:rect.width,height:rect.height,...style||null};return jsx6("div",{"aria-hidden":!0,className,style:merged})}import{useCallback as useCallback8,useEffect as useEffect9,useRef as useRef8,useState as useState4}from"react";var MARQUEE_INTERACTIVE_SELECTOR='button, a, input, textarea, select, [role="button"], [contenteditable]:not([contenteditable="false"])';function rectsIntersect(a,b){return a.left<b.right&&a.right>b.left&&a.top<b.bottom&&a.bottom>b.top}function itemsInMarquee(container,rect,itemAttribute,isSelectable){let nodes=container?.querySelectorAll(`[${itemAttribute}]`);if(!nodes)return[];let ids=[];return nodes.forEach(node=>{if(!rectsIntersect(rect,node.getBoundingClientRect()))return;let id=node.getAttribute(itemAttribute);id&&isSelectable(id)&&ids.push(id)}),ids}function useMarqueeSelection(options){let{enabled,itemAttribute,threshold=5,interactiveSelector=MARQUEE_INTERACTIVE_SELECTOR,startSelector}=options,latest=useRef8(options);latest.current=options;let[rect,setRect]=useState4(null),containerRef=useRef8(null),pendingRef=useRef8(!1),activeRef=useRef8(!1),startRef=useRef8({x:0,y:0}),currentRef=useRef8({x:0,y:0}),clickShouldClearRef=useRef8(!1),suppressNextClickRef=useRef8(!1),armSuppressNextClick=useCallback8(()=>{suppressNextClickRef.current=!0,setTimeout(()=>{suppressNextClickRef.current=!1},0)},[]),onMouseDown=useCallback8(event=>{if(!enabled||event.button!==0)return;let target=event.target;if(!target||typeof target.closest!="function")return;let itemTarget=target.closest(`[${itemAttribute}]`),interactiveTarget=target.closest(interactiveSelector);if(interactiveTarget&&interactiveTarget!==itemTarget){clickShouldClearRef.current=!1;return}if(clickShouldClearRef.current=!itemTarget,itemTarget){let startTarget=startSelector?target.closest(startSelector):null;if(!startTarget||!itemTarget.contains(startTarget))return;event.preventDefault()}containerRef.current=event.currentTarget,pendingRef.current=!0,startRef.current={x:event.clientX,y:event.clientY},currentRef.current={x:event.clientX,y:event.clientY}},[enabled,interactiveSelector,itemAttribute,startSelector]),onClickCapture=useCallback8(event=>{suppressNextClickRef.current&&(suppressNextClickRef.current=!1,event.preventDefault(),event.stopPropagation())},[]);return useEffect9(()=>{if(!enabled){pendingRef.current=!1,activeRef.current&&(activeRef.current=!1,setRect(null));return}if(typeof document>"u")return;let doc=document,handleMouseMove=event=>{if(pendingRef.current){let dx=event.clientX-startRef.current.x,dy=event.clientY-startRef.current.y;if(Math.abs(dx)>threshold||Math.abs(dy)>threshold)pendingRef.current=!1,activeRef.current=!0,window.getSelection()?.removeAllRanges();else return}if(!activeRef.current)return;event.preventDefault(),currentRef.current={x:event.clientX,y:event.clientY};let next={left:Math.min(startRef.current.x,currentRef.current.x),top:Math.min(startRef.current.y,currentRef.current.y),width:Math.abs(currentRef.current.x-startRef.current.x),height:Math.abs(currentRef.current.y-startRef.current.y)};setRect(next);let{itemAttribute:attribute,isSelectable,onSelect}=latest.current;onSelect(itemsInMarquee(containerRef.current,{left:next.left,top:next.top,right:next.left+next.width,bottom:next.top+next.height},attribute,isSelectable))},handleMouseUp=()=>{let wasPending=pendingRef.current,wasActive=activeRef.current;pendingRef.current=!1,activeRef.current=!1,wasActive?(setRect(null),clickShouldClearRef.current=!1,armSuppressNextClick()):wasPending&&clickShouldClearRef.current&&(clickShouldClearRef.current=!1,latest.current.onClear())};return doc.addEventListener("mousemove",handleMouseMove),doc.addEventListener("mouseup",handleMouseUp),()=>{doc.removeEventListener("mousemove",handleMouseMove),doc.removeEventListener("mouseup",handleMouseUp)}},[armSuppressNextClick,enabled,threshold]),{rect,onMouseDown,onClickCapture,armSuppressNextClick}}export{__export,isInteractionElementVisible,SHORTCUT_SCOPE_PRIORITY,createShortcutCollectionOwner,releaseShortcutCollection,activateShortcutCollection,isEditableShortcutEvent,useShortcuts,shortcutDisplay,SPACE_VIEWER_READ_OPERATIONS,SPACE_CLOUD_COMPUTER_OPERATIONS,spaceCloudComputerAllows,SPACE_VIEW_SPEC_VERSION,SpaceActionError,SpaceNavigationCancelled,isSpaceNavigationCancelled,spaceQueryKey,NotisProvider,useNotisRuntime,queryKey,createPrefetchQueue,createQueryClient,useQuery,useQueryClient,isWords,pick,fillWords,w,NNBSP,DOCUMENT_WORDS,isPresentString,asRecord,optionalString,extractRichText,getSecretValue,getRelationIds,normalizePropertyValue,normalizeDocumentRecord,normalizeDatabaseProperty,markdownToPlainText,blockNoteToPlainText,getDocumentPreview,useNativeDocuments,useNativeMutation,useNativeDelete,VIEW_PERIODS,isViewDate,isViewPeriod,resolveViewPeriod,parseViewParams,writeViewParams,useViewParams,useShownAvailable,useShown,useTopBarSearch,useTopBarTitleLeaf,useMarqueeSelection,hasIcon,Icon,renderIcon,RenderChartData,isValidKeySpec,isSequenceSpec,keyList,canonicalKey,matchChord,matchKey,KEY_JOIN_WORDS,formatKeyParts,formatKey,toAriaKeyShortcuts,formatKeySpoken,actionErrorReason,STANDARD_ACTIONS,isStandardActionId,resolveActionRef,toWords,SHELL_WORDS,selectedCount,HELP_WORDS,DEFAULT_KEYMAP,keyFingerprints,selfClashes,eventTarget,closestComposed,containsComposed,keysOff,isVisibleComposed,openModalLayers,modalLayerOf,ROOT_OWNER,NotisKeyClash,ShortcutRegistry,safeWhen,ESCAPE_PRIORITY,SEQUENCE_TIMEOUT_MS,detectPlatform,detectLocale,KeyboardEngineCore,getSharedInstance,useEngineCore,useShortcutOwner,useToolkitLocale,useToolkitPlatform,useToolkitSettings,useShortcut,useShortcuts2,useShortcutScope,useEscapeLayer,useEscapeBlocker,useHelpSheet,useRegistryVersion,cx,useT,useLabelValue,flag,useIsoLayoutEffect2 as useIsoLayoutEffect,useLatest,useStableId,eventWithin,deepActiveElement,revealInline,Dialog,MultiSelectDragOverlay};
|
|
@@ -0,0 +1,15 @@
|
|
|
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:`
|
|
3
|
+
[data-notis-bulk-action-icon][data-has-shortcut] { display: none !important; }
|
|
4
|
+
@media (max-width: 639px) {
|
|
5
|
+
[data-notis-bulk-actions] { flex-wrap: wrap; width: calc(100% - 2rem) !important; }
|
|
6
|
+
[data-notis-bulk-count] { flex-basis: 100%; padding: 0.375rem 0.5rem !important; font-size: 14px !important; }
|
|
7
|
+
[data-notis-bulk-divider] { display: none; }
|
|
8
|
+
[data-notis-bulk-action-list] { width: 100%; }
|
|
9
|
+
[data-notis-bulk-actions] button { min-height: 48px; font-size: 16px !important; }
|
|
10
|
+
}
|
|
11
|
+
@media (hover: none) and (pointer: coarse) {
|
|
12
|
+
[data-notis-bulk-actions] kbd { display: none !important; }
|
|
13
|
+
[data-notis-bulk-action-icon][data-has-shortcut] { display: inline-flex !important; }
|
|
14
|
+
}
|
|
15
|
+
`}),jsx8("span",{"data-notis-bulk-count":!0,style:countStyle,children:countLabel}),actions.length>0?jsx8("span",{"data-notis-bulk-divider":!0,"aria-hidden":!0,style:dividerStyle}):null,jsx8("div",{"data-notis-bulk-action-list":!0,style:{display:"flex",minWidth:0,overflowX:"auto",overscrollBehaviorX:"contain",gap:"0.25rem"},children:actions.map(action=>jsx8(ActionButton,{action},action.id))})]})}function ActionButton({action}){let[hover,setHover]=useState12(!1),display=action.shortcut?shortcutDisplay(action.shortcut):null,buttonStyle={...baseButtonStyle,background:hover?"color-mix(in srgb, hsl(var(--background)) 12%, transparent)":"transparent",color:hover?"hsl(var(--background))":baseButtonStyle.color,opacity:action.disabled?.45:1,cursor:action.disabled||action.pending?"not-allowed":"pointer"};return jsxs5("button",{type:"button",onClick:()=>{!action.disabled&&!action.pending&&action.onRun()},disabled:action.disabled||action.pending,"aria-busy":action.pending||void 0,"aria-keyshortcuts":action.shortcut||void 0,"data-destructive":action.destructive?"true":"false",onMouseEnter:()=>setHover(!0),onMouseLeave:()=>setHover(!1),onFocus:()=>setHover(!0),onBlur:()=>setHover(!1),style:buttonStyle,children:[action.icon?jsx8("span",{"data-notis-bulk-action-icon":!0,"data-has-shortcut":action.shortcut?"":void 0,"aria-hidden":!0,style:iconSlotStyle,children:action.icon}):null,display?jsx8("kbd",{"aria-hidden":!0,style:keycapStyle,children:display}):null,jsx8("span",{children:action.pending?`${action.label}\u2026`:action.label})]})}import{jsx as jsx9}from"react/jsx-runtime";var baseStyle={flexShrink:0,display:"inline-flex",alignItems:"center",justifyContent:"center",width:"16px",height:"16px",borderRadius:"4px",borderWidth:"1px",borderStyle:"solid",borderColor:"hsl(var(--border))",background:"transparent",color:"hsl(var(--primary-foreground))",cursor:"pointer",padding:0,transition:"background-color 120ms ease, border-color 120ms ease, opacity 150ms ease"},selectedStyle={background:"hsl(var(--primary))",borderColor:"hsl(var(--primary))"},checkPath="M3.5 7.5l2.5 2.5 6.5-6.5";function MultiSelectCheckbox({isSelected,onClick,disabled=!1,alwaysVisible=!1,ariaLabel,className,style}){let merged={...baseStyle,...isSelected?selectedStyle:null,...alwaysVisible||isSelected?{opacity:1}:null,...disabled?{opacity:.45,cursor:"not-allowed"}:null,...style||null};return jsx9("button",{type:"button",role:"checkbox","aria-checked":isSelected,disabled,"aria-label":ariaLabel??(isSelected?"Deselect item":"Select item"),onClick,onMouseDown:e=>e.stopPropagation(),"data-notis-multiselect-checkbox":"","data-selected":isSelected?"true":"false",className,style:merged,children:isSelected?jsx9("svg",{width:"10",height:"10",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:3,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,focusable:"false",children:jsx9("path",{d:checkPath})}):null})}import{jsx as jsx10,jsxs as jsxs6}from"react/jsx-runtime";var listStyle={display:"flex",flexWrap:"wrap",alignItems:"center",gap:"0.75rem",color:"hsl(var(--muted-foreground))",fontSize:"12px"},hintStyle={display:"inline-flex",alignItems:"center",gap:"0.35rem"},keyStyle={minWidth:"20px",border:"1px solid hsl(var(--border))",borderRadius:"4px",background:"hsl(var(--muted))",color:"hsl(var(--foreground))",padding:"1px 5px",textAlign:"center",font:"inherit"};function ShortcutHints({shortcuts,className,style}){return shortcuts.length===0?null:jsx10("div",{"aria-label":"Keyboard shortcuts",className,style:{...listStyle,...style},children:shortcuts.map(shortcut=>jsxs6("span",{style:hintStyle,children:[jsx10("kbd",{style:keyStyle,children:shortcutDisplay(shortcut.keys)}),jsx10("span",{children:shortcut.label})]},shortcut.id))})}function useToolQuery(name,args={},options){let runtime=useNotisRuntime();return useQuery(["tool",name,args],()=>runtime.callTool(name,args,{readOnly:!0,dedupe:!0}),options)}import{useMemo as useMemo4}from"react";function useAgentContext(){let runtime=useNotisRuntime();return useMemo4(()=>({add(item){return runtime?.addContext?runtime.addContext(item):Promise.reject(new Error("Chat context is unavailable in this host."))},update(item){return runtime?.updateContext?runtime.updateContext(item):Promise.reject(new Error("Chat context is unavailable in this host."))},remove(id){return runtime?.removeContext?runtime.removeContext(id):Promise.reject(new Error("Chat context is unavailable in this host."))}}),[runtime])}import{useEffect as useEffect9,useRef as useRef10,useState as useState13}from"react";import{jsx as jsx11,jsxs as jsxs7}from"react/jsx-runtime";function NotisCommentBox({quote,value,onChange,onSubmit,onCancel,pending,error,className=""}){return jsxs7("div",{"data-notis-comment-ui":!0,role:"dialog","aria-label":"Comment on selection",style:{colorScheme:"dark",background:"hsl(var(--sidebar-background, 0 0% 7.5%))",color:"hsl(var(--sidebar-foreground, 240 4.8% 95.9%))",borderColor:"hsl(var(--sidebar-border, 0 0% 23.5%))"},className:`flex min-w-0 flex-col gap-2 rounded-xl border p-2.5 text-sm shadow-lg ${className}`,children:[jsxs7("div",{className:"flex min-w-0 items-center gap-2",children:[quote&&jsx11("blockquote",{title:quote,className:"min-w-0 flex-1 truncate border-l-2 border-current/40 pl-2 opacity-70",children:quote}),jsx11("button",{type:"button","aria-label":"Cancel comment",onClick:onCancel,disabled:pending,className:"ml-auto flex size-7 shrink-0 items-center justify-center rounded-lg opacity-70 hover:bg-white/10 hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-current disabled:opacity-40 [@media(pointer:coarse)]:size-9",children:jsx11("svg",{"aria-hidden":"true",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",children:jsx11("path",{d:"m6 6 12 12M18 6 6 18"})})})]}),jsx11("textarea",{autoFocus:!0,rows:2,name:"selection-comment","aria-label":"Your comment",placeholder:"Add a comment\u2026",value,onChange:event=>onChange(event.target.value),disabled:pending,onKeyDown:event=>{event.nativeEvent.isComposing||pending||(event.key==="Escape"&&(event.preventDefault(),onCancel()),event.key==="Enter"&&(event.metaKey||event.ctrlKey)&&(event.preventDefault(),value.trim()&&onSubmit()))},className:"w-full min-w-0 resize-none rounded bg-transparent px-0.5 py-1 text-base text-inherit outline-none placeholder:text-current placeholder:opacity-60 sm:text-sm"}),error&&jsx11("p",{role:"alert",className:"text-sm text-red-300",children:error}),jsxs7("div",{className:"flex items-center justify-between gap-3",children:[jsx11("span",{className:"text-xs opacity-60",children:"\u2318 / Ctrl \u21B5 to add"}),jsx11("button",{type:"button",disabled:pending||!value.trim(),onClick:onSubmit,style:{background:"hsl(var(--sidebar-foreground, 240 4.8% 95.9%))",color:"hsl(var(--sidebar-background, 0 0% 7.5%))"},className:"min-h-8 shrink-0 rounded-lg px-2.5 text-sm font-medium hover:opacity-90 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-current disabled:opacity-40 [@media(pointer:coarse)]:min-h-9",children:pending?"Adding\u2026":"Add to chat"})]})]})}function getCommentActionPosition(rects,viewport,rightBoundary=viewport.width,trailing=[]){let last=rects[rects.length-1],size=32,gap=8,clampX=x=>Math.max(gap,Math.min(viewport.width-size-gap,x)),clampY=y=>Math.max(gap,Math.min(viewport.height-size-gap,y)),beside={left:last.right+gap,top:clampY((last.top+last.bottom-size)/2)},overlapsText=trailing.some(rect=>rect.left<beside.left+size&&rect.right>beside.left&&rect.top<beside.top+size&&rect.bottom>beside.top);return beside.left+size<=Math.min(viewport.width,rightBoundary)-gap&&!overlapsText?beside:{left:clampX(last.right-size),top:clampY(last.bottom+gap+size<=viewport.height-gap?last.bottom+gap:last.top-size-gap)}}function getOwnedCommentRange(selected,content){let owned=content.ownerDocument.createRange();owned.selectNodeContents(content);let range=selected.cloneRange();if(range.compareBoundaryPoints(Range.START_TO_START,owned)<0){let before=range.cloneRange();if(before.setEnd(owned.startContainer,owned.startOffset),before.toString().trim())return null;range.setStart(owned.startContainer,owned.startOffset)}if(range.compareBoundaryPoints(Range.END_TO_END,owned)>0){let after=range.cloneRange();if(after.setStart(owned.endContainer,owned.endOffset),after.toString().trim())return null;range.setEnd(owned.endContainer,owned.endOffset)}return range.collapsed||!content.contains(range.startContainer)||!content.contains(range.endContainer)?null:range}function NotisCommentBoundary({resource,children,className,commentClassName,renderComment}){let context=useAgentContext(),root=useRef10(null),[selection,setSelection]=useState13(null),[editing,setEditing]=useState13(!1),editingRef=useRef10(!1),[comment,setComment]=useState13(""),[pending,setPending]=useState13(!1),[error,setError]=useState13("");useEffect9(()=>{let node=root.current;if(!node)return;let document=node.ownerDocument,scope=node.getRootNode(),clearInvalidSelection=()=>{if(editingRef.current)return;let selected=scope.getSelection?.()||document.defaultView?.getSelection(),content=node.firstElementChild;(!selected?.rangeCount||selected.isCollapsed||!selected.toString().trim()||!content||!getOwnedCommentRange(selected.getRangeAt(0),content))&&setSelection(null)};return document.addEventListener("selectionchange",clearInvalidSelection),scope!==document&&scope.addEventListener("selectionchange",clearInvalidSelection),()=>{document.removeEventListener("selectionchange",clearInvalidSelection),scope!==document&&scope.removeEventListener("selectionchange",clearInvalidSelection)}},[]);let open=()=>{editingRef.current=!0,setEditing(!0)},capture=target=>{if(editing||target instanceof Element&&target.closest("[data-notis-comment-ui]"))return;let node=root.current,selected=node?.getRootNode()?.getSelection?.()||window.getSelection();if(!node||!selected?.rangeCount||selected.isCollapsed){setSelection(null);return}let content=node.firstElementChild,range=content?getOwnedCommentRange(selected.getRangeAt(0),content):null;if(!range){setSelection(null);return}let start=range.startContainer.nodeType===Node.ELEMENT_NODE?range.startContainer:range.startContainer.parentElement,end=range.endContainer.nodeType===Node.ELEMENT_NODE?range.endContainer:range.endContainer.parentElement;if(!node.contains(range.startContainer)||!node.contains(range.endContainer)||start?.closest("input,textarea,button,[contenteditable],[data-notis-comment-ui]")||end?.closest("input,textarea,button,[contenteditable],[data-notis-comment-ui]")){setSelection(null);return}let rect=range.getBoundingClientRect(),lines=Array.from(range.getClientRects?.()||[]).filter(line=>line.width>0&&line.height>0),boundary=node.firstElementChild?.getBoundingClientRect(),trailing=[],endBlock=end?.closest("p,li,h1,h2,h3,h4,h5,h6,td,th,div");if(endBlock&&node.contains(endBlock)){let remainder=range.cloneRange();remainder.selectNodeContents(endBlock),remainder.setStart(range.endContainer,range.endOffset),trailing.push(...Array.from(remainder.getClientRects?.()||[]).filter(line=>line.width>0&&line.height>0))}let position=getCommentActionPosition(lines.length?lines:[rect],{width:window.innerWidth,height:window.innerHeight},boundary?.width?boundary.right:window.innerWidth,trailing);setSelection({id:crypto.randomUUID(),text:selected.toString().trim(),resource:resource?JSON.parse(JSON.stringify(resource)):null,...position})},close=()=>{editingRef.current=!1,setEditing(!1),setSelection(null),setComment(""),setError("")},submit=async()=>{if(!(!selection||!comment.trim()||pending)){setPending(!0),setError("");try{if(!await context.add({id:selection.id,kind:"comment",title:selection.resource?.label||"Comment",icon:"phosphor:chat-text",text:selection.text,comment,resource:selection.resource}))throw new Error("The comment could not be added to chat.");close()}catch(reason){setError(reason instanceof Error?reason.message:"Could not add this comment.")}finally{setPending(!1)}}},editorProps={quote:selection?.text,value:comment,onChange:setComment,onSubmit:()=>{submit()},onCancel:close,pending,error,className:commentClassName};return jsxs7("div",{ref:root,className:"contents",onMouseUp:event=>capture(event.target),onDoubleClick:event=>capture(event.target),onKeyUp:event=>{!editing&&(event.shiftKey||event.key==="Shift"||(event.metaKey||event.ctrlKey)&&event.key.toLowerCase()==="a")&&capture(event.target)},children:[jsx11(NotisSelectionBoundary,{resource,className,style:className?void 0:{display:"contents"},children}),selection&&jsx11("div",{"data-notis-comment-ui":!0,className:"fixed z-50 max-h-[calc(100dvh-1rem)]",style:{overflow:editing?"auto":"visible",top:editing?Math.min(selection.top,Math.max(8,window.innerHeight-320)):selection.top,left:`clamp(8px, ${selection.left}px, calc(100vw - ${editing?"min(20rem, calc(100vw - 1rem))":"2rem"} - 8px))`,width:editing?"min(20rem, calc(100vw - 1rem))":void 0},children:editing?renderComment?renderComment(editorProps):jsx11(NotisCommentBox,{...editorProps}):jsxs7("button",{type:"button","aria-label":"Comment",title:"Comment",onMouseDown:event=>event.preventDefault(),onClick:open,style:{background:"hsl(var(--sidebar-background, 0 0% 7.5%))",color:"hsl(var(--sidebar-foreground, 240 4.8% 95.9%))"},className:"relative flex size-8 items-center justify-center rounded-lg ring-1 ring-white/15 hover:opacity-90 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-current",children:[jsx11("svg",{"aria-hidden":"true",width:"18",height:"18",viewBox:"0 0 256 256",fill:"currentColor",children:jsx11("path",{d:"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H80a8,8,0,0,0-5.23,1.95L40,224V64H216ZM88,112a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H96A8,8,0,0,1,88,112Zm0,32a8,8,0,0,1,8-8h64a8,8,0,1,1,0,16H96A8,8,0,0,1,88,144Z"})}),jsx11("span",{"aria-hidden":"true",className:"absolute left-1/2 top-1/2 hidden size-12 -translate-x-1/2 -translate-y-1/2 [@media(pointer:coarse)]:block"})]})})]})}function journalViewParams(timezone){return{period:{type:"period",description:"Calendar period, inclusive. Which dates should the journal show?",timezone}}}function tasksViewParams({timezone,projectDatabase,statuses}){return{...journalViewParams(timezone),dueDate:{type:"date",description:"Which exact due date should the task list show?",timezone},late:{type:"boolean",description:"Only unfinished tasks due before today in the selected timezone."},notPlanned:{type:"boolean",description:"Only tasks without a due date."},today:{type:"date",default:"today",timezone,description:"Reference date for late tasks; pin it for a dated answer."},project:{type:"record",database:projectDatabase,description:"Which project should the tasks belong to?"},status:{type:"enum",values:statuses,description:"Which task status should the list show?"}}}function tasksViewFilter({dueProperty,statusProperty,projectProperty,doneStatus}){return{and:[{field:{property:dueProperty},op:"equals",value:"{dueDate}"},{field:{property:dueProperty},op:"on_or_after",value:"{period.start}"},{field:{property:dueProperty},op:"on_or_before",value:"{period.end}"},{field:{property:dueProperty},op:"before",value:"{today}",when:"late"},{field:{property:statusProperty},op:"not_equals",value:doneStatus,when:"late"},{field:{property:dueProperty},op:"is_empty",when:"notPlanned"},{field:{property:projectProperty},op:"contains",value:"{project}"},{field:{property:statusProperty},op:"equals",value:"{status}"}]}}export{COLLECTION_ITEM_ATTRIBUTE,DOCUMENT_WORDS,Dialog,DocumentEditor,DocumentPage,DocumentPageSkeleton,HtmlFrame,Markdown,MarkdownEditor,MultiSelectActionBar,MultiSelectCheckbox,MultiSelectDragOverlay,NOTIS_CONTEXT_CLIPBOARD_TYPE,NotisCommentBoundary,NotisCommentBox,NotisProvider,NotisSelectionBoundary,RecordProperties,RenderChartData,ReportFrame,SHORTCUT_SCOPE_PRIORITY,SKELETON_WORDS,SPACE_CLOUD_COMPUTER_OPERATIONS,SPACE_VIEWER_READ_OPERATIONS,SPACE_VIEW_SPEC_VERSION,MultiSelectCheckbox as SelectionCheckbox,MultiSelectDragOverlay as SelectionMarquee,ShareControl,ShortcutHints,Skeleton,SpaceActionError,SpaceNavigationCancelled,SpacePageFrame,VIEW_PERIODS,ViewSkeleton,asRecord,blockNoteToPlainText,createPrefetchQueue,createQueryClient,extractRichText,getDocumentPreview,getRelationIds,getSecretValue,isEditableShortcutEvent,isInteractionElementVisible,isPresentString,isSpaceNavigationCancelled,isViewDate,isViewPeriod,journalViewParams,markdownToPlainText,normalizeDatabaseProperty,normalizeDocumentRecord,normalizePropertyValue,optionalString,parseViewParams,queryKey,resolveViewPeriod,shortcutDisplay,spaceCloudComputerAllows,tasksViewFilter,tasksViewParams,useAction,useActionQuery,useActiveResource,useAgentContext,useBackend,useCloudComputer,useCloudComputerShell,useCollectionInteractions,useDatabaseSchema,useDatabaseSubscription,useDocument,useDocuments,useHandover,useLongPressSelection,useMultiSelect,useNativeDelete,useNativeDocumentBody,useNativeDocuments,useNativeMutation,useNotis,useNotisNavigation,useNotisRuntime,usePrefetchRecord,useQuery,useQueryClient,useShortcuts,useShown,useShownAvailable,useTool,useToolQuery,useTools,useTopBarSearch,useTopBarTitleLeaf,useUpsertDocument,useViewParams,useViewerDatabases,useViewerRead,useViewerReadAvailable,useViewerSkills};
|