@inkandswitch/patchwork-pkg-base 0.0.101 → 0.0.103
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/module-settings-url +1 -1
- package/package.json +1 -1
- package/packages/account/dist/{AccountPicker-A2PAS5CG.js → AccountPicker-DCX77HQI.js} +7 -3
- package/packages/account/dist/AccountPicker-DCX77HQI.js.map +7 -0
- package/packages/account/dist/index.css +70 -34
- package/packages/account/dist/index.css.map +2 -2
- package/packages/account/dist/index.js +1 -1
- package/packages/account-history/dist/assets/HistoryRecorder-_3PrVW6n.js +1 -1
- package/packages/account-history/dist/assets/HistoryViewer-BmG0rAfK.js +1 -1
- package/packages/account-history/dist/assets/NotebookViewer-DZ_ZQU5x.js +37 -37
- package/packages/add-doc-to-sidebar-button/styles.css +2 -2
- package/packages/chat/dist/{ChatRoot-BYmq4SXi.js → ChatRoot-1d-658Rr.js} +2 -2
- package/packages/chat/dist/{context-tool-Bob-FZ_T.js → context-tool-iP64Oz6H.js} +2 -2
- package/packages/chat/dist/{index-wkaHcVCz.js → index-Dm_2jZcu.js} +3 -3
- package/packages/chat/dist/index.js +2 -2
- package/packages/chat/dist/{tool-DCOdh_fx.js → tool-BmNd5mrj.js} +1 -1
- package/packages/codemirror-base/dist/{chunk-QRT4ZVQ4.js → chunk-A2WBDY3J.js} +5 -5
- package/packages/codemirror-base/dist/{chunk-QRT4ZVQ4.js.map → chunk-A2WBDY3J.js.map} +1 -1
- package/packages/codemirror-base/dist/lib/codemirror.js +1 -1
- package/packages/codemirror-base/dist/tool.js +3 -3
- package/packages/codemirror-base/dist/tool.js.map +1 -1
- package/packages/codemirror-markdown/dist/extensions/embed.js +1 -1
- package/packages/codemirror-markdown/dist/extensions/embed.js.map +1 -1
- package/packages/codemirror-markdown/dist/extensions/links.js +1 -1
- package/packages/codemirror-markdown/dist/extensions/links.js.map +1 -1
- package/packages/codemirror-markdown/dist/extensions/markdown.js +6 -6
- package/packages/codemirror-markdown/dist/extensions/markdown.js.map +1 -1
- package/packages/commands/dist/main.js +1 -1
- package/packages/commands/dist/main.js.map +1 -1
- package/packages/comments-view/dist/assets/main-wSSvAVfi.js +1 -1
- package/packages/doc-openwith/doc-openwith.js +5 -5
- package/packages/doc-presence/doc-presence.js +1 -1
- package/packages/drafts/dist/assets/main-CG9HOCai.js +31 -31
- package/packages/embed/dist/assets/tool-D58NGTZ7.js +1 -1
- package/packages/file/dist/index.js +2 -2
- package/packages/file/dist/{new-file-tool-DGKllnzw.js → new-file-tool-BolBDUrL.js} +27 -27
- package/packages/file/dist/new-file-tool-BolBDUrL.js.map +1 -0
- package/packages/file/dist/{tool-UKWDK93W.js → tool-Bt8I8T2-.js} +4 -4
- package/packages/file/dist/tool-Bt8I8T2-.js.map +1 -0
- package/packages/file/dist/{typescript-language-server-BgBx0vSF.js → typescript-language-server-Db4173Y5.js} +2 -2
- package/packages/file/dist/{typescript-language-server-BgBx0vSF.js.map → typescript-language-server-Db4173Y5.js.map} +1 -1
- package/packages/folder/dist/index.js +1 -1
- package/packages/folder/dist/{tool-WAWTPB4A.js → tool-5E3YPGES.js} +2 -2
- package/packages/folder/dist/{tool-WAWTPB4A.js.map → tool-5E3YPGES.js.map} +1 -1
- package/packages/history-view/dist/assets/{HistoryTimeline-COYNGORP.js → HistoryTimeline-Bo-BTf2A.js} +6 -6
- package/packages/history-view/dist/assets/{HistoryTimeline-COYNGORP.js.map → HistoryTimeline-Bo-BTf2A.js.map} +1 -1
- package/packages/history-view/dist/assets/{index-C1gYt7m5.js → index-B5Afrk9Y.js} +2 -2
- package/packages/history-view/dist/assets/{index-C1gYt7m5.js.map → index-B5Afrk9Y.js.map} +1 -1
- package/packages/history-view/dist/index.js +1 -1
- package/packages/llm-host/dist/{LlmConfigTray-DdZHZT4F.js → LlmConfigTray-CjW04jeT.js} +108 -108
- package/packages/llm-host/dist/index.js +1 -1
- package/packages/packages/dist/index.js +46 -46
- package/packages/raw/raw-editor.js +22 -22
- package/packages/settings/dist/assets/FrameConfigurator-DVRBzIR-.js +1 -1
- package/packages/sideboard/dist/index.css +1 -1
- package/packages/sideboard/dist/index.css.map +2 -2
- package/packages/sideboard/dist/index.js +1 -1
- package/packages/sync-indicator/dist/assets/{SyncIndicator-B2ag1OoZ.js → SyncIndicator-oVMcVRXg.js} +3 -3
- package/packages/sync-indicator/dist/assets/{SyncIndicator-B2ag1OoZ.js.map → SyncIndicator-oVMcVRXg.js.map} +1 -1
- package/packages/sync-indicator/dist/index.js +1 -1
- package/packages/tasks/dist/assets/index-BbuRtBN3.js +1 -1
- package/packages/theming/dist/{active-theme-BMSIQXBV.js → active-theme-CC3CS64F.js} +2 -2
- package/packages/theming/dist/{chunk-Z3JB7ERH.js → chunk-DH4YUYFJ.js} +2 -2
- package/packages/theming/dist/chunk-VJZ4NPK4.js +136 -0
- package/packages/theming/dist/chunk-VJZ4NPK4.js.map +7 -0
- package/packages/theming/dist/main.js +4 -4
- package/packages/theming/dist/{theme-7OG2K56L.css → theme-HE7ECLIW.css} +212 -58
- package/packages/theming/dist/{theme-editor-datatype-TMYH7U2S.js → theme-editor-datatype-TJ6LYT2U.js} +2 -2
- package/packages/theming/dist/theme-editor.js +35 -25
- package/packages/theming/dist/theme-editor.js.map +2 -2
- package/packages/theming/dist/{theme-titlebar-YIFJINPJ.js → theme-titlebar-BO2Y2GRN.js} +2 -2
- package/packages/theming/dist/{theme-tray-7J247NRY.js → theme-tray-V6BEXQWR.js} +15 -15
- package/packages/theming/dist/theme-tray-V6BEXQWR.js.map +7 -0
- package/packages/theming/dist/tool.js +9 -9
- package/packages/theming/dist/tool.js.map +1 -1
- package/packages/threepane/dist/IsolatedDocumentArea-IZWZ74TV.js +2 -0
- package/packages/threepane/dist/{PatchworkFrame-GEEBBGCS.js → PatchworkFrame-UNWWAISP.js} +2 -2
- package/packages/threepane/dist/{chunk-YC5AHP5G.js → chunk-MSZ7JVNB.js} +31 -31
- package/packages/threepane/dist/{chunk-YC5AHP5G.js.map → chunk-MSZ7JVNB.js.map} +3 -3
- package/packages/threepane/dist/index.js +1 -1
- package/plugin-registry-url +1 -1
- package/packages/account/dist/AccountPicker-A2PAS5CG.js.map +0 -7
- package/packages/file/dist/new-file-tool-DGKllnzw.js.map +0 -1
- package/packages/file/dist/tool-UKWDK93W.js.map +0 -1
- package/packages/theming/dist/chunk-GIPQLUDU.js +0 -86
- package/packages/theming/dist/chunk-GIPQLUDU.js.map +0 -7
- package/packages/theming/dist/theme-tray-7J247NRY.js.map +0 -7
- package/packages/threepane/dist/IsolatedDocumentArea-G3V7KYHJ.js +0 -2
- /package/packages/theming/dist/{active-theme-BMSIQXBV.js.map → active-theme-CC3CS64F.js.map} +0 -0
- /package/packages/theming/dist/{chunk-Z3JB7ERH.js.map → chunk-DH4YUYFJ.js.map} +0 -0
- /package/packages/theming/dist/{theme-editor-datatype-TMYH7U2S.js.map → theme-editor-datatype-TJ6LYT2U.js.map} +0 -0
- /package/packages/theming/dist/{theme-titlebar-YIFJINPJ.js.map → theme-titlebar-BO2Y2GRN.js.map} +0 -0
- /package/packages/threepane/dist/{IsolatedDocumentArea-G3V7KYHJ.js.map → IsolatedDocumentArea-IZWZ74TV.js.map} +0 -0
- /package/packages/threepane/dist/{PatchworkFrame-GEEBBGCS.js.map → PatchworkFrame-UNWWAISP.js.map} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/main.css
|
|
2
|
-
var main_default = '@layer package {\n:root,\n:host,\n[theme] {\n --command-palette-bg: var(--studio-fill, white);\n --command-palette-fg: var(--studio-line, black);\n --command-palette-muted: var(--studio-line-offset-50, #999);\n --command-palette-secondary: var(--studio-line-offset-40, #666);\n --command-palette-border: var(--studio-fill-offset-20, #ccc);\n --command-palette-hover: var(--studio-fill-offset-10, #e5e5e5);\n --command-palette-accent: var(--studio-secondary, #33ccf8);\n --command-palette-accent-hover: color-mix(in oklch, var(--studio-secondary, #33ccf8), var(--studio-line, black) 20%);\n --command-palette-font-size: var(--studio-font-size, 16px);\n}\n}\n\n.command-palette-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n z-index: 9999;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 15vh;\n}\n\n.command-palette-container {\n width: 100%;\n max-width: 640px;\n background: var(--command-palette-bg);\n border-radius: 12px;\n box-shadow: 0 16px 70px rgba(0, 0, 0, 0.3);\n overflow: hidden;\n animation: slideDown 0.2s ease-out;\n border: 1px solid var(--command-palette-border);\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.command-palette-input {\n width: 100%;\n padding: 16px 20px;\n border: none;\n outline: none;\n font-size: var(--command-palette-font-size);\n background: transparent;\n color: var(--command-palette-fg);\n border-bottom: 1px solid var(--command-palette-border);\n}\n\n.command-palette-input::placeholder {\n color: var(--command-palette-secondary);\n}\n\n.command-palette-list {\n max-height: 400px;\n overflow-y: auto;\n padding: 8px;\n}\n\n.command-palette-empty {\n padding: 32px 20px;\n text-align: center;\n color: var(--command-palette-muted);\n font-size: 14px;\n}\n\n.command-palette-group-heading {\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--command-palette-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.command-palette-item {\n padding: 12px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: background-color 0.15s;\n margin-bottom: 2px;\n}\n\n.command-palette-item[aria-selected="true"] {\n background: var(--command-palette-hover);\n}\n\n.command-palette-item:hover {\n background: var(--command-palette-hover);\n}\n\n.command-palette-item-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.command-palette-item-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--command-palette-fg);\n}\n\n.command-palette-item-description {\n font-size: 12px;\n color: var(--command-palette-secondary);\n}\n\n/* Argument Form Styles */\n.command-palette-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--command-palette-border);\n}\n\n.command-palette-back-button {\n background: none;\n border: none;\n color: var(--command-palette-secondary);\n cursor: pointer;\n font-size: 14px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.15s;\n}\n\n.command-palette-back-button:hover {\n background: var(--command-palette-hover);\n}\n\n.command-palette-header-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--command-palette-fg);\n}\n\n.command-palette-arg-form {\n padding: 20px;\n}\n\n.command-palette-arg-input-group {\n margin-bottom: 16px;\n}\n\n.command-palette-arg-label {\n display: block;\n font-size: 14px;\n font-weight: 500;\n color: var(--command-palette-fg);\n margin-bottom: 8px;\n}\n\n.command-palette-arg-description {\n display: block;\n font-size: 12px;\n font-weight: 400;\n color: var(--command-palette-secondary);\n margin-top: 4px;\n}\n\n.command-palette-arg-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--command-palette-border);\n border-radius: 6px;\n font-size: 14px;\n background: var(--command-palette-bg);\n color: var(--command-palette-fg);\n outline: none;\n transition: border-color 0.15s;\n}\n\n.command-palette-arg-input:focus {\n border-color: var(--command-palette-accent);\n}\n\n.command-palette-arg-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n margin-top: 24px;\n}\n\n.command-palette-arg-button {\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n border: none;\n transition: background-color 0.15s;\n}\n\n.command-palette-arg-button-cancel {\n background: var(--command-palette-hover);\n color: var(--command-palette-fg);\n}\n\n.command-palette-arg-button-cancel:hover {\n background: var(--command-palette-border);\n}\n\n.command-palette-arg-button-submit {\n background: var(--command-palette-accent);\n color: var(--command-palette-bg);\n}\n\n.command-palette-arg-button-submit:hover {\n background: var(--command-palette-accent-hover);\n}\n';
|
|
2
|
+
var main_default = '@layer package {\n:root,\n:host,\n[theme] {\n --command-palette-bg: var(--studio-fill, white);\n --command-palette-fg: var(--studio-line, black);\n --command-palette-muted: var(--studio-line-offset-50, #999);\n --command-palette-secondary: var(--studio-line-offset-40, #666);\n --command-palette-border: var(--studio-fill-offset-20, #ccc);\n --command-palette-hover: var(--studio-fill-offset-10, #e5e5e5);\n --command-palette-accent: var(--studio-secondary, #33ccf8);\n --command-palette-accent-hover: color-mix(in oklch, var(--studio-secondary, #33ccf8), var(--studio-line, black) 20%);\n --command-palette-font-size: var(--studio-font-size, 16px);\n}\n}\n\n.command-palette-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--studio-backdrop, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--studio-backdrop-blur, blur(4px));\n z-index: var(--studio-layer-modal, 9999);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 15vh;\n}\n\n.command-palette-container {\n width: 100%;\n max-width: 640px;\n background: var(--command-palette-bg);\n border-radius: 12px;\n box-shadow: 0 16px 70px rgba(0, 0, 0, 0.3);\n overflow: hidden;\n animation: slideDown max(1ms, calc(0.2s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1))) ease-out;\n border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--command-palette-border);\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.command-palette-input {\n width: 100%;\n padding: 16px 20px;\n border: none;\n outline: none;\n font-size: var(--command-palette-font-size);\n background: transparent;\n color: var(--command-palette-fg);\n border-bottom: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--command-palette-border);\n}\n\n.command-palette-input::placeholder {\n color: var(--command-palette-secondary);\n}\n\n.command-palette-list {\n max-height: 400px;\n overflow-y: auto;\n padding: 8px;\n}\n\n.command-palette-empty {\n padding: 32px 20px;\n text-align: center;\n color: var(--command-palette-muted);\n font-size: 14px;\n}\n\n.command-palette-group-heading {\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--command-palette-secondary);\n text-transform: uppercase;\n letter-spacing: var(--studio-chrome-letter-spacing, 0.5px);\n}\n\n.command-palette-item {\n padding: 12px 12px;\n border-radius: 6px;\n cursor: var(--studio-cursor-pointer, pointer);\n transition: background-color max(1ms, calc(0.15s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1)));\n margin-bottom: 2px;\n}\n\n.command-palette-item[aria-selected="true"] {\n background: var(--command-palette-hover);\n}\n\n.command-palette-item:hover {\n background: var(--studio-hover-fill, var(--command-palette-hover));\n}\n\n.command-palette-item-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.command-palette-item-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--command-palette-fg);\n}\n\n.command-palette-item-description {\n font-size: 12px;\n color: var(--command-palette-secondary);\n}\n\n/* Argument Form Styles */\n.command-palette-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--command-palette-border);\n}\n\n.command-palette-back-button {\n background: none;\n border: none;\n color: var(--command-palette-secondary);\n cursor: var(--studio-cursor-pointer, pointer);\n font-size: 14px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color max(1ms, calc(0.15s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1)));\n}\n\n.command-palette-back-button:hover {\n background: var(--studio-hover-fill, var(--command-palette-hover));\n}\n\n.command-palette-header-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--command-palette-fg);\n}\n\n.command-palette-arg-form {\n padding: 20px;\n}\n\n.command-palette-arg-input-group {\n margin-bottom: 16px;\n}\n\n.command-palette-arg-label {\n display: block;\n font-size: 14px;\n font-weight: 500;\n color: var(--command-palette-fg);\n margin-bottom: 8px;\n}\n\n.command-palette-arg-description {\n display: block;\n font-size: 12px;\n font-weight: 400;\n color: var(--command-palette-secondary);\n margin-top: 4px;\n}\n\n.command-palette-arg-input {\n width: 100%;\n padding: 10px 12px;\n border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--command-palette-border);\n border-radius: 6px;\n font-size: 14px;\n background: var(--command-palette-bg);\n color: var(--command-palette-fg);\n outline: none;\n transition: border-color max(1ms, calc(0.15s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1)));\n}\n\n.command-palette-arg-input:focus {\n border-color: var(--command-palette-accent);\n}\n\n.command-palette-arg-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n margin-top: 24px;\n}\n\n.command-palette-arg-button {\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: var(--studio-cursor-pointer, pointer);\n border: none;\n transition: background-color max(1ms, calc(0.15s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1)));\n}\n\n.command-palette-arg-button-cancel {\n background: var(--command-palette-hover);\n color: var(--command-palette-fg);\n}\n\n.command-palette-arg-button-cancel:hover {\n background: var(--command-palette-border);\n}\n\n.command-palette-arg-button-submit {\n background: var(--command-palette-accent);\n color: var(--command-palette-bg);\n}\n\n.command-palette-arg-button-submit:hover {\n background: var(--command-palette-accent-hover);\n}\n';
|
|
3
3
|
|
|
4
4
|
// src/commands.js
|
|
5
5
|
import {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.css", "../src/commands.js", "../src/CommandPalette.js", "../src/main.js"],
|
|
4
|
-
"sourcesContent": ["@layer package {\n:root,\n:host,\n[theme] {\n --command-palette-bg: var(--studio-fill, white);\n --command-palette-fg: var(--studio-line, black);\n --command-palette-muted: var(--studio-line-offset-50, #999);\n --command-palette-secondary: var(--studio-line-offset-40, #666);\n --command-palette-border: var(--studio-fill-offset-20, #ccc);\n --command-palette-hover: var(--studio-fill-offset-10, #e5e5e5);\n --command-palette-accent: var(--studio-secondary, #33ccf8);\n --command-palette-accent-hover: color-mix(in oklch, var(--studio-secondary, #33ccf8), var(--studio-line, black) 20%);\n --command-palette-font-size: var(--studio-font-size, 16px);\n}\n}\n\n.command-palette-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n z-index: 9999;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 15vh;\n}\n\n.command-palette-container {\n width: 100%;\n max-width: 640px;\n background: var(--command-palette-bg);\n border-radius: 12px;\n box-shadow: 0 16px 70px rgba(0, 0, 0, 0.3);\n overflow: hidden;\n animation: slideDown 0.2s ease-out;\n border: 1px solid var(--command-palette-border);\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.command-palette-input {\n width: 100%;\n padding: 16px 20px;\n border: none;\n outline: none;\n font-size: var(--command-palette-font-size);\n background: transparent;\n color: var(--command-palette-fg);\n border-bottom: 1px solid var(--command-palette-border);\n}\n\n.command-palette-input::placeholder {\n color: var(--command-palette-secondary);\n}\n\n.command-palette-list {\n max-height: 400px;\n overflow-y: auto;\n padding: 8px;\n}\n\n.command-palette-empty {\n padding: 32px 20px;\n text-align: center;\n color: var(--command-palette-muted);\n font-size: 14px;\n}\n\n.command-palette-group-heading {\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--command-palette-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.command-palette-item {\n padding: 12px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: background-color 0.15s;\n margin-bottom: 2px;\n}\n\n.command-palette-item[aria-selected=\"true\"] {\n background: var(--command-palette-hover);\n}\n\n.command-palette-item:hover {\n background: var(--command-palette-hover);\n}\n\n.command-palette-item-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.command-palette-item-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--command-palette-fg);\n}\n\n.command-palette-item-description {\n font-size: 12px;\n color: var(--command-palette-secondary);\n}\n\n/* Argument Form Styles */\n.command-palette-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: 1px solid var(--command-palette-border);\n}\n\n.command-palette-back-button {\n background: none;\n border: none;\n color: var(--command-palette-secondary);\n cursor: pointer;\n font-size: 14px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.15s;\n}\n\n.command-palette-back-button:hover {\n background: var(--command-palette-hover);\n}\n\n.command-palette-header-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--command-palette-fg);\n}\n\n.command-palette-arg-form {\n padding: 20px;\n}\n\n.command-palette-arg-input-group {\n margin-bottom: 16px;\n}\n\n.command-palette-arg-label {\n display: block;\n font-size: 14px;\n font-weight: 500;\n color: var(--command-palette-fg);\n margin-bottom: 8px;\n}\n\n.command-palette-arg-description {\n display: block;\n font-size: 12px;\n font-weight: 400;\n color: var(--command-palette-secondary);\n margin-top: 4px;\n}\n\n.command-palette-arg-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--command-palette-border);\n border-radius: 6px;\n font-size: 14px;\n background: var(--command-palette-bg);\n color: var(--command-palette-fg);\n outline: none;\n transition: border-color 0.15s;\n}\n\n.command-palette-arg-input:focus {\n border-color: var(--command-palette-accent);\n}\n\n.command-palette-arg-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n margin-top: 24px;\n}\n\n.command-palette-arg-button {\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n border: none;\n transition: background-color 0.15s;\n}\n\n.command-palette-arg-button-cancel {\n background: var(--command-palette-hover);\n color: var(--command-palette-fg);\n}\n\n.command-palette-arg-button-cancel:hover {\n background: var(--command-palette-border);\n}\n\n.command-palette-arg-button-submit {\n background: var(--command-palette-accent);\n color: var(--command-palette-bg);\n}\n\n.command-palette-arg-button-submit:hover {\n background: var(--command-palette-accent-hover);\n}\n", "import {\n encodeHeads,\n isValidAutomergeUrl,\n stringifyAutomergeUrl,\n} from \"@automerge/automerge-repo/slim\";\nimport { Automerge } from \"@automerge/automerge-repo/slim\";\n\nconst toCamelCase = (str) => {\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n};\n\nexport const commands = (accountDocHandle, repo) => [\n {\n id: \"set-sidebar-tool-id\",\n label: \"Set Sidebar Tool ID\",\n description: \"Change the sidebar to a specific tool by ID\",\n category: \"Layout\",\n action: (sidebarToolId) => {\n accountDocHandle.change((doc) => {\n doc.accountSidebarToolId = sidebarToolId;\n });\n },\n args: [\n {\n name: \"Tool ID\",\n placeholder: \"e.g. simple-sidebar, funky-sidebar\",\n description: \"The ID of the tool to display in the sidebar\",\n },\n ],\n },\n {\n id: \"add-context-inspector\",\n label: \"Add Context Inspector\",\n description: \"Add a context inspector to the sidebar\",\n category: \"Tools\",\n action: async () => {\n accountDocHandle.change((doc) => {\n doc.contextToolIds.push(\"context-inspector\");\n });\n },\n },\n {\n id: \"install-module\",\n label: \"Install Module\",\n description: \"Install a module from an Automerge URL\",\n category: \"Tools\",\n action: async (url) => {\n if (!isValidAutomergeUrl(url)) {\n throw new Error(\"Invalid URL\");\n }\n\n const moduleDocHandle = await repo.find(url);\n if (!moduleDocHandle) {\n throw new Error(\"Module not found\");\n }\n\n const moduleSettingsUrl = accountDocHandle.doc().moduleSettingsUrl;\n if (!moduleSettingsUrl) {\n throw new Error(\n \"account has no moduleSettingsUrl yet; try again after the frame has finished mounting\"\n );\n }\n const moduleSettingsHandle = await repo.find(moduleSettingsUrl);\n\n moduleSettingsHandle.change((doc) => {\n const doesModuleAlreadyExist = doc.modules.includes(url);\n if (doesModuleAlreadyExist) {\n console.log(\"Module already installed, skipping\");\n return;\n } else {\n console.log(\"Installed module\", url);\n }\n\n doc.modules.push(url);\n });\n },\n args: [\n {\n name: \"Module URL\",\n placeholder: \"automerge:...\",\n description: \"The Automerge URL of the module to install\",\n },\n ],\n },\n {\n id: \"copy-current-doc\",\n label: \"Copy Current Document\",\n description: \"Create a copy of the currently open document\",\n category: \"Document\",\n action: async () => {\n const currentDocHandle = window.currentDocHandle;\n const repo = window.repo;\n const accountDoc = window.accountDocHandle;\n if (!currentDocHandle || !accountDoc) {\n return;\n }\n\n const rootFolderUrl = accountDoc.doc().rootFolderUrl;\n if (!rootFolderUrl) {\n console.log(\n \"account has no rootFolderUrl yet; frame should lazy-create it on mount\"\n );\n return;\n }\n const rootFolderDocHandle = await repo.find(rootFolderUrl);\n\n const originalDocLink = rootFolderDocHandle\n .doc()\n .docs.find((doc) => doc.url === currentDocHandle.url);\n if (!originalDocLink) {\n console.log(\"can only copy docs that are in the root folder\");\n return;\n }\n\n const copyDocHandle = await repo.create2();\n\n copyDocHandle.update(() => {\n return Automerge.clone(currentDocHandle.doc());\n });\n\n copyDocHandle.change((doc) => {\n const heads = encodeHeads(Automerge.getHeads(currentDocHandle.doc()));\n\n doc[\"@patchwork\"].copyOf = stringifyAutomergeUrl({\n documentId: currentDocHandle.documentId,\n heads,\n });\n });\n\n currentDocHandle.change((doc) => {\n if (!doc[\"@patchwork\"].copies) {\n doc[\"@patchwork\"].copies = [];\n }\n\n doc[\"@patchwork\"].copies.push(copyDocHandle.url);\n });\n\n rootFolderDocHandle.change((doc) => {\n doc.docs.push({\n name: originalDocLink.name,\n type: originalDocLink.type,\n url: copyDocHandle.url,\n });\n });\n },\n },\n];\n\nexport const initCommands = (accountDocHandle, repo) => {\n const commandList = commands(accountDocHandle, repo);\n\n window.commands = commandList;\n window.$command = Object.fromEntries(\n commandList.map((cmd) => [toCamelCase(cmd.id), cmd.action])\n );\n};\n", "export function createCommandPalette(root) {\n let open = false;\n let search = \"\";\n let selectedCommand = null;\n let argValues = [];\n let selectedIndex = 0;\n\n let backdrop = null;\n\n function el(tag, attrs, ...children) {\n const element = document.createElement(tag);\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (key.startsWith(\"on\")) {\n element.addEventListener(key.slice(2).toLowerCase(), value);\n } else if (key === \"className\") {\n element.className = value;\n } else {\n element.setAttribute(key, value);\n }\n }\n }\n for (const child of children) {\n if (typeof child === \"string\") {\n element.appendChild(document.createTextNode(child));\n } else if (child) {\n element.appendChild(child);\n }\n }\n return element;\n }\n\n function getFilteredCommands() {\n const commands = window.commands || [];\n if (!search) return commands;\n const lower = search.toLowerCase();\n return commands.filter(\n (cmd) =>\n cmd.label.toLowerCase().includes(lower) ||\n (cmd.description && cmd.description.toLowerCase().includes(lower))\n );\n }\n\n function getGroupedCommands(filtered) {\n const groups = {};\n for (const cmd of filtered) {\n const category = cmd.category || \"Commands\";\n if (!groups[category]) groups[category] = [];\n groups[category].push(cmd);\n }\n return groups;\n }\n\n function getFlatList(filtered) {\n return filtered;\n }\n\n function close() {\n open = false;\n search = \"\";\n selectedCommand = null;\n argValues = [];\n selectedIndex = 0;\n render();\n }\n\n function show() {\n open = true;\n search = \"\";\n selectedCommand = null;\n argValues = [];\n selectedIndex = 0;\n render();\n }\n\n async function handleSelect(cmd) {\n if (cmd.args && cmd.args.length > 0) {\n selectedCommand = cmd;\n argValues = new Array(cmd.args.length).fill(\"\");\n render();\n } else {\n close();\n await cmd.action();\n }\n }\n\n async function handleArgSubmit(e) {\n e.preventDefault();\n if (!selectedCommand) return;\n const cmd = selectedCommand;\n const vals = [...argValues];\n close();\n await cmd.action(...vals);\n }\n\n function handleBack() {\n selectedCommand = null;\n argValues = [];\n render();\n }\n\n function renderArgForm() {\n const cmd = selectedCommand;\n return el(\n \"div\",\n {\n className: \"command-palette-backdrop\",\n onClick: close,\n },\n el(\n \"div\",\n {\n className: \"command-palette-container\",\n onClick: (e) => e.stopPropagation(),\n },\n el(\n \"div\",\n { className: \"command-palette-header\" },\n el(\n \"button\",\n {\n className: \"command-palette-back-button\",\n onClick: handleBack,\n },\n \"\u2190 Back\"\n ),\n el(\"span\", { className: \"command-palette-header-title\" }, cmd.label)\n ),\n el(\n \"form\",\n {\n className: \"command-palette-arg-form\",\n onSubmit: handleArgSubmit,\n },\n ...cmd.args.map((arg, index) =>\n el(\n \"div\",\n { className: \"command-palette-arg-input-group\" },\n el(\n \"label\",\n { className: \"command-palette-arg-label\" },\n arg.name,\n arg.description\n ? el(\n \"span\",\n { className: \"command-palette-arg-description\" },\n arg.description\n )\n : null\n ),\n (() => {\n const input = el(\"input\", {\n type: \"text\",\n placeholder: arg.placeholder || \"\",\n className: \"command-palette-arg-input\",\n });\n input.value = argValues[index];\n input.addEventListener(\"input\", (e) => {\n argValues[index] = e.target.value;\n });\n if (index === 0) {\n setTimeout(() => input.focus(), 0);\n }\n return input;\n })()\n )\n ),\n el(\n \"div\",\n { className: \"command-palette-arg-actions\" },\n el(\n \"button\",\n {\n type: \"button\",\n className:\n \"command-palette-arg-button command-palette-arg-button-cancel\",\n onClick: handleBack,\n },\n \"Cancel\"\n ),\n el(\n \"button\",\n {\n type: \"submit\",\n className:\n \"command-palette-arg-button command-palette-arg-button-submit\",\n },\n \"Run Command\"\n )\n )\n )\n )\n );\n }\n\n function renderCommandList() {\n const filtered = getFilteredCommands();\n const grouped = getGroupedCommands(filtered);\n const flat = getFlatList(filtered);\n\n const input = el(\"input\", {\n type: \"text\",\n placeholder: \"Type a command or search...\",\n className: \"command-palette-input\",\n });\n input.value = search;\n input.addEventListener(\"input\", (e) => {\n search = e.target.value;\n selectedIndex = 0;\n updateList();\n });\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n selectedIndex = Math.min(selectedIndex + 1, flat.length - 1);\n updateSelection();\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n selectedIndex = Math.max(selectedIndex - 1, 0);\n updateSelection();\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const currentFiltered = getFilteredCommands();\n if (currentFiltered[selectedIndex]) {\n handleSelect(currentFiltered[selectedIndex]);\n }\n }\n });\n\n const list = el(\"div\", { className: \"command-palette-list\" });\n\n function buildListContent(cmds) {\n const g = getGroupedCommands(cmds);\n const items = [];\n for (const [category, categoryItems] of Object.entries(g)) {\n const heading = el(\n \"div\",\n { className: \"command-palette-group-heading\" },\n category\n );\n items.push(heading);\n for (const cmd of categoryItems) {\n const idx = cmds.indexOf(cmd);\n const item = el(\n \"div\",\n {\n className: \"command-palette-item\",\n onClick: () => handleSelect(cmd),\n onMouseenter: () => {\n selectedIndex = idx;\n updateSelection();\n },\n },\n el(\n \"div\",\n { className: \"command-palette-item-content\" },\n el(\"span\", { className: \"command-palette-item-label\" }, cmd.label),\n cmd.description\n ? el(\n \"span\",\n { className: \"command-palette-item-description\" },\n cmd.description\n )\n : null\n )\n );\n item.dataset.index = idx;\n items.push(item);\n }\n }\n return items;\n }\n\n function updateList() {\n const currentFiltered = getFilteredCommands();\n list.innerHTML = \"\";\n if (currentFiltered.length === 0) {\n list.appendChild(\n el(\n \"div\",\n { className: \"command-palette-empty\" },\n \"No results found.\"\n )\n );\n } else {\n for (const node of buildListContent(currentFiltered)) {\n list.appendChild(node);\n }\n }\n updateSelection();\n }\n\n function updateSelection() {\n for (const item of list.querySelectorAll(\".command-palette-item\")) {\n item.setAttribute(\n \"aria-selected\",\n item.dataset.index == selectedIndex ? \"true\" : \"false\"\n );\n }\n const selected = list.querySelector(\n '.command-palette-item[aria-selected=\"true\"]'\n );\n if (selected) {\n selected.scrollIntoView({ block: \"nearest\" });\n }\n }\n\n updateList();\n\n const container = el(\n \"div\",\n {\n className: \"command-palette-backdrop\",\n onClick: close,\n },\n el(\n \"div\",\n {\n className: \"command-palette-container\",\n onClick: (e) => e.stopPropagation(),\n },\n input,\n list\n )\n );\n\n setTimeout(() => input.focus(), 0);\n\n return container;\n }\n\n function render() {\n if (backdrop) {\n backdrop.remove();\n backdrop = null;\n }\n\n if (!open) return;\n\n if (selectedCommand && selectedCommand.args) {\n backdrop = renderArgForm();\n } else {\n backdrop = renderCommandList();\n }\n\n root.appendChild(backdrop);\n }\n\n document.addEventListener(\"keydown\", (e) => {\n if (e.key === \"o\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n if (open) {\n close();\n } else {\n show();\n }\n }\n if (e.key === \"Escape\" && open) {\n e.preventDefault();\n close();\n }\n });\n}\n", "import styles from \"./main.css\";\nimport { initCommands } from \"./commands.js\";\nimport { createCommandPalette } from \"./CommandPalette.js\";\n\nexport const plugins = [\n {\n type: \"patchwork:tool\",\n id: \"orion/commands\",\n name: \"Commands\",\n supportedDatatypes: [],\n async load() {\n // HACK because we have no real solution for this kind of tool yet...\n setTimeout(() => {\n initCommands(window.accountDocHandle, window.repo);\n }, 1000);\n\n const container = document.createElement(\"div\");\n container.id = \"command-palette-root\";\n document.body.appendChild(container);\n const shadowRoot = container.attachShadow({ mode: \"open\" });\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(styles);\n shadowRoot.adoptedStyleSheets ??= [];\n shadowRoot.adoptedStyleSheets.push(sheet);\n\n createCommandPalette(shadowRoot);\n\n return () => {\n return () => {};\n };\n },\n },\n];\n"],
|
|
4
|
+
"sourcesContent": ["@layer package {\n:root,\n:host,\n[theme] {\n --command-palette-bg: var(--studio-fill, white);\n --command-palette-fg: var(--studio-line, black);\n --command-palette-muted: var(--studio-line-offset-50, #999);\n --command-palette-secondary: var(--studio-line-offset-40, #666);\n --command-palette-border: var(--studio-fill-offset-20, #ccc);\n --command-palette-hover: var(--studio-fill-offset-10, #e5e5e5);\n --command-palette-accent: var(--studio-secondary, #33ccf8);\n --command-palette-accent-hover: color-mix(in oklch, var(--studio-secondary, #33ccf8), var(--studio-line, black) 20%);\n --command-palette-font-size: var(--studio-font-size, 16px);\n}\n}\n\n.command-palette-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--studio-backdrop, rgba(0, 0, 0, 0.5));\n backdrop-filter: var(--studio-backdrop-blur, blur(4px));\n z-index: var(--studio-layer-modal, 9999);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 15vh;\n}\n\n.command-palette-container {\n width: 100%;\n max-width: 640px;\n background: var(--command-palette-bg);\n border-radius: 12px;\n box-shadow: 0 16px 70px rgba(0, 0, 0, 0.3);\n overflow: hidden;\n animation: slideDown max(1ms, calc(0.2s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1))) ease-out;\n border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--command-palette-border);\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.command-palette-input {\n width: 100%;\n padding: 16px 20px;\n border: none;\n outline: none;\n font-size: var(--command-palette-font-size);\n background: transparent;\n color: var(--command-palette-fg);\n border-bottom: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--command-palette-border);\n}\n\n.command-palette-input::placeholder {\n color: var(--command-palette-secondary);\n}\n\n.command-palette-list {\n max-height: 400px;\n overflow-y: auto;\n padding: 8px;\n}\n\n.command-palette-empty {\n padding: 32px 20px;\n text-align: center;\n color: var(--command-palette-muted);\n font-size: 14px;\n}\n\n.command-palette-group-heading {\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--command-palette-secondary);\n text-transform: uppercase;\n letter-spacing: var(--studio-chrome-letter-spacing, 0.5px);\n}\n\n.command-palette-item {\n padding: 12px 12px;\n border-radius: 6px;\n cursor: var(--studio-cursor-pointer, pointer);\n transition: background-color max(1ms, calc(0.15s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1)));\n margin-bottom: 2px;\n}\n\n.command-palette-item[aria-selected=\"true\"] {\n background: var(--command-palette-hover);\n}\n\n.command-palette-item:hover {\n background: var(--studio-hover-fill, var(--command-palette-hover));\n}\n\n.command-palette-item-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.command-palette-item-label {\n font-size: 14px;\n font-weight: 500;\n color: var(--command-palette-fg);\n}\n\n.command-palette-item-description {\n font-size: 12px;\n color: var(--command-palette-secondary);\n}\n\n/* Argument Form Styles */\n.command-palette-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--command-palette-border);\n}\n\n.command-palette-back-button {\n background: none;\n border: none;\n color: var(--command-palette-secondary);\n cursor: var(--studio-cursor-pointer, pointer);\n font-size: 14px;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color max(1ms, calc(0.15s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1)));\n}\n\n.command-palette-back-button:hover {\n background: var(--studio-hover-fill, var(--command-palette-hover));\n}\n\n.command-palette-header-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--command-palette-fg);\n}\n\n.command-palette-arg-form {\n padding: 20px;\n}\n\n.command-palette-arg-input-group {\n margin-bottom: 16px;\n}\n\n.command-palette-arg-label {\n display: block;\n font-size: 14px;\n font-weight: 500;\n color: var(--command-palette-fg);\n margin-bottom: 8px;\n}\n\n.command-palette-arg-description {\n display: block;\n font-size: 12px;\n font-weight: 400;\n color: var(--command-palette-secondary);\n margin-top: 4px;\n}\n\n.command-palette-arg-input {\n width: 100%;\n padding: 10px 12px;\n border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--command-palette-border);\n border-radius: 6px;\n font-size: 14px;\n background: var(--command-palette-bg);\n color: var(--command-palette-fg);\n outline: none;\n transition: border-color max(1ms, calc(0.15s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1)));\n}\n\n.command-palette-arg-input:focus {\n border-color: var(--command-palette-accent);\n}\n\n.command-palette-arg-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n margin-top: 24px;\n}\n\n.command-palette-arg-button {\n padding: 8px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: var(--studio-cursor-pointer, pointer);\n border: none;\n transition: background-color max(1ms, calc(0.15s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1)));\n}\n\n.command-palette-arg-button-cancel {\n background: var(--command-palette-hover);\n color: var(--command-palette-fg);\n}\n\n.command-palette-arg-button-cancel:hover {\n background: var(--command-palette-border);\n}\n\n.command-palette-arg-button-submit {\n background: var(--command-palette-accent);\n color: var(--command-palette-bg);\n}\n\n.command-palette-arg-button-submit:hover {\n background: var(--command-palette-accent-hover);\n}\n", "import {\n encodeHeads,\n isValidAutomergeUrl,\n stringifyAutomergeUrl,\n} from \"@automerge/automerge-repo/slim\";\nimport { Automerge } from \"@automerge/automerge-repo/slim\";\n\nconst toCamelCase = (str) => {\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n};\n\nexport const commands = (accountDocHandle, repo) => [\n {\n id: \"set-sidebar-tool-id\",\n label: \"Set Sidebar Tool ID\",\n description: \"Change the sidebar to a specific tool by ID\",\n category: \"Layout\",\n action: (sidebarToolId) => {\n accountDocHandle.change((doc) => {\n doc.accountSidebarToolId = sidebarToolId;\n });\n },\n args: [\n {\n name: \"Tool ID\",\n placeholder: \"e.g. simple-sidebar, funky-sidebar\",\n description: \"The ID of the tool to display in the sidebar\",\n },\n ],\n },\n {\n id: \"add-context-inspector\",\n label: \"Add Context Inspector\",\n description: \"Add a context inspector to the sidebar\",\n category: \"Tools\",\n action: async () => {\n accountDocHandle.change((doc) => {\n doc.contextToolIds.push(\"context-inspector\");\n });\n },\n },\n {\n id: \"install-module\",\n label: \"Install Module\",\n description: \"Install a module from an Automerge URL\",\n category: \"Tools\",\n action: async (url) => {\n if (!isValidAutomergeUrl(url)) {\n throw new Error(\"Invalid URL\");\n }\n\n const moduleDocHandle = await repo.find(url);\n if (!moduleDocHandle) {\n throw new Error(\"Module not found\");\n }\n\n const moduleSettingsUrl = accountDocHandle.doc().moduleSettingsUrl;\n if (!moduleSettingsUrl) {\n throw new Error(\n \"account has no moduleSettingsUrl yet; try again after the frame has finished mounting\"\n );\n }\n const moduleSettingsHandle = await repo.find(moduleSettingsUrl);\n\n moduleSettingsHandle.change((doc) => {\n const doesModuleAlreadyExist = doc.modules.includes(url);\n if (doesModuleAlreadyExist) {\n console.log(\"Module already installed, skipping\");\n return;\n } else {\n console.log(\"Installed module\", url);\n }\n\n doc.modules.push(url);\n });\n },\n args: [\n {\n name: \"Module URL\",\n placeholder: \"automerge:...\",\n description: \"The Automerge URL of the module to install\",\n },\n ],\n },\n {\n id: \"copy-current-doc\",\n label: \"Copy Current Document\",\n description: \"Create a copy of the currently open document\",\n category: \"Document\",\n action: async () => {\n const currentDocHandle = window.currentDocHandle;\n const repo = window.repo;\n const accountDoc = window.accountDocHandle;\n if (!currentDocHandle || !accountDoc) {\n return;\n }\n\n const rootFolderUrl = accountDoc.doc().rootFolderUrl;\n if (!rootFolderUrl) {\n console.log(\n \"account has no rootFolderUrl yet; frame should lazy-create it on mount\"\n );\n return;\n }\n const rootFolderDocHandle = await repo.find(rootFolderUrl);\n\n const originalDocLink = rootFolderDocHandle\n .doc()\n .docs.find((doc) => doc.url === currentDocHandle.url);\n if (!originalDocLink) {\n console.log(\"can only copy docs that are in the root folder\");\n return;\n }\n\n const copyDocHandle = await repo.create2();\n\n copyDocHandle.update(() => {\n return Automerge.clone(currentDocHandle.doc());\n });\n\n copyDocHandle.change((doc) => {\n const heads = encodeHeads(Automerge.getHeads(currentDocHandle.doc()));\n\n doc[\"@patchwork\"].copyOf = stringifyAutomergeUrl({\n documentId: currentDocHandle.documentId,\n heads,\n });\n });\n\n currentDocHandle.change((doc) => {\n if (!doc[\"@patchwork\"].copies) {\n doc[\"@patchwork\"].copies = [];\n }\n\n doc[\"@patchwork\"].copies.push(copyDocHandle.url);\n });\n\n rootFolderDocHandle.change((doc) => {\n doc.docs.push({\n name: originalDocLink.name,\n type: originalDocLink.type,\n url: copyDocHandle.url,\n });\n });\n },\n },\n];\n\nexport const initCommands = (accountDocHandle, repo) => {\n const commandList = commands(accountDocHandle, repo);\n\n window.commands = commandList;\n window.$command = Object.fromEntries(\n commandList.map((cmd) => [toCamelCase(cmd.id), cmd.action])\n );\n};\n", "export function createCommandPalette(root) {\n let open = false;\n let search = \"\";\n let selectedCommand = null;\n let argValues = [];\n let selectedIndex = 0;\n\n let backdrop = null;\n\n function el(tag, attrs, ...children) {\n const element = document.createElement(tag);\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (key.startsWith(\"on\")) {\n element.addEventListener(key.slice(2).toLowerCase(), value);\n } else if (key === \"className\") {\n element.className = value;\n } else {\n element.setAttribute(key, value);\n }\n }\n }\n for (const child of children) {\n if (typeof child === \"string\") {\n element.appendChild(document.createTextNode(child));\n } else if (child) {\n element.appendChild(child);\n }\n }\n return element;\n }\n\n function getFilteredCommands() {\n const commands = window.commands || [];\n if (!search) return commands;\n const lower = search.toLowerCase();\n return commands.filter(\n (cmd) =>\n cmd.label.toLowerCase().includes(lower) ||\n (cmd.description && cmd.description.toLowerCase().includes(lower))\n );\n }\n\n function getGroupedCommands(filtered) {\n const groups = {};\n for (const cmd of filtered) {\n const category = cmd.category || \"Commands\";\n if (!groups[category]) groups[category] = [];\n groups[category].push(cmd);\n }\n return groups;\n }\n\n function getFlatList(filtered) {\n return filtered;\n }\n\n function close() {\n open = false;\n search = \"\";\n selectedCommand = null;\n argValues = [];\n selectedIndex = 0;\n render();\n }\n\n function show() {\n open = true;\n search = \"\";\n selectedCommand = null;\n argValues = [];\n selectedIndex = 0;\n render();\n }\n\n async function handleSelect(cmd) {\n if (cmd.args && cmd.args.length > 0) {\n selectedCommand = cmd;\n argValues = new Array(cmd.args.length).fill(\"\");\n render();\n } else {\n close();\n await cmd.action();\n }\n }\n\n async function handleArgSubmit(e) {\n e.preventDefault();\n if (!selectedCommand) return;\n const cmd = selectedCommand;\n const vals = [...argValues];\n close();\n await cmd.action(...vals);\n }\n\n function handleBack() {\n selectedCommand = null;\n argValues = [];\n render();\n }\n\n function renderArgForm() {\n const cmd = selectedCommand;\n return el(\n \"div\",\n {\n className: \"command-palette-backdrop\",\n onClick: close,\n },\n el(\n \"div\",\n {\n className: \"command-palette-container\",\n onClick: (e) => e.stopPropagation(),\n },\n el(\n \"div\",\n { className: \"command-palette-header\" },\n el(\n \"button\",\n {\n className: \"command-palette-back-button\",\n onClick: handleBack,\n },\n \"\u2190 Back\"\n ),\n el(\"span\", { className: \"command-palette-header-title\" }, cmd.label)\n ),\n el(\n \"form\",\n {\n className: \"command-palette-arg-form\",\n onSubmit: handleArgSubmit,\n },\n ...cmd.args.map((arg, index) =>\n el(\n \"div\",\n { className: \"command-palette-arg-input-group\" },\n el(\n \"label\",\n { className: \"command-palette-arg-label\" },\n arg.name,\n arg.description\n ? el(\n \"span\",\n { className: \"command-palette-arg-description\" },\n arg.description\n )\n : null\n ),\n (() => {\n const input = el(\"input\", {\n type: \"text\",\n placeholder: arg.placeholder || \"\",\n className: \"command-palette-arg-input\",\n });\n input.value = argValues[index];\n input.addEventListener(\"input\", (e) => {\n argValues[index] = e.target.value;\n });\n if (index === 0) {\n setTimeout(() => input.focus(), 0);\n }\n return input;\n })()\n )\n ),\n el(\n \"div\",\n { className: \"command-palette-arg-actions\" },\n el(\n \"button\",\n {\n type: \"button\",\n className:\n \"command-palette-arg-button command-palette-arg-button-cancel\",\n onClick: handleBack,\n },\n \"Cancel\"\n ),\n el(\n \"button\",\n {\n type: \"submit\",\n className:\n \"command-palette-arg-button command-palette-arg-button-submit\",\n },\n \"Run Command\"\n )\n )\n )\n )\n );\n }\n\n function renderCommandList() {\n const filtered = getFilteredCommands();\n const grouped = getGroupedCommands(filtered);\n const flat = getFlatList(filtered);\n\n const input = el(\"input\", {\n type: \"text\",\n placeholder: \"Type a command or search...\",\n className: \"command-palette-input\",\n });\n input.value = search;\n input.addEventListener(\"input\", (e) => {\n search = e.target.value;\n selectedIndex = 0;\n updateList();\n });\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n selectedIndex = Math.min(selectedIndex + 1, flat.length - 1);\n updateSelection();\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n selectedIndex = Math.max(selectedIndex - 1, 0);\n updateSelection();\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const currentFiltered = getFilteredCommands();\n if (currentFiltered[selectedIndex]) {\n handleSelect(currentFiltered[selectedIndex]);\n }\n }\n });\n\n const list = el(\"div\", { className: \"command-palette-list\" });\n\n function buildListContent(cmds) {\n const g = getGroupedCommands(cmds);\n const items = [];\n for (const [category, categoryItems] of Object.entries(g)) {\n const heading = el(\n \"div\",\n { className: \"command-palette-group-heading\" },\n category\n );\n items.push(heading);\n for (const cmd of categoryItems) {\n const idx = cmds.indexOf(cmd);\n const item = el(\n \"div\",\n {\n className: \"command-palette-item\",\n onClick: () => handleSelect(cmd),\n onMouseenter: () => {\n selectedIndex = idx;\n updateSelection();\n },\n },\n el(\n \"div\",\n { className: \"command-palette-item-content\" },\n el(\"span\", { className: \"command-palette-item-label\" }, cmd.label),\n cmd.description\n ? el(\n \"span\",\n { className: \"command-palette-item-description\" },\n cmd.description\n )\n : null\n )\n );\n item.dataset.index = idx;\n items.push(item);\n }\n }\n return items;\n }\n\n function updateList() {\n const currentFiltered = getFilteredCommands();\n list.innerHTML = \"\";\n if (currentFiltered.length === 0) {\n list.appendChild(\n el(\n \"div\",\n { className: \"command-palette-empty\" },\n \"No results found.\"\n )\n );\n } else {\n for (const node of buildListContent(currentFiltered)) {\n list.appendChild(node);\n }\n }\n updateSelection();\n }\n\n function updateSelection() {\n for (const item of list.querySelectorAll(\".command-palette-item\")) {\n item.setAttribute(\n \"aria-selected\",\n item.dataset.index == selectedIndex ? \"true\" : \"false\"\n );\n }\n const selected = list.querySelector(\n '.command-palette-item[aria-selected=\"true\"]'\n );\n if (selected) {\n selected.scrollIntoView({ block: \"nearest\" });\n }\n }\n\n updateList();\n\n const container = el(\n \"div\",\n {\n className: \"command-palette-backdrop\",\n onClick: close,\n },\n el(\n \"div\",\n {\n className: \"command-palette-container\",\n onClick: (e) => e.stopPropagation(),\n },\n input,\n list\n )\n );\n\n setTimeout(() => input.focus(), 0);\n\n return container;\n }\n\n function render() {\n if (backdrop) {\n backdrop.remove();\n backdrop = null;\n }\n\n if (!open) return;\n\n if (selectedCommand && selectedCommand.args) {\n backdrop = renderArgForm();\n } else {\n backdrop = renderCommandList();\n }\n\n root.appendChild(backdrop);\n }\n\n document.addEventListener(\"keydown\", (e) => {\n if (e.key === \"o\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n if (open) {\n close();\n } else {\n show();\n }\n }\n if (e.key === \"Escape\" && open) {\n e.preventDefault();\n close();\n }\n });\n}\n", "import styles from \"./main.css\";\nimport { initCommands } from \"./commands.js\";\nimport { createCommandPalette } from \"./CommandPalette.js\";\n\nexport const plugins = [\n {\n type: \"patchwork:tool\",\n id: \"orion/commands\",\n name: \"Commands\",\n supportedDatatypes: [],\n async load() {\n // HACK because we have no real solution for this kind of tool yet...\n setTimeout(() => {\n initCommands(window.accountDocHandle, window.repo);\n }, 1000);\n\n const container = document.createElement(\"div\");\n container.id = \"command-palette-root\";\n document.body.appendChild(container);\n const shadowRoot = container.attachShadow({ mode: \"open\" });\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(styles);\n shadowRoot.adoptedStyleSheets ??= [];\n shadowRoot.adoptedStyleSheets.push(sheet);\n\n createCommandPalette(shadowRoot);\n\n return () => {\n return () => {};\n };\n },\n },\n];\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["repo", "commands"]
|
|
7
7
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
try {
|
|
4
4
|
if (typeof document != "undefined") {
|
|
5
5
|
var elementStyle = document.createElement("style");
|
|
6
|
-
elementStyle.appendChild(document.createTextNode("@layer package {\n:root,\n:host,\n[theme] {\n --comments-fg: var(--text-editor-line, var(--studio-line, black));\n --comments-muted-fg: var(--studio-line-offset-50, #999);\n --comments-bg: var(--text-editor-fill, var(--studio-fill, white));\n --comments-border: var(--studio-fill-offset-20, #ccc);\n --comments-hover-bg: var(--studio-fill-offset-10, #f5f5f5);\n --comments-font: var(--studio-family-sans, system-ui, sans-serif);\n --comments-accent: var(--studio-secondary, #33ccf8);\n}\n}\n\n/* The width:100% boxes below (panel, textarea) also carry padding and a\n border, so without border-box they extend past their container and overflow\n it. Scoped to the panel and the thread card so the injected stylesheet never\n touches the host page (it may be injected into document.head, not a shadow\n root). The card is covered on its own because a single thread renders\n standalone too — e.g. in the editor's comment popover, with no panel around\n it — and its draft textarea would otherwise spill out of the card. */\n.comments-panel,\n.comments-panel *,\n.comments-panel *::before,\n.comments-panel *::after,\n.comments-thread-card,\n.comments-thread-card *,\n.comments-thread-card *::before,\n.comments-thread-card *::after {\n box-sizing: border-box;\n}\n\n.comments-panel {\n height: 100%;\n width: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n padding: 0.5rem;\n gap: 0.5rem;\n font-family: var(--comments-font);\n color: var(--comments-fg);\n}\n\n.comments-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.75rem;\n color: var(--comments-muted-fg);\n}\n\n.comments-panel-header-title {\n font-weight: 500;\n}\n\n.comments-empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.5rem 0.5rem;\n text-align: center;\n font-size: 0.875rem;\n color: var(--comments-muted-fg);\n}\n\n.comments-thread {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n/* A thread that arrived while the doc was open (see SETTLE_MS in\n CommentsView.tsx). Its card and actions mount whenever the `comment-thread`\n tool finishes loading, so they animate on mount rather than the wrapper,\n which could otherwise lift in while still empty. */\n.comments-thread[data-new] > patchwork-view > * {\n transition:\n opacity 200ms var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1)),\n transform 200ms var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1));\n}\n@starting-style {\n .comments-thread[data-new] > patchwork-view > * {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n}\n\n/* The thread's card + actions are rendered by the `comment-thread` tool into\n its <patchwork-view> host, so that host is the flex column that lays them\n out (a custom element is `display: inline` by default). */\n.comments-thread > patchwork-view {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.comments-thread-card {\n background: var(--comments-bg);\n border: 1px solid var(--comments-border);\n padding: 0.5rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n cursor: pointer;\n border-radius: 6px;\n transition:\n border-color 0.15s ease,\n background 0.15s ease,\n box-shadow 0.15s ease;\n}\n\n.comments-thread-card--primary {\n box-shadow:\n 0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1);\n}\n\n.comments-thread-card--secondary {\n box-shadow:\n 0 4px 6px -1px rgb(0 0 0 / 0.1),\n 0 2px 4px -2px rgb(0 0 0 / 0.1);\n}\n\n.comments-thread-card--inactive {\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n/* In the sidebar, where threads sit side by side, the selected one needs to\n stand out from the rest: an accent border and ring, faintly tinted. A thread\n embedded on its own defaults to primary, so this is scoped to the panel. */\n.comments-panel .comments-thread-card--primary {\n border-color: var(--comments-accent);\n background: color-mix(in srgb, var(--comments-accent) 6%, var(--comments-bg));\n box-shadow:\n 0 0 0 1px var(--comments-accent),\n 0 6px 14px -4px rgb(0 0 0 / 0.15);\n}\n\n/* Threads that also overlap the selection: a softer accent border. */\n.comments-panel .comments-thread-card--secondary {\n border-color: color-mix(\n in srgb,\n var(--comments-accent) 50%,\n var(--comments-border)\n );\n box-shadow: 0 2px 4px -2px rgb(0 0 0 / 0.1);\n}\n\n.comments-panel .comments-thread-card--inactive {\n box-shadow: none;\n}\n\n/* Hovering a thread highlights its target, so hint that it's live. */\n.comments-panel .comments-thread:hover .comments-thread-card--inactive {\n border-color: color-mix(\n in srgb,\n var(--comments-accent) 40%,\n var(--comments-border)\n );\n background: var(--comments-hover-bg);\n}\n\n/* Resolved threads are hidden in the sidebar but shown when embedded. Keep\n them clearly readable, just visibly \"settled\": muted fill, dashed border,\n and slightly dimmed so they read as archived rather than active. */\n.comments-thread-card--resolved {\n background: var(--comments-hover-bg);\n border-style: dashed;\n opacity: 0.75;\n}\n\n.comments-thread-resolved-label {\n align-self: flex-start;\n font-size: 0.6875rem;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n padding: 0.0625rem 0.375rem;\n border-radius: 0.625rem;\n color: var(--comments-muted-fg);\n border: 1px solid var(--comments-border);\n}\n\n.comments-thread-card-body {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.comments-thread-doc-level {\n font-size: 0.6875rem;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--comments-muted-fg);\n}\n\n.comments-thread-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n}\n\n.comments-thread-actions {\n display: flex;\n flex-direction: row;\n gap: 0.5rem;\n justify-content: flex-end;\n}\n\n.comment-card {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.comment-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n}\n\n.comment-author {\n display: flex;\n flex-direction: row;\n gap: 0.5rem;\n align-items: center;\n}\n\n.comment-author-name {\n font-size: 0.875rem;\n font-weight: 500;\n white-space: nowrap;\n color: var(--comments-fg);\n}\n\n.comment-timestamp {\n font-size: 0.75rem;\n color: var(--comments-muted-fg);\n}\n\n.comment-content {\n font-size: 1rem;\n color: var(--comments-fg);\n white-space: pre-wrap;\n overflow-wrap: break-word;\n}\n\n/* The draft editor is a cute.txt (CodeMirror) instance. Its inner\n padding/font come from the injected cute.txt styles. */\n.comment-draft-editor {\n height: 6rem;\n min-height: 6rem;\n min-width: 0;\n width: 100%;\n border: 1px solid var(--comments-border);\n border-radius: 0.5rem;\n color: var(--comments-fg);\n background: var(--comments-bg);\n overflow: hidden;\n}\n\n.comment-draft-editor .cm-content {\n box-sizing: border-box;\n min-height: 0;\n min-width: 0;\n margin: 0;\n padding: 0.5rem;\n}\n\n.comment-draft-editor .cm-line {\n margin: 0;\n padding: 0;\n}\n\n.comment-draft-editor .cm-scroller {\n height: 100%;\n min-width: 0;\n}\n\n.comment-draft-editor:focus-within {\n outline: 2px solid var(--comments-accent);\n outline-offset: 1px;\n}\n\n.comment-btn {\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n font-family: inherit;\n font-size: 0.875rem;\n cursor: pointer;\n border: none;\n background: transparent;\n color: var(--comments-fg);\n}\n\n.comment-btn:hover {\n background: var(--comments-hover-bg);\n}"));
|
|
6
|
+
elementStyle.appendChild(document.createTextNode("@layer package {\n:root,\n:host,\n[theme] {\n --comments-fg: var(--text-editor-line, var(--studio-line, black));\n --comments-muted-fg: var(--studio-line-offset-50, #999);\n --comments-bg: var(--text-editor-fill, var(--studio-fill, white));\n --comments-border: var(--studio-fill-offset-20, #ccc);\n --comments-hover-bg: var(--studio-fill-offset-10, #f5f5f5);\n --comments-font: var(--studio-family-sans, system-ui, sans-serif);\n --comments-accent: var(--studio-secondary, #33ccf8);\n}\n}\n\n/* The width:100% boxes below (panel, textarea) also carry padding and a\n border, so without border-box they extend past their container and overflow\n it. Scoped to the panel and the thread card so the injected stylesheet never\n touches the host page (it may be injected into document.head, not a shadow\n root). The card is covered on its own because a single thread renders\n standalone too — e.g. in the editor's comment popover, with no panel around\n it — and its draft textarea would otherwise spill out of the card. */\n.comments-panel,\n.comments-panel *,\n.comments-panel *::before,\n.comments-panel *::after,\n.comments-thread-card,\n.comments-thread-card *,\n.comments-thread-card *::before,\n.comments-thread-card *::after {\n box-sizing: border-box;\n}\n\n.comments-panel {\n height: 100%;\n width: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n padding: 0.5rem;\n gap: 0.5rem;\n font-family: var(--comments-font);\n color: var(--comments-fg);\n}\n\n.comments-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.75rem;\n color: var(--comments-muted-fg);\n}\n\n.comments-panel-header-title {\n font-weight: 500;\n}\n\n.comments-empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.5rem 0.5rem;\n text-align: center;\n font-size: 0.875rem;\n color: var(--comments-muted-fg);\n}\n\n.comments-thread {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n/* A thread that arrived while the doc was open (see SETTLE_MS in\n CommentsView.tsx). Its card and actions mount whenever the `comment-thread`\n tool finishes loading, so they animate on mount rather than the wrapper,\n which could otherwise lift in while still empty. */\n.comments-thread[data-new] > patchwork-view > * {\n transition:\n opacity max(1ms, calc(200ms * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1))) var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1)),\n transform max(1ms, calc(200ms * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1))) var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1));\n}\n@starting-style {\n .comments-thread[data-new] > patchwork-view > * {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n}\n\n/* The thread's card + actions are rendered by the `comment-thread` tool into\n its <patchwork-view> host, so that host is the flex column that lays them\n out (a custom element is `display: inline` by default). */\n.comments-thread > patchwork-view {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.comments-thread-card {\n background: var(--comments-bg);\n border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--comments-border);\n padding: 0.5rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n cursor: var(--studio-cursor-pointer, pointer);\n border-radius: 6px;\n transition:\n border-color var(--studio-transition, 0.15s ease),\n background var(--studio-transition, 0.15s ease),\n box-shadow var(--studio-transition, 0.15s ease);\n}\n\n.comments-thread-card--primary {\n box-shadow:\n 0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1);\n}\n\n.comments-thread-card--secondary {\n box-shadow:\n 0 4px 6px -1px rgb(0 0 0 / 0.1),\n 0 2px 4px -2px rgb(0 0 0 / 0.1);\n}\n\n.comments-thread-card--inactive {\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n/* In the sidebar, where threads sit side by side, the selected one needs to\n stand out from the rest: an accent border and ring, faintly tinted. A thread\n embedded on its own defaults to primary, so this is scoped to the panel. */\n.comments-panel .comments-thread-card--primary {\n border-color: var(--comments-accent);\n background: color-mix(in srgb, var(--comments-accent) 6%, var(--comments-bg));\n box-shadow:\n 0 0 0 1px var(--comments-accent),\n 0 6px 14px -4px rgb(0 0 0 / 0.15);\n}\n\n/* Threads that also overlap the selection: a softer accent border. */\n.comments-panel .comments-thread-card--secondary {\n border-color: color-mix(\n in srgb,\n var(--comments-accent) 50%,\n var(--comments-border)\n );\n box-shadow: 0 2px 4px -2px rgb(0 0 0 / 0.1);\n}\n\n.comments-panel .comments-thread-card--inactive {\n box-shadow: none;\n}\n\n/* Hovering a thread highlights its target, so hint that it's live. */\n.comments-panel .comments-thread:hover .comments-thread-card--inactive {\n border-color: color-mix(\n in srgb,\n var(--comments-accent) 40%,\n var(--comments-border)\n );\n background: var(--comments-hover-bg);\n}\n\n/* Resolved threads are hidden in the sidebar but shown when embedded. Keep\n them clearly readable, just visibly \"settled\": muted fill, dashed border,\n and slightly dimmed so they read as archived rather than active. */\n.comments-thread-card--resolved {\n background: var(--comments-hover-bg);\n border-style: dashed;\n opacity: 0.75;\n}\n\n.comments-thread-resolved-label {\n align-self: flex-start;\n font-size: 0.6875rem;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: var(--studio-chrome-letter-spacing, 0.03em);\n padding: 0.0625rem 0.375rem;\n border-radius: 0.625rem;\n color: var(--comments-muted-fg);\n border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--comments-border);\n}\n\n.comments-thread-card-body {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.comments-thread-doc-level {\n font-size: 0.6875rem;\n text-transform: uppercase;\n letter-spacing: var(--studio-chrome-letter-spacing, 0.03em);\n color: var(--comments-muted-fg);\n}\n\n.comments-thread-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n}\n\n.comments-thread-actions {\n display: flex;\n flex-direction: row;\n gap: 0.5rem;\n justify-content: flex-end;\n}\n\n.comment-card {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.comment-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n}\n\n.comment-author {\n display: flex;\n flex-direction: row;\n gap: 0.5rem;\n align-items: center;\n}\n\n.comment-author-name {\n font-size: 0.875rem;\n font-weight: 500;\n white-space: nowrap;\n color: var(--comments-fg);\n}\n\n.comment-timestamp {\n font-size: 0.75rem;\n color: var(--comments-muted-fg);\n}\n\n.comment-content {\n font-size: 1rem;\n color: var(--comments-fg);\n white-space: pre-wrap;\n overflow-wrap: break-word;\n}\n\n/* The draft editor is a cute.txt (CodeMirror) instance. Its inner\n padding/font come from the injected cute.txt styles. */\n.comment-draft-editor {\n height: 6rem;\n min-height: 6rem;\n min-width: 0;\n width: 100%;\n border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--comments-border);\n border-radius: 0.5rem;\n color: var(--comments-fg);\n background: var(--comments-bg);\n overflow: hidden;\n}\n\n.comment-draft-editor .cm-content {\n box-sizing: border-box;\n min-height: 0;\n min-width: 0;\n margin: 0;\n padding: 0.5rem;\n}\n\n.comment-draft-editor .cm-line {\n margin: 0;\n padding: 0;\n}\n\n.comment-draft-editor .cm-scroller {\n height: 100%;\n min-width: 0;\n}\n\n.comment-draft-editor:focus-within {\n outline: var(--studio-focus-ring, 2px solid var(--comments-accent));\n outline-offset: var(--studio-focus-ring-offset, 1px);\n}\n\n.comment-btn {\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n font-family: inherit;\n font-size: 0.875rem;\n cursor: var(--studio-cursor-pointer, pointer);\n border: none;\n background: transparent;\n color: var(--comments-fg);\n}\n\n.comment-btn:hover {\n background: var(--studio-hover-fill, var(--comments-hover-bg));\n}"));
|
|
7
7
|
document.head.appendChild(elementStyle);
|
|
8
8
|
}
|
|
9
9
|
} catch (e) {
|
|
@@ -86,14 +86,14 @@ function DocOpenWith(handle, element) {
|
|
|
86
86
|
align-items: center;
|
|
87
87
|
height: 22px;
|
|
88
88
|
padding: 0 var(--studio-space-sm, 0.5rem);
|
|
89
|
-
border: 1px solid var(--doc-openwith-border);
|
|
89
|
+
border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--doc-openwith-border);
|
|
90
90
|
border-radius: var(--studio-radius-sm, 4px);
|
|
91
91
|
background: var(--doc-openwith-bg);
|
|
92
92
|
color: var(--doc-openwith-fg);
|
|
93
93
|
font: inherit;
|
|
94
94
|
font-size: 0.8em;
|
|
95
95
|
font-weight: 500;
|
|
96
|
-
cursor: pointer;
|
|
96
|
+
cursor: var(--studio-cursor-pointer, pointer);
|
|
97
97
|
transition: border-color var(--studio-transition-fast, 0.1s ease),
|
|
98
98
|
background var(--studio-transition-fast, 0.1s ease);
|
|
99
99
|
white-space: nowrap;
|
|
@@ -111,7 +111,7 @@ function DocOpenWith(handle, element) {
|
|
|
111
111
|
inset: unset;
|
|
112
112
|
margin: 0;
|
|
113
113
|
padding: 0;
|
|
114
|
-
border: 1px solid var(--doc-openwith-border);
|
|
114
|
+
border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--doc-openwith-border);
|
|
115
115
|
border-radius: var(--studio-radius-sm, 4px);
|
|
116
116
|
background: var(--doc-openwith-bg);
|
|
117
117
|
box-shadow: var(--studio-shadow-sm, 0 2px 8px rgba(0, 0, 0, 0.08));
|
|
@@ -123,7 +123,7 @@ function DocOpenWith(handle, element) {
|
|
|
123
123
|
width: 100%;
|
|
124
124
|
padding: var(--studio-space-xs, 0.375rem) var(--studio-space-sm, 0.5rem);
|
|
125
125
|
border: none;
|
|
126
|
-
border-bottom: 1px solid var(--doc-openwith-divider);
|
|
126
|
+
border-bottom: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--doc-openwith-divider);
|
|
127
127
|
background: none;
|
|
128
128
|
font: inherit;
|
|
129
129
|
font-size: 0.8em;
|
|
@@ -149,7 +149,7 @@ function DocOpenWith(handle, element) {
|
|
|
149
149
|
font: inherit;
|
|
150
150
|
font-size: 0.8em;
|
|
151
151
|
text-align: left;
|
|
152
|
-
cursor: pointer;
|
|
152
|
+
cursor: var(--studio-cursor-pointer, pointer);
|
|
153
153
|
white-space: nowrap;
|
|
154
154
|
}
|
|
155
155
|
|
|
@@ -210,7 +210,7 @@ function DocPresence(handle, element) {
|
|
|
210
210
|
line-height: 1;
|
|
211
211
|
overflow: hidden;
|
|
212
212
|
flex-shrink: 0;
|
|
213
|
-
transition: opacity 0.3s ease;
|
|
213
|
+
transition: opacity max(1ms, calc(0.3s * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1))) ease;
|
|
214
214
|
background-color: var(--color-base-200, #eee);
|
|
215
215
|
background-size: cover;
|
|
216
216
|
background-position: center;
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
|
|
68
68
|
.draft-card {
|
|
69
69
|
background: var(--drafts-bg);
|
|
70
|
-
border: 1px solid var(--drafts-border);
|
|
70
|
+
border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--drafts-border);
|
|
71
71
|
border-radius: var(--drafts-radius);
|
|
72
72
|
box-shadow: var(--drafts-shadow-sm);
|
|
73
73
|
overflow: hidden;
|
|
@@ -113,14 +113,14 @@
|
|
|
113
113
|
/* Round the top corners itself: the card's overflow clipping is lifted
|
|
114
114
|
while the menu is open, so the hover background can't rely on it. */
|
|
115
115
|
border-radius: calc(var(--drafts-radius) - 1px) calc(var(--drafts-radius) - 1px) 0 0;
|
|
116
|
-
cursor: pointer;
|
|
116
|
+
cursor: var(--studio-cursor-pointer, pointer);
|
|
117
117
|
font-family: inherit;
|
|
118
118
|
color: inherit;
|
|
119
119
|
transition: background var(--studio-transition, 0.15s ease);
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
.draft-card-header:hover {
|
|
123
|
-
background: var(--drafts-hover-bg);
|
|
123
|
+
background: var(--studio-chrome-hover-fill, var(--drafts-hover-bg));
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
.draft-card-title {
|
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
padding: 0 0.25rem;
|
|
147
147
|
margin: 0;
|
|
148
148
|
background: var(--drafts-bg);
|
|
149
|
-
border: 1px solid var(--drafts-primary);
|
|
149
|
+
border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--drafts-primary);
|
|
150
150
|
border-radius: var(--drafts-radius-sm);
|
|
151
151
|
outline: none;
|
|
152
152
|
}
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
display: flex;
|
|
168
168
|
flex-direction: column;
|
|
169
169
|
gap: 0.125rem;
|
|
170
|
-
border-top: 1px solid var(--drafts-border);
|
|
170
|
+
border-top: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--drafts-border);
|
|
171
171
|
/* Extra top headroom: the scrubber's dot (5px) and sticker (10px) overhang
|
|
172
172
|
above the head line, which sits at 0 on the latest version — without
|
|
173
173
|
this they'd crowd into the card header. */
|
|
@@ -203,17 +203,17 @@
|
|
|
203
203
|
border-radius: var(--studio-radius, 0.25rem);
|
|
204
204
|
background: transparent;
|
|
205
205
|
color: var(--drafts-faint-fg);
|
|
206
|
-
cursor: pointer;
|
|
206
|
+
cursor: var(--studio-cursor-pointer, pointer);
|
|
207
207
|
}
|
|
208
208
|
|
|
209
209
|
.draft-card-action:hover:not(:disabled) {
|
|
210
|
-
background: var(--drafts-hover-bg);
|
|
210
|
+
background: var(--studio-chrome-hover-fill, var(--drafts-hover-bg));
|
|
211
211
|
color: var(--drafts-primary-text);
|
|
212
212
|
}
|
|
213
213
|
|
|
214
214
|
.draft-card-action:disabled {
|
|
215
215
|
opacity: 0.35;
|
|
216
|
-
cursor: default;
|
|
216
|
+
cursor: var(--studio-cursor-default, default);
|
|
217
217
|
}
|
|
218
218
|
|
|
219
219
|
/* The menu trigger stays lit while its dropdown is showing. */
|
|
@@ -247,14 +247,14 @@
|
|
|
247
247
|
flex-direction: column;
|
|
248
248
|
padding: 0.25rem;
|
|
249
249
|
background: var(--drafts-bg);
|
|
250
|
-
border: 1px solid var(--drafts-border);
|
|
250
|
+
border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--drafts-border);
|
|
251
251
|
border-radius: var(--drafts-radius-sm);
|
|
252
252
|
box-shadow: var(--drafts-shadow-md);
|
|
253
253
|
/* Grows out of its button. Closing is instant. */
|
|
254
254
|
transform-origin: top right;
|
|
255
255
|
transition:
|
|
256
|
-
opacity 150ms var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1)),
|
|
257
|
-
transform 150ms var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1));
|
|
256
|
+
opacity max(1ms, calc(150ms * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1))) var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1)),
|
|
257
|
+
transform max(1ms, calc(150ms * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1))) var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1));
|
|
258
258
|
}
|
|
259
259
|
@starting-style {
|
|
260
260
|
.draft-menu-list {
|
|
@@ -276,17 +276,17 @@
|
|
|
276
276
|
font-size: 0.8125rem;
|
|
277
277
|
text-align: left;
|
|
278
278
|
color: var(--drafts-fg);
|
|
279
|
-
cursor: pointer;
|
|
279
|
+
cursor: var(--studio-cursor-pointer, pointer);
|
|
280
280
|
white-space: nowrap;
|
|
281
281
|
}
|
|
282
282
|
|
|
283
283
|
.draft-menu-item:hover:not(:disabled) {
|
|
284
|
-
background: var(--drafts-hover-bg);
|
|
284
|
+
background: var(--studio-chrome-hover-fill, var(--drafts-hover-bg));
|
|
285
285
|
}
|
|
286
286
|
|
|
287
287
|
.draft-menu-item:disabled {
|
|
288
|
-
opacity: 0.5;
|
|
289
|
-
cursor: default;
|
|
288
|
+
opacity: var(--studio-disabled-opacity, 0.5);
|
|
289
|
+
cursor: var(--studio-cursor-default, default);
|
|
290
290
|
}
|
|
291
291
|
|
|
292
292
|
.draft-menu-item svg {
|
|
@@ -318,18 +318,18 @@
|
|
|
318
318
|
.draft-card-return {
|
|
319
319
|
flex-shrink: 0;
|
|
320
320
|
padding: 0.125rem 0.5rem;
|
|
321
|
-
border: 1px solid var(--drafts-border);
|
|
321
|
+
border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--drafts-border);
|
|
322
322
|
border-radius: var(--studio-radius-round, 9999px);
|
|
323
323
|
background: transparent;
|
|
324
324
|
font-family: inherit;
|
|
325
325
|
font-size: 0.6875rem;
|
|
326
326
|
line-height: 1.2;
|
|
327
327
|
color: var(--drafts-primary-text);
|
|
328
|
-
cursor: pointer;
|
|
328
|
+
cursor: var(--studio-cursor-pointer, pointer);
|
|
329
329
|
}
|
|
330
330
|
|
|
331
331
|
.draft-card-return:hover {
|
|
332
|
-
background: var(--drafts-hover-bg);
|
|
332
|
+
background: var(--studio-chrome-hover-fill, var(--drafts-hover-bg));
|
|
333
333
|
}
|
|
334
334
|
|
|
335
335
|
/* The diff toggle (eye) in the card title's tool cluster. Active = diff
|
|
@@ -344,11 +344,11 @@
|
|
|
344
344
|
border-radius: var(--studio-radius, 0.25rem);
|
|
345
345
|
background: transparent;
|
|
346
346
|
color: var(--drafts-faint-fg);
|
|
347
|
-
cursor: pointer;
|
|
347
|
+
cursor: var(--studio-cursor-pointer, pointer);
|
|
348
348
|
}
|
|
349
349
|
|
|
350
350
|
.draft-card-eye:hover:not([data-disabled]) {
|
|
351
|
-
background: var(--drafts-hover-bg);
|
|
351
|
+
background: var(--studio-chrome-hover-fill, var(--drafts-hover-bg));
|
|
352
352
|
color: var(--drafts-primary-text);
|
|
353
353
|
}
|
|
354
354
|
|
|
@@ -360,7 +360,7 @@
|
|
|
360
360
|
explanatory tooltip shows; clicks are ignored in the handler. */
|
|
361
361
|
.draft-card-eye[data-disabled] {
|
|
362
362
|
opacity: 0.35;
|
|
363
|
-
cursor: default;
|
|
363
|
+
cursor: var(--studio-cursor-default, default);
|
|
364
364
|
}
|
|
365
365
|
|
|
366
366
|
.draft-changes-empty {
|
|
@@ -407,7 +407,7 @@
|
|
|
407
407
|
font-size: 0.75rem;
|
|
408
408
|
text-align: left;
|
|
409
409
|
color: inherit;
|
|
410
|
-
cursor: pointer;
|
|
410
|
+
cursor: var(--studio-cursor-pointer, pointer);
|
|
411
411
|
}
|
|
412
412
|
|
|
413
413
|
.draft-change-line {
|
|
@@ -418,7 +418,7 @@
|
|
|
418
418
|
}
|
|
419
419
|
|
|
420
420
|
.draft-change-row:hover {
|
|
421
|
-
background: var(--drafts-hover-bg);
|
|
421
|
+
background: var(--studio-chrome-hover-fill, var(--drafts-hover-bg));
|
|
422
422
|
}
|
|
423
423
|
|
|
424
424
|
.draft-change-row[data-selected] {
|
|
@@ -476,7 +476,7 @@
|
|
|
476
476
|
font-size: 0.75rem;
|
|
477
477
|
text-align: left;
|
|
478
478
|
color: inherit;
|
|
479
|
-
cursor: pointer;
|
|
479
|
+
cursor: var(--studio-cursor-pointer, pointer);
|
|
480
480
|
}
|
|
481
481
|
|
|
482
482
|
/* Group backgrounds stay lightly translucent so the row highlight reads as a
|
|
@@ -571,7 +571,7 @@
|
|
|
571
571
|
flex: none;
|
|
572
572
|
width: 16px;
|
|
573
573
|
border-radius: var(--drafts-radius-sm);
|
|
574
|
-
cursor: pointer;
|
|
574
|
+
cursor: var(--studio-cursor-pointer, pointer);
|
|
575
575
|
touch-action: none;
|
|
576
576
|
}
|
|
577
577
|
|
|
@@ -597,12 +597,12 @@
|
|
|
597
597
|
border-radius: 50%;
|
|
598
598
|
background: var(--scrub-color);
|
|
599
599
|
pointer-events: auto;
|
|
600
|
-
cursor: grab;
|
|
600
|
+
cursor: var(--studio-cursor-grab, grab);
|
|
601
601
|
touch-action: none;
|
|
602
602
|
}
|
|
603
603
|
|
|
604
604
|
.draft-scrubber-dot:active {
|
|
605
|
-
cursor: grabbing;
|
|
605
|
+
cursor: var(--studio-cursor-grabbing, grabbing);
|
|
606
606
|
}
|
|
607
607
|
|
|
608
608
|
/* The visible head line, spanning across the rows on top of them. */
|
|
@@ -632,7 +632,7 @@
|
|
|
632
632
|
width: 16px;
|
|
633
633
|
height: 9px;
|
|
634
634
|
pointer-events: auto;
|
|
635
|
-
cursor: grab;
|
|
635
|
+
cursor: var(--studio-cursor-grab, grab);
|
|
636
636
|
touch-action: none;
|
|
637
637
|
}
|
|
638
638
|
|
|
@@ -650,12 +650,12 @@
|
|
|
650
650
|
border-radius: 50%;
|
|
651
651
|
background: var(--studio-fill, white);
|
|
652
652
|
pointer-events: auto;
|
|
653
|
-
cursor: grab;
|
|
653
|
+
cursor: var(--studio-cursor-grab, grab);
|
|
654
654
|
touch-action: none;
|
|
655
655
|
}
|
|
656
656
|
|
|
657
657
|
.draft-scrubber-baseline:active {
|
|
658
|
-
cursor: grabbing;
|
|
658
|
+
cursor: var(--studio-cursor-grabbing, grabbing);
|
|
659
659
|
}
|
|
660
660
|
|
|
661
661
|
/* Joins the head and baseline handles down the gutter so the two read as one
|
|
@@ -685,7 +685,7 @@
|
|
|
685
685
|
align-items: center;
|
|
686
686
|
gap: 0.375rem;
|
|
687
687
|
padding: 0 0.375rem;
|
|
688
|
-
border: 1px solid var(--scrub-color);
|
|
688
|
+
border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--scrub-color);
|
|
689
689
|
border-radius: var(--drafts-radius-sm);
|
|
690
690
|
background: var(--drafts-bg);
|
|
691
691
|
font-size: 0.6875rem;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
try {
|
|
4
4
|
if (typeof document != "undefined") {
|
|
5
5
|
var elementStyle = document.createElement("style");
|
|
6
|
-
elementStyle.appendChild(document.createTextNode("@layer package {\n :root,\n :host,\n [theme] {\n --embed-frame-bg: var(--editor-fill, white);\n --embed-frame-fg: var(--editor-line, black);\n --embed-frame-muted: var(--editor-line-offset-30, #666);\n --embed-frame-border: var(--editor-fill-offset-20, #ddd);\n --embed-frame-hover: var(--editor-fill-offset-10, #f4f4f4);\n --embed-frame-highlight: var(--editor-fill-offset-10, #f0f0f0);\n --embed-frame-family: var(--editor-family-sans, system-ui, sans-serif);\n }\n}\n\n.embed-frame {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--embed-frame-bg);\n color: var(--embed-frame-fg);\n font-family: var(--embed-frame-family);\n}\n\n.embed-frame .header {\n display: flex;\n align-items: center;\n gap: var(--studio-space-sm, 0.5rem);\n padding: var(--studio-space-2xs, 0.25rem) var(--studio-space-sm, 0.5rem);\n border-bottom: 1px solid var(--embed-frame-border);\n flex-shrink: 0;\n}\n\n.embed-frame .title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n font-size: 0.85em;\n cursor: default;\n}\n\n.embed-frame .title[data-renamable] {\n cursor: text;\n}\n\n.embed-frame .rename-input {\n flex: 1;\n min-width: 0;\n font: inherit;\n font-size: 0.85em;\n color: inherit;\n background: none;\n border: 1px solid var(--embed-frame-border);\n border-radius: var(--studio-radius-sm, 4px);\n padding: 0 var(--studio-space-2xs, 0.25rem);\n outline: none;\n}\n\n.embed-frame .version {\n font-size: 0.7em;\n color: var(--embed-frame-muted);\n flex-shrink: 0;\n}\n\n.embed-frame .tool-btn {\n display: inline-flex;\n align-items: center;\n height: 20px;\n padding: 0 var(--studio-space-sm, 0.5rem);\n border: 1px solid var(--embed-frame-border);\n border-radius: var(--studio-radius-round, 9999px);\n background: none;\n color: var(--embed-frame-muted);\n font: inherit;\n font-size: 0.75em;\n font-weight: 500;\n cursor: pointer;\n white-space: nowrap;\n max-width: 10rem;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 0;\n transition: background var(--studio-transition-fast, 0.1s ease);\n}\n\n.embed-frame .tool-btn:hover {\n background: var(--embed-frame-hover);\n color: var(--embed-frame-fg);\n}\n\n.embed-frame .open-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n background: none;\n color: inherit;\n padding: 0;\n cursor: pointer;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n.embed-frame .open-btn:hover {\n opacity: 1;\n}\n\n.embed-frame .content {\n flex: 1;\n min-height: 0;\n position: relative;\n}\n\n.embed-frame .content > patchwork-view {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.embed-frame .tool-menu[popover] {\n position: fixed;\n inset: unset;\n margin: 0;\n padding: 0;\n min-width: 180px;\n border: 1px solid var(--embed-frame-border);\n border-radius: var(--studio-radius-sm, 4px);\n background: var(--embed-frame-bg);\n color: var(--embed-frame-fg);\n box-shadow: var(--studio-shadow-sm, 0 2px 8px rgba(0, 0, 0, 0.08));\n overflow: hidden;\n font-family: var(--embed-frame-family);\n font-size: 0.85em;\n /* Grows out of the tool button (origin set in tool.tsx). Closing is instant. */\n transition:\n opacity 150ms var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1)),\n transform 150ms var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1));\n}\n@starting-style {\n .embed-frame .tool-menu[popover]:popover-open {\n opacity: 0;\n transform: scale(0.97);\n }\n}\n\n.embed-frame .tool-menu .list {\n max-height: 200px;\n overflow-y: auto;\n padding: var(--studio-space-2xs, 0.25rem);\n}\n\n.embed-frame .tool-menu .item {\n display: block;\n width: 100%;\n padding: var(--studio-space-2xs, 0.25rem) var(--studio-space-sm, 0.5rem);\n border: none;\n border-radius: var(--studio-radius-sm, 4px);\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.embed-frame .tool-menu .item:hover {\n background: var(--embed-frame-highlight);\n}\n\n.embed-frame .tool-menu .item[data-current] {\n font-weight: 600;\n}"));
|
|
6
|
+
elementStyle.appendChild(document.createTextNode("@layer package {\n :root,\n :host,\n [theme] {\n --embed-frame-bg: var(--editor-fill, white);\n --embed-frame-fg: var(--editor-line, black);\n --embed-frame-muted: var(--editor-line-offset-30, #666);\n --embed-frame-border: var(--editor-fill-offset-20, #ddd);\n --embed-frame-hover: var(--editor-fill-offset-10, #f4f4f4);\n --embed-frame-highlight: var(--editor-fill-offset-10, #f0f0f0);\n --embed-frame-family: var(--editor-family-sans, system-ui, sans-serif);\n }\n}\n\n.embed-frame {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--embed-frame-bg);\n color: var(--embed-frame-fg);\n font-family: var(--embed-frame-family);\n}\n\n.embed-frame .header {\n display: flex;\n align-items: center;\n gap: var(--studio-space-sm, 0.5rem);\n padding: var(--studio-space-2xs, 0.25rem) var(--studio-space-sm, 0.5rem);\n border-bottom: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--embed-frame-border);\n flex-shrink: 0;\n}\n\n.embed-frame .title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n font-size: 0.85em;\n cursor: var(--studio-cursor-default, default);\n}\n\n.embed-frame .title[data-renamable] {\n cursor: var(--studio-cursor-text, text);\n}\n\n.embed-frame .rename-input {\n flex: 1;\n min-width: 0;\n font: inherit;\n font-size: 0.85em;\n color: inherit;\n background: none;\n border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--embed-frame-border);\n border-radius: var(--studio-radius-sm, 4px);\n padding: 0 var(--studio-space-2xs, 0.25rem);\n outline: none;\n}\n\n.embed-frame .version {\n font-size: 0.7em;\n color: var(--embed-frame-muted);\n flex-shrink: 0;\n}\n\n.embed-frame .tool-btn {\n display: inline-flex;\n align-items: center;\n height: 20px;\n padding: 0 var(--studio-space-sm, 0.5rem);\n border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--embed-frame-border);\n border-radius: var(--studio-radius-round, 9999px);\n background: none;\n color: var(--embed-frame-muted);\n font: inherit;\n font-size: 0.75em;\n font-weight: 500;\n cursor: var(--studio-cursor-pointer, pointer);\n white-space: nowrap;\n max-width: 10rem;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 0;\n transition: background var(--studio-transition-fast, 0.1s ease);\n}\n\n.embed-frame .tool-btn:hover {\n background: var(--embed-frame-hover);\n color: var(--embed-frame-fg);\n}\n\n.embed-frame .open-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n background: none;\n color: inherit;\n padding: 0;\n cursor: var(--studio-cursor-pointer, pointer);\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n.embed-frame .open-btn:hover {\n opacity: 1;\n}\n\n.embed-frame .content {\n flex: 1;\n min-height: 0;\n position: relative;\n}\n\n.embed-frame .content > patchwork-view {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.embed-frame .tool-menu[popover] {\n position: fixed;\n inset: unset;\n margin: 0;\n padding: 0;\n min-width: 180px;\n border: var(--studio-border-width, 1px) var(--studio-border-style, solid) var(--embed-frame-border);\n border-radius: var(--studio-radius-sm, 4px);\n background: var(--embed-frame-bg);\n color: var(--embed-frame-fg);\n box-shadow: var(--studio-shadow-sm, 0 2px 8px rgba(0, 0, 0, 0.08));\n overflow: hidden;\n font-family: var(--embed-frame-family);\n font-size: 0.85em;\n /* Grows out of the tool button (origin set in tool.tsx). Closing is instant. */\n transition:\n opacity max(1ms, calc(150ms * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1))) var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1)),\n transform max(1ms, calc(150ms * var(--studio-motion-scale, 1) * var(--studio-motion-preference, 1))) var(--studio-ease-out, cubic-bezier(0.23, 1, 0.32, 1));\n}\n@starting-style {\n .embed-frame .tool-menu[popover]:popover-open {\n opacity: 0;\n transform: scale(0.97);\n }\n}\n\n.embed-frame .tool-menu .list {\n max-height: 200px;\n overflow-y: auto;\n padding: var(--studio-space-2xs, 0.25rem);\n}\n\n.embed-frame .tool-menu .item {\n display: block;\n width: 100%;\n padding: var(--studio-space-2xs, 0.25rem) var(--studio-space-sm, 0.5rem);\n border: none;\n border-radius: var(--studio-radius-sm, 4px);\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: var(--studio-cursor-pointer, pointer);\n white-space: nowrap;\n}\n\n.embed-frame .tool-menu .item:hover {\n background: var(--embed-frame-highlight);\n}\n\n.embed-frame .tool-menu .item[data-current] {\n font-weight: 600;\n}"));
|
|
7
7
|
document.head.appendChild(elementStyle);
|
|
8
8
|
}
|
|
9
9
|
} catch (e) {
|
|
@@ -122,7 +122,7 @@ const k = [
|
|
|
122
122
|
icon: "File",
|
|
123
123
|
supportedDatatypes: ["file"],
|
|
124
124
|
async load() {
|
|
125
|
-
return (await import("./tool-
|
|
125
|
+
return (await import("./tool-Bt8I8T2-.js").then((t) => t.t)).FileTool;
|
|
126
126
|
}
|
|
127
127
|
},
|
|
128
128
|
{
|
|
@@ -141,7 +141,7 @@ const k = [
|
|
|
141
141
|
icon: "FilePlus",
|
|
142
142
|
supportedDatatypes: ["new-file"],
|
|
143
143
|
async load() {
|
|
144
|
-
return (await import("./new-file-tool-
|
|
144
|
+
return (await import("./new-file-tool-BolBDUrL.js")).NewFileTool;
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { render as
|
|
2
|
-
const
|
|
1
|
+
import { render as x, createComponent as c, template as m, use as d, delegateEvents as u } from "solid-js/web";
|
|
2
|
+
const f = {
|
|
3
3
|
".js": "application/javascript",
|
|
4
4
|
".mjs": "application/javascript",
|
|
5
5
|
".cjs": "application/javascript",
|
|
@@ -50,45 +50,45 @@ const u = {
|
|
|
50
50
|
".webp": "image/webp",
|
|
51
51
|
".pdf": "application/pdf"
|
|
52
52
|
};
|
|
53
|
-
function y(
|
|
54
|
-
const
|
|
55
|
-
return
|
|
53
|
+
function y(s) {
|
|
54
|
+
const n = s.startsWith(".") ? s : `.${s}`;
|
|
55
|
+
return f[n] || "text/plain";
|
|
56
56
|
}
|
|
57
|
-
var g = /* @__PURE__ */ m('<div style="display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:12px;font-family:system-ui, sans-serif"><label for=new-file-name style=font-size:14px;color:#666>Enter a filename</label><input id=new-file-name type=text placeholder=hello.tsx autofocus style="font-size:16px;padding:8px 12px;border:1px solid #ccc;border-radius:6px;min-width:240px;outline:none"><button style="font-size:14px;padding:6px 16px;border:1px solid #ccc;border-radius:6px;background:#f5f5f5;cursor:pointer">Create');
|
|
58
|
-
function h(
|
|
59
|
-
let
|
|
60
|
-
function
|
|
61
|
-
const t =
|
|
57
|
+
var g = /* @__PURE__ */ m('<div style="display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:12px;font-family:system-ui, sans-serif"><label for=new-file-name style=font-size:14px;color:#666>Enter a filename</label><input id=new-file-name type=text placeholder=hello.tsx autofocus style="font-size:16px;padding:8px 12px;border:var(--studio-border-width, 1px) var(--studio-border-style, solid) #ccc;border-radius:6px;min-width:240px;outline:none"><button style="font-size:14px;padding:6px 16px;border:var(--studio-border-width, 1px) var(--studio-border-style, solid) #ccc;border-radius:6px;background:#f5f5f5;cursor:var(--studio-cursor-pointer, pointer)">Create');
|
|
58
|
+
function h(s) {
|
|
59
|
+
let n;
|
|
60
|
+
function r() {
|
|
61
|
+
const t = n.value.trim();
|
|
62
62
|
if (!t) return;
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
const a = t.lastIndexOf("."), e = a > 0 ? t.slice(a) : "", p = e ? y(e) : "text/plain";
|
|
64
|
+
s.handle.change((i) => {
|
|
65
|
+
i.name = t, i.extension = e, i.mimeType = p, i.content = "", i["@patchwork"].type = "file";
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
-
function
|
|
69
|
-
t.key === "Enter" && (t.preventDefault(),
|
|
68
|
+
function o(t) {
|
|
69
|
+
t.key === "Enter" && (t.preventDefault(), r());
|
|
70
70
|
}
|
|
71
71
|
return (() => {
|
|
72
|
-
var t = g(),
|
|
72
|
+
var t = g(), a = t.firstChild, e = a.nextSibling, p = e.nextSibling;
|
|
73
73
|
e.addEventListener("blur", (l) => {
|
|
74
74
|
l.currentTarget.style["border-color"] = "#ccc";
|
|
75
75
|
}), e.addEventListener("focus", (l) => {
|
|
76
76
|
l.currentTarget.style["border-color"] = "#888";
|
|
77
|
-
}), e.$$keydown =
|
|
78
|
-
var
|
|
79
|
-
return typeof
|
|
77
|
+
}), e.$$keydown = o;
|
|
78
|
+
var i = n;
|
|
79
|
+
return typeof i == "function" ? d(i, e) : n = e, p.$$click = r, t;
|
|
80
80
|
})();
|
|
81
81
|
}
|
|
82
|
-
function
|
|
83
|
-
const
|
|
84
|
-
handle:
|
|
85
|
-
}),
|
|
82
|
+
function b(s, n) {
|
|
83
|
+
const r = x(() => c(h, {
|
|
84
|
+
handle: s
|
|
85
|
+
}), n);
|
|
86
86
|
return () => {
|
|
87
|
-
|
|
87
|
+
r();
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
|
-
|
|
90
|
+
u(["keydown", "click"]);
|
|
91
91
|
export {
|
|
92
|
-
|
|
92
|
+
b as NewFileTool
|
|
93
93
|
};
|
|
94
|
-
//# sourceMappingURL=new-file-tool-
|
|
94
|
+
//# sourceMappingURL=new-file-tool-BolBDUrL.js.map
|