@fraziym/axoniz 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +76 -0
- package/dist/agents/definition.d.ts +15 -0
- package/dist/agents/definition.d.ts.map +1 -0
- package/dist/agents/definition.js +41 -0
- package/dist/agents/definition.js.map +1 -0
- package/dist/agents/index.d.ts +12 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +11 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/registry.d.ts +17 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +23 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/specialized.d.ts +31 -0
- package/dist/agents/specialized.d.ts.map +1 -0
- package/dist/agents/specialized.js +75 -0
- package/dist/agents/specialized.js.map +1 -0
- package/dist/awareness/index.d.ts +14 -0
- package/dist/awareness/index.d.ts.map +1 -0
- package/dist/awareness/index.js +22 -0
- package/dist/awareness/index.js.map +1 -0
- package/dist/awareness/service.d.ts +180 -0
- package/dist/awareness/service.d.ts.map +1 -0
- package/dist/awareness/service.js +789 -0
- package/dist/awareness/service.js.map +1 -0
- package/dist/cli/entry.d.ts +13 -0
- package/dist/cli/entry.d.ts.map +1 -0
- package/dist/cli/entry.js +35 -0
- package/dist/cli/entry.js.map +1 -0
- package/dist/comms/telegram.d.ts +41 -0
- package/dist/comms/telegram.d.ts.map +1 -0
- package/dist/comms/telegram.js +332 -0
- package/dist/comms/telegram.js.map +1 -0
- package/dist/core/agent.d.ts +252 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +1399 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/auth.d.ts +23 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +113 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/authority.d.ts +118 -0
- package/dist/core/authority.d.ts.map +1 -0
- package/dist/core/authority.js +402 -0
- package/dist/core/authority.js.map +1 -0
- package/dist/core/backend/async_queue.d.ts +17 -0
- package/dist/core/backend/async_queue.d.ts.map +1 -0
- package/dist/core/backend/async_queue.js +66 -0
- package/dist/core/backend/async_queue.js.map +1 -0
- package/dist/core/backend/index.d.ts +24 -0
- package/dist/core/backend/index.d.ts.map +1 -0
- package/dist/core/backend/index.js +128 -0
- package/dist/core/backend/index.js.map +1 -0
- package/dist/core/backend/llama_server.d.ts +39 -0
- package/dist/core/backend/llama_server.d.ts.map +1 -0
- package/dist/core/backend/llama_server.js +182 -0
- package/dist/core/backend/llama_server.js.map +1 -0
- package/dist/core/backend/llamacpp.d.ts +40 -0
- package/dist/core/backend/llamacpp.d.ts.map +1 -0
- package/dist/core/backend/llamacpp.js +200 -0
- package/dist/core/backend/llamacpp.js.map +1 -0
- package/dist/core/backend/lmstudio.d.ts +53 -0
- package/dist/core/backend/lmstudio.d.ts.map +1 -0
- package/dist/core/backend/lmstudio.js +274 -0
- package/dist/core/backend/lmstudio.js.map +1 -0
- package/dist/core/backend/ollama.d.ts +25 -0
- package/dist/core/backend/ollama.d.ts.map +1 -0
- package/dist/core/backend/ollama.js +86 -0
- package/dist/core/backend/ollama.js.map +1 -0
- package/dist/core/backend/openai.d.ts +27 -0
- package/dist/core/backend/openai.d.ts.map +1 -0
- package/dist/core/backend/openai.js +84 -0
- package/dist/core/backend/openai.js.map +1 -0
- package/dist/core/backend/types.d.ts +73 -0
- package/dist/core/backend/types.d.ts.map +1 -0
- package/dist/core/backend/types.js +137 -0
- package/dist/core/backend/types.js.map +1 -0
- package/dist/core/chat_store.d.ts +77 -0
- package/dist/core/chat_store.d.ts.map +1 -0
- package/dist/core/chat_store.js +332 -0
- package/dist/core/chat_store.js.map +1 -0
- package/dist/core/cli.d.ts +82 -0
- package/dist/core/cli.d.ts.map +1 -0
- package/dist/core/cli.js +602 -0
- package/dist/core/cli.js.map +1 -0
- package/dist/core/config.d.ts +127 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +295 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/debug.d.ts +8 -0
- package/dist/core/debug.d.ts.map +1 -0
- package/dist/core/debug.js +8 -0
- package/dist/core/debug.js.map +1 -0
- package/dist/core/downloader.d.ts +31 -0
- package/dist/core/downloader.d.ts.map +1 -0
- package/dist/core/downloader.js +180 -0
- package/dist/core/downloader.js.map +1 -0
- package/dist/core/errors.d.ts +80 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +134 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/extras.d.ts +160 -0
- package/dist/core/extras.d.ts.map +1 -0
- package/dist/core/extras.js +553 -0
- package/dist/core/extras.js.map +1 -0
- package/dist/core/health.d.ts +27 -0
- package/dist/core/health.d.ts.map +1 -0
- package/dist/core/health.js +96 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/history.d.ts +50 -0
- package/dist/core/history.d.ts.map +1 -0
- package/dist/core/history.js +276 -0
- package/dist/core/history.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/intelligence/ast_index.d.ts +255 -0
- package/dist/core/intelligence/ast_index.d.ts.map +1 -0
- package/dist/core/intelligence/ast_index.js +1369 -0
- package/dist/core/intelligence/ast_index.js.map +1 -0
- package/dist/core/intelligence/confidence.d.ts +113 -0
- package/dist/core/intelligence/confidence.d.ts.map +1 -0
- package/dist/core/intelligence/confidence.js +298 -0
- package/dist/core/intelligence/confidence.js.map +1 -0
- package/dist/core/intelligence/context_compressor.d.ts +80 -0
- package/dist/core/intelligence/context_compressor.d.ts.map +1 -0
- package/dist/core/intelligence/context_compressor.js +245 -0
- package/dist/core/intelligence/context_compressor.js.map +1 -0
- package/dist/core/intelligence/daemon.d.ts +247 -0
- package/dist/core/intelligence/daemon.d.ts.map +1 -0
- package/dist/core/intelligence/daemon.js +842 -0
- package/dist/core/intelligence/daemon.js.map +1 -0
- package/dist/core/intelligence/index.d.ts +60 -0
- package/dist/core/intelligence/index.d.ts.map +1 -0
- package/dist/core/intelligence/index.js +101 -0
- package/dist/core/intelligence/index.js.map +1 -0
- package/dist/core/intelligence/predictor.d.ts +246 -0
- package/dist/core/intelligence/predictor.d.ts.map +1 -0
- package/dist/core/intelligence/predictor.js +590 -0
- package/dist/core/intelligence/predictor.js.map +1 -0
- package/dist/core/intelligence/reflex.d.ts +84 -0
- package/dist/core/intelligence/reflex.d.ts.map +1 -0
- package/dist/core/intelligence/reflex.js +344 -0
- package/dist/core/intelligence/reflex.js.map +1 -0
- package/dist/core/intelligence/self_correction.d.ts +121 -0
- package/dist/core/intelligence/self_correction.d.ts.map +1 -0
- package/dist/core/intelligence/self_correction.js +327 -0
- package/dist/core/intelligence/self_correction.js.map +1 -0
- package/dist/core/intelligence/skill_distiller.d.ts +100 -0
- package/dist/core/intelligence/skill_distiller.d.ts.map +1 -0
- package/dist/core/intelligence/skill_distiller.js +246 -0
- package/dist/core/intelligence/skill_distiller.js.map +1 -0
- package/dist/core/intelligence/swarm.d.ts +330 -0
- package/dist/core/intelligence/swarm.d.ts.map +1 -0
- package/dist/core/intelligence/swarm.js +1064 -0
- package/dist/core/intelligence/swarm.js.map +1 -0
- package/dist/core/intelligence/trajectory.d.ts +107 -0
- package/dist/core/intelligence/trajectory.d.ts.map +1 -0
- package/dist/core/intelligence/trajectory.js +330 -0
- package/dist/core/intelligence/trajectory.js.map +1 -0
- package/dist/core/logger.d.ts +111 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +640 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/loop.d.ts +123 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +423 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/memory.d.ts +81 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +328 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/metrics.d.ts +29 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +109 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/models.d.ts +51 -0
- package/dist/core/models.d.ts.map +1 -0
- package/dist/core/models.js +146 -0
- package/dist/core/models.js.map +1 -0
- package/dist/core/optimizer.d.ts +34 -0
- package/dist/core/optimizer.d.ts.map +1 -0
- package/dist/core/optimizer.js +131 -0
- package/dist/core/optimizer.js.map +1 -0
- package/dist/core/persona.d.ts +35 -0
- package/dist/core/persona.d.ts.map +1 -0
- package/dist/core/persona.js +126 -0
- package/dist/core/persona.js.map +1 -0
- package/dist/core/rate_limit.d.ts +23 -0
- package/dist/core/rate_limit.d.ts.map +1 -0
- package/dist/core/rate_limit.js +62 -0
- package/dist/core/rate_limit.js.map +1 -0
- package/dist/core/runner.d.ts +63 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +671 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/stream_parser.d.ts +43 -0
- package/dist/core/stream_parser.d.ts.map +1 -0
- package/dist/core/stream_parser.js +140 -0
- package/dist/core/stream_parser.js.map +1 -0
- package/dist/core/tool_schemas.d.ts +26 -0
- package/dist/core/tool_schemas.d.ts.map +1 -0
- package/dist/core/tool_schemas.js +124 -0
- package/dist/core/tool_schemas.js.map +1 -0
- package/dist/core/which.d.ts +2 -0
- package/dist/core/which.d.ts.map +1 -0
- package/dist/core/which.js +35 -0
- package/dist/core/which.js.map +1 -0
- package/dist/goals/index.d.ts +9 -0
- package/dist/goals/index.d.ts.map +1 -0
- package/dist/goals/index.js +17 -0
- package/dist/goals/index.js.map +1 -0
- package/dist/goals/service.d.ts +115 -0
- package/dist/goals/service.d.ts.map +1 -0
- package/dist/goals/service.js +415 -0
- package/dist/goals/service.js.map +1 -0
- package/dist/goals/types.d.ts +47 -0
- package/dist/goals/types.d.ts.map +1 -0
- package/dist/goals/types.js +66 -0
- package/dist/goals/types.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/autonomous_startup.d.ts +51 -0
- package/dist/integrations/autonomous_startup.d.ts.map +1 -0
- package/dist/integrations/autonomous_startup.js +419 -0
- package/dist/integrations/autonomous_startup.js.map +1 -0
- package/dist/integrations/goose.d.ts +105 -0
- package/dist/integrations/goose.d.ts.map +1 -0
- package/dist/integrations/goose.js +408 -0
- package/dist/integrations/goose.js.map +1 -0
- package/dist/integrations/index.d.ts +21 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +17 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/mcp.d.ts +73 -0
- package/dist/integrations/mcp.d.ts.map +1 -0
- package/dist/integrations/mcp.js +307 -0
- package/dist/integrations/mcp.js.map +1 -0
- package/dist/integrations/mempalace.d.ts +18 -0
- package/dist/integrations/mempalace.d.ts.map +1 -0
- package/dist/integrations/mempalace.js +25 -0
- package/dist/integrations/mempalace.js.map +1 -0
- package/dist/integrations/multi_agent.d.ts +82 -0
- package/dist/integrations/multi_agent.d.ts.map +1 -0
- package/dist/integrations/multi_agent.js +280 -0
- package/dist/integrations/multi_agent.js.map +1 -0
- package/dist/integrations/unified_memory.d.ts +415 -0
- package/dist/integrations/unified_memory.d.ts.map +1 -0
- package/dist/integrations/unified_memory.js +1489 -0
- package/dist/integrations/unified_memory.js.map +1 -0
- package/dist/roles/beru.yaml +48 -0
- package/dist/sidecar/client.d.ts +63 -0
- package/dist/sidecar/client.d.ts.map +1 -0
- package/dist/sidecar/client.js +222 -0
- package/dist/sidecar/client.js.map +1 -0
- package/dist/sidecar/index.d.ts +7 -0
- package/dist/sidecar/index.d.ts.map +1 -0
- package/dist/sidecar/index.js +6 -0
- package/dist/sidecar/index.js.map +1 -0
- package/dist/startup.d.ts +22 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +194 -0
- package/dist/startup.js.map +1 -0
- package/dist/tools/_internal.d.ts +90 -0
- package/dist/tools/_internal.d.ts.map +1 -0
- package/dist/tools/_internal.js +375 -0
- package/dist/tools/_internal.js.map +1 -0
- package/dist/tools/_smoke.d.ts +2 -0
- package/dist/tools/_smoke.d.ts.map +1 -0
- package/dist/tools/_smoke.js +203 -0
- package/dist/tools/_smoke.js.map +1 -0
- package/dist/tools/axodex_tools.d.ts +51 -0
- package/dist/tools/axodex_tools.d.ts.map +1 -0
- package/dist/tools/axodex_tools.js +181 -0
- package/dist/tools/axodex_tools.js.map +1 -0
- package/dist/tools/code_tools.d.ts +33 -0
- package/dist/tools/code_tools.d.ts.map +1 -0
- package/dist/tools/code_tools.js +191 -0
- package/dist/tools/code_tools.js.map +1 -0
- package/dist/tools/computer_tools.d.ts +59 -0
- package/dist/tools/computer_tools.d.ts.map +1 -0
- package/dist/tools/computer_tools.js +348 -0
- package/dist/tools/computer_tools.js.map +1 -0
- package/dist/tools/file_tools.d.ts +51 -0
- package/dist/tools/file_tools.d.ts.map +1 -0
- package/dist/tools/file_tools.js +424 -0
- package/dist/tools/file_tools.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +13 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/shell_tools.d.ts +39 -0
- package/dist/tools/shell_tools.d.ts.map +1 -0
- package/dist/tools/shell_tools.js +163 -0
- package/dist/tools/shell_tools.js.map +1 -0
- package/dist/tools/web_tools.d.ts +31 -0
- package/dist/tools/web_tools.d.ts.map +1 -0
- package/dist/tools/web_tools.js +117 -0
- package/dist/tools/web_tools.js.map +1 -0
- package/dist/voice/index.d.ts +41 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +58 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/light_daemon.d.ts +197 -0
- package/dist/voice/light_daemon.d.ts.map +1 -0
- package/dist/voice/light_daemon.js +746 -0
- package/dist/voice/light_daemon.js.map +1 -0
- package/dist/voice/setup.d.ts +63 -0
- package/dist/voice/setup.d.ts.map +1 -0
- package/dist/voice/setup.js +443 -0
- package/dist/voice/setup.js.map +1 -0
- package/dist/voice/stt.d.ts +148 -0
- package/dist/voice/stt.d.ts.map +1 -0
- package/dist/voice/stt.js +361 -0
- package/dist/voice/stt.js.map +1 -0
- package/dist/voice/tts.d.ts +168 -0
- package/dist/voice/tts.d.ts.map +1 -0
- package/dist/voice/tts.js +698 -0
- package/dist/voice/tts.js.map +1 -0
- package/dist/voice/voice_loop.d.ts +101 -0
- package/dist/voice/voice_loop.d.ts.map +1 -0
- package/dist/voice/voice_loop.js +463 -0
- package/dist/voice/voice_loop.js.map +1 -0
- package/dist/voice/wake_word.d.ts +153 -0
- package/dist/voice/wake_word.d.ts.map +1 -0
- package/dist/voice/wake_word.js +458 -0
- package/dist/voice/wake_word.js.map +1 -0
- package/dist/voice/wav.d.ts +99 -0
- package/dist/voice/wav.d.ts.map +1 -0
- package/dist/voice/wav.js +306 -0
- package/dist/voice/wav.js.map +1 -0
- package/dist/web/broker.d.ts +33 -0
- package/dist/web/broker.d.ts.map +1 -0
- package/dist/web/broker.js +58 -0
- package/dist/web/broker.js.map +1 -0
- package/dist/web/open_browser.d.ts +2 -0
- package/dist/web/open_browser.d.ts.map +1 -0
- package/dist/web/open_browser.js +42 -0
- package/dist/web/open_browser.js.map +1 -0
- package/dist/web/server.d.ts +54 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +831 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/static/app.js +4121 -0
- package/dist/web/static/index.html +2281 -0
- package/dist/web/static/js/MODULE_SUMMARY.md +124 -0
- package/dist/web/static/js/a11y.js +165 -0
- package/dist/web/static/js/admin.js +2145 -0
- package/dist/web/static/js/assistant.js +475 -0
- package/dist/web/static/js/calendar/reminders.js +114 -0
- package/dist/web/static/js/calendar/utils.js +166 -0
- package/dist/web/static/js/calendar.js +3348 -0
- package/dist/web/static/js/censor.js +356 -0
- package/dist/web/static/js/chat.js +4546 -0
- package/dist/web/static/js/chatRenderer.js +2294 -0
- package/dist/web/static/js/chatStream.js +276 -0
- package/dist/web/static/js/codeRunner.js +398 -0
- package/dist/web/static/js/color/hex.js +14 -0
- package/dist/web/static/js/colorPicker.js +453 -0
- package/dist/web/static/js/compare/icons.js +77 -0
- package/dist/web/static/js/compare/index.js +1482 -0
- package/dist/web/static/js/compare/models.js +104 -0
- package/dist/web/static/js/compare/panes.js +817 -0
- package/dist/web/static/js/compare/probe.js +78 -0
- package/dist/web/static/js/compare/scoreboard.js +223 -0
- package/dist/web/static/js/compare/selector.js +1335 -0
- package/dist/web/static/js/compare/state.js +58 -0
- package/dist/web/static/js/compare/stream.js +695 -0
- package/dist/web/static/js/compare/vote.js +254 -0
- package/dist/web/static/js/cookbook-diagnosis.js +694 -0
- package/dist/web/static/js/cookbook-hwfit.js +1888 -0
- package/dist/web/static/js/cookbook.js +2093 -0
- package/dist/web/static/js/cookbookDownload.js +633 -0
- package/dist/web/static/js/cookbookProgressSignal.js +29 -0
- package/dist/web/static/js/cookbookRunning.js +3506 -0
- package/dist/web/static/js/cookbookServe.js +2128 -0
- package/dist/web/static/js/document.js +9731 -0
- package/dist/web/static/js/documentLibrary.js +3376 -0
- package/dist/web/static/js/dragSort.js +265 -0
- package/dist/web/static/js/editor/ai-inpaint.js +374 -0
- package/dist/web/static/js/editor/ai-models.js +273 -0
- package/dist/web/static/js/editor/ai-rembg.js +230 -0
- package/dist/web/static/js/editor/ai-tool-runner.js +147 -0
- package/dist/web/static/js/editor/ai-tools-misc.js +216 -0
- package/dist/web/static/js/editor/build/controls.js +366 -0
- package/dist/web/static/js/editor/build/popups.js +112 -0
- package/dist/web/static/js/editor/build/right-panel.js +200 -0
- package/dist/web/static/js/editor/build/toolbar.js +73 -0
- package/dist/web/static/js/editor/build/topbar.js +131 -0
- package/dist/web/static/js/editor/build/transform-popup.js +109 -0
- package/dist/web/static/js/editor/canvas-coords.js +21 -0
- package/dist/web/static/js/editor/canvas-events.js +197 -0
- package/dist/web/static/js/editor/canvas-transforms.js +132 -0
- package/dist/web/static/js/editor/checkerboard.js +24 -0
- package/dist/web/static/js/editor/clipboard-and-drop.js +133 -0
- package/dist/web/static/js/editor/composite-helpers.js +83 -0
- package/dist/web/static/js/editor/filters/blur.js +118 -0
- package/dist/web/static/js/editor/filters/edge-feather.js +70 -0
- package/dist/web/static/js/editor/fx/adj-popup.js +677 -0
- package/dist/web/static/js/editor/fx/filter-string.js +38 -0
- package/dist/web/static/js/editor/fx/histogram.js +67 -0
- package/dist/web/static/js/editor/fx/pixel-pass.js +249 -0
- package/dist/web/static/js/editor/harmonize-masks.js +116 -0
- package/dist/web/static/js/editor/history-panel.js +176 -0
- package/dist/web/static/js/editor/keyboard-shortcuts.js +271 -0
- package/dist/web/static/js/editor/layer-helpers.js +131 -0
- package/dist/web/static/js/editor/layer-panel.js +600 -0
- package/dist/web/static/js/editor/mask-utils.js +91 -0
- package/dist/web/static/js/editor/shortcuts-popover.js +149 -0
- package/dist/web/static/js/editor/slider-ux.js +191 -0
- package/dist/web/static/js/editor/snap.js +107 -0
- package/dist/web/static/js/editor/state.js +257 -0
- package/dist/web/static/js/editor/stroke-pipeline.js +162 -0
- package/dist/web/static/js/editor/stroke-tool-sliders.js +64 -0
- package/dist/web/static/js/editor/tools/clone.js +81 -0
- package/dist/web/static/js/editor/tools/crop.js +137 -0
- package/dist/web/static/js/editor/tools/flood-fill.js +72 -0
- package/dist/web/static/js/editor/tools/lasso-mask.js +171 -0
- package/dist/web/static/js/editor/tools/lasso.js +65 -0
- package/dist/web/static/js/editor/tools/move.js +79 -0
- package/dist/web/static/js/editor/tools/stroke.js +123 -0
- package/dist/web/static/js/editor/tools/transform-drag.js +174 -0
- package/dist/web/static/js/editor/tools/transform-handles.js +271 -0
- package/dist/web/static/js/editor/tools/transform-session.js +381 -0
- package/dist/web/static/js/editor/tools/wand.js +46 -0
- package/dist/web/static/js/editor/wire-import.js +148 -0
- package/dist/web/static/js/editor/wire-inpaint-controls.js +164 -0
- package/dist/web/static/js/editor/wire-merge-buttons.js +103 -0
- package/dist/web/static/js/editor/wire-selection-controls.js +170 -0
- package/dist/web/static/js/editor/wire-topbar-menus.js +174 -0
- package/dist/web/static/js/editor/wire-topbar-overflow.js +49 -0
- package/dist/web/static/js/editor/wire-topbar.js +188 -0
- package/dist/web/static/js/emailInbox.js +1245 -0
- package/dist/web/static/js/emailLibrary/replyRecipients.js +27 -0
- package/dist/web/static/js/emailLibrary/signatureFold.js +339 -0
- package/dist/web/static/js/emailLibrary/state.js +34 -0
- package/dist/web/static/js/emailLibrary/utils.js +202 -0
- package/dist/web/static/js/emailLibrary.js +5217 -0
- package/dist/web/static/js/emojiPicker.js +311 -0
- package/dist/web/static/js/escMenuStack.js +102 -0
- package/dist/web/static/js/fileHandler.js +295 -0
- package/dist/web/static/js/gallery.js +2835 -0
- package/dist/web/static/js/galleryEditor.js +3798 -0
- package/dist/web/static/js/group.js +955 -0
- package/dist/web/static/js/init.js +405 -0
- package/dist/web/static/js/keyboard-shortcuts.js +292 -0
- package/dist/web/static/js/langIcons.js +187 -0
- package/dist/web/static/js/markdown/tableRow.js +19 -0
- package/dist/web/static/js/markdown.js +806 -0
- package/dist/web/static/js/memory.js +1418 -0
- package/dist/web/static/js/modalManager.js +1552 -0
- package/dist/web/static/js/modalSnap.js +782 -0
- package/dist/web/static/js/model/matchKey.js +19 -0
- package/dist/web/static/js/modelPicker.js +695 -0
- package/dist/web/static/js/modelSort.js +33 -0
- package/dist/web/static/js/models.js +642 -0
- package/dist/web/static/js/notes.js +5054 -0
- package/dist/web/static/js/package.json +1 -0
- package/dist/web/static/js/platform.js +47 -0
- package/dist/web/static/js/presets.js +1110 -0
- package/dist/web/static/js/providers.js +93 -0
- package/dist/web/static/js/rag.js +177 -0
- package/dist/web/static/js/research/jobs.js +335 -0
- package/dist/web/static/js/research/panel.js +1233 -0
- package/dist/web/static/js/researchSynapse.js +225 -0
- package/dist/web/static/js/search-chat.js +201 -0
- package/dist/web/static/js/search.js +52 -0
- package/dist/web/static/js/section-management.js +260 -0
- package/dist/web/static/js/sessions.js +3108 -0
- package/dist/web/static/js/settings.js +4991 -0
- package/dist/web/static/js/sidebar-layout.js +573 -0
- package/dist/web/static/js/signature.js +504 -0
- package/dist/web/static/js/skills.js +1908 -0
- package/dist/web/static/js/slashAutocomplete.js +267 -0
- package/dist/web/static/js/slashCommands.js +6099 -0
- package/dist/web/static/js/spinner.js +406 -0
- package/dist/web/static/js/storage.js +123 -0
- package/dist/web/static/js/tasks.js +2699 -0
- package/dist/web/static/js/theme.js +2086 -0
- package/dist/web/static/js/tileManager.js +386 -0
- package/dist/web/static/js/tourAutoplay.js +133 -0
- package/dist/web/static/js/tourHints.js +179 -0
- package/dist/web/static/js/tts-ai.js +521 -0
- package/dist/web/static/js/ui.js +1288 -0
- package/dist/web/static/js/util/ordinal.js +13 -0
- package/dist/web/static/js/voiceRecorder.js +283 -0
- package/dist/web/static/js/windowDrag.js +326 -0
- package/dist/web/static/js/windowResize.js +233 -0
- package/dist/web/static/landing.html +824 -0
- package/dist/web/static/lib/docx.umd.min.js +20116 -0
- package/dist/web/static/lib/highlight.min.js +1213 -0
- package/dist/web/static/lib/html2pdf.bundle.min.js +3 -0
- package/dist/web/static/lib/mammoth.browser.min.js +21 -0
- package/dist/web/static/lib/qrcode.min.js +8 -0
- package/dist/web/static/lib/xlsx.full.min.js +24 -0
- package/dist/web/static/login.html +582 -0
- package/dist/web/static/manifest.json +15 -0
- package/dist/web/static/style.css +35733 -0
- package/dist/web/static/sw.js +144 -0
- package/dist/workflows/engine.d.ts +162 -0
- package/dist/workflows/engine.d.ts.map +1 -0
- package/dist/workflows/engine.js +625 -0
- package/dist/workflows/engine.js.map +1 -0
- package/dist/workflows/index.d.ts +8 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +14 -0
- package/dist/workflows/index.js.map +1 -0
- package/package.json +112 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* emojiPicker.js — Monochrome icon picker (no colored emojis).
|
|
3
|
+
* Curated set of common icons as inline SVGs. The PICKER shows monochrome SVGs,
|
|
4
|
+
* and — crucially — every character it INSERTS is one with a real monochrome
|
|
5
|
+
* (text) presentation. On insert we append U+FE0E (VARIATION SELECTOR-15) so the
|
|
6
|
+
* glyph renders flat/text, not as a system color emoji — so the RECIPIENT of an
|
|
7
|
+
* email/message sees a non-colored symbol too, not just the sender. Pure-emoji
|
|
8
|
+
* faces (😂, 👍, 😎) have no text form and are intentionally excluded.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// Each entry: [char, label, svgPath OR svg]
|
|
12
|
+
// SVG icons matching Lucide style (24x24 viewBox, 2 stroke)
|
|
13
|
+
const I = (path) => `<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${path}</svg>`;
|
|
14
|
+
|
|
15
|
+
// Text variation selector — appended to chars that might render as color emoji,
|
|
16
|
+
// asks the browser to use text (monochrome) presentation if available.
|
|
17
|
+
const VS15 = '\uFE0E';
|
|
18
|
+
|
|
19
|
+
const EMOJI_GROUPS = [
|
|
20
|
+
{
|
|
21
|
+
name: 'Faces & Hearts',
|
|
22
|
+
// Only chars with a genuine monochrome (text) presentation. VS15 is appended
|
|
23
|
+
// on insert (see _insertEmoji) so they render flat for the recipient too.
|
|
24
|
+
// Pure-emoji faces (grin/cry/sunglasses/thumbs) have no text form, so they're
|
|
25
|
+
// omitted — there is no way to send them non-colored as plain text.
|
|
26
|
+
items: [
|
|
27
|
+
['☻', 'grin', I('<circle cx="12" cy="12" r="10"/><path d="M7 14 C 7 18, 17 18, 17 14 Z"/><line x1="9" y1="9" x2="9.01" y2="9"/><line x1="15" y1="9" x2="15.01" y2="9"/>')],
|
|
28
|
+
['♡', 'heart-outline', I('<path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"/>')],
|
|
29
|
+
['★', 'star', I('<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" fill="currentColor" stroke="none"/>')],
|
|
30
|
+
['☆', 'star-outline', I('<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>')],
|
|
31
|
+
['✦', 'sparkle', I('<polygon points="12 2 14 10 22 12 14 14 12 22 10 14 2 12 10 10" fill="currentColor" stroke="none"/>')],
|
|
32
|
+
['☽', 'moon', I('<path d="M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8z"/>')],
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'Checks & Marks',
|
|
37
|
+
items: [
|
|
38
|
+
['✓', 'check', I('<polyline points="20 6 9 17 4 12"/>')],
|
|
39
|
+
['✗', 'cross', I('<line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>')],
|
|
40
|
+
['✘', 'cross-heavy', I('<line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>')],
|
|
41
|
+
['★', 'star-filled', I('<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>')],
|
|
42
|
+
['☆', 'star-empty', I('<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>')],
|
|
43
|
+
['●', 'dot', I('<circle cx="12" cy="12" r="6" fill="currentColor" stroke="none"/>')],
|
|
44
|
+
['○', 'circle', I('<circle cx="12" cy="12" r="8"/>')],
|
|
45
|
+
['■', 'square-filled', I('<rect x="6" y="6" width="12" height="12" fill="currentColor" stroke="none"/>')],
|
|
46
|
+
['□', 'square-empty', I('<rect x="5" y="5" width="14" height="14"/>')],
|
|
47
|
+
['◆', 'diamond', I('<polygon points="12 3 21 12 12 21 3 12"/>')],
|
|
48
|
+
['◇', 'diamond-empty', I('<polygon points="12 3 21 12 12 21 3 12"/>')],
|
|
49
|
+
['†', 'dagger', I('<line x1="12" y1="4" x2="12" y2="20"/><line x1="8" y1="8" x2="16" y2="8"/>')],
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'Arrows',
|
|
54
|
+
items: [
|
|
55
|
+
['→', 'arrow-right', I('<line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/>')],
|
|
56
|
+
['←', 'arrow-left', I('<line x1="19" y1="12" x2="5" y2="12"/><polyline points="12 19 5 12 12 5"/>')],
|
|
57
|
+
['↑', 'arrow-up', I('<line x1="12" y1="19" x2="12" y2="5"/><polyline points="5 12 12 5 19 12"/>')],
|
|
58
|
+
['↓', 'arrow-down', I('<line x1="12" y1="5" x2="12" y2="19"/><polyline points="19 12 12 19 5 12"/>')],
|
|
59
|
+
['⇒', 'arrow-r-dbl', I('<polyline points="10 5 17 12 10 19"/><polyline points="6 5 13 12 6 19"/>')],
|
|
60
|
+
['⇐', 'arrow-l-dbl', I('<polyline points="14 5 7 12 14 19"/><polyline points="18 5 11 12 18 19"/>')],
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: 'Math & Punctuation',
|
|
65
|
+
items: [
|
|
66
|
+
['±', 'plus-minus', I('<line x1="4" y1="10" x2="20" y2="10"/><line x1="12" y1="2" x2="12" y2="18"/><line x1="4" y1="20" x2="20" y2="20"/>')],
|
|
67
|
+
['×', 'multiply', I('<line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>')],
|
|
68
|
+
['÷', 'divide', I('<circle cx="12" cy="6" r="1.5" fill="currentColor" stroke="none"/><line x1="5" y1="12" x2="19" y2="12"/><circle cx="12" cy="18" r="1.5" fill="currentColor" stroke="none"/>')],
|
|
69
|
+
['≈', 'approx', I('<path d="M4 9 C 6 6, 8 12, 10 9 S 14 6, 16 9 S 20 12, 22 9"/><path d="M4 15 C 6 12, 8 18, 10 15 S 14 12, 16 15 S 20 18, 22 15"/>')],
|
|
70
|
+
['≠', 'not-equal', I('<line x1="5" y1="9" x2="19" y2="9"/><line x1="5" y1="15" x2="19" y2="15"/><line x1="16" y1="5" x2="8" y2="19"/>')],
|
|
71
|
+
['≤', 'lte', I('<polyline points="17 5 7 11 17 17"/><line x1="7" y1="20" x2="17" y2="20"/>')],
|
|
72
|
+
['≥', 'gte', I('<polyline points="7 5 17 11 7 17"/><line x1="7" y1="20" x2="17" y2="20"/>')],
|
|
73
|
+
['∞', 'infinity', I('<path d="M18.178 8c5.096 0 5.096 8 0 8-5.095 0-7.133-8-12.739-8-4.585 0-4.585 8 0 8 5.606 0 7.644-8 12.739-8z"/>')],
|
|
74
|
+
['π', 'pi', I('<line x1="4" y1="8" x2="20" y2="8"/><line x1="9" y1="8" x2="9" y2="20"/><line x1="15" y1="8" x2="15" y2="20"/>')],
|
|
75
|
+
['Σ', 'sum', I('<polyline points="6 4 18 4 10 12 18 20 6 20"/>')],
|
|
76
|
+
['∆', 'delta', I('<polygon points="12 4 20 20 4 20"/>')],
|
|
77
|
+
['√', 'root', I('<polyline points="4 14 8 20 14 4 22 4"/>')],
|
|
78
|
+
['°', 'degree', I('<circle cx="12" cy="8" r="3"/>')],
|
|
79
|
+
['§', 'section', I('<path d="M14 6 a4 3 0 1 0 -4 4 q-3 0 -3 3 t3 3 q3 0 3 -3"/>')],
|
|
80
|
+
['¶', 'pilcrow', I('<path d="M16 4 H 9 a4 4 0 0 0 0 8 H 12 V 20"/><line x1="16" y1="4" x2="16" y2="20"/>')],
|
|
81
|
+
['•', 'bullet', I('<circle cx="12" cy="12" r="3" fill="currentColor" stroke="none"/>')],
|
|
82
|
+
['…', 'ellipsis', I('<circle cx="6" cy="12" r="1.5" fill="currentColor" stroke="none"/><circle cx="12" cy="12" r="1.5" fill="currentColor" stroke="none"/><circle cx="18" cy="12" r="1.5" fill="currentColor" stroke="none"/>')],
|
|
83
|
+
['—', 'em-dash', I('<line x1="4" y1="12" x2="20" y2="12"/>')],
|
|
84
|
+
['«', 'quote-l', I('<polyline points="12 5 6 12 12 19"/><polyline points="18 5 12 12 18 19"/>')],
|
|
85
|
+
['»', 'quote-r', I('<polyline points="6 5 12 12 6 19"/><polyline points="12 5 18 12 12 19"/>')],
|
|
86
|
+
['"', 'quote-dbl', I('<line x1="8" y1="5" x2="8" y2="11"/><line x1="11" y1="5" x2="11" y2="11"/><line x1="13" y1="5" x2="13" y2="11"/><line x1="16" y1="5" x2="16" y2="11"/>')],
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'Currency & Misc',
|
|
91
|
+
items: [
|
|
92
|
+
['€', 'euro', I('<text x="12" y="16" font-size="16" text-anchor="middle" fill="currentColor" stroke="none">€</text>')],
|
|
93
|
+
['£', 'pound', I('<text x="12" y="16" font-size="16" text-anchor="middle" fill="currentColor" stroke="none">£</text>')],
|
|
94
|
+
['¥', 'yen', I('<text x="12" y="16" font-size="16" text-anchor="middle" fill="currentColor" stroke="none">¥</text>')],
|
|
95
|
+
['$', 'dollar', I('<text x="12" y="16" font-size="16" text-anchor="middle" fill="currentColor" stroke="none">$</text>')],
|
|
96
|
+
['¢', 'cent', I('<text x="12" y="16" font-size="16" text-anchor="middle" fill="currentColor" stroke="none">¢</text>')],
|
|
97
|
+
['%', 'percent', I('<text x="12" y="16" font-size="16" text-anchor="middle" fill="currentColor" stroke="none">%</text>')],
|
|
98
|
+
['‰', 'per-mille', I('<text x="12" y="16" font-size="13" text-anchor="middle" fill="currentColor" stroke="none">‰</text>')],
|
|
99
|
+
['№', 'number', I('<text x="12" y="16" font-size="12" text-anchor="middle" fill="currentColor" stroke="none">№</text>')],
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
let _pickerEl = null;
|
|
105
|
+
let _pickerOpenedAt = 0;
|
|
106
|
+
let _targetEl = null;
|
|
107
|
+
let _closeOnOutsideClick = null;
|
|
108
|
+
let _closeOnEscape = null;
|
|
109
|
+
// For contenteditable targets we snapshot the caret/selection when the picker
|
|
110
|
+
// opens, since focusing the picker's search box collapses the live selection.
|
|
111
|
+
let _savedRange = null;
|
|
112
|
+
|
|
113
|
+
// `target` may be a textarea element id (string) or a resolver function that
|
|
114
|
+
// returns the live target element — the latter lets a caller switch between a
|
|
115
|
+
// textarea and a contenteditable (e.g. plain markdown vs. WYSIWYG email).
|
|
116
|
+
export function createEmojiButton(target) {
|
|
117
|
+
const btn = document.createElement('button');
|
|
118
|
+
btn.type = 'button';
|
|
119
|
+
btn.className = 'emoji-picker-btn';
|
|
120
|
+
btn.title = 'Insert icon';
|
|
121
|
+
btn.innerHTML = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M8 14s1.5 2 4 2 4-2 4-2"/><line x1="9" y1="9" x2="9.01" y2="9"/><line x1="15" y1="9" x2="15.01" y2="9"/></svg>';
|
|
122
|
+
// Don't steal focus from the editor on press — keeps the caret/selection so
|
|
123
|
+
// the emoji lands where the user was typing.
|
|
124
|
+
btn.addEventListener('mousedown', (e) => e.preventDefault());
|
|
125
|
+
btn.addEventListener('click', (e) => {
|
|
126
|
+
e.preventDefault();
|
|
127
|
+
e.stopPropagation();
|
|
128
|
+
const el = (typeof target === 'function') ? target() : document.getElementById(target);
|
|
129
|
+
if (!el) return;
|
|
130
|
+
togglePicker(btn, el);
|
|
131
|
+
});
|
|
132
|
+
return btn;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function togglePicker(anchor, target) {
|
|
136
|
+
const now = Date.now();
|
|
137
|
+
if (_pickerEl) {
|
|
138
|
+
// Ignore the duplicate/ghost click mobile fires right after opening, which
|
|
139
|
+
// would otherwise re-toggle the picker shut the instant it appears.
|
|
140
|
+
if (now - _pickerOpenedAt < 400) return;
|
|
141
|
+
_closePicker();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
_targetEl = target;
|
|
145
|
+
_savedRange = null;
|
|
146
|
+
if (target.isContentEditable) {
|
|
147
|
+
const sel = window.getSelection();
|
|
148
|
+
if (sel && sel.rangeCount) {
|
|
149
|
+
const r = sel.getRangeAt(0);
|
|
150
|
+
if (target.contains(r.commonAncestorContainer)) _savedRange = r.cloneRange();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
_pickerEl = _buildPicker();
|
|
154
|
+
_pickerOpenedAt = now;
|
|
155
|
+
document.body.appendChild(_pickerEl);
|
|
156
|
+
|
|
157
|
+
const rect = anchor.getBoundingClientRect();
|
|
158
|
+
_pickerEl.style.position = 'fixed';
|
|
159
|
+
_pickerEl.style.top = (rect.bottom + 4) + 'px';
|
|
160
|
+
_pickerEl.style.left = rect.left + 'px';
|
|
161
|
+
_pickerEl.style.zIndex = '10000';
|
|
162
|
+
|
|
163
|
+
requestAnimationFrame(() => {
|
|
164
|
+
const pr = _pickerEl.getBoundingClientRect();
|
|
165
|
+
if (pr.right > window.innerWidth - 8) {
|
|
166
|
+
_pickerEl.style.left = Math.max(8, window.innerWidth - pr.width - 8) + 'px';
|
|
167
|
+
}
|
|
168
|
+
// Always open downward. If it would run past the bottom, cap its height so
|
|
169
|
+
// it scrolls internally instead of flipping up (which got cut off at top).
|
|
170
|
+
const avail = window.innerHeight - rect.bottom - 12;
|
|
171
|
+
if (pr.height > avail) {
|
|
172
|
+
_pickerEl.style.maxHeight = Math.max(160, avail) + 'px';
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const close = (e) => {
|
|
177
|
+
// Ignore the ghost/duplicate click mobile fires right after opening.
|
|
178
|
+
if (e && e.type === 'click' && Date.now() - _pickerOpenedAt < 400) return;
|
|
179
|
+
if (_pickerEl && !_pickerEl.contains(e.target) && e.target !== anchor && !anchor.contains(e.target)) {
|
|
180
|
+
_closePicker();
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
_closeOnOutsideClick = close;
|
|
184
|
+
setTimeout(() => document.addEventListener('click', close, true), 10);
|
|
185
|
+
|
|
186
|
+
_closeOnEscape = (e) => {
|
|
187
|
+
if (e.key !== 'Escape' || !_pickerEl) return;
|
|
188
|
+
e.preventDefault();
|
|
189
|
+
e.stopPropagation();
|
|
190
|
+
e.stopImmediatePropagation?.();
|
|
191
|
+
_closePicker();
|
|
192
|
+
};
|
|
193
|
+
document.addEventListener('keydown', _closeOnEscape, true);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function _closePicker() {
|
|
197
|
+
if (_pickerEl) {
|
|
198
|
+
_pickerEl.remove();
|
|
199
|
+
_pickerEl = null;
|
|
200
|
+
}
|
|
201
|
+
if (_closeOnOutsideClick) {
|
|
202
|
+
document.removeEventListener('click', _closeOnOutsideClick, true);
|
|
203
|
+
_closeOnOutsideClick = null;
|
|
204
|
+
}
|
|
205
|
+
if (_closeOnEscape) {
|
|
206
|
+
document.removeEventListener('keydown', _closeOnEscape, true);
|
|
207
|
+
_closeOnEscape = null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function _buildPicker() {
|
|
212
|
+
const el = document.createElement('div');
|
|
213
|
+
el.className = 'emoji-picker';
|
|
214
|
+
|
|
215
|
+
const search = document.createElement('input');
|
|
216
|
+
search.type = 'text';
|
|
217
|
+
search.placeholder = 'Search…';
|
|
218
|
+
search.className = 'emoji-picker-search';
|
|
219
|
+
el.appendChild(search);
|
|
220
|
+
|
|
221
|
+
const groupsContainer = document.createElement('div');
|
|
222
|
+
groupsContainer.className = 'emoji-picker-groups';
|
|
223
|
+
el.appendChild(groupsContainer);
|
|
224
|
+
|
|
225
|
+
function render(filter = '') {
|
|
226
|
+
groupsContainer.innerHTML = '';
|
|
227
|
+
const f = filter.toLowerCase();
|
|
228
|
+
for (const group of EMOJI_GROUPS) {
|
|
229
|
+
const filtered = f
|
|
230
|
+
? group.items.filter(item => item[1].toLowerCase().includes(f) || item[0].includes(filter))
|
|
231
|
+
: group.items;
|
|
232
|
+
if (filtered.length === 0) continue;
|
|
233
|
+
|
|
234
|
+
const groupDiv = document.createElement('div');
|
|
235
|
+
groupDiv.className = 'emoji-picker-group';
|
|
236
|
+
const header = document.createElement('div');
|
|
237
|
+
header.className = 'emoji-picker-group-name';
|
|
238
|
+
header.textContent = group.name;
|
|
239
|
+
groupDiv.appendChild(header);
|
|
240
|
+
|
|
241
|
+
const grid = document.createElement('div');
|
|
242
|
+
grid.className = 'emoji-picker-grid';
|
|
243
|
+
for (const item of filtered) {
|
|
244
|
+
const [char, label, svg] = item;
|
|
245
|
+
const btn = document.createElement('button');
|
|
246
|
+
btn.type = 'button';
|
|
247
|
+
btn.className = 'emoji-picker-item';
|
|
248
|
+
btn.title = label;
|
|
249
|
+
btn.innerHTML = svg;
|
|
250
|
+
btn.addEventListener('click', (e) => {
|
|
251
|
+
e.preventDefault();
|
|
252
|
+
e.stopPropagation();
|
|
253
|
+
_insertEmoji(char);
|
|
254
|
+
_closePicker();
|
|
255
|
+
});
|
|
256
|
+
grid.appendChild(btn);
|
|
257
|
+
}
|
|
258
|
+
groupDiv.appendChild(grid);
|
|
259
|
+
groupsContainer.appendChild(groupDiv);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
render();
|
|
264
|
+
|
|
265
|
+
search.addEventListener('input', () => render(search.value.trim()));
|
|
266
|
+
setTimeout(() => search.focus(), 50);
|
|
267
|
+
|
|
268
|
+
return el;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function _insertEmoji(char) {
|
|
272
|
+
if (!_targetEl) return;
|
|
273
|
+
// Force monochrome (text) presentation for the recipient by appending the
|
|
274
|
+
// text variation selector U+FE0E. It only affects chars that *have* an emoji
|
|
275
|
+
// presentation (e.g. ♥ ▶ ❤ ↩ ☀); for plain ASCII it's pointless, so we skip
|
|
276
|
+
// those. This is why the inserted glyph is non-colored on the other end too,
|
|
277
|
+
// not just in our own (already-SVG) picker UI.
|
|
278
|
+
const cp = char.codePointAt(0);
|
|
279
|
+
const ins = cp >= 0x80 ? char + VS15 : char;
|
|
280
|
+
// Contenteditable (e.g. WYSIWYG email body) — insert at the saved caret.
|
|
281
|
+
if (_targetEl.isContentEditable) {
|
|
282
|
+
_targetEl.focus();
|
|
283
|
+
let range = _savedRange;
|
|
284
|
+
if (!range) {
|
|
285
|
+
range = document.createRange();
|
|
286
|
+
range.selectNodeContents(_targetEl);
|
|
287
|
+
range.collapse(false);
|
|
288
|
+
}
|
|
289
|
+
range.deleteContents();
|
|
290
|
+
const node = document.createTextNode(ins);
|
|
291
|
+
range.insertNode(node);
|
|
292
|
+
range.setStartAfter(node);
|
|
293
|
+
range.collapse(true);
|
|
294
|
+
const sel = window.getSelection();
|
|
295
|
+
sel.removeAllRanges();
|
|
296
|
+
sel.addRange(range);
|
|
297
|
+
_savedRange = range.cloneRange();
|
|
298
|
+
_targetEl.dispatchEvent(new Event('input', { bubbles: true }));
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const start = _targetEl.selectionStart || 0;
|
|
302
|
+
const end = _targetEl.selectionEnd || 0;
|
|
303
|
+
const before = _targetEl.value.substring(0, start);
|
|
304
|
+
const after = _targetEl.value.substring(end);
|
|
305
|
+
_targetEl.value = before + ins + after;
|
|
306
|
+
_targetEl.selectionStart = _targetEl.selectionEnd = start + ins.length;
|
|
307
|
+
_targetEl.focus();
|
|
308
|
+
_targetEl.dispatchEvent(new Event('input', { bubbles: true }));
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export default { createEmojiButton };
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// static/js/escMenuStack.js
|
|
2
|
+
//
|
|
3
|
+
// Dismissal registry for transient, ad-hoc overlays — dropdown menus and
|
|
4
|
+
// context popups that are built on the fly and appended to <body>, living
|
|
5
|
+
// OUTSIDE the .modal system. The global Escape arbiter in ui.js can find
|
|
6
|
+
// modals but not these, so each menu registers a dismiss callback here while
|
|
7
|
+
// it is open and unregisters when it closes.
|
|
8
|
+
//
|
|
9
|
+
// The stack is LIFO: dismissTopMenu() closes the most-recently-opened menu
|
|
10
|
+
// first, so a dropdown opened on top of a modal closes before the modal does.
|
|
11
|
+
// Deliberately DOM-free so it can be unit-tested under plain node (see
|
|
12
|
+
// tests/test_esc_menu_stack_js.py).
|
|
13
|
+
|
|
14
|
+
const _stack = [];
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Register a menu's dismiss callback. Returns an unregister function that the
|
|
18
|
+
* menu MUST call from its own teardown (outside-click close, item click, etc.)
|
|
19
|
+
* so the stack never holds a stale entry. Calling the returned function more
|
|
20
|
+
* than once, or after the menu was already dismissed via Escape, is safe.
|
|
21
|
+
*/
|
|
22
|
+
export function registerMenuDismiss(dismissFn) {
|
|
23
|
+
if (typeof dismissFn !== 'function') return () => {};
|
|
24
|
+
const entry = { dismissFn };
|
|
25
|
+
_stack.push(entry);
|
|
26
|
+
return () => {
|
|
27
|
+
const i = _stack.indexOf(entry);
|
|
28
|
+
if (i !== -1) _stack.splice(i, 1);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Dismiss the most-recently-registered menu, if any. Returns true when a menu
|
|
34
|
+
* was dismissed (so the caller can swallow the Escape key), false when nothing
|
|
35
|
+
* was open. The entry is popped BEFORE its callback runs, so even if a
|
|
36
|
+
* dismissFn forgets to unregister or throws, a single Escape closes exactly
|
|
37
|
+
* one menu and the stack never gets stuck.
|
|
38
|
+
*/
|
|
39
|
+
export function dismissTopMenu() {
|
|
40
|
+
const entry = _stack.pop();
|
|
41
|
+
if (!entry) return false;
|
|
42
|
+
try { entry.dismissFn(); } catch {}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Test/debug helper: number of currently-registered menus. */
|
|
47
|
+
export function _openMenuCount() {
|
|
48
|
+
return _stack.length;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Tear a transient menu down through its registered dismiss callback if it has
|
|
53
|
+
* one (releasing its Escape-stack entry and any listeners), else fall back to a
|
|
54
|
+
* plain node removal. Use this anywhere menus are cleared in bulk — scroll /
|
|
55
|
+
* swipe / modal-dismiss cleanup, or a "close the previous one" reopen sweep —
|
|
56
|
+
* instead of a raw `el.remove()`, which would strand the stack entry.
|
|
57
|
+
*/
|
|
58
|
+
export function dismissOrRemove(el) {
|
|
59
|
+
if (!el) return;
|
|
60
|
+
if (typeof el._dismiss === 'function') el._dismiss();
|
|
61
|
+
else el.remove();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ── DOM convenience wrapper ──────────────────────────────────────────────
|
|
65
|
+
// The registry above is intentionally DOM-free (and unit-tested as such).
|
|
66
|
+
// bindMenuDismiss is the thin DOM layer most callers actually want: it wires
|
|
67
|
+
// the ubiquitous "overlay appended to <body>, closes on an outside click"
|
|
68
|
+
// idiom to BOTH the outside-click listener AND the Escape stack in one call,
|
|
69
|
+
// so a menu only has to describe how to tear itself down once.
|
|
70
|
+
//
|
|
71
|
+
// const close = bindMenuDismiss(popup, () => popup.remove());
|
|
72
|
+
// // outside-click and Escape now both call close(); call it yourself from
|
|
73
|
+
// // item handlers too.
|
|
74
|
+
//
|
|
75
|
+
// `onClose` runs exactly once (idempotent) and owns the actual teardown
|
|
76
|
+
// (removing/hiding the node, clearing anchor state, …). `isOutside(ev)`
|
|
77
|
+
// defaults to "the click landed outside `el`"; override it when extra anchors
|
|
78
|
+
// should count as inside the menu. The returned idempotent close() is also
|
|
79
|
+
// stashed on `el._dismiss`, so bulk removers (see dismissOrRemove) can tear the
|
|
80
|
+
// menu down through its real teardown rather than orphaning its stack entry.
|
|
81
|
+
export function bindMenuDismiss(el, onClose, isOutside) {
|
|
82
|
+
let done = false;
|
|
83
|
+
let unreg = () => {};
|
|
84
|
+
const onDocClick = (ev) => {
|
|
85
|
+
const outside = typeof isOutside === 'function' ? isOutside(ev) : !el.contains(ev.target);
|
|
86
|
+
if (outside) close();
|
|
87
|
+
};
|
|
88
|
+
function close() {
|
|
89
|
+
if (done) return;
|
|
90
|
+
done = true;
|
|
91
|
+
unreg(); unreg = () => {};
|
|
92
|
+
document.removeEventListener('click', onDocClick, true);
|
|
93
|
+
try { if (typeof onClose === 'function') onClose(); } catch {}
|
|
94
|
+
}
|
|
95
|
+
// Defer attaching the outside-click listener so the opening click doesn't
|
|
96
|
+
// immediately close the menu. Skip the attach if close() already ran in the
|
|
97
|
+
// same tick (e.g. an instant Escape) so we never leave a dangling listener.
|
|
98
|
+
setTimeout(() => { if (!done) document.addEventListener('click', onDocClick, true); }, 0);
|
|
99
|
+
unreg = registerMenuDismiss(close);
|
|
100
|
+
el._dismiss = close;
|
|
101
|
+
return close;
|
|
102
|
+
}
|