diff --git a/main.js b/main.js index 5e87337..7bc2a63 100644 --- a/main.js +++ b/main.js @@ -1 +1 @@ -var C=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var N=(o,s)=>{for(var t in s)C(o,t,{get:s[t],enumerable:!0})},q=(o,s,t,r)=>{if(s&&typeof s=="object"||typeof s=="function")for(let p of O(s))!R.call(o,p)&&p!==t&&C(o,p,{get:()=>s[p],enumerable:!(r=H(s,p))||r.enumerable});return o};var U=o=>q(C({},"__esModule",{value:!0}),o);var Y={};N(Y,{default:()=>v});module.exports=U(Y);var n=require("obsidian"),P={passphrase:"",rememberPassphrase:!1,defaultMode:"encrypt"},V=2e5,c=16,h=12;function G(o){let s=new Uint8Array(o),t="";for(let r=0;r{let d=L.createDiv();d.createEl("strong",{text:e}),d.appendChild(document.createTextNode(" \u2014 "+l))});let b=r.createDiv({cls:"cryptopad-toast",text:"\u2705 Copied!"});this.setToastElement(b);let D=e=>{this.mode=e,this.resultBlock.removeClass("cryptopad-result-block--visible"),this.resultBlock.addClass("cryptopad-result-block--hidden"),this.errorEl.removeClass("cryptopad-error--visible"),this.errorEl.addClass("cryptopad-error--hidden"),this.updateStatus(),this.passInput.focus()},K=async()=>{let e=this.passInput.value.trim(),l=this.inputArea.value;this.errorEl.removeClass("cryptopad-error--visible"),this.errorEl.addClass("cryptopad-error--hidden"),this.resultBlock.removeClass("cryptopad-result-block--visible"),this.resultBlock.addClass("cryptopad-result-block--hidden");try{let d=m.checked;this.plugin.settings.rememberPassphrase=d,this.plugin.settings.passphrase=d?e:"",await this.plugin.saveSettings();let B=this.mode==="encrypt"?await F(e,l):await _(e,l);this.outputArea.value=B,this.resultBlock.removeClass("cryptopad-result-block--hidden"),this.resultBlock.addClass("cryptopad-result-block--visible"),this.outputArea.select()}catch(d){this.errorEl.textContent=d.message,this.errorEl.removeClass("cryptopad-error--hidden"),this.errorEl.addClass("cryptopad-error--visible")}},S=()=>{b.addClass("cryptopad-toast--visible"),setTimeout(()=>b.removeClass("cryptopad-toast--visible"),2e3)},g=async()=>{if(this.outputArea.value)try{await navigator.clipboard.writeText(this.outputArea.value),S()}catch(e){this.outputArea.select(),document.execCommand("copy"),S()}};E.addEventListener("click",g),f.addEventListener("click",()=>{this.replaceSelectedTextWithOutput()||(this.errorEl.textContent="No output to replace or no editor active",this.errorEl.removeClass("cryptopad-error--hidden"),this.errorEl.addClass("cryptopad-error--visible"))}),this.passInput.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&e.key==="p"&&(e.preventDefault(),this.passInput.type=this.passInput.type==="password"?"text":"password"),e.key==="Tab"&&!e.shiftKey&&(e.preventDefault(),this.inputArea.focus()),e.key==="Tab"&&e.shiftKey&&(e.preventDefault(),this.commandInput.focus())}),this.inputArea.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&e.key==="Enter"&&(e.preventDefault(),K()),(e.ctrlKey||e.metaKey)&&e.key==="c"&&!e.shiftKey&&(e.preventDefault(),this.inputArea.value="",this.resultBlock.removeClass("cryptopad-result-block--visible"),this.resultBlock.addClass("cryptopad-result-block--hidden"),this.errorEl.removeClass("cryptopad-error--visible"),this.errorEl.addClass("cryptopad-error--hidden"))}),this.outputArea.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&e.key==="c"&&!e.shiftKey&&(e.preventDefault(),g()),(e.ctrlKey||e.metaKey)&&e.key==="r"&&!e.shiftKey&&(e.preventDefault(),this.replaceSelectedTextWithOutput())});let I=e=>{switch(e){case"e":return D("encrypt"),!0;case"d":return D("decrypt"),!0;case"c":return g(),!0;case"q":case"quit":case"exit":return this.close(),!0;case"h":case"help":return this.errorEl.textContent="Commands: e(ncrypt) d(ecrypt) c(opy) q(uit). Ctrl+Enter: process | Ctrl+C: copy",this.errorEl.removeClass("cryptopad-error--hidden"),this.errorEl.addClass("cryptopad-error--visible"),!0;default:return e.length>0&&(this.errorEl.textContent=`Unknown command: ${e}`,this.errorEl.removeClass("cryptopad-error--hidden"),this.errorEl.addClass("cryptopad-error--visible")),!1}};this.commandInput.addEventListener("keydown",e=>{if(e.key==="Tab"){e.preventDefault();let l=this.commandInput.value.toLowerCase().trim();l.length>0&&(this.commandInput.value="",I(l)),this.passInput.focus()}if(e.key==="Enter"){e.preventDefault();let l=this.commandInput.value.toLowerCase().trim();this.commandInput.value="",I(l)}e.key==="Escape"&&(this.commandInput.value="")}),this.passInput.value?this.inputArea.focus():this.passInput.focus()}updateStatus(){let t=this.mode==="encrypt"?"ENCRYPT":"DECRYPT";this.statusEl.innerHTML=`${t} E/D to switch | Ctrl+Enter to process`;let r=this.statusEl.querySelector(".cryptopad-mode-badge");r&&(r.classList.remove("highlight"),r.offsetWidth,r.classList.add("highlight"))}onClose(){this.contentEl.empty()}},w=class extends n.PluginSettingTab{constructor(s,t){super(s,t),this.plugin=t}display(){let{containerEl:s}=this;s.empty(),new n.Setting(s).setName("\u{1F510} CryptoPad").setHeading(),new n.Setting(s).setName("Saved passphrase").setDesc("Pre-filled in the modal when opened. Leave empty to always type it manually.").addText(i=>{let a=i.inputEl;a.type="password",i.setPlaceholder("Enter passphrase...").setValue(this.plugin.settings.passphrase).onChange(async u=>{this.plugin.settings.passphrase=u,await this.plugin.saveSettings()})}),new n.Setting(s).setName("Remember passphrase").setDesc("Pre-fill the passphrase field each time the modal opens.").addToggle(i=>i.setValue(this.plugin.settings.rememberPassphrase).onChange(async a=>{this.plugin.settings.rememberPassphrase=a,await this.plugin.saveSettings()})),new n.Setting(s).setName("Default mode").setDesc("Start with encrypt or decrypt mode.").addDropdown(i=>i.addOption("encrypt","Encrypt").addOption("decrypt","Decrypt").setValue(this.plugin.settings.defaultMode).onChange(async a=>{this.plugin.settings.defaultMode=a,await this.plugin.saveSettings()})),new n.Setting(s).setName("Keyboard shortcuts").setHeading();let t=["Ctrl+Shift+E \u2014 Open CryptoPad","Ctrl+Shift+C \u2014 Open in Encrypt mode","Ctrl+Shift+D \u2014 Open in Decrypt mode","Tab \u2014 Navigate to next field","Ctrl+P \u2014 Toggle passphrase visibility","Ctrl+Enter \u2014 Encrypt/Decrypt","Ctrl+C \u2014 Clear input (in textarea) or copy output","Ctrl+R \u2014 Replace selected text in editor with output",":e \u2014 Switch to Encrypt mode",":d \u2014 Switch to Decrypt mode",":c \u2014 Copy output",":q \u2014 Close modal",":help \u2014 Show help"],r=s.createEl("ul");t.forEach(i=>{r.createEl("li",{text:i}).addClass("cryptopad-list-item")}),new n.Setting(s).setName("Encryption details").setHeading();let p=s.createEl("ul");["Cipher: AES-256-GCM","Key derivation: PBKDF2-SHA256 (200,000 iterations)","Salt: 16 bytes \u2014 random per encryption","IV: 12 bytes \u2014 random per encryption","Output encoding: Base64","API: Web Crypto API (native browser/Electron)"].forEach(i=>{p.createEl("li",{text:i}).addClass("cryptopad-list-item")})}},v=class extends n.Plugin{constructor(){super(...arguments);this.settings=P;this.lastModal=null}async onload(){await this.loadSettings(),this.addCommand({id:"open-cryptopad",name:"Open CryptoPad",hotkeys:[{modifiers:["Mod","Shift"],key:"E"}],callback:()=>{new y(this.app,this).open()}}),this.addCommand({id:"encrypt-quick",name:"Open in Encrypt mode",hotkeys:[{modifiers:["Mod","Shift"],key:"C"}],callback:()=>{let t=new y(this.app,this);t.setMode("encrypt"),t.open()}}),this.addCommand({id:"decrypt-quick",name:"Open in Decrypt mode",hotkeys:[{modifiers:["Mod","Shift"],key:"D"}],callback:()=>{let t=new y(this.app,this);t.setMode("decrypt"),t.open()}}),this.addCommand({id:"replace-with-output",name:"Replace selection with encrypted/decrypted text",hotkeys:[{modifiers:["Mod","Shift"],key:"R"}],callback:()=>{this.lastModal&&this.lastModal.getOutputValue()&&this.lastModal.replaceSelectedTextWithOutput()}}),this.addSettingTab(new w(this.app,this))}onunload(){}async loadSettings(){let t=await this.loadData();this.settings=Object.assign({},P,t)}async saveSettings(){await this.saveData(this.settings)}}; +var C=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var H=(i,s)=>{for(var t in s)C(i,t,{get:s[t],enumerable:!0})},N=(i,s,t,r)=>{if(s&&typeof s=="object"||typeof s=="function")for(let p of O(s))!R.call(i,p)&&p!==t&&C(i,p,{get:()=>s[p],enumerable:!(r=B(s,p))||r.enumerable});return i};var U=i=>N(C({},"__esModule",{value:!0}),i);var _={};H(_,{default:()=>E});module.exports=U(_);var o=require("obsidian"),I={passphrase:"",rememberPassphrase:!1,defaultMode:"encrypt"},q=2e5,c=16,u=12;function V(i){let s=new Uint8Array(i),t="";for(let r=0;r{let d=K.createDiv();d.createEl("strong",{text:e}),d.appendText(" \u2014 "+l)});let g=t.createDiv({cls:"cryptopad-toast",text:"\u2705 Copied!"});this.setToastElement(g);let T=e=>{this.mode=e,this.resultBlock.removeClass("cryptopad-result-block--visible"),this.resultBlock.addClass("cryptopad-result-block--hidden"),this.errorEl.removeClass("cryptopad-error--visible"),this.errorEl.addClass("cryptopad-error--hidden"),this.updateStatus(),this.passInput.focus()},M=async()=>{let e=this.passInput.value.trim(),l=this.inputArea.value;this.errorEl.removeClass("cryptopad-error--visible"),this.errorEl.addClass("cryptopad-error--hidden"),this.resultBlock.removeClass("cryptopad-result-block--visible"),this.resultBlock.addClass("cryptopad-result-block--hidden");try{let d=v.checked;this.plugin.settings.rememberPassphrase=d,this.plugin.settings.passphrase=d?e:"",await this.plugin.saveSettings();let L=this.mode==="encrypt"?await W(e,l):await F(e,l);this.outputArea.value=L,this.resultBlock.removeClass("cryptopad-result-block--hidden"),this.resultBlock.addClass("cryptopad-result-block--visible"),this.outputArea.select()}catch(d){this.errorEl.textContent=d.message,this.errorEl.removeClass("cryptopad-error--hidden"),this.errorEl.addClass("cryptopad-error--visible")}},D=()=>{g.addClass("cryptopad-toast--visible"),window.setTimeout(()=>g.removeClass("cryptopad-toast--visible"),2e3)},w=async()=>{if(this.outputArea.value)try{await navigator.clipboard.writeText(this.outputArea.value),D()}catch(e){this.outputArea.select();try{await navigator.clipboard.writeText(this.outputArea.value)}catch(l){}D()}};f.addEventListener("click",()=>{w()}),b.addEventListener("click",()=>{this.replaceSelectedTextWithOutput()||(this.errorEl.textContent="No output to replace or no editor active",this.errorEl.removeClass("cryptopad-error--hidden"),this.errorEl.addClass("cryptopad-error--visible"))}),this.passInput.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&e.key==="p"&&(e.preventDefault(),this.passInput.type=this.passInput.type==="password"?"text":"password"),e.key==="Tab"&&!e.shiftKey&&(e.preventDefault(),this.inputArea.focus()),e.key==="Tab"&&e.shiftKey&&(e.preventDefault(),this.commandInput.focus())}),this.inputArea.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&e.key==="Enter"&&(e.preventDefault(),M()),(e.ctrlKey||e.metaKey)&&e.key==="c"&&!e.shiftKey&&(e.preventDefault(),this.inputArea.value="",this.resultBlock.removeClass("cryptopad-result-block--visible"),this.resultBlock.addClass("cryptopad-result-block--hidden"),this.errorEl.removeClass("cryptopad-error--visible"),this.errorEl.addClass("cryptopad-error--hidden"))}),this.outputArea.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&e.key==="c"&&!e.shiftKey&&(e.preventDefault(),w()),(e.ctrlKey||e.metaKey)&&e.key==="r"&&!e.shiftKey&&(e.preventDefault(),this.replaceSelectedTextWithOutput())});let S=e=>{switch(e){case"e":return T("encrypt"),!0;case"d":return T("decrypt"),!0;case"c":return w(),!0;case"q":case"quit":case"exit":return this.close(),!0;case"h":case"help":return this.errorEl.textContent="Commands: e(ncrypt) d(ecrypt) c(opy) q(uit). Ctrl+Enter: process | Ctrl+C: copy",this.errorEl.removeClass("cryptopad-error--hidden"),this.errorEl.addClass("cryptopad-error--visible"),!0;default:return e.length>0&&(this.errorEl.textContent=`Unknown command: ${e}`,this.errorEl.removeClass("cryptopad-error--hidden"),this.errorEl.addClass("cryptopad-error--visible")),!1}};this.commandInput.addEventListener("keydown",e=>{if(e.key==="Tab"){e.preventDefault();let l=this.commandInput.value.toLowerCase().trim();l.length>0&&(this.commandInput.value="",S(l)),this.passInput.focus()}if(e.key==="Enter"){e.preventDefault();let l=this.commandInput.value.toLowerCase().trim();this.commandInput.value="",S(l)}e.key==="Escape"&&(this.commandInput.value="")}),this.passInput.value?this.inputArea.focus():this.passInput.focus()}updateStatus(){let t=this.mode==="encrypt"?"ENCRYPT":"DECRYPT";this.statusEl.empty();let r=this.statusEl.createEl("span",{cls:"cryptopad-mode-badge",text:t});this.statusEl.appendText(" E/D to switch | Ctrl+Enter to process"),r.classList.remove("highlight"),r.offsetWidth,r.classList.add("highlight")}onClose(){this.contentEl.empty()}},x=class extends o.PluginSettingTab{constructor(s,t){super(s,t),this.plugin=t}display(){let{containerEl:s}=this;s.empty(),new o.Setting(s).setName("Saved passphrase").setDesc("Pre-filled in the modal when opened. Leave empty to always type it manually.").addText(a=>{let n=a.inputEl;n.type="password",a.setPlaceholder("Enter passphrase...").setValue(this.plugin.settings.passphrase).onChange(async h=>{this.plugin.settings.passphrase=h,await this.plugin.saveSettings()})}),new o.Setting(s).setName("Remember passphrase").setDesc("Pre-fill the passphrase field each time the modal opens.").addToggle(a=>a.setValue(this.plugin.settings.rememberPassphrase).onChange(async n=>{this.plugin.settings.rememberPassphrase=n,await this.plugin.saveSettings()})),new o.Setting(s).setName("Default mode").setDesc("Start with encrypt or decrypt mode.").addDropdown(a=>a.addOption("encrypt","Encrypt").addOption("decrypt","Decrypt").setValue(this.plugin.settings.defaultMode).onChange(async n=>{this.plugin.settings.defaultMode=n,await this.plugin.saveSettings()})),new o.Setting(s).setName("Keyboard shortcuts").setHeading();let t=["Ctrl+Shift+E \u2014 Open CryptoPad","Ctrl+Shift+C \u2014 Open in Encrypt mode","Ctrl+Shift+D \u2014 Open in Decrypt mode","Tab \u2014 Navigate to next field","Ctrl+P \u2014 Toggle passphrase visibility","Ctrl+Enter \u2014 Encrypt/Decrypt","Ctrl+C \u2014 Clear input (in textarea) or copy output","Ctrl+R \u2014 Replace selected text in editor with output",":e \u2014 Switch to Encrypt mode",":d \u2014 Switch to Decrypt mode",":c \u2014 Copy output",":q \u2014 Close modal",":help \u2014 Show help"],r=s.createEl("ul");t.forEach(a=>{r.createEl("li",{text:a}).addClass("cryptopad-list-item")}),new o.Setting(s).setName("Encryption details").setHeading();let p=s.createEl("ul");["Cipher: AES-256-GCM","Key derivation: PBKDF2-SHA256 (200,000 iterations)","Salt: 16 bytes \u2014 random per encryption","IV: 12 bytes \u2014 random per encryption","Output encoding: Base64","API: Web Crypto API (native browser/Electron)"].forEach(a=>{p.createEl("li",{text:a}).addClass("cryptopad-list-item")})}},E=class extends o.Plugin{constructor(){super(...arguments);this.settings=I;this.lastModal=null}async onload(){await this.loadSettings(),this.addCommand({id:"open-cryptopad",name:"Open CryptoPad",callback:()=>{new y(this.app,this).open()}}),this.addCommand({id:"encrypt-quick",name:"Quick Encrypt",callback:()=>{let t=new y(this.app,this);t.setMode("encrypt"),t.open()}}),this.addCommand({id:"decrypt-quick",name:"Quick Decrypt",callback:()=>{let t=new y(this.app,this);t.setMode("decrypt"),t.open()}}),this.addCommand({id:"replace-with-output",name:"Replace selection with encrypted/decrypted text",callback:()=>{this.lastModal&&this.lastModal.getOutputValue()&&this.lastModal.replaceSelectedTextWithOutput()}}),this.addSettingTab(new x(this.app,this))}onunload(){}async loadSettings(){let t=await this.loadData();this.settings=Object.assign({},I,t||{})}async saveSettings(){await this.saveData(this.settings)}}; diff --git a/main.ts b/main.ts index 84b93d7..910e7af 100644 --- a/main.ts +++ b/main.ts @@ -47,7 +47,7 @@ async function deriveKey(passphrase: string, salt: Uint8Array): Promise { const item = helpContent.createDiv(); item.createEl("strong", { text: shortcut }); - item.appendChild(document.createTextNode(" \u2014 " + description)); + item.appendText(" \u2014 " + description); }); // Toast (attached to modal container for absolute positioning) - const toast = modalEl.createDiv({ cls: "cryptopad-toast", text: "✅ Copied!" }); + const toast = contentEl.createDiv({ cls: "cryptopad-toast", text: "✅ Copied!" }); this.setToastElement(toast); // Helper to switch mode @@ -333,7 +333,7 @@ class CryptoPadModal extends Modal { // ── Copy helper ── const showToast = () => { toast.addClass("cryptopad-toast--visible"); - setTimeout(() => toast.removeClass("cryptopad-toast--visible"), 2000); + window.setTimeout(() => toast.removeClass("cryptopad-toast--visible"), 2000); }; const copyOutput = async () => { @@ -343,13 +343,19 @@ class CryptoPadModal extends Modal { showToast(); } catch { this.outputArea.select(); - document.execCommand("copy"); + try { + await navigator.clipboard.writeText(this.outputArea.value); + } catch { + // Fallback silently if copy fails + } showToast(); } }; // Button click handlers - copyBtn.addEventListener("click", copyOutput); + copyBtn.addEventListener("click", () => { + void copyOutput(); + }); replaceBtn.addEventListener("click", () => { if (!this.replaceSelectedTextWithOutput()) { this.errorEl.textContent = "No output to replace or no editor active"; @@ -381,7 +387,7 @@ class CryptoPadModal extends Modal { // Ctrl+Enter to process if ((e.ctrlKey || e.metaKey) && e.key === "Enter") { e.preventDefault(); - handleAction(); + void handleAction(); } // Ctrl+C to clear if ((e.ctrlKey || e.metaKey) && e.key === "c" && !e.shiftKey) { @@ -398,7 +404,7 @@ class CryptoPadModal extends Modal { // Ctrl+C to copy from output if ((e.ctrlKey || e.metaKey) && e.key === "c" && !e.shiftKey) { e.preventDefault(); - copyOutput(); + void copyOutput(); } if ((e.ctrlKey || e.metaKey) && e.key === "r" && !e.shiftKey) { @@ -417,7 +423,7 @@ class CryptoPadModal extends Modal { switchMode("decrypt"); return true; case "c": - copyOutput(); + void copyOutput(); return true; case "q": case "quit": @@ -472,16 +478,15 @@ class CryptoPadModal extends Modal { private updateStatus(): void { const modeText = this.mode === "encrypt" ? "ENCRYPT" : "DECRYPT"; - this.statusEl.innerHTML = `${modeText} E/D to switch | Ctrl+Enter to process`; + this.statusEl.empty(); + const badge = this.statusEl.createEl("span", { cls: "cryptopad-mode-badge", text: modeText }); + this.statusEl.appendText(" E/D to switch | Ctrl+Enter to process"); // Trigger highlight animation - const badge = this.statusEl.querySelector(".cryptopad-mode-badge") as HTMLElement; - if (badge) { - badge.classList.remove("highlight"); - // Trigger reflow to restart animation - void badge.offsetWidth; - badge.classList.add("highlight"); - } + badge.classList.remove("highlight"); + // Trigger reflow to restart animation + void badge.offsetWidth; + badge.classList.add("highlight"); } onClose(): void { @@ -503,8 +508,6 @@ class CryptoPadSettingTab extends PluginSettingTab { const { containerEl } = this; containerEl.empty(); - new Setting(containerEl).setName("🔐 CryptoPad").setHeading(); - new Setting(containerEl) .setName("Saved passphrase") .setDesc("Pre-filled in the modal when opened. Leave empty to always type it manually.") @@ -597,7 +600,6 @@ export default class CryptoPadPlugin extends Plugin { this.addCommand({ id: "open-cryptopad", name: "Open CryptoPad", - hotkeys: [{ modifiers: ["Mod", "Shift"], key: "E" }], callback: () => { new CryptoPadModal(this.app, this).open(); }, @@ -606,8 +608,7 @@ export default class CryptoPadPlugin extends Plugin { // Quick encrypt command this.addCommand({ id: "encrypt-quick", - name: "Open in Encrypt mode", - hotkeys: [{ modifiers: ["Mod", "Shift"], key: "C" }], + name: "Quick Encrypt", callback: () => { const modal = new CryptoPadModal(this.app, this); modal.setMode("encrypt"); @@ -618,8 +619,7 @@ export default class CryptoPadPlugin extends Plugin { // Quick decrypt command this.addCommand({ id: "decrypt-quick", - name: "Open in Decrypt mode", - hotkeys: [{ modifiers: ["Mod", "Shift"], key: "D" }], + name: "Quick Decrypt", callback: () => { const modal = new CryptoPadModal(this.app, this); modal.setMode("decrypt"); @@ -631,7 +631,6 @@ export default class CryptoPadPlugin extends Plugin { this.addCommand({ id: "replace-with-output", name: "Replace selection with encrypted/decrypted text", - hotkeys: [{ modifiers: ["Mod", "Shift"], key: "R" }], callback: () => { if (this.lastModal && this.lastModal.getOutputValue()) { this.lastModal.replaceSelectedTextWithOutput(); @@ -645,8 +644,8 @@ export default class CryptoPadPlugin extends Plugin { onunload(): void {} async loadSettings(): Promise { - const loaded = await this.loadData(); - this.settings = Object.assign({}, DEFAULT_SETTINGS, loaded); + const loaded = (await this.loadData()) as CryptoPadSettings | null; + this.settings = Object.assign({}, DEFAULT_SETTINGS, loaded || {}); } async saveSettings(): Promise { diff --git a/package.json b/package.json index 25a7184..7769fe4 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ }, "devDependencies": { "@types/node": "^20.0.0", - "builtin-modules": "^3.3.0", "esbuild": "^0.20.0", "obsidian": "latest", "tslib": "^2.6.0", diff --git a/styles.css b/styles.css index 4b62dd0..13e812a 100644 --- a/styles.css +++ b/styles.css @@ -1,13 +1,12 @@ /* CryptoPad — Keyboard-Centric Obsidian Plugin Styles */ .cryptopad-modal { - padding: 0 !important; + padding: 0; overflow: hidden; position: relative; } -/* Make the modal a good width */ -.modal:has(.cryptopad-modal) { +.modal .cryptopad-modal { width: min(550px, 95vw); }