@inkandswitch/patchwork-pkg-base 0.0.100 → 0.0.102

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.
Files changed (91) hide show
  1. package/module-settings-url +1 -1
  2. package/package.json +1 -1
  3. package/packages/account/dist/index.css +32 -32
  4. package/packages/account/dist/index.css.map +2 -2
  5. package/packages/account-history/dist/assets/HistoryRecorder-_3PrVW6n.js +1 -1
  6. package/packages/account-history/dist/assets/HistoryViewer-BmG0rAfK.js +1 -1
  7. package/packages/account-history/dist/assets/NotebookViewer-DZ_ZQU5x.js +37 -37
  8. package/packages/add-doc-to-sidebar-button/styles.css +2 -2
  9. package/packages/chat/dist/{ChatRoot-BYmq4SXi.js → ChatRoot-1d-658Rr.js} +2 -2
  10. package/packages/chat/dist/{context-tool-Bob-FZ_T.js → context-tool-iP64Oz6H.js} +2 -2
  11. package/packages/chat/dist/{index-wkaHcVCz.js → index-Dm_2jZcu.js} +3 -3
  12. package/packages/chat/dist/index.js +2 -2
  13. package/packages/chat/dist/{tool-DCOdh_fx.js → tool-BmNd5mrj.js} +1 -1
  14. package/packages/codemirror-base/dist/{chunk-QRT4ZVQ4.js → chunk-A2WBDY3J.js} +5 -5
  15. package/packages/codemirror-base/dist/{chunk-QRT4ZVQ4.js.map → chunk-A2WBDY3J.js.map} +1 -1
  16. package/packages/codemirror-base/dist/lib/codemirror.js +1 -1
  17. package/packages/codemirror-base/dist/tool.js +3 -3
  18. package/packages/codemirror-base/dist/tool.js.map +1 -1
  19. package/packages/codemirror-markdown/dist/extensions/embed.js +1 -1
  20. package/packages/codemirror-markdown/dist/extensions/embed.js.map +1 -1
  21. package/packages/codemirror-markdown/dist/extensions/links.js +1 -1
  22. package/packages/codemirror-markdown/dist/extensions/links.js.map +1 -1
  23. package/packages/codemirror-markdown/dist/extensions/markdown.js +6 -6
  24. package/packages/codemirror-markdown/dist/extensions/markdown.js.map +1 -1
  25. package/packages/commands/dist/main.js +1 -1
  26. package/packages/commands/dist/main.js.map +1 -1
  27. package/packages/comments-view/dist/assets/main-wSSvAVfi.js +1 -1
  28. package/packages/doc-openwith/doc-openwith.js +5 -5
  29. package/packages/doc-presence/doc-presence.js +1 -1
  30. package/packages/drafts/dist/assets/main-CG9HOCai.js +31 -31
  31. package/packages/embed/dist/assets/tool-D58NGTZ7.js +1 -1
  32. package/packages/file/dist/index.js +2 -2
  33. package/packages/file/dist/{new-file-tool-DGKllnzw.js → new-file-tool-BolBDUrL.js} +27 -27
  34. package/packages/file/dist/new-file-tool-BolBDUrL.js.map +1 -0
  35. package/packages/file/dist/{tool-UKWDK93W.js → tool-Bt8I8T2-.js} +4 -4
  36. package/packages/file/dist/tool-Bt8I8T2-.js.map +1 -0
  37. package/packages/file/dist/{typescript-language-server-BgBx0vSF.js → typescript-language-server-Db4173Y5.js} +2 -2
  38. package/packages/file/dist/{typescript-language-server-BgBx0vSF.js.map → typescript-language-server-Db4173Y5.js.map} +1 -1
  39. package/packages/folder/dist/index.js +1 -1
  40. package/packages/folder/dist/{tool-WAWTPB4A.js → tool-5E3YPGES.js} +2 -2
  41. package/packages/folder/dist/{tool-WAWTPB4A.js.map → tool-5E3YPGES.js.map} +1 -1
  42. package/packages/history-view/dist/assets/{HistoryTimeline-COYNGORP.js → HistoryTimeline-Bo-BTf2A.js} +6 -6
  43. package/packages/history-view/dist/assets/{HistoryTimeline-COYNGORP.js.map → HistoryTimeline-Bo-BTf2A.js.map} +1 -1
  44. package/packages/history-view/dist/assets/{index-C1gYt7m5.js → index-B5Afrk9Y.js} +2 -2
  45. package/packages/history-view/dist/assets/{index-C1gYt7m5.js.map → index-B5Afrk9Y.js.map} +1 -1
  46. package/packages/history-view/dist/index.js +1 -1
  47. package/packages/llm-host/dist/{LlmConfigTray-DdZHZT4F.js → LlmConfigTray-CjW04jeT.js} +108 -108
  48. package/packages/llm-host/dist/index.js +1 -1
  49. package/packages/packages/dist/index.js +46 -46
  50. package/packages/patternwitch/tool.js +21 -0
  51. package/packages/raw/raw-editor.js +22 -22
  52. package/packages/settings/dist/assets/FrameConfigurator-DVRBzIR-.js +1 -1
  53. package/packages/sideboard/dist/index.css +1 -1
  54. package/packages/sideboard/dist/index.css.map +2 -2
  55. package/packages/sideboard/dist/index.js +1 -1
  56. package/packages/sync-indicator/dist/assets/{SyncIndicator-B2ag1OoZ.js → SyncIndicator-oVMcVRXg.js} +3 -3
  57. package/packages/sync-indicator/dist/assets/{SyncIndicator-B2ag1OoZ.js.map → SyncIndicator-oVMcVRXg.js.map} +1 -1
  58. package/packages/sync-indicator/dist/index.js +1 -1
  59. package/packages/tasks/dist/assets/index-BbuRtBN3.js +1 -1
  60. package/packages/theming/dist/{active-theme-BMSIQXBV.js → active-theme-CC3CS64F.js} +2 -2
  61. package/packages/theming/dist/{chunk-Z3JB7ERH.js → chunk-DH4YUYFJ.js} +2 -2
  62. package/packages/theming/dist/chunk-VJZ4NPK4.js +136 -0
  63. package/packages/theming/dist/chunk-VJZ4NPK4.js.map +7 -0
  64. package/packages/theming/dist/main.js +4 -4
  65. package/packages/theming/dist/{theme-7OG2K56L.css → theme-HE7ECLIW.css} +212 -58
  66. package/packages/theming/dist/{theme-editor-datatype-TMYH7U2S.js → theme-editor-datatype-TJ6LYT2U.js} +2 -2
  67. package/packages/theming/dist/theme-editor.js +35 -25
  68. package/packages/theming/dist/theme-editor.js.map +2 -2
  69. package/packages/theming/dist/{theme-titlebar-YIFJINPJ.js → theme-titlebar-BO2Y2GRN.js} +2 -2
  70. package/packages/theming/dist/{theme-tray-7J247NRY.js → theme-tray-V6BEXQWR.js} +15 -15
  71. package/packages/theming/dist/theme-tray-V6BEXQWR.js.map +7 -0
  72. package/packages/theming/dist/tool.js +9 -9
  73. package/packages/theming/dist/tool.js.map +1 -1
  74. package/packages/threepane/dist/IsolatedDocumentArea-IZWZ74TV.js +2 -0
  75. package/packages/threepane/dist/{PatchworkFrame-GEEBBGCS.js → PatchworkFrame-UNWWAISP.js} +2 -2
  76. package/packages/threepane/dist/{chunk-YC5AHP5G.js → chunk-MSZ7JVNB.js} +31 -31
  77. package/packages/threepane/dist/{chunk-YC5AHP5G.js.map → chunk-MSZ7JVNB.js.map} +3 -3
  78. package/packages/threepane/dist/index.js +1 -1
  79. package/plugin-registry-url +1 -1
  80. package/packages/file/dist/new-file-tool-DGKllnzw.js.map +0 -1
  81. package/packages/file/dist/tool-UKWDK93W.js.map +0 -1
  82. package/packages/theming/dist/chunk-GIPQLUDU.js +0 -86
  83. package/packages/theming/dist/chunk-GIPQLUDU.js.map +0 -7
  84. package/packages/theming/dist/theme-tray-7J247NRY.js.map +0 -7
  85. package/packages/threepane/dist/IsolatedDocumentArea-G3V7KYHJ.js +0 -2
  86. /package/packages/theming/dist/{active-theme-BMSIQXBV.js.map → active-theme-CC3CS64F.js.map} +0 -0
  87. /package/packages/theming/dist/{chunk-Z3JB7ERH.js.map → chunk-DH4YUYFJ.js.map} +0 -0
  88. /package/packages/theming/dist/{theme-editor-datatype-TMYH7U2S.js.map → theme-editor-datatype-TJ6LYT2U.js.map} +0 -0
  89. /package/packages/theming/dist/{theme-titlebar-YIFJINPJ.js.map → theme-titlebar-BO2Y2GRN.js.map} +0 -0
  90. /package/packages/threepane/dist/{IsolatedDocumentArea-G3V7KYHJ.js.map → IsolatedDocumentArea-IZWZ74TV.js.map} +0 -0
  91. /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-UKWDK93W.js").then((t) => t.t)).FileTool;
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-DGKllnzw.js")).NewFileTool;
144
+ return (await import("./new-file-tool-BolBDUrL.js")).NewFileTool;
145
145
  }
