Shared config extracted from obsidian-config; vault-specific files (bookmarks.json, daily-notes.json) excluded. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ASYabtTgxSxJPjxPmBK9PJ
18 lines
69 KiB
JavaScript
18 lines
69 KiB
JavaScript
var{defineProperty:kt,getOwnPropertyNames:Oe,getOwnPropertyDescriptor:Le}=Object,He=Object.prototype.hasOwnProperty;function Ke(t){return this[t]}var Pe=(t)=>{var e=(pe??=new WeakMap).get(t),i;if(e)return e;if(e=kt({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function"){for(var n of Oe(t))if(!He.call(e,n))kt(e,n,{get:Ke.bind(t,n),enumerable:!(i=Le(t,n))||i.enumerable})}return pe.set(t,e),e},pe;var Be=(t)=>t;function Ee(t,e){this[t]=Be.bind(null,e)}var ke=(t,e)=>{for(var i in e)kt(t,i,{get:e[i],enumerable:!0,configurable:!0,set:Ee.bind(e,i)})};var Ie={};ke(Ie,{default:()=>me});module.exports=Pe(Ie);var De=require("obsidian");var V=require("obsidian");var E=`**Thank you for using Typewriter Mode!** I am a student at the University of Tübingen and develop this plugin in my spare time. If you like the plugin, please consider supporting me on [GitHub Sponsors](https://github.com/sponsors/davisriedel) or [Buy Me a Coffee](https://www.buymeacoffee.com/davis.riedel). Your support ensures the continuous development and maintenance of the plugin. <br/><br/> <a href="https://www.buymeacoffee.com/davis.riedel" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;"></a><br/>
|
|
|
|
If you find any bugs or have a feature request, please [open an issue on GitHub](https://github.com/davisriedel/obsidian-typewriter-mode/issues). Contributions are welcome too.
|
|
`;var he=`# Typewriter Mode updated to v{{tag-name}}
|
|
|
|
{{funding}}
|
|
|
|
## What's new?
|
|
|
|
{{release-notes}}
|
|
`;async function Re(t,e,i,n){let s=(await V.requestUrl(`https://api.github.com/repos/${t}/${e}/releases`)).json;if(!Array.isArray(s))throw Error(`Failed to fetch releases: ${"message"in s?s.message:"Unknown error"}`);if(i==null)return s.filter((m)=>!(m.draft||m.prerelease));let d=s.findIndex((m)=>m.tag_name===i);if(d===-1)throw Error(`Could not find release with tag ${i}`);return s.slice(0,d).filter((m)=>!m.draft&&(n||!m.prerelease))}class $ extends V.Modal{currentVersion;previousVersion;constructor(t,e,i){super(t);this.currentVersion=e,this.previousVersion=i}fetchAndDisplayReleaseNotes(){let t=this.currentVersion.includes("-");Re("davisriedel","obsidian-typewriter-mode",this.previousVersion,t).then((e)=>{if(e.length===0)this.displayError(Error("No new releases found"));else this.displayReleaseNotes(e)}).catch((e)=>{this.displayError(e)})}onOpen(){let{contentEl:t}=this;t.empty(),t.createEl("h2",{text:"Fetching release notes..."}),this.fetchAndDisplayReleaseNotes()}displayReleaseNotes(t){let{contentEl:e}=this;e.empty(),e.classList.add("ptm-update-modal");let i=e.createDiv(),n=t.map((d)=>`### ${d.tag_name}
|
|
|
|
${d.body}`).join(`
|
|
---
|
|
`),o=he.replace("{{tag-name}}",t[0].tag_name).replace("{{funding}}",E).replace("{{release-notes}}",n),s=new V.Component;s.load(),V.MarkdownRenderer.render(this.app,o,i,this.app.vault.getRoot().path,s).catch((d)=>{})}displayError(t){let{contentEl:e}=this;e.empty(),e.classList.add("ptm-update-modal"),e.createDiv().createEl("h2",{text:t.message})}}var T=require("@codemirror/state"),R=require("@codemirror/view"),f=require("obsidian");function S(t){return t.dom.ownerDocument.querySelector(".workspace-leaf.mod-active .cm-editor, .mod-inside-iframe .cm-editor")}function k(t){return t.dom.ownerDocument.querySelector(".workspace-leaf.mod-active .cm-scroller, .mod-inside-iframe .cm-scroller")}function $t(t){return t.dom.ownerDocument.querySelector(".workspace-leaf.mod-active .cm-sizer, .mod-inside-iframe .cm-sizer")}class Tt{tm;view;constructor(t,e){this.tm=t,this.view=e}getActiveLineProp(t){let e=this.view.contentDOM.querySelector(".cm-active.cm-line")?.getCssPropertyValue(t).replace("px","");if(!e)return null;return Number.parseFloat(e)}getActiveLineOffset(t){let e=t.top,i=S(this.view);if(!i)return 0;let n=i.getBoundingClientRect().top;return e-n}getTypewriterOffset(){let t=S(this.view);if(!t)return 0;return t.clientHeight*this.tm.settings.typewriter.typewriterOffset}getTypewriterPositionData(){let t=this.view.coordsAtPos(this.view.state.selection.main.head);if(!t)return null;let e=t.bottom-t.top,i=this.getActiveLineProp("line-height");if(!i)return null;let n=0,o=0;if(e>i)n=e,o=0;else n=i,o=(n-e)/2;let s=this.getTypewriterOffset(),d=this.getActiveLineOffset(t),m=this.tm.settings.typewriter.isTypewriterScrollEnabled,y=this.tm.settings.keepLinesAboveAndBelow.isKeepLinesAboveAndBelowEnabled,C=this.tm.settings.typewriter.isOnlyMaintainTypewriterOffsetWhenReachedEnabled,h=S(this.view),g=k(this.view),u;if(!(h&&g))u=0;else if(m){if(u=s,C)if(d<0)u=0;else u=g.scrollTop+d<s?Math.min(s,d):s}else if(y){let P=this.tm.settings.keepLinesAboveAndBelow.linesAboveAndBelow,Et=this.view.defaultLineHeight*P,B=h.clientHeight-this.view.defaultLineHeight*(P+1),we=g.scrollTop!==0&&d<Et,ve=d>B;if(we)u=Et;else if(ve)u=B;else u=d}else u=this.getActiveLineOffset(t);return{typewriterOffset:s,scrollOffset:u,activeLineOffset:d,lineHeight:n,lineOffset:o}}}var Rt=require("@codemirror/view"),ze=new Set([")","]","}"]);function Ue(t,e,i){return e.some((n)=>t.slice(i+1-n.length,i+1)===n)}function Ye(t,e){return ze.has(t[e+1])}function ge(t){return!!t&&(t>="a"&&t<="z"||t>="A"&&t<="Z")}function We(t,e){return ge(t[e-1])&&!ge(t[e-2])}function ye(t,e,i){if(Ue(t,e,i))return!1;if(Ye(t,i))return!1;if(We(t,i))return!1;return!0}function le(t,e,i){let n=t.sentenceDelimiters.split(""),o=t.extraCharacters.split(""),s=t.ignoredPatterns.split(`
|
|
`),d=e.from,m=e.text,y=-1;for(let h=i-d-1;h>=0;h--){if(!n.contains(m[h]))continue;if(!ye(m,s,h))continue;let g=1;while(m[h+g]===" "&&g<i-d-1)g+=1;while(o.contains(m[h+g])&&n.contains(m[h+g-1])&&g<i-d-1)g+=1;y=h+g;break}if(y===-1)y=0;let C=-1;for(let h=i-d;h<e.length;h++){if(!n.contains(m[h]))continue;if(!ye(m,s,h))continue;let g=1;while(n.contains(m[h+g])&&g<e.length)g+=1;while(o.contains(m[h+g])&&g<e.length)g+=1;C=h+g;break}if(C!==-1)return{start:y+d,end:C+d};return{start:y+d,end:null}}function ue(t,e){let i=[],o=t.state.selection.main.from,s=t.state.doc.lineAt(o),d=le(e,s,o);if(d.end==null&&o>s.from)d=le(e,s,o-1);let{start:m,end:y}=d;if(y==null)y=s.to;function C(h,g,u){i.push(Rt.Decoration.mark({inclusive:!0,attributes:{},class:u}).range(h,g))}if(m!==y){if(C(m,y,"active-sentence"),s.from!==m)C(s.from,m,"active-paragraph");if(y!==s.to)C(y,s.to,"active-paragraph")}return Rt.Decoration.set(i,!0)}var zt="ptm-current-line",Ut="ptm-current-line-fade-before",Yt="ptm-current-line-fade-after",Xe=/^(select|input|delete|undo|redo)(\..+)?$/,je=/^(select.pointer)$/,qe=/^(input|delete|undo|redo)(\..+)?$/,Ae=/^(select)(\..+)?$/;class ce{tm;view;domResizeObserver=null;onScrollEventKey;isListeningToOnScroll=!1;isOnScrollClassSet=!1;isInitialInteraction=!0;isRenderingAllowedUserEvent=!1;decorations=T.RangeSet.empty;isPerWindowPropsReloadRequired=!1;moveByCommandBound=this.moveByCommand.bind(this);onScrollBound=this.onScroll.bind(this);onResizeBound=this.onResize.bind(this);constructor(t,e){this.tm=t,this.view=e,this.onScrollEventKey=f.Platform.isMobile?"touchmove":"wheel",this.onLoad()}destroy(){this.domResizeObserver?.disconnect(),this.destroyCurrentLine(),this.removeScrollListener(),window.removeEventListener("moveByCommand",this.moveByCommandBound)}onLoad(){this.domResizeObserver=new ResizeObserver(this.onResizeBound),this.domResizeObserver.observe(this.view.dom.ownerDocument.body),window.addEventListener("moveByCommand",this.moveByCommandBound),this.watchEmbeddedMarkdown(),this.onReconfigured(),window.requestAnimationFrame(()=>{this.restoreCursorPosition(this.view)})}userEventAllowed(t){let e=Xe,i=je;if(this.tm.settings.typewriter.isTypewriterOnlyUseCommandsEnabled)e=qe,i=Ae;return e.test(t)&&!i.test(t)}inspectTransactions(t){let e=[],i=!1;for(let o of t.transactions){if(o.reconfigured)i=!0;let s=o.annotation(T.Transaction.userEvent);if(s!==void 0)e.push(s)}if(e.length===0)return{isReconfigured:i,isUserEvent:!1,allowedUserEvents:null};return{isReconfigured:!1,isUserEvent:!0,allowedUserEvents:e.reduce((o,s)=>o&&this.userEventAllowed(s),e.length>0)}}update(t){let{isReconfigured:e,isUserEvent:i,allowedUserEvents:n}=this.inspectTransactions(t);if(this.isTableCell())return;if(e)this.onReconfigured();if(this.isDisabled())return;if(this.isPerWindowPropsReloadRequired){this.updateAfterExternalEvent();return}if(!i){this.updateNonUserEvent();return}if(n)this.updateAllowedUserEvent();else this.updateDisallowedUserEvent()}isTableCell(){return this.view.dom.parentElement?.parentElement?.className.contains("table-cell-wrapper")??!1}isMarkdownFile(){let t=this.tm.plugin.app.workspace.getActiveViewOfType(f.ItemView);if(!t)return this.isPerWindowPropsReloadRequired=!0,!1;return t.getViewType()==="markdown"}isDisabledInFrontmatter(){let t=this.tm.plugin.app.workspace.getActiveFile();if(!t)return this.isPerWindowPropsReloadRequired=!0,!1;let e=this.tm.plugin.app.metadataCache.getFileCache(t)?.frontmatter;if(!e)return!1;if(!Object.hasOwn(e,"typewriter-mode"))return!1;return!e["typewriter-mode"]}matchesPath(t,e){return e===""||t===e||t.startsWith(`${e}/`)}isDisabledByFilePaths(){let t=this.tm.plugin.app.workspace.getActiveFile();if(!t)return this.isPerWindowPropsReloadRequired=!0,!1;let{path:e}=t,{enabledFilePaths:i,disabledFilePaths:n}=this.tm.settings.general;if(n?.length>0){for(let o of n)if(this.matchesPath(e,o))return!0}if(i?.length>0){for(let o of i)if(this.matchesPath(e,o))return!1;return!0}return!1}isDisabledByPlatform(){let{enabledPlatforms:t}=this.tm.settings.general;switch(t){case"desktop":return f.Platform.isMobile;case"mobile":return f.Platform.isDesktop;case"tablet":return!f.Platform.isTablet;case"phone":return!f.Platform.isPhone;case"desktop-and-tablet":return f.Platform.isPhone;default:return!1}}isDisabled(){if(!this.tm.settings.general.isPluginActivated)return!0;if(this.isDisabledByPlatform())return!0;if(!this.isMarkdownFile())return!0;if(this.isDisabledByFilePaths())return!0;if(this.isDisabledInFrontmatter())return!0}onReconfigured(){if(this.isPerWindowPropsReloadRequired=!0,this.isDisabled())this.destroyCurrentLine(),this.resetPadding(this.view),this.loadPerWindowProps();else this.updateAfterExternalEvent()}watchEmbeddedMarkdown(){let e=this.tm.perWindowProps;new MutationObserver((n)=>{n.forEach((o)=>{[].forEach.call(o.addedNodes,(s)=>{if(s.nodeType===Node.ELEMENT_NODE&&s.matches(".markdown-embed-content iframe.embed-iframe")){let d=s.contentDocument?.body;if(!d)return;this.loadPerWindowPropsOnElement(e,d)}})})}).observe(this.view.dom.ownerDocument,{childList:!0,subtree:!0})}loadPerWindowPropsOnElement(t,e){for(let i of t.allBodyClasses)e.classList.remove(i);if(e.addClasses(t.persistentBodyClasses),!this.isDisabled())e.addClasses(t.bodyClasses);e.setCssProps(t.cssVariables),e.setAttrs(t.bodyAttrs)}getMarkdownBodies(){let t=this.view.dom.ownerDocument.querySelectorAll(".markdown-embed-content iframe.embed-iframe"),e=Array.from(t).flatMap((i)=>{let n=i.contentDocument?.body;return n?[n]:[]});return[this.view.dom.ownerDocument.body,...e]}loadPerWindowProps(){if(!this.isPerWindowPropsReloadRequired)return;this.isPerWindowPropsReloadRequired=!1;let t=this.getMarkdownBodies();for(let e of t)this.loadPerWindowPropsOnElement(this.tm.perWindowProps,e)}loadCurrentLine(t=this.view){let e=S(t);if(!e)return null;let i=e.querySelector(`.${zt}`);if(!i)i=e.ownerDocument.createElement("div"),i.className=zt,e.appendChild(i);if(this.tm.settings.currentLine.isFadeLinesEnabled){let n=e.querySelector(`.${Ut}`),o=e.querySelector(`.${Yt}`);if(!n)n=e.ownerDocument.createElement("div"),n.className=Ut,e.appendChild(n);if(!o)o=e.ownerDocument.createElement("div"),o.className=Yt,e.appendChild(o);return{currentLine:i,fadeBefore:n,fadeAfter:o}}return{currentLine:i}}destroyCurrentLine(t=this.view){let e=S(t);if(!e)return;let i=e.querySelector(`.${zt}`),n=e.querySelector(`.${Ut}`),o=e.querySelector(`.${Yt}`);i?.remove(),n?.remove(),o?.remove()}setupScrollListener(){if(this.isListeningToOnScroll)return;let t=k(this.view);if(t)t.addEventListener(this.onScrollEventKey,this.onScrollBound,{passive:!0}),this.isListeningToOnScroll=!0}removeScrollListener(){if(!this.isListeningToOnScroll)return;let t=k(this.view);if(t)t.removeEventListener(this.onScrollEventKey,this.onScrollBound),this.isListeningToOnScroll=!1}measureTypewriterPosition(t,e){this.view.requestMeasure({key:t,read:(i)=>new Tt(this.tm,i).getTypewriterPositionData(),write:(i,n)=>{if(!i)return;window.requestAnimationFrame(()=>{e(i,n)})}})}updateAllowedUserEvent(){this.removeScrollListener(),this.applyDecorations();let t=S(this.view);if(t){if(t.classList.remove("ptm-scroll"),this.isOnScrollClassSet=!1,t.classList.remove("ptm-select"),this.isInitialInteraction)t.classList.remove("ptm-first-open"),this.isInitialInteraction=!1}this.isRenderingAllowedUserEvent=!0,this.measureTypewriterPosition("TypewriterModeUpdateAfterAllowedUserEvent",(e,i)=>{if(!e)return;this.recenterAndMoveCurrentLine(i,e),this.isRenderingAllowedUserEvent=!1,this.handleCursorStateUpdate(i),this.setupScrollListener()})}updateDisallowedUserEvent(){if(this.isRenderingAllowedUserEvent)return;let t=S(this.view);if(t){if(this.isInitialInteraction)t.classList.remove("ptm-first-open"),this.isInitialInteraction=!1;t.classList.add("ptm-select")}this.measureTypewriterPosition("TypewriterModeUpdateAfterDisallowedUserEvent",(e,i)=>{if(!e)return;this.handleCursorStateUpdate(i);let{activeLineOffset:n,lineHeight:o,lineOffset:s}=e;if(this.tm.settings.currentLine.isHighlightCurrentLineEnabled||this.tm.settings.currentLine.isFadeLinesEnabled)this.moveCurrentLine(i,n,s,o)})}updateNonUserEvent(){if(this.applyDecorations(),!this.isInitialInteraction)return;if(this.tm.settings.general.isOnlyActivateAfterFirstInteractionEnabled){let t=S(this.view);if(t)t.classList.add("ptm-first-open")}}moveByCommand(){let t=S(this.view);if(t)t.classList.remove("ptm-select");this.updateAllowedUserEvent()}onResize(){if(this.isDisabled())return;this.updateAfterExternalEvent()}onScroll(){this.measureTypewriterPosition("TypewriterModeOnScroll",(t,e)=>{if(!this.isOnScrollClassSet){let s=S(this.view);if(s)s.classList.add("ptm-scroll"),this.isOnScrollClassSet=!0}if(!t)return;let{activeLineOffset:i,lineOffset:n,lineHeight:o}=t;this.moveCurrentLine(e,i,n,o)})}applyDecorations(){if(!this.tm.settings.dimming.isDimUnfocusedEnabled||this.tm.settings.dimming.dimUnfocusedMode!=="sentences")return;this.decorations=ue(this.view,{sentenceDelimiters:".!?",extraCharacters:"*”’",ignoredPatterns:"Mr."})}updateAfterExternalEvent(){if(this.isTableCell()){this.destroyCurrentLine();return}this.loadPerWindowProps(),this.applyDecorations(),this.measureTypewriterPosition("TypewriterModeUpdateAfterExternalEvent",(t,e)=>{if(this.setupScrollListener(),!t)return;if(this.tm.settings.typewriter.isTypewriterScrollEnabled)this.setPadding(e,t.typewriterOffset);this.recenterAndMoveCurrentLine(e,t)})}moveCurrentLine(t,e,i,n){let o=this.loadCurrentLine(t);if(!o)return;if(o.currentLine.style.height=`${n}px`,o.currentLine.style.top=`${e-i}px`,o.fadeBefore)o.fadeBefore.style.top=`calc(${e-i}px - 100vh)`;if(o.fadeAfter)o.fadeAfter.style.top=`${e-i+n}px`}setPadding(t,e){let i=$t(t);if(!i)return;i.style.padding=this.tm.settings.typewriter.isOnlyMaintainTypewriterOffsetWhenReachedEnabled?`0 0 ${e}px 0`:`${e}px 0`}resetPadding(t){if(!this.isMarkdownFile())return;let e=$t(t);if(!e)return;e.style.removeProperty("padding")}recenter(t,e){let i=t.state.selection.main.head,n=R.EditorView.scrollIntoView(i,{y:"start",yMargin:e}),o=t.state.update({effects:n});t.dispatch(o)}recenterAndMoveCurrentLine(t,{scrollOffset:e,lineOffset:i,lineHeight:n}){let o=this.tm.settings.typewriter.isTypewriterScrollEnabled,s=this.tm.settings.keepLinesAboveAndBelow.isKeepLinesAboveAndBelowEnabled,d=this.tm.settings.currentLine.isHighlightCurrentLineEnabled,m=this.tm.settings.currentLine.isFadeLinesEnabled;if(o||s)this.recenter(t,e);if(d||m)this.moveCurrentLine(t,e,i,n)}handleCursorStateUpdate(t){if(!this.tm.settings.restoreCursorPosition.isRestoreCursorPositionEnabled)return;this.tm.getRestoreCursorPositionFeature().setCursorState(t.state.selection.main)}restoreCursorPosition(t){let e=this.tm.getRestoreCursorPositionFeature();e.saveState().catch((n)=>{});let i=this.tm.plugin.app.workspace.getActiveFile()?.path;if(i){let n=e.state[i];if(n){if(!this.tm.plugin.app.workspace.containerEl.querySelector("span.is-flashing"))t.dispatch({selection:n})}}}}function Wt(t){return R.ViewPlugin.define((e)=>new ce(t,e),{decorations:(e)=>e.decorations})}var l=require("obsidian");class z extends l.PluginSettingTab{icon="type-outline";tm;constructor(t,e){super(t,e.plugin);this.tm=e}registerFeaturesInGroup(t,e){for(let i of Object.values(e))i.registerSetting(t)}featureDefs(t,e){return Object.values(t).map((i)=>i.getDefinition(e))}getSettingDefinitions(){let t=()=>this.refreshDomState();return[...this.featureDefs(this.tm.features.general,t),{type:"group",heading:"Typewriter",items:[{name:'Not available if "keep lines above and below" is activated',visible:()=>this.tm.settings.keepLinesAboveAndBelow.isKeepLinesAboveAndBelowEnabled},...this.featureDefs(this.tm.features.typewriter,t)]},{type:"group",heading:"Keep lines above and below",items:[{name:"Not available if typewriter scrolling is activated",visible:()=>this.tm.settings.typewriter.isTypewriterScrollEnabled},...this.featureDefs(this.tm.features.keepAboveAndBelow,t)]},{type:"group",heading:"Highlight current line",items:this.featureDefs(this.tm.features.currentLine,t)},{type:"group",heading:"Limit line width",items:this.featureDefs(this.tm.features.maxChar,t)},{type:"group",heading:"Dimming",items:this.featureDefs(this.tm.features.dimming,t)},{type:"group",heading:"Writing focus",items:this.featureDefs(this.tm.features.writingFocus,t)},{type:"group",heading:"Hemingway mode",items:this.featureDefs(this.tm.features.hemingwayMode,t)},{type:"group",heading:"Restore cursor position",items:this.featureDefs(this.tm.features.restoreCursorPosition,t)},{type:"group",heading:"Update notice and funding",items:[...this.featureDefs(this.tm.features.updates,t),{name:"",render:(e)=>{e.settingEl.empty();let i=e.settingEl.createDiv(),n=new l.Component;n.load(),l.MarkdownRenderer.render(this.app,E,i,this.app.vault.getRoot().path,n).catch((o)=>{})}}]}]}display(){this.containerEl.empty();let t=new l.SettingGroup(this.containerEl);this.registerFeaturesInGroup(t,this.tm.features.general);let e=new l.SettingGroup(this.containerEl).setHeading("Typewriter");if(this.tm.settings.keepLinesAboveAndBelow.isKeepLinesAboveAndBelowEnabled)e.addSetting((u)=>{u.setName('Not available if "keep lines above and below" is activated')});this.registerFeaturesInGroup(e,this.tm.features.typewriter);let i=new l.SettingGroup(this.containerEl).setHeading("Keep lines above and below");if(this.tm.settings.typewriter.isTypewriterScrollEnabled)i.addSetting((u)=>{u.setName("Not available if typewriter scrolling is activated")});this.registerFeaturesInGroup(i,this.tm.features.keepAboveAndBelow);let n=new l.SettingGroup(this.containerEl).setHeading("Highlight current line");this.registerFeaturesInGroup(n,this.tm.features.currentLine);let o=new l.SettingGroup(this.containerEl).setHeading("Limit line width");this.registerFeaturesInGroup(o,this.tm.features.maxChar);let s=new l.SettingGroup(this.containerEl).setHeading("Dimming");this.registerFeaturesInGroup(s,this.tm.features.dimming);let d=new l.SettingGroup(this.containerEl).setHeading("Writing focus");this.registerFeaturesInGroup(d,this.tm.features.writingFocus);let m=new l.SettingGroup(this.containerEl).setHeading("Hemingway mode");this.registerFeaturesInGroup(m,this.tm.features.hemingwayMode);let y=new l.SettingGroup(this.containerEl).setHeading("Restore cursor position");this.registerFeaturesInGroup(y,this.tm.features.restoreCursorPosition);let C=new l.SettingGroup(this.containerEl).setHeading("Update notice and funding");this.registerFeaturesInGroup(C,this.tm.features.updates);let h=this.containerEl.createDiv();this.containerEl.appendChild(h);let g=new l.Component;g.load(),l.MarkdownRenderer.render(this.app,E,h,this.app.vault.getRoot().path,g).catch((u)=>{})}}class v{tm;constructor(t){this.tm=t}load(){}}class O extends v{}function be(t,e){let i=e==="up"?"goUp":"goDown";t.plugin.addCommand({id:`move-typewriter-${e}`,name:`Move typewriter ${e}`,editorCallback:(n,o)=>{n.exec(i),window.dispatchEvent(new Event("moveByCommand"))}})}class Xt extends O{commandKey="move-typewriter-up";commandTitle="Move typewriter up";registerCommand(){be(this.tm,"up")}}class jt extends O{commandKey="move-typewriter-down";commandTitle="Move typewriter down";registerCommand(){be(this.tm,"down")}}class qt extends O{registerCommand(){this.tm.plugin.addCommand({id:this.commandKey,name:this.commandTitle,callback:this.onCommand.bind(this)})}load(){this.registerCommand()}}class c extends qt{registerCommand(){this.tm.plugin.addCommand({id:`${this.commandKey}-toggle`,name:`Toggle ${this.commandTitle}`,callback:this.onCommand.bind(this)}),this.tm.plugin.addCommand({id:`${this.commandKey}-enable`,name:`Enable ${this.commandTitle}`,callback:this.onEnable.bind(this)}),this.tm.plugin.addCommand({id:`${this.commandKey}-disable`,name:`Disable ${this.commandTitle}`,callback:this.onDisable.bind(this)})}onCommand(){this.featureToggle?.toggle()}onEnable(){this.featureToggle?.toggle(!0)}onDisable(){this.featureToggle?.toggle(!1)}}class At extends c{commandKey="dimming";commandTitle="dimming";featureToggle=this.tm.features.dimming["dimming.isDimUnfocusedEnabled"]}class Jt extends c{commandKey="hemingway-mode";commandTitle="Hemingway mode";featureToggle=this.tm.features.hemingwayMode["hemingwayMode.isHemingwayModeEnabled"]}class Qt extends c{commandKey="max-chars-per-line";commandTitle="limit maximum characters per line";featureToggle=this.tm.features.maxChar["maxChars.isMaxCharsPerLineEnabled"]}class Zt extends c{commandKey="typewriter-mode-plugin";commandTitle="typewriter mode plugin";featureToggle=this.tm.features.general["general.isPluginActivated"]}class Ft extends c{commandKey="typewriter";commandTitle="typewriter scrolling";featureToggle=this.tm.features.typewriter["typewriter.isTypewriterScrollEnabled"]}class It extends c{featureToggle=null;commandKey="typewriter-scrolling-and-paragraph-dimming";commandTitle="typewriter scrolling and paragraph dimming";onCommand(){let t=this.tm.features.typewriter["typewriter.isTypewriterScrollEnabled"],e=this.tm.features.dimming["dimming.isDimUnfocusedEnabled"],i=t.getSettingValue()&&e.getSettingValue();t.toggle(!i),e.toggle(!i)}onEnable(){this.tm.features.typewriter["typewriter.isTypewriterScrollEnabled"].toggle(!0),this.tm.features.dimming["dimming.isDimUnfocusedEnabled"].toggle(!0)}onDisable(){this.tm.features.typewriter["typewriter.isTypewriterScrollEnabled"].toggle(!1),this.tm.features.dimming["dimming.isDimUnfocusedEnabled"].toggle(!1)}}var L=require("obsidian");class _t{tm;constructor(t){this.tm=t}focusModeActive=!1;maximizedClass="ptm-maximized";focusModeClass="ptm-focus-mode";vignetteElClass="ptm-writing-focus-vignette-element";vignetteStyleAttr="data-ptm-writing-focus-vignette-style";leftSplitCollapsed=!1;rightSplitCollapsed=!1;prevWasFullscreen=!1;addVignette(t){let e=this.tm.settings.writingFocus.doesWritingFocusShowHeader?t.containerEl:t.contentEl;e.classList.add(this.vignetteElClass),e.setAttr(this.vignetteStyleAttr,this.tm.settings.writingFocus.writingFocusVignetteStyle)}removeVignette(t){let e=this.tm.settings.writingFocus.doesWritingFocusShowHeader?t.containerEl:t.contentEl;e.removeAttribute(this.vignetteStyleAttr),e.classList.remove(this.vignetteElClass)}startFullscreen(t){if(L.Platform.isMobile)return;let e=window.electron.remote.getCurrentWindow();this.prevWasFullscreen=e.isFullScreen(),e.setFullScreen(!0);let i=()=>{this.onExitFullscreenWritingFocus(t),e.off("leave-full-screen",i)};e.on("leave-full-screen",i)}exitFullscreen(){if(L.Platform.isMobile)return;if(this.prevWasFullscreen)return;window.electron.remote.getCurrentWindow().setFullScreen(!1)}onExitFullscreenWritingFocus(t){if(this.focusModeActive)this.disableFocusModeForView(t)}storeSplitsValues(){this.leftSplitCollapsed=this.tm.plugin.app.workspace.leftSplit.collapsed,this.rightSplitCollapsed=this.tm.plugin.app.workspace.rightSplit.collapsed}collapseSplits(){this.tm.plugin.app.workspace.leftSplit.collapse(),this.tm.plugin.app.workspace.rightSplit.collapse()}restoreSplits(){if(!this.leftSplitCollapsed)this.tm.plugin.app.workspace.leftSplit.expand();if(!this.rightSplitCollapsed)this.tm.plugin.app.workspace.rightSplit.expand()}removeExtraneousClasses(){if(this.tm.plugin.app.workspace.containerEl.hasClass(this.maximizedClass))this.tm.plugin.app.workspace.containerEl.removeClass(this.maximizedClass);if(activeDocument.body.classList.contains(this.focusModeClass))activeDocument.body.classList.remove(this.focusModeClass)}enableFocusModeForView(t){if(this.focusModeActive=!0,!activeDocument.body.classList.contains(this.focusModeClass))this.storeSplitsValues();if(this.collapseSplits(),this.tm.plugin.app.workspace.containerEl.toggleClass(this.maximizedClass,!this.tm.plugin.app.workspace.containerEl.hasClass(this.maximizedClass)),activeDocument.body.classList.toggle(this.focusModeClass,!activeDocument.body.classList.contains(this.focusModeClass)),activeDocument.body.classList.contains(this.focusModeClass))Array.from(activeDocument.querySelectorAll(`.${this.focusModeClass} .workspace-split`)).forEach((e)=>{let i=e,n=i.querySelector(".mod-active");i.toggleClass("ptm-wf-split-hidden",!n)});if(this.tm.settings.writingFocus.doesWritingFocusShowVignette)this.addVignette(t);if(this.tm.settings.writingFocus.isWritingFocusFullscreen)this.startFullscreen(t)}disableFocusModeForView(t){if(this.removeExtraneousClasses(),activeDocument.body.classList.contains(this.focusModeClass))activeDocument.body.classList.remove(this.focusModeClass);if(this.restoreSplits(),Array.from(activeDocument.querySelectorAll(".workspace-split")).forEach((e)=>{e.removeClass("ptm-wf-split-hidden")}),this.tm.settings.writingFocus.doesWritingFocusShowVignette)this.removeVignette(t);if(this.tm.settings.writingFocus.isWritingFocusFullscreen)this.exitFullscreen();this.focusModeActive=!1}enableFocusMode(){let t=this.tm.plugin.app.workspace.getActiveViewOfType(L.ItemView);if(!t||t?.getViewType()==="empty")return;this.enableFocusModeForView(t)}disableFocusMode(){let t=this.tm.plugin.app.workspace.getActiveViewOfType(L.ItemView);if(!t||t?.getViewType()==="empty")return;this.disableFocusModeForView(t)}toggleFocusMode(){if(this.focusModeActive)this.disableFocusMode();else this.enableFocusMode()}}class Nt extends c{featureToggle=null;commandKey="writing-focus";commandTitle="writing focus";writingFocus=new _t(this.tm);onCommand(){this.writingFocus.toggleFocusMode()}onEnable(){this.writingFocus.enableFocusMode()}onDisable(){this.writingFocus.disableFocusMode()}onload(){this.tm.plugin.addRibbonIcon("enter","Toggle Writing Focus",(t)=>{this.writingFocus.toggleFocusMode()})}}function Ce(t){return Object.fromEntries([new Zt(t),new Ft(t),new At(t),new It(t),new Xt(t),new jt(t),new Nt(t),new Jt(t),new Qt(t)].map((e)=>[e.commandKey,e]))}var x={NONE:"dim-none",DIM:"dim",ALL:"dim-all"},M={PARAGRAPHS:"paragraphs",SENTENCES:"sentences"},D={BOX:"box",UNDERLINE:"underline"},w={BOX:"box",COLUMN:"column"},b={BOTH:"both",DESKTOP:"desktop",MOBILE:"mobile",TABLET:"tablet",PHONE:"phone",DESKTOP_AND_TABLET:"desktop-and-tablet"};function Se(t,e){let i=e.indexOf("."),n=e.slice(0,i),o=e.slice(i+1);return t[n][o]}function U(t,e,i){let n=e.indexOf("."),o=e.slice(0,n),s=e.slice(n+1);t[o][s]=i}var a={general:{version:null,isAnnounceUpdatesEnabled:!0,isPluginActivated:!0,isOnlyActivateAfterFirstInteractionEnabled:!1,enabledPlatforms:b.BOTH,enabledFilePaths:[],disabledFilePaths:[]},typewriter:{isTypewriterScrollEnabled:!0,isOnlyMaintainTypewriterOffsetWhenReachedEnabled:!1,isTypewriterOnlyUseCommandsEnabled:!1,typewriterOffset:0.5},keepLinesAboveAndBelow:{isKeepLinesAboveAndBelowEnabled:!1,linesAboveAndBelow:5},maxChars:{isMaxCharsPerLineEnabled:!1,maxCharsPerLine:64},dimming:{isDimUnfocusedEnabled:!1,isDimUnfocusedOnlyInWritingFocusModeEnabled:!1,isDimHighlightListParentEnabled:!1,isDimTableAsOneEnabled:!0,dimUnfocusedMode:M.PARAGRAPHS,dimUnfocusedEditorsBehavior:x.DIM,dimmedOpacity:0.25,isPauseDimUnfocusedWhileScrollingEnabled:!0,isPauseDimUnfocusedWhileSelectingEnabled:!0},currentLine:{isHighlightCurrentLineEnabled:!0,isHighlightCurrentLineOnlyInWritingFocusModeEnabled:!1,isFadeLinesEnabled:!1,isFadeLinesOnlyInWritingFocusModeEnabled:!1,fadeLinesIntensity:0.5,isHighlightCurrentLineOnlyInFocusedEditorEnabled:!1,isPauseCurrentLineHighlightWhileScrollingEnabled:!1,isPauseCurrentLineHighlightWhileSelectingEnabled:!1,currentLineHighlightStyle:D.BOX,currentLineHighlightUnderlineThickness:1,"currentLineHighlightColor-dark":"#444444","currentLineHighlightColor-light":"#dddddd"},writingFocus:{doesWritingFocusShowHeader:!1,doesWritingFocusShowStatusBar:!1,doesWritingFocusShowVignette:!0,isWritingFocusFullscreen:!0,writingFocusVignetteStyle:w.BOX,writingFocusFontSize:0},restoreCursorPosition:{isRestoreCursorPositionEnabled:!1,cursorPositions:{}},hemingwayMode:{isHemingwayModeEnabled:!1,isHemingwayModeOnlyInWritingFocusModeEnabled:!1,isAllowBackspaceInHemingwayModeEnabled:!1,isShowHemingwayModeStatusBarEnabled:!0,hemingwayModeStatusBarText:"Hemingway"}};function Je(t){return{general:{version:t.version??a.general.version,isAnnounceUpdatesEnabled:t.isAnnounceUpdatesEnabled??a.general.isAnnounceUpdatesEnabled,isPluginActivated:t.isPluginActivated??a.general.isPluginActivated,isOnlyActivateAfterFirstInteractionEnabled:t.isOnlyActivateAfterFirstInteractionEnabled??a.general.isOnlyActivateAfterFirstInteractionEnabled,enabledPlatforms:a.general.enabledPlatforms,enabledFilePaths:a.general.enabledFilePaths,disabledFilePaths:a.general.disabledFilePaths},typewriter:{isTypewriterScrollEnabled:t.isTypewriterScrollEnabled??a.typewriter.isTypewriterScrollEnabled,isOnlyMaintainTypewriterOffsetWhenReachedEnabled:t.isOnlyMaintainTypewriterOffsetWhenReachedEnabled??a.typewriter.isOnlyMaintainTypewriterOffsetWhenReachedEnabled,isTypewriterOnlyUseCommandsEnabled:t.isTypewriterOnlyUseCommandsEnabled??a.typewriter.isTypewriterOnlyUseCommandsEnabled,typewriterOffset:t.typewriterOffset??a.typewriter.typewriterOffset},keepLinesAboveAndBelow:{isKeepLinesAboveAndBelowEnabled:t.isKeepLinesAboveAndBelowEnabled??a.keepLinesAboveAndBelow.isKeepLinesAboveAndBelowEnabled,linesAboveAndBelow:t.linesAboveAndBelow??a.keepLinesAboveAndBelow.linesAboveAndBelow},maxChars:{isMaxCharsPerLineEnabled:t.isMaxCharsPerLineEnabled??a.maxChars.isMaxCharsPerLineEnabled,maxCharsPerLine:t.maxCharsPerLine??a.maxChars.maxCharsPerLine},dimming:{isDimUnfocusedEnabled:t.isDimUnfocusedEnabled??a.dimming.isDimUnfocusedEnabled,isDimUnfocusedOnlyInWritingFocusModeEnabled:a.dimming.isDimUnfocusedOnlyInWritingFocusModeEnabled,isDimHighlightListParentEnabled:t.isDimHighlightListParentEnabled??a.dimming.isDimHighlightListParentEnabled,isDimTableAsOneEnabled:t.isDimTableAsOneEnabled??a.dimming.isDimTableAsOneEnabled,dimUnfocusedMode:t.dimUnfocusedMode??a.dimming.dimUnfocusedMode,dimUnfocusedEditorsBehavior:t.dimUnfocusedEditorsBehavior??a.dimming.dimUnfocusedEditorsBehavior,dimmedOpacity:t.dimmedOpacity??a.dimming.dimmedOpacity,isPauseDimUnfocusedWhileScrollingEnabled:t.isPauseDimUnfocusedWhileScrollingEnabled??a.dimming.isPauseDimUnfocusedWhileScrollingEnabled,isPauseDimUnfocusedWhileSelectingEnabled:t.isPauseDimUnfocusedWhileSelectingEnabled??a.dimming.isPauseDimUnfocusedWhileSelectingEnabled},currentLine:{isHighlightCurrentLineEnabled:t.isHighlightCurrentLineEnabled??a.currentLine.isHighlightCurrentLineEnabled,isHighlightCurrentLineOnlyInWritingFocusModeEnabled:a.currentLine.isHighlightCurrentLineOnlyInWritingFocusModeEnabled,isFadeLinesEnabled:t.isFadeLinesEnabled??a.currentLine.isFadeLinesEnabled,isFadeLinesOnlyInWritingFocusModeEnabled:a.currentLine.isFadeLinesOnlyInWritingFocusModeEnabled,fadeLinesIntensity:t.fadeLinesIntensity??a.currentLine.fadeLinesIntensity,isHighlightCurrentLineOnlyInFocusedEditorEnabled:t.isHighlightCurrentLineOnlyInFocusedEditorEnabled??a.currentLine.isHighlightCurrentLineOnlyInFocusedEditorEnabled,isPauseCurrentLineHighlightWhileScrollingEnabled:a.currentLine.isPauseCurrentLineHighlightWhileScrollingEnabled,isPauseCurrentLineHighlightWhileSelectingEnabled:a.currentLine.isPauseCurrentLineHighlightWhileSelectingEnabled,currentLineHighlightStyle:t.currentLineHighlightStyle??a.currentLine.currentLineHighlightStyle,currentLineHighlightUnderlineThickness:t.currentLineHighlightUnderlineThickness??a.currentLine.currentLineHighlightUnderlineThickness,"currentLineHighlightColor-dark":t["currentLineHighlightColor-dark"]??a.currentLine["currentLineHighlightColor-dark"],"currentLineHighlightColor-light":t["currentLineHighlightColor-light"]??a.currentLine["currentLineHighlightColor-light"]},writingFocus:{doesWritingFocusShowHeader:t.doesWritingFocusShowHeader??a.writingFocus.doesWritingFocusShowHeader,doesWritingFocusShowVignette:t.doesWritingFocusShowVignette??a.writingFocus.doesWritingFocusShowVignette,doesWritingFocusShowStatusBar:t.doesWritingFocusShowStatusBar??a.writingFocus.doesWritingFocusShowStatusBar,isWritingFocusFullscreen:t.isWritingFocusFullscreen??a.writingFocus.isWritingFocusFullscreen,writingFocusVignetteStyle:t.writingFocusVignetteStyle??a.writingFocus.writingFocusVignetteStyle,writingFocusFontSize:t.writingFocusFontSize??a.writingFocus.writingFocusFontSize},restoreCursorPosition:{isRestoreCursorPositionEnabled:t.isRestoreCursorPositionEnabled??a.restoreCursorPosition.isRestoreCursorPositionEnabled,cursorPositions:{}},hemingwayMode:{isHemingwayModeEnabled:t.isHemingwayModeEnabled??a.hemingwayMode.isHemingwayModeEnabled,isHemingwayModeOnlyInWritingFocusModeEnabled:a.hemingwayMode.isHemingwayModeOnlyInWritingFocusModeEnabled,isAllowBackspaceInHemingwayModeEnabled:t.isAllowBackspaceInHemingwayModeEnabled??a.hemingwayMode.isAllowBackspaceInHemingwayModeEnabled,isShowHemingwayModeStatusBarEnabled:t.isShowHemingwayModeStatusBarEnabled??a.hemingwayMode.isShowHemingwayModeStatusBarEnabled,hemingwayModeStatusBarText:t.hemingwayModeStatusBarText??a.hemingwayMode.hemingwayModeStatusBarText}}}async function Qe(t,e,i){let n=`${i}/cursor-positions.json`;try{if(await e.adapter.exists(n)){let o=await e.adapter.read(n),s=JSON.parse(o);t.restoreCursorPosition.cursorPositions=s}}catch(o){}return t}async function fe(t,e,i){if(!("general"in t)){let o=Je(t);return await Qe(o,e,i)}return t}class p extends v{enable(){}disable(){}getBodyClasses(){return[]}getSettingKey(){return this.settingKey}getSettingValue(){return Se(this.tm.settings,this.settingKey)}setSettingValue(t){U(this.tm.settings,this.settingKey,t)}}var Ze=/rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([0-9.]+))?\s*\)/;class H extends p{settingKey;themeMode;constructor(t,e){super(t);this.themeMode=e,this.settingKey=`currentLine.currentLineHighlightColor-${e}`}registerSetting(t){let e=this.getSettingValue(),{color:i,opacity:n}=this.parseColor(e);t.addSetting((o)=>{o.setName(`Current line highlight color in ${this.themeMode} themes`).setDesc(`The color and opacity of the current line highlight in ${this.themeMode} themes`).setClass("typewriter-mode-setting").addColorPicker((s)=>s.setValue(i).onChange((d)=>{let m=this.parseColor(this.getSettingValue()).opacity;this.changeCurrentLineHighlightColor(d,m)})).addSlider((s)=>s.setLimits(0,1,0.01).setValue(n).setDynamicTooltip().onChange((d)=>{let m=this.parseColor(this.getSettingValue()).color;this.changeCurrentLineHighlightColor(m,d)}))})}getDefinition(t){let e=this.getSettingValue(),{color:i,opacity:n}=this.parseColor(e);return{name:`Current line highlight color in ${this.themeMode} themes`,desc:`The color and opacity of the current line highlight in ${this.themeMode} themes`,render:(o)=>{o.setClass("typewriter-mode-setting").addColorPicker((s)=>s.setValue(i).onChange((d)=>{let m=this.parseColor(this.getSettingValue()).opacity;this.changeCurrentLineHighlightColor(d,m),t?.()})).addSlider((s)=>s.setLimits(0,1,0.01).setValue(n).setDynamicTooltip().onChange((d)=>{let m=this.parseColor(this.getSettingValue()).color;this.changeCurrentLineHighlightColor(m,d),t?.()}))}}}load(){this.tm.setCSSVariable(`--current-line-highlight-color-${this.themeMode}`,`${this.getSettingValue()}`)}parseColor(t){let e=t.match(Ze);if(e){let i=Number.parseInt(e[1],10),n=Number.parseInt(e[2],10),o=Number.parseInt(e[3],10),s=e[4]?Number.parseFloat(e[4]):1;return{color:`#${(16777216+(i<<16)+(n<<8)+o).toString(16).slice(1)}`,opacity:s}}if(t.startsWith("#")){if(t.length===4){let i=t[1],n=t[2],o=t[3];return{color:`#${i}${i}${n}${n}${o}${o}`,opacity:1}}return{color:t,opacity:1}}return{color:"#000000",opacity:1}}changeCurrentLineHighlightColor(t,e){let i=t.replace("#",""),n=Number.parseInt(i.slice(0,2),16),o=Number.parseInt(i.slice(2,4),16),s=Number.parseInt(i.slice(4,6),16),d=`rgba(${n}, ${o}, ${s}, ${e})`;this.setSettingValue(d),this.tm.setCSSVariable(`--current-line-highlight-color-${this.themeMode}`,`${d}`),this.tm.saveSettings().catch((m)=>{})}}class Y extends H{constructor(t){super(t,"dark")}}class W extends H{constructor(t){super(t,"light")}}class X extends p{settingKey="currentLine.currentLineHighlightStyle";getBodyClasses(){return["ptm-current-line-highlight-box","ptm-current-line-highlight-underline"]}registerSetting(t){t.addSetting((e)=>{e.setName("Current line highlight style").setDesc("The style of the current line highlight").setClass("typewriter-mode-setting").addDropdown((i)=>i.addOption(D.BOX,"Box").addOption(D.UNDERLINE,"Underline").setValue(this.getSettingValue()).onChange((n)=>{this.changeCurrentLineHighlightStyle(n)}))})}getDefinition(t){return{name:"Current line highlight style",desc:"The style of the current line highlight",render:(e)=>{e.setClass("typewriter-mode-setting").addDropdown((i)=>i.addOption(D.BOX,"Box").addOption(D.UNDERLINE,"Underline").setValue(this.getSettingValue()).onChange((n)=>{this.changeCurrentLineHighlightStyle(n),t?.()}))}}}load(){super.load(),this.applyClass()}applyClass(){let t=`ptm-current-line-highlight-${this.getSettingValue()}`;for(let e of this.getBodyClasses())this.tm.perWindowProps.bodyClasses.remove(e);this.tm.perWindowProps.bodyClasses.push(t)}changeCurrentLineHighlightStyle(t){this.setSettingValue(t),this.applyClass(),this.tm.saveSettings().catch((e)=>{})}}class j extends p{settingKey="currentLine.currentLineHighlightUnderlineThickness";registerSetting(t){t.addSetting((e)=>{e.setName("Current line underline thickness").setDesc("The thickness of the underline that highlights the current line").setClass("typewriter-mode-setting").addSlider((i)=>i.setLimits(1,5,1).setDynamicTooltip().setValue(this.getSettingValue()).onChange((n)=>{this.changeCurrentLineHighlightUnderlineThickness(n)}))})}getDefinition(t){return{name:"Current line underline thickness",desc:"The thickness of the underline that highlights the current line",render:(e)=>{e.setClass("typewriter-mode-setting").addSlider((i)=>i.setLimits(1,5,1).setDynamicTooltip().setValue(this.getSettingValue()).onChange((n)=>{this.changeCurrentLineHighlightUnderlineThickness(n),t?.()}))}}}load(){this.tm.setCSSVariable("--current-line-highlight-underline-thickness",`${this.getSettingValue()}px`)}changeCurrentLineHighlightUnderlineThickness(t){this.setSettingValue(t),this.tm.setCSSVariable("--current-line-highlight-underline-thickness",`${t}px`),this.tm.saveSettings().catch((e)=>{})}}class r extends p{toggleClass=null;isToggleClassPersistent=!1;getBodyClasses(){if(this.toggleClass)return[this.toggleClass];return[]}isSettingEnabled(){return!0}getToggleClass(){return this.toggleClass}registerSetting(t){t.addSetting((e)=>{e.setName(this.settingTitle).setDesc(this.settingDesc).setClass("typewriter-mode-setting").addToggle((i)=>i.setValue(this.getSettingValue()).onChange((n)=>{this.toggle(n)})).setDisabled(!this.isSettingEnabled())})}getDefinition(t){return{name:this.settingTitle,desc:this.settingDesc,render:(e)=>{e.setClass("typewriter-mode-setting").addToggle((i)=>i.setValue(this.getSettingValue()).onChange((n)=>{this.toggle(n),t?.()})).setDisabled(!this.isSettingEnabled())}}}load(){if(this.getSettingValue())this.enable();else this.disable()}toggle(t=null){let e=t;if(e===null)e=!this.getSettingValue();if(this.setSettingValue(e),e)this.enable();else this.disable();this.tm.saveSettings().catch((i)=>{})}enable(){if(this.toggleClass){let t=this.isToggleClassPersistent?"persistentBodyClasses":"bodyClasses";if(!this.tm.perWindowProps[t].contains(this.toggleClass))this.tm.perWindowProps[t].push(this.toggleClass)}}disable(){if(this.toggleClass){let t=this.isToggleClassPersistent?"persistentBodyClasses":"bodyClasses";this.tm.perWindowProps[t].remove(this.toggleClass)}}}class q extends r{settingKey="currentLine.isFadeLinesEnabled";toggleClass="ptm-fade-lines";settingTitle="Fade lines";settingDesc="This places a gradient on the lines above and below the current line, making the text fade out more and more towards the top and bottom of the editor."}class A extends p{settingKey="currentLine.fadeLinesIntensity";registerSetting(t){t.addSetting((e)=>{e.setName("Intensity of the fade lines gradient").setDesc("How soon lines shall be faded out").setClass("typewriter-mode-setting").addSlider((i)=>i.setLimits(0,100,5).setDynamicTooltip().setValue(this.getSettingValue()*100).onChange((n)=>{this.changeFadeLinesIntensity(n/100)}))})}getDefinition(t){return{name:"Intensity of the fade lines gradient",desc:"How soon lines shall be faded out",render:(e)=>{e.setClass("typewriter-mode-setting").addSlider((i)=>i.setLimits(0,100,5).setDynamicTooltip().setValue(this.getSettingValue()*100).onChange((n)=>{this.changeFadeLinesIntensity(n/100),t?.()}))}}}load(){this.tm.setCSSVariable("--ptm-fade-lines-intensity",`${this.getSettingValue()*100}%`)}changeFadeLinesIntensity(t=0.5){this.setSettingValue(t),this.tm.setCSSVariable("--ptm-fade-lines-intensity",`${t*100}%`),this.tm.saveSettings().catch((e)=>{})}}class J extends r{settingKey="currentLine.isFadeLinesOnlyInWritingFocusModeEnabled";toggleClass="ptm-fade-lines-only-in-writing-focus-mode";hasCommand=!1;settingTitle="Fade lines only in writing focus mode";settingDesc="Only show the fade lines effect when writing focus mode is active"}class Q extends r{settingKey="currentLine.isHighlightCurrentLineEnabled";toggleClass="ptm-highlight-current-line";settingTitle="Highlight current line";settingDesc="Highlights the line that the cursor is currently on"}class Z extends r{settingKey="currentLine.isHighlightCurrentLineOnlyInFocusedEditorEnabled";toggleClass="ptm-highlight-current-line-only-in-active-editor";hasCommand=!1;settingTitle="Highlight current line only in focused note";settingDesc="Only show highlighted line in the note your cursor is on (e.g. if you have multiple notes open in split panes)"}class F extends r{settingKey="currentLine.isHighlightCurrentLineOnlyInWritingFocusModeEnabled";toggleClass="ptm-highlight-current-line-only-in-writing-focus-mode";hasCommand=!1;settingTitle="Highlight current line only in writing focus mode";settingDesc="Only show the highlighted line when writing focus mode is active"}class I extends r{settingKey="currentLine.isPauseCurrentLineHighlightWhileScrollingEnabled";toggleClass="ptm-current-line-pause-while-scrolling";settingTitle="Pause current line highlight while scrolling";settingDesc="If enabled, the current line highlight is hidden while scrolling"}class _ extends r{settingKey="currentLine.isPauseCurrentLineHighlightWhileSelectingEnabled";toggleClass="ptm-current-line-pause-while-selecting";settingTitle="Pause current line highlight while selecting text";settingDesc="If enabled, the current line highlight is hidden while selecting text"}function Gt(t){return Object.fromEntries([new Q(t),new F(t),new q(t),new A(t),new J(t),new W(t),new Y(t),new X(t),new j(t),new Z(t),new I(t),new _(t)].map((e)=>[e.getSettingKey(),e]))}class N extends r{settingKey="dimming.isDimHighlightListParentEnabled";toggleClass="ptm-dim-highlight-list-parent";settingTitle="Highlight list parents";settingDesc="If this is enabled, the parent items of the active list item are not dimmed"}class G extends r{settingKey="dimming.isDimTableAsOneEnabled";toggleClass="ptm-dim-table-as-one";settingTitle="Undim all table cells when editing";settingDesc="If this is enabled, all table cells are shown/not dimmed when you edit a table. If this is disabled, only the current table cell that you are editing is shown, while the other cells remain dimmed."}class tt extends r{settingKey="dimming.isDimUnfocusedEnabled";toggleClass="ptm-dim-unfocused";settingTitle="Dim unfocused";settingDesc="Dim unfocused paragraphs / sentences"}class et extends p{settingKey="dimming.dimUnfocusedEditorsBehavior";registerSetting(t){t.addSetting((e)=>{e.setName("Dimming behavior in unfocused notes").setDesc("How to dim paragraphs / sentences in notes / editors that your cursor is not on (e.g. if you have multiple notes open in split panes)").setClass("typewriter-mode-setting").addDropdown((i)=>i.addOption(x.NONE,"Do not dim anything").addOption(x.DIM,"Dim all but the previously focused paragraph / sentence").addOption(x.ALL,"Dim everything").setValue(this.getSettingValue()).onChange((n)=>{this.changeDimUnfocusedEditorsBehavior(n)}))})}getDefinition(t){return{name:"Dimming behavior in unfocused notes",desc:"How to dim paragraphs / sentences in notes / editors that your cursor is not on (e.g. if you have multiple notes open in split panes)",render:(e)=>{e.setClass("typewriter-mode-setting").addDropdown((i)=>i.addOption(x.NONE,"Do not dim anything").addOption(x.DIM,"Dim all but the previously focused paragraph / sentence").addOption(x.ALL,"Dim everything").setValue(this.getSettingValue()).onChange((n)=>{this.changeDimUnfocusedEditorsBehavior(n),t?.()}))}}}load(){super.load(),this.tm.perWindowProps.bodyAttrs["data-ptm-dim-unfocused-editors-behavior"]=this.getSettingValue()}changeDimUnfocusedEditorsBehavior(t){this.setSettingValue(t),this.tm.perWindowProps.bodyAttrs["data-ptm-dim-unfocused-editors-behavior"]=t,this.tm.saveSettings().catch((e)=>{})}}class it extends p{settingKey="dimming.dimUnfocusedMode";registerSetting(t){t.addSetting((e)=>{e.setName("Dim unfocused mode").setDesc("Choose to dim unfocused paragraphs or sentences").setClass("typewriter-mode-setting").addDropdown((i)=>i.addOption(M.PARAGRAPHS,"Paragraphs").addOption(M.SENTENCES,"Sentences").setValue(this.getSettingValue()).onChange((n)=>{this.change(n)}))})}getDefinition(t){return{name:"Dim unfocused mode",desc:"Choose to dim unfocused paragraphs or sentences",render:(e)=>{e.setClass("typewriter-mode-setting").addDropdown((i)=>i.addOption(M.PARAGRAPHS,"Paragraphs").addOption(M.SENTENCES,"Sentences").setValue(this.getSettingValue()).onChange((n)=>{this.change(n),t?.()}))}}}load(){super.load(),this.tm.perWindowProps.bodyAttrs["data-ptm-dim-unfocused-mode"]=this.getSettingValue()}change(t){this.setSettingValue(t),this.tm.perWindowProps.bodyAttrs["data-ptm-dim-unfocused-mode"]=t,this.tm.saveSettings().catch((e)=>{})}}class nt extends r{settingKey="dimming.isDimUnfocusedOnlyInWritingFocusModeEnabled";toggleClass="ptm-dim-unfocused-only-in-writing-focus-mode";hasCommand=!1;settingTitle="Dim unfocused only in writing focus mode";settingDesc="Only dim unfocused paragraphs / sentences when writing focus mode is active"}class ot extends p{settingKey="dimming.dimmedOpacity";registerSetting(t){t.addSetting((e)=>{e.setName("Opacity of dimmed elements").setDesc("The opacity of dimmed elements").setClass("typewriter-mode-setting").addSlider((i)=>i.setLimits(0,100,5).setDynamicTooltip().setValue(this.getSettingValue()*100).onChange((n)=>{this.changeDimmedOpacity(n/100)}))})}getDefinition(t){return{name:"Opacity of dimmed elements",desc:"The opacity of dimmed elements",render:(e)=>{e.setClass("typewriter-mode-setting").addSlider((i)=>i.setLimits(0,100,5).setDynamicTooltip().setValue(this.getSettingValue()*100).onChange((n)=>{this.changeDimmedOpacity(n/100),t?.()}))}}}load(){this.tm.setCSSVariable("--dimmed-opacity",`${this.getSettingValue()}`)}changeDimmedOpacity(t=0.25){this.setSettingValue(t),this.tm.setCSSVariable("--dimmed-opacity",`${t}`),this.tm.saveSettings().catch((e)=>{})}}class st extends r{settingKey="dimming.isPauseDimUnfocusedWhileScrollingEnabled";toggleClass="ptm-dim-unfocused-pause-while-scrolling";settingTitle="Pause dimming while scrolling";settingDesc="If this is enabled, paragraphs / sentences are not dimmed while scrolling"}class rt extends r{settingKey="dimming.isPauseDimUnfocusedWhileSelectingEnabled";toggleClass="ptm-dim-unfocused-pause-while-selecting";settingTitle="Pause dimming while selecting text";settingDesc="If this is enabled, paragraphs / sentences are not dimmed while selecting text"}function te(t){return Object.fromEntries([new tt(t),new nt(t),new it(t),new N(t),new G(t),new ot(t),new st(t),new rt(t),new et(t)].map((e)=>[e.getSettingKey(),e]))}var K=require("obsidian");function Fe(t){let e=new Set;for(let n of t.vault.getFiles())e.add(n.path);function i(n){if(n.path)e.add(n.path);for(let o of n.children)if(o instanceof K.TFolder)i(o)}return i(t.vault.getRoot()),[...e].sort()}class xe extends K.AbstractInputSuggest{vaultPaths;constructor(t,e,i){super(t,e);this.vaultPaths=i}getSuggestions(t){let e=t.toLowerCase();return this.vaultPaths.filter((i)=>i.toLowerCase().includes(e)).slice(0,20)}renderSuggestion(t,e){e.setText(t)}}class Ve extends K.Modal{vaultPaths;getEnabledPaths;setEnabledPaths;getDisabledPaths;setDisabledPaths;constructor(t,e,i,n,o,s){super(t);this.vaultPaths=e,this.getEnabledPaths=i,this.setEnabledPaths=n,this.getDisabledPaths=o,this.setDisabledPaths=s}onOpen(){let{contentEl:t,modalEl:e}=this;e.addClass("typewriter-mode-file-paths-modal"),this.setTitle("File paths");let i=t.createDiv({cls:"typewriter-mode-file-paths-columns"});this.renderSection(i,"Enabled paths","Only enable the plugin for these files or folders. If empty, the plugin is active in all files.",this.getEnabledPaths,this.setEnabledPaths),this.renderSection(i,"Disabled paths","Always disable the plugin for these files or folders, overriding the enabled paths.",this.getDisabledPaths,this.setDisabledPaths)}onClose(){this.contentEl.empty()}renderSection(t,e,i,n,o){let s=t.createDiv({cls:"typewriter-mode-file-paths-column"});s.createEl("h3",{text:e}),s.createEl("p",{text:i,cls:"setting-item-description"});let d=s.createEl("input",{type:"text",placeholder:"Type to search vault paths…",cls:"typewriter-mode-file-paths-input"}),m=s.createDiv({cls:"typewriter-mode-file-paths-list"}),y=()=>{m.empty();let h=n();if(h.length===0){m.createEl("p",{text:"No paths configured.",cls:"setting-item-description"});return}for(let[g,u]of h.entries()){let P=m.createDiv({cls:"typewriter-mode-file-paths-row"});P.createEl("code",{text:u,cls:"typewriter-mode-file-paths-row-name"}),P.createEl("button",{text:"Remove"}).addEventListener("click",()=>{let B=[...n()];B.splice(g,1),o(B),y()})}};y();let C=new xe(this.app,d,this.vaultPaths);C.onSelect((h)=>{let g=n();if(!g.includes(h))o([...g,h]),y();C.setValue("")})}}class dt extends p{settingKey="general.enabledFilePaths";getDefinition(t){return{name:"File paths",desc:"Configure which files or folders the plugin is enabled or disabled in.",render:(e)=>{e.setClass("typewriter-mode-setting").addButton((i)=>i.setButtonText("Configure").onClick(()=>{this.openModal(),t?.()}))}}}openModal(){let t=this.tm.plugin.app,e=Fe(t);new Ve(t,e,()=>this.tm.settings.general.enabledFilePaths??[],(d)=>{this.setSettingValue(d),this.tm.saveSettings().catch((m)=>{})},()=>this.tm.settings.general.disabledFilePaths??[],(d)=>{U(this.tm.settings,"general.disabledFilePaths",d),this.tm.saveSettings().catch((m)=>{})}).open()}registerSetting(t){t.addSetting((e)=>{e.setName("File paths").setDesc("Configure which files or folders the plugin is enabled or disabled in.").setClass("typewriter-mode-setting").addButton((i)=>i.setButtonText("Configure").onClick(()=>{this.openModal()}))})}}class at extends p{settingKey="general.enabledPlatforms";settingTitle="Enable on platforms";settingDesc="Select on which platforms Typewriter Mode should be active";getDefinition(t){return{name:this.settingTitle,desc:this.settingDesc,render:(e)=>{e.setClass("typewriter-mode-setting").addDropdown((i)=>i.addOption(b.BOTH,"All platforms").addOption(b.DESKTOP,"Desktop only").addOption(b.MOBILE,"Mobile only (tablet and phone)").addOption(b.TABLET,"Tablet only").addOption(b.PHONE,"Phone only").addOption(b.DESKTOP_AND_TABLET,"Desktop and tablet").setValue(this.getSettingValue()).onChange((n)=>{this.setSettingValue(n),this.tm.saveSettings().catch((o)=>{}),t?.()}))}}}registerSetting(t){t.addSetting((e)=>{e.setName(this.settingTitle).setDesc(this.settingDesc).setClass("typewriter-mode-setting").addDropdown((i)=>i.addOption(b.BOTH,"All platforms").addOption(b.DESKTOP,"Desktop only").addOption(b.MOBILE,"Mobile only (tablet and phone)").addOption(b.TABLET,"Tablet only").addOption(b.PHONE,"Phone only").addOption(b.DESKTOP_AND_TABLET,"Desktop and tablet").setValue(this.getSettingValue()).onChange((n)=>{this.setSettingValue(n),this.tm.saveSettings().catch((o)=>{})}))})}}class mt extends r{settingKey="general.isOnlyActivateAfterFirstInteractionEnabled";settingTitle="Only activate after first interaction";settingDesc="Activate the focused line highlight and paragraph dimming only after the first interaction with the editor"}class pt extends r{settingKey="general.isPluginActivated";toggleClass="ptm-plugin-activated";settingTitle="Activate Typewriter Mode";settingDesc="This enables or disables all the features below."}function ee(t){return Object.fromEntries([new pt(t),new at(t),new mt(t),new dt(t)].map((e)=>[e.getSettingKey(),e]))}class ht extends r{settingKey="hemingwayMode.isAllowBackspaceInHemingwayModeEnabled";toggleClass=null;settingTitle="Allow using Backspace key in Hemingway mode";settingDesc="Allows deleting text with Backspace when Hemingway mode is active. Useful for fixing typos while maintaining forward-only writing flow."}class gt extends r{settingKey="hemingwayMode.isHemingwayModeEnabled";toggleClass="ptm-hemingway-mode-enabled";settingTitle="Hemingway mode";settingDesc="Prevents editing previously written text. Blocks navigation keys (arrows, Home, End, Page Up/Down), Delete key, and undo operations to enforce forward-only writing.";statusBarItem=null;load(){super.load(),this.statusBarItem=this.tm.plugin.addStatusBarItem(),this.statusBarItem.addClass("ptm-hemingway-mode-status"),this.updateStatusBar(),this.registerFocusModeObserver()}enable(){super.enable(),this.registerKeyboardHandler(),this.updateStatusBar()}disable(){super.disable(),this.unregisterKeyboardHandler(),this.updateStatusBar()}updateStatusBar(){if(!this.statusBarItem)return;let t=this.getSettingValue(),e=this.tm.settings.hemingwayMode.isShowHemingwayModeStatusBarEnabled,i=this.tm.settings.hemingwayMode.hemingwayModeStatusBarText,n=this.tm.settings.hemingwayMode.isHemingwayModeOnlyInWritingFocusModeEnabled,o=activeDocument.body.hasClass("ptm-focus-mode");if(t&&e&&(!n||o))this.statusBarItem.setText(i),this.statusBarItem.show();else this.statusBarItem.hide()}registerFocusModeObserver(){let t=new MutationObserver(()=>{this.updateStatusBar()});t.observe(activeDocument.body,{attributes:!0,attributeFilter:["class"]}),this.tm.plugin.register(()=>t.disconnect())}updateStatusBarText(){this.updateStatusBar()}keyboardHandler=(t)=>{if(!this.getSettingValue())return;if(this.tm.settings.hemingwayMode.isHemingwayModeOnlyInWritingFocusModeEnabled&&!activeDocument.body.hasClass("ptm-focus-mode"))return;let i=["ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","PageDown","Delete"],n=t.key==="z"&&(t.ctrlKey||t.metaKey),o=t.key==="Backspace",s=this.tm.settings.hemingwayMode.isAllowBackspaceInHemingwayModeEnabled;if(i.includes(t.key)||n)t.preventDefault(),t.stopPropagation();if(o&&!s)t.preventDefault(),t.stopPropagation()};registerKeyboardHandler(){activeDocument.addEventListener("keydown",this.keyboardHandler,{capture:!0})}unregisterKeyboardHandler(){activeDocument.removeEventListener("keydown",this.keyboardHandler,{capture:!0})}}class yt extends r{settingKey="hemingwayMode.isHemingwayModeOnlyInWritingFocusModeEnabled";toggleClass=null;hasCommand=!1;settingTitle="Hemingway mode only in writing focus mode";settingDesc="Only enforce Hemingway mode when writing focus mode is active";enable(){super.enable(),this.updateHemingwayModeStatusBar()}disable(){super.disable(),this.updateHemingwayModeStatusBar()}updateHemingwayModeStatusBar(){this.tm.features.hemingwayMode["hemingwayMode.isHemingwayModeEnabled"].updateStatusBarText()}}class lt extends r{settingKey="hemingwayMode.isShowHemingwayModeStatusBarEnabled";toggleClass=null;settingTitle="Show status bar indicator";settingDesc="Shows an indicator in the status bar when Hemingway mode is active.";enable(){super.enable(),this.updateHemingwayModeStatusBar()}disable(){super.disable(),this.updateHemingwayModeStatusBar()}updateHemingwayModeStatusBar(){this.tm.features.hemingwayMode["hemingwayMode.isHemingwayModeEnabled"].updateStatusBarText()}}class ut extends p{settingKey="hemingwayMode.hemingwayModeStatusBarText";settingTitle="Status bar text";settingDesc="Text to display in the status bar when Hemingway mode is active.";getDefinition(t){return{name:this.settingTitle,desc:this.settingDesc,render:(e)=>{e.setClass("typewriter-mode-setting").addText((i)=>i.setValue(this.getSettingValue()).onChange((n)=>{this.setSettingValue(n),this.tm.saveSettings().catch((o)=>{}),this.updateHemingwayModeStatusBar(),t?.()}))}}}registerSetting(t){t.addSetting((e)=>{e.setName(this.settingTitle).setDesc(this.settingDesc).setClass("typewriter-mode-setting").addText((i)=>i.setValue(this.getSettingValue()).onChange((n)=>{this.setSettingValue(n),this.tm.saveSettings().catch((o)=>{}),this.updateHemingwayModeStatusBar()}))})}updateHemingwayModeStatusBar(){this.tm.features.hemingwayMode["hemingwayMode.isHemingwayModeEnabled"].updateStatusBarText()}}function ie(t){return Object.fromEntries([new gt(t),new yt(t),new ht(t),new lt(t),new ut(t)].map((e)=>[e.getSettingKey(),e]))}class ct extends r{settingKey="keepLinesAboveAndBelow.isKeepLinesAboveAndBelowEnabled";settingTitle="Keep lines above and below";settingDesc="When enabled, always keeps the specified amount of lines above and below the current line in view";isSettingEnabled(){return!this.tm.settings.typewriter.isTypewriterScrollEnabled}}class bt extends p{settingKey="keepLinesAboveAndBelow.linesAboveAndBelow";getDefinition(t){return{name:"Amount of lines above and below the current line",desc:"The amount of lines to always keep above and below the current line",render:(e)=>{e.setClass("typewriter-mode-setting").addText((i)=>i.setValue(this.getSettingValue().toString()).onChange((n)=>{this.changeAmountOfLinesAboveAndBelow(Number.parseInt(n,10)),t?.()}))}}}registerSetting(t){t.addSetting((e)=>{e.setName("Amount of lines above and below the current line").setDesc("The amount of lines to always keep above and below the current line").setClass("typewriter-mode-setting").addText((i)=>i.setValue(this.getSettingValue().toString()).onChange((n)=>{this.changeAmountOfLinesAboveAndBelow(Number.parseInt(n,10))}))})}changeAmountOfLinesAboveAndBelow(t){this.setSettingValue(t),this.tm.saveSettings().catch((e)=>{})}}function ne(t){return Object.fromEntries([new ct(t),new bt(t)].map((e)=>[e.getSettingKey(),e]))}class Ct extends r{settingKey="maxChars.isMaxCharsPerLineEnabled";toggleClass="ptm-max-chars-per-line";isToggleClassPersistent=!0;settingTitle="Limit maximum number of characters per line";settingDesc="Limits the maximum number of characters per line"}class St extends p{settingKey="maxChars.maxCharsPerLine";registerSetting(t){t.addSetting((e)=>{e.setName("Maximum number of characters per line").setDesc("The maximum number of characters per line").setClass("typewriter-mode-setting").addText((i)=>i.setValue(this.getSettingValue().toString()).onChange((n)=>{this.changeMaxCharsPerLine(Number.parseInt(n,10))}))})}getDefinition(t){return{name:"Maximum number of characters per line",desc:"The maximum number of characters per line",render:(e)=>{e.setClass("typewriter-mode-setting").addText((i)=>i.setValue(this.getSettingValue().toString()).onChange((n)=>{this.changeMaxCharsPerLine(Number.parseInt(n,10)),t?.()}))}}}load(){this.tm.setCSSVariable("--max-chars-per-line",`${this.getSettingValue()}ch`)}changeMaxCharsPerLine(t){this.setSettingValue(t),this.tm.setCSSVariable("--max-chars-per-line",`${t}ch`),this.tm.saveSettings().catch((e)=>{})}}function oe(t){return Object.fromEntries([new Ct(t),new St(t)].map((e)=>[e.getSettingKey(),e]))}class ft extends r{settingKey="restoreCursorPosition.isRestoreCursorPositionEnabled";settingTitle="Restore cursor position";settingDesc="Restore the last cursor position when opening files";get state(){return this.tm.settings.restoreCursorPosition.cursorPositions}set state(t){this.tm.settings.restoreCursorPosition.cursorPositions=t}enable(){super.enable(),this.tm.plugin.registerEvent(this.tm.plugin.app.workspace.on("quit",this.saveState)),this.tm.plugin.registerEvent(this.tm.plugin.app.vault.on("rename",this.onRenameFile)),this.tm.plugin.registerEvent(this.tm.plugin.app.vault.on("delete",this.onDeleteFile)),this.tm.plugin.registerEvent(this.tm.plugin.app.workspace.on("file-open",this.onFileOpen))}disable(){this.saveState().catch((t)=>{}),this.tm.plugin.app.workspace.off("quit",this.saveState),this.tm.plugin.app.workspace.off("rename",this.onRenameFile),this.tm.plugin.app.workspace.off("delete",this.onDeleteFile),this.tm.plugin.app.workspace.off("file-open",this.onFileOpen)}saveState=async()=>{await this.tm.saveSettings()};onRenameFile=(t,e)=>{let i=t.path,n=e;this.state[i]=this.state[n],delete this.state[n]};onDeleteFile=(t)=>{let e=t.path;delete this.state[e]};setCursorState(t){let e=this.tm.plugin.app.workspace.getActiveFile()?.path;if(!e)return;this.state[e]=t}onFileOpen=(t)=>{if(!t)return;if(!this.state[t.path])return;window.requestAnimationFrame(()=>{this.restoreSavedPosition(t.path)})};restoreSavedPosition(t){let e=this.tm.plugin.app.workspace.getLeavesOfType("markdown");for(let i of e){let n=i.view;if(n.getViewType()==="markdown"){let o=n.editor;if(!o?.cm)continue;let s=o.cm;if(this.tm.plugin.app.workspace.getActiveFile()?.path===t){let m=this.state[t];if(!this.tm.plugin.app.workspace.containerEl.querySelector("span.is-flashing")&&m)s.dispatch({selection:m})}}}}}function se(t){return Object.fromEntries([new ft(t)].map((e)=>[e.getSettingKey(),e]))}class xt extends r{settingKey="typewriter.isOnlyMaintainTypewriterOffsetWhenReachedEnabled";hasCommand=!1;settingTitle="Only maintain typewriter offset when reached";settingDesc="The line that the cursor is on will not be scrolled to the center of the editor until it the specified typewriter offset is reached. This removes the additional space at the top of the editor."}class Vt extends p{settingKey="typewriter.typewriterOffset";getDefinition(t){return{name:"Typewriter offset",desc:"Positions the typewriter line at the specified percentage of the screen",render:(e)=>{e.setClass("typewriter-mode-setting").addSlider((i)=>i.setLimits(0,100,5).setDynamicTooltip().setValue(this.getSettingValue()*100).onChange((n)=>{this.changeTypewriterOffset(n/100),t?.()}))}}}registerSetting(t){t.addSetting((e)=>{e.setName("Typewriter offset").setDesc("Positions the typewriter line at the specified percentage of the screen").setClass("typewriter-mode-setting").addSlider((i)=>i.setLimits(0,100,5).setDynamicTooltip().setValue(this.getSettingValue()*100).onChange((n)=>{this.changeTypewriterOffset(n/100)}))})}changeTypewriterOffset(t){this.setSettingValue(t),this.tm.saveSettings().catch((e)=>{})}}class Mt extends r{settingKey="typewriter.isTypewriterOnlyUseCommandsEnabled";toggleClass="ptm-typewriter-only-use-commands";settingTitle="Do not snap typewriter with arrow keys";settingDesc="The typewriter will only snap when using this plugin's move commands. It will not snap when using the arrow keys. The move commands are by default Cmd/Ctrl+ArrowUp/ArrowDown, but you can assign your own hotkeys for the move commands in Obsidian's settings."}class Dt extends r{settingKey="typewriter.isTypewriterScrollEnabled";toggleClass="ptm-typewriter-scroll";settingTitle="Typewriter scrolling";settingDesc="Turns typewriter scrolling on or off";isSettingEnabled(){return!this.tm.settings.keepLinesAboveAndBelow.isKeepLinesAboveAndBelowEnabled}}function re(t){return Object.fromEntries([new Dt(t),new Vt(t),new xt(t),new Mt(t)].map((e)=>[e.getSettingKey(),e]))}class wt extends r{settingKey="general.isAnnounceUpdatesEnabled";toggleClass="ptm-announce-updates";settingTitle="Announce updates";settingDesc="If enabled you will get a notice with release notes whenever you install a new version of Typewriter Mode"}function de(t){return Object.fromEntries([new wt(t)].map((e)=>[e.getSettingKey(),e]))}class vt extends p{settingKey="writingFocus.writingFocusFontSize";getDefinition(t){return{name:"Writing focus font size",desc:"Custom font size in points for writing focus mode (0 = use default font size)",render:(e)=>{e.setClass("typewriter-mode-setting").addSlider((i)=>i.setLimits(0,36,1).setDynamicTooltip().setValue(this.getSettingValue()).onChange((n)=>{this.changeFontSize(n),t?.()}))}}}registerSetting(t){t.addSetting((e)=>{e.setName("Writing focus font size").setDesc("Custom font size in points for writing focus mode (0 = use default font size)").setClass("typewriter-mode-setting").addSlider((i)=>i.setLimits(0,36,1).setDynamicTooltip().setValue(this.getSettingValue()).onChange((n)=>{this.changeFontSize(n)}))})}load(){let t=this.getSettingValue();if(t>0)this.tm.setCSSVariable("--writing-focus-font-size",`${t}pt`);else this.tm.setCSSVariable("--writing-focus-font-size","inherit")}changeFontSize(t){if(this.setSettingValue(t),t>0)this.tm.setCSSVariable("--writing-focus-font-size",`${t}pt`);else this.tm.setCSSVariable("--writing-focus-font-size","inherit");this.tm.saveSettings().catch((e)=>{})}}class Ot extends r{settingKey="writingFocus.isWritingFocusFullscreen";settingTitle="Make Obsidian fullscreen in writing focus";settingDesc="If enabled, the Obsidian window will toggle to fullscreen when entering writing focus"}class Lt extends r{settingKey="writingFocus.doesWritingFocusShowHeader";toggleClass="ptm-writing-focus-shows-header";settingTitle="Show header in writing focus";settingDesc="If enabled, the header will be shown in writing focus"}class Ht extends r{settingKey="writingFocus.doesWritingFocusShowStatusBar";toggleClass="ptm-writing-focus-shows-status-bar";settingTitle="Show status bar in writing focus";settingDesc="If enabled, the status bar will be shown in writing focus"}class Kt extends r{settingKey="writingFocus.doesWritingFocusShowVignette";settingTitle="Writing focus vignette";settingDesc="Add a vignette to the edges of the screen in writing focus"}class Pt extends p{settingKey="writingFocus.writingFocusVignetteStyle";getDefinition(t){return{name:"Writing focus vignette style",desc:"The style of the vignette in writing focus mode",render:(e)=>{e.setClass("typewriter-mode-setting").addDropdown((i)=>i.addOption(w.BOX,"Box").addOption(w.COLUMN,"Column").setValue(this.getSettingValue()).onChange((n)=>{this.changeVignetteStyle(n),t?.()}))}}}registerSetting(t){t.addSetting((e)=>{e.setName("Writing focus vignette style").setDesc("The style of the vignette in writing focus mode").setClass("typewriter-mode-setting").addDropdown((i)=>i.addOption(w.BOX,"Box").addOption(w.COLUMN,"Column").setValue(this.getSettingValue()).onChange((n)=>{this.changeVignetteStyle(n)}))})}changeVignetteStyle(t){this.setSettingValue(t),this.tm.saveSettings().catch((e)=>{})}}function ae(t){return Object.fromEntries([new Lt(t),new Ht(t),new Ot(t),new Kt(t),new Pt(t),new vt(t)].map((e)=>[e.getSettingKey(),e]))}function Me(t){return{currentLine:Gt(t),dimming:te(t),general:ee(t),hemingwayMode:ie(t),keepAboveAndBelow:ne(t),maxChar:oe(t),typewriter:re(t),updates:de(t),writingFocus:ae(t),restoreCursorPosition:se(t)}}class Bt{plugin;loadData;saveData;settings=a;perWindowProps={cssVariables:{},bodyClasses:[],bodyAttrs:{},allBodyClasses:[],persistentBodyClasses:[]};editorExtensions;features;commands;constructor(t,e,i){this.plugin=t,this.loadData=e,this.saveData=i,this.features=Me(this),this.commands=Ce(this),this.editorExtensions=[Wt(this),[]]}async load(){await this.loadSettings(),await this.saveSettings(),this.loadPerWindowProps(),this.loadEditorExtension()}loadPerWindowProps(){let t=[];for(let e of Object.values(this.features))for(let i of Object.values(e))i.load(),t=t.concat(i.getBodyClasses());this.perWindowProps.allBodyClasses=t;for(let e of Object.values(this.commands))e.load()}getRestoreCursorPositionFeature(){return this.features.restoreCursorPosition["restoreCursorPosition.isRestoreCursorPositionEnabled"]}loadEditorExtension(){this.plugin.registerEditorExtension(this.editorExtensions)}loadSettingsTab(){this.plugin.addSettingTab(new z(this.plugin.app,this))}unload(){for(let t of Object.values(this.features))for(let e of Object.values(t))e.disable()}async loadSettings(){let t=this.plugin.manifest.dir;if(!t)return;let e=await this.loadData();this.settings=await fe(e??{},this.plugin.app.vault,t)}async saveSettings(){await this.saveData(this.settings),this.plugin.app.workspace.updateOptions()}setCSSVariable(t,e){this.perWindowProps.cssVariables[t]=e}}class me extends De.Plugin{tm;constructor(t,e){super(t,e);this.tm=new Bt(this,async()=>await this.loadData(),async(i)=>await this.saveData(i))}async onload(){await this.tm.load(),this.tm.loadSettingsTab(),this.app.workspace.onLayoutReady(()=>{this.announceUpdate()})}onunload(){this.tm.unload()}openUpdateModal(t){let e=this.manifest.version;new $(this.app,e,t??null).open()}announceUpdate(){let t=this.manifest.version,e=this.tm.settings.general.version??null;if(t===e)return;if(this.tm.settings.general.version=t,this.tm.saveSettings().catch((n)=>{}),this.tm.settings.general.isAnnounceUpdatesEnabled===!1)return;new $(this.app,t,e).open()}}
|
|
|
|
/* nosourcemap */ |