146
146
  }
147
147
  ];
@@ -1,5 +1,5 @@
1
- import { render as c, createComponent as o, template as m, use as f, delegateEvents as d } from "solid-js/web";
2
- const u = {
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(i) {
54
- const s = i.startsWith(".") ? i : `.${i}`;
55
- return u[s] || "text/plain";
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(i) {
59
- let s;
60
- function a() {
61
- const t = s.value.trim();
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 p = t.lastIndexOf("."), e = p > 0 ? t.slice(p) : "", r = e ? y(e) : "text/plain";
64
- i.handle.change((n) => {
65
- n.name = t, n.extension = e, n.mimeType = r, n.content = "", n["@patchwork"].type = "file";
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 x(t) {
69
- t.key === "Enter" && (t.preventDefault(), a());
68
+ function o(t) {
69
+ t.key === "Enter" && (t.preventDefault(), r());
70
70
  }
71
71
  return (() => {
72
- var t = g(), p = t.firstChild, e = p.nextSibling, r = e.nextSibling;
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 = x;
78
- var n = s;
79
- return typeof n == "function" ? f(n, e) : s = e, r.$$click = a, t;
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 j(i, s) {
83
- const a = c(() => o(h, {
84
- handle: i
85
- }), s);
82
+ function b(s, n) {
83
+ const r = x(() => c(h, {
84
+ handle: s
85
+ }), n);
86
86
  return () => {
87
- a();
87
+ r();
88
88
  };
89
89
  }
90
- d(["keydown", "click"]);
90
+ u(["keydown", "click"]);
91
91
  export {
92
- j as NewFileTool
92
+ b as NewFileTool
93
93
  };
94
- //# sourceMappingURL=new-file-tool-DGKllnzw.js.map
94
+ //# sourceMappingURL=new-file-tool-BolBDUrL.js.map