- Updated electron
- Added a workaround that ensured updated CSS actually gets updated quickly during development
- Floating elements: avoiding using fullscreen modals, improved spacing, fixed an issue regarding blurred text on non-hi-dpi displays
- Fixed many minor alignment issues
- Palette: avoiding displaying the default shortcut hint for the current item when custom shortcut hints are provided
- New React hook: useEvent
- Ensuring popovers are repositioned when resizable layouts are resized
- Changelogs: reversed history order
- New commands: changelog.first, changelog.last
- Mapped Ctrl+Home/Ctrl+End to changelog.first/changelog.last
- New context key: isConfigurationEditorOpen
- New commands: configurationEditor.next, configurationEditor.previous
- New commands: configurationEditor.first, configurationEditor.last
- Mapped Ctrl+Tab/Ctrl+Shift+Tab to configurationEditor.next/configurationEditor.previous
- Mapped Ctrl+Home/Ctrl+End to configurationEditor.first/configurationEditor.last
- New commands: standaloneEditor.first, standaloneEditor.last, standaloneEditor.previous, standaloneEditor.next
- Mapped Ctrl+Tab/Ctrl+Shift+Tab to standaloneEditor.next/standaloneEditor.previous
- Mapped Ctrl+Home/Ctrl+End to standaloneEditor.first/standaloneEditor.last
- Mapped Alt to view.menubar.enable rather than view.menubar.toggle
- New React hook: useMount
- New React hook: useUnmount
- Ensuring state is kept in sync when modals or popovers are removed from the DOM at the React level
- New context keys: hasDialog, hasNotification, hasPopover
- New commands: dialog.close, modal.close, notification.close, popover.close
- Wired the “Esc” shortcut used for closing dialogs/modals/popovers/notifications with the main shortcuts system
- Added a context menu for the custom titlebar
- Added a context menu for the statusbar
- Making portable builds for Windows again
- Updated some dependencies
- Detecting focus change events more reliably
- Switch focus back to the editor when appropriate
- New commands: note.attachment.embed, note.attachment.link
- note.attachment.add command: added support for passing attachments paths directly, and to embed or link them directly once imported too
- Optimized throttling scalability in chokidar, especially when dealing with large number of files
- Fixed a bug when attempting to detect TLDs in URLs with single-letter subdomains
- Implemented a rough diff algorithm that’s often absurdly fast
- Slightly optimized Markdown segmentation
- Added an incremental Markdown tokenizer
- Added a “medium” note length threshold at 25kb
- Implemented an incremental indentation provider for the editor that’s about twice as fast most of the time
- Disabled the default link detector in Markdown editors
- Improved Markdown link detection: accounting for IP addresses, localhost URLs, URLs with a port specified and “notable://“ URLs
- Improved editor link detection: accounting for IP addresses, localhost URLs, URLs with a port specified, URLs with a fragment, URLs with query parameters, special placeholders, and potentially valid URLs contained in actually invalid URLs
- Implemented a potential fix for those “loading chunk X failed” errors
- Updated some dependencies
- Incremental tokenizer: detecting diffs more precisely
- Incremental tokenizer: added support for using a custom env object
- Caching DOM nodes that didn’t change when rendering arbitrary HTML
- Caching DOM nodes that didn’t change more aggressively when rendering arbitrary HTML
- Implemented an incremental Markdown tokens renderer
- Tokenizing and rendering regular Markdown documents incrementally
- Incremental tokenizer: handling many edge cases that caused the wrong tokens to be returned
- Incremental tokenizer: bailing out of it when environment data might be in use
<markdown>
tag: ensuring heading IDs used in parent scopes are taken into account<markdown>
tag: ensuring its usage doesn’t make the app bail out from incremental tokenization and rendering of the top-level document- Slugifier: properly accounting for
<markdown>
tags, resetting the cache at the right time <markdown>
tag: using a references cache that’s shared between all rendering scopes of the document<markdown>
tag: ensuring it is detected properly when using inline and at the start of a line<markdown>
tag: ensuring empty tags are handled properly- HTML component: avoiding making DOM elements for useless empty paragraphs
- Significantly improved the reliability of line mappings under many complex scenarios
- Outputting accurate line mapping in many additional cases
- Ensuring commands executed in a macro are executed in the right order and don’t overlap with each other
- HTML component: avoiding making new DOM elements when only their line mapping changed
- New command: sleep
- Minor changes
- Pasting the selected emoji or language picked from its respective palette to the editor only if the editor is already visible
- Updated KaTeX assets, ensuring expressiona re rendered correctly
- Added a potential workaround for the issue that causes weird characters to be printed to PDF under macOS Catalina
- Ensuring sidebar tags are proparly sorted
- Updated shortcuts font, using monospaced digits
- Partial tokenizer: handling a couple of other edge cases
- Ensuring the button for opening mermaid or PlantUML diagrams in the browser are rendered
- Replaced react-window with react-virtuoso
- Updated some dependencies
- Simplified some types used alongside React
- New React hook: useStateRef
- Ensuring spacers can’t be shrunk in size
- New React hook: useOverflowObserver
- Overflow observer: added a “tail” strategy
- Proper handling of overflowing buttons in the mainbar toolbar
- Menu: improved activation/deactivation states styling, accounting for icons
- Lowered some minimum-allowed widths
- Ensuring popovers are positioned reasonably in zen mode when the custom titlebar is being used
- Providing on-hover toolbar and statusbar in zen mode
- Added a dedicated button to the toolbar for toggling split mode
- New React hook: useUpdatingRef
- Overflow observer: reacting to dynamic changes in the DOM too
- New React component: Noop
- Overflow observer: improved detection of dynamic changes
- Overflow observer: accounting for padding in the parent
- Overflow observer: implemented an “ends” strategy
- Implemented a, currently disabled, statusbar overflower
- Fetch: ensuring the response gets parsed only for 2xx HTTP codes
- Editor: ensuring long lines always have a bit of padding to the right when word wrapping is disabled
- Improved heading detection reliability for the first heading in some scenarios
- Ensuring popovers opened from the overflow menu are positioned reasonably
- Ensuring the "empty" item in trees are properly marked as the first and last items in the tree
- Ensuring only one app title is displayed in the custom titlebar at any given time
- Minor changes
- Added a "Languages" library
- Added support for moving logic into web workers easily
- Added the "un-UN" (Unsupported) language
- Languages: simplified name of the "Setswana / Tswana" language
- Added a "Language" library
- Added a function for string language detection, accounting for the user’s system preferences too
- Added a "Spell Checker" library
- New commands: spellChecker.enable, spellChecker.disable, spellChecker.toggle
- New context key: isSpellCheckerEnabled
- Added a basic statusbar item for toggling the spell checker
- New setting: spellChecker.enabled
- New command: link.releases.experimental
- Added a "Dictionary" library for fetching and caching language dictionaries
- Bundling the available English dictionaries with the app
- Added a simple "format" function
- Using the new "format" function throughout the codebase
- New setting: plantuml.endpoint
- New setting: spellChecker.dictionary.endpoint
- Minor changes
- Added support for generating a words frequency list
- Added a "numbers" sorter
- Words frequency: ensuring words are sorted, quickly
- Words: added APIs for showing words frequencies in a quick pick
- New command: note.words.count
- New command: note.words.frequency
- Words statusbar item: opening up the words frequency quick pick on click
- Added some convenience methods for managing markers in Monaco
- Implemented a simple "memoize" function
- Implemented a simple spell checker interface that abstracts over nspell
- Dictionary: significantly improved retrival performance for unsupported languages
- Implemented some basic spell-checking primitives
- New theming colors: colors⚠️*
- New settings for changing the words in dictionaries: spellChecker.dictionary.include, spellChecker.dictionary.exclude
- Spell checker: implemented a function for finding incorrect words in a whole string
- Fixed a few bugs in the generation of some complex emojis
- Defined a regex for matching raw emojis
- Natural sorting: accounting for all present emojis when sorting
- Wrapping generated emojis in a custom HTML element, fixing a few rendering bugs on macOS
- Markdown: added a, currently disable, plugin for wrapping raw emojis in the custom HTML element too
- Improved words detection, especially in languages with non-latin alphabets
- Language inferring: added support for picking the inferred language only within a set of probable languages
- Editor markers: added support for quickly checking if an editor has any markers
- Editor markers: added support for retrieving markers with updated ranges due to edits
- Spell checker: added support for detecting incorrect words up to a limit
- Added support for spell-checking note editors
- Editor spell checker: refreshing on mount/blur/change
- Editor spell checking: fixed a bug causing 0-length markers to not get cleaned up
- Editor spell checking: ensuring the editor to spell check didn’t get unmounted while spell checking
- Levelshtein distance: added a sort function
- Markdown: ensuring line breaks in paragraphs are not rendered as break elements
- Spell checker: sorting suggestions by edit distance
- Ensuring strings like "Something Bar" are always spelled as "Somethingbar", for consistency
- Ensuring that if a renderer process crash its associated window is closed automatically too
- Levenshtein sorter: added support for providing an iterator function
- Spell checking: sorting suggestions case insensitively
- New commands: spellChecker.dictionary.include, spellChecker.dictionary.exclude
- Added a "Word" library
- New command: editor.spelling.replace
- Editor: implemented many convenience API, to be used for spell checking
- Input context menu: ensuring Monaco’s tiny textarea doesn’t trigger the general context menu for inputs and textareas
- Editor context menu: added the expected items for spell checking
- Editor spell checker context menu: updated items order
- Disabled "look up" and "search with Google" menu items in editors context menus until they both can be implemented properly
- Added some basic APIs for implementing autocomplete(-ish) experiences in editors
- New commands: editor.autocomplete, editor.autocomplete.spelling
- New shortcut: Ctrl+Space -> editor.autocomplete
- New shortcut: Ctrl+. -> editor.autocomplete.spelling
- Language: added quick pick APIs for picking a language
- New commands: spellChecker.dictionary.set, spellChecker.dictionary.setAuto
- Spell checker: preserving manually set dictionary for each note across restarts
- Spell checker: ensuring it’s refreshed whenever something changes
- Spell checker: ensuring dictionaries are initialized with the configured inclusion and exclusion lists
- Spell checker: efficiently updating the dictionary when include/exclude lists change, when possible, rather then rebuilding the entire thing
- Spell checker: ensuring the "Learn Spelling" item is provided even if there are no suggestions available
- Spell checker: ensuring all visible editors get refreshed when the settings change
- New commands: spellChecker.word.first, spellChecker.word.last, spellChecker.word.previous, spellChecker.word.next
- New shortcuts: F9/Shift+F9 -> spellChecker.word.next/spellChecker.word.previous
- Editor: ensuring it gets focused too when setting new cursors
- Editor: added some APIs related to selections
- New command: editor.selection.words
- note.words.frequency command: selecting all occurrences of the picked word in the editor
- New command: spellChecker.words.frequency
- Minor changes
- Spell checker: providing much more info to the user via the statusbar item, both using the icon and the tooltip
- New shortcut: F8 -> spellChecker.toggle
- Implemented a context menu for the spell checker statusbar item
- Spell checker: greatly reduced the number of false positives, skipping checks of words inside code blocks, urls, and other common false positives scenarios
- Spell-checked theming notes
- Spell checker: ignoring HTML entities
- Spell checker: included ~200 extra technical words in the built-in dictionaries
- Updated some internal notes
- Markdown: reduced the amount of time spent parsing by the custom syntax plugins by ~50% in most cases
- Markdown: reverted previous change regarding breaking paragraphs as it had some unforeseen breaking changes
- Spell checker: ensuring only the diff is re-evaluated also when no mispellings are found
- Spell checker: ensuring the entire document is still taken into consideration when performing spell checking on diffs
- Editor: ensuring new selections are scrolled to automatically if they are all outside the viewport
- Diff: ensuring calculated offsets don’t overlap with each other
- Ensuring the app can be resized vertically from all parts of the top edge of the titlebar (Windows)
- Markdown shield: ensuring rendered block elements aren’t wrapped again in a paragraph
- Details tag: ensuring it has no extra margin at the bottom if it’s the last rendered element
- Updated some dependencies
- New programming languages: Dart, Terraform HCL, Julia, Lexon, Scala, SystemVerilog, Verilog
- Editor: ensuring it has consistent top and bottom padding applied to it
- Spell checker: added a few more words to the built-in dictionary
- Markdown: providing accurate line mappings for HTML blocks too
- Markdown: ensuring line mappings are provided for table rows too
- Markdown: updating the raw Markdown too when toggling a
<details>
element - Markdown shield: ensuring the added padding doesn’t break any potential html_block token
- New autocomplete providers: emoji, programming language, quick link note/attachment/command/heading/search/tag
- New commands: editor.autocomplete.emoji, editor.autocomplete.language, editor.autocomplete.quickLink
- Minor changes
- Monaco: added a "Marker" lib
- Editor: registering metadata for some kind-of supported languages with no syntax highlighting yet available
- New context key: hasEditorSelectionAnchor
- New theming color: editor⚓background
- New commands: editor.selection.anchor, editor.selection.anchor.set, editor.selection.anchor.clear
- New shortcu: Esc -> editor.selection.anchor.clear
- New private command: editor.native
- New commands: editor.transform.lowercase, editor.transform.titlecase, editor.transform.uppercase
- New command: editor.go.selection.anchor
- New command: editor.link.open
- New commands: editor.sort.ascending, editor.sort.descending
- New command: editor.cursor.redo
- New shortcut: CmdOrCtrl+Shift+U -> editor.cursor.redo
- New command: editor.copy.selection.right
- New commands: editor.insert.cursors.up, editor.insert.cursors.down
- New shortcut: Ctrl+Enter -> editor.link.open (macOS)
- New shortcut: Ctrl+Alt+Enter -> editor.link.open (Windows & Linux)
- Markdown: ensuring tasks in loose lists are rendered properly
- Added a markdown table formatter library
- New commands: editor.table.format.all, editor.table.format.current
- New shortcut: CtrlOrCmd+Alt+Shift+C -> editor.table.format.current
- New shortcut: CtrlOrCmd+Alt+Shift+A -> editor.table.format.all
- New commands: editor.heading.increase, editor.heading.decrease
- New shortcut: CmdOrCtrl+Shift+[ -> editor.heading.decrease
- New shortcut: CmdOrCtrl+Shift+] -> editor.heading.increase
- New commands: editor.formatting.bold.add, editor.formatting.bold.remove, editor.formatting.bold.toggle, editor.formatting.italic.add, editor.formatting.italic.remove, editor.formatting.italic.toggle, editor.formatting.strikethrough.add, editor.formatting.strikethrough.remove, editor.formatting.strikethrough.toggle
- New shortcut: CmdOrCtrl+B -> editor.formatting.bold.toggle
- New shortcut: CmdOrCtrl+I -> editor.formatting.italic.toggle
- Spell checking: stopping providing general autocomplete and context menu contributions when disabled
- New command: editor.heading.set
- New command: editor.pasteAsLink
- Tasks: improved support for toggling all tasks in a selection
- Autocomplete: added a file system provider for quick links
- Shortcut: added quick pick APIs
- Autocomplete: added a provider for regular links
- Autocomplete: added a provider for reference links
- Autocomplete: added a provider for scheme urls
- Markdown: implemented some convenience functions for extracting the environmen out of markdown strings
- Autocomplete: added a provider for links references
- Autocomplete: added a provider for footnotes references
- Editor: added a "Formatting" submenu to the context menu
- Minor changes
- Added a "File" library
- New commands: file.copy, file.copyPath, file.open, file.reveal
- Added a context menu for raw files
- Added a "file" palette
- HTMLCached: ensuring malformed HTML doesn’t crash the component
- Markdown: improved code block detection, accounting for non-closed ones too
- New command: crash.report
- Preview: added an error boundary, ensuring that if the preview crashes for whatever reason it doesn’t take the whole app with it
- Added basic autocomplete support to tags inputs
- New React component: IconProgressPie
- New React component: IconProgressCircle
- Ensuring dynamic icons inherit the color being used
- Added a function for retrieving tasks statistics from a note
- New sort dimension: tasks
- Added a dynamic pie-style progress bar icon in the notes list when the sorting dimension is "tasks"
- New command: note.tag.rename
- Added a "Rename" context menu item from note tags
- New command: tag.delete
- Added a "Delete" context menu item for regular sidebar tags
- New command: tag.rename
- Added a "Rename" context menu item for regular sidebar tags
- Added a "DataTransfer" library
- New React hook: useDefaultEventHandler
- New React hook: useDropTarget
- New decorator class: drop-target-dropping
- Note: added suppor for handling drop events
- Added support for dropping files to note previews
- New class decorator: drop-pseudo-target-dropping
- Added support for dropping files to note editors
- New command: focus.reset
- New context key: isEscapableEditableFocused
- New shortcut: Esc -> focus.reset
- New React hook: useInputEditable
- Tags popover: added support for renaming tags directly on Alt+Click
- List: improved styling of embedded inputs
- Sidebar: added support for renaming tags directly on Alt+Click
- New note metadata field: title_custom, which remembers whether the note’s title has been set manually, and should therefor not be changed automatically, or not
- New command: note.rename
- Middlebar: Sidebar: added support for renaming notes directly on Alt+Click
- Drag and drop: implemented some simple, general and flexible primitives
- Iconography: made some tweaks, added some new icons
- Iconography: added a test note listing all icons
- Implemented some convenience functions for generating links to all supported resources in any supported format
- Quick link: improved detection of embedded regular links
- Fixed some minor pluralization issues
- New commands: editor.duplicate.lines.delete, editor.duplicate.lines.deleteNonBlanks
- Links: defaulting to "markdown.special" rather than "markdown.regular" as the default "markdown" format
- Drag and drop: added back support for dropping files into note editors/previews using the new primitives
- Drag and drop: notes in the middlebar are now draggable sources
- Drag and drop: the tabbar is now a droppable target
- Drag and drop: sidebar tags are now droppable targets
- Drag and drop: the search bar is now a droppable target
- Drag and drop: tabs are now droppable targets
- Drag and drop: renamed some droppable targets
- Drag and drop: middlebar notes are now droppable targets
- Drag and drop: dragging a single note or all selected notes from the sidebar depending on if the dragged note is selected or not
- Drag and drop: tags in the sidebar are now draggable sources
- Drag and drop: tags in the tags editor popover are now draggable sources
- Drag and drop: attachments in the attachments editor popover are now draggable sources
- Drag and drop: made draggables provide their titles as their "text/plain" contribution
- Drag and drop: exclusing current draggables as valid droppable targets
- Drag and drop: tabs are now droppable targets
- Drag and drop: inferring which draggables each droppable can handle automatically
- Drag and drop: added a "noop" draggable
- New icon: heading
- Drag and drop: attachments/headings/notes/tabs/tags/commands/searches from quick picks are now draggable sources
- Drag and drop: added support for linking or embedding (with Alt) an attachment by dropping it into a note editor
- Drag and drop: added support for linking an heading by dropping it into a note editor
- Drag and drop: added support for linking a note by dropping it into a note editor
- Drag and drop: added support for linking a tag by dropping it into a note editor
- Drag and drop: added support for linking a command by dropping it into a note editor
- Drag and drop: added support for linking a search by dropping it into a note editor
- Drag and drop: added support for linking multiple tags by dropping them into a note editor
- Drag and drop: added support for linking multiple notes by dropping them into a note editor
- Drag and drop: added support for opening a note in a tab by dropping it into the tabbar
- Drag and drop: added support for opening multiple notes in tabs by dropping them into the tabbar
- Tabs: storing the tabs order more reliably, with an array, without relying on the insertion order of object properties
- Drag and drop: added support for reordering tabs by dragging one onto another one
- Settings: ensuring errors thrown during serialization or serialization can’t crash the app
- Note: added support for toggling some special tags too
- Drag and drop: added support for toggling a tag for a note by dropping the note into the tag
- Drag and drop: added support for toggling a tag for multiple notes by dropping the notes into the tag
- Drag and drop: added support for toggling an attachment for a note by dropping the attachment into the note
- Drag and drop: added support for toggling a tag for a note by dropping the tag into the note
- Drag and drop: added support for toggling multiple tags for a note by dropping the tags into the note
- Improved rendering of editable list items
- Drag and drop: ensuring the droppable overlay doesn’t interfere with the visibility of children
- Spell checking: reduced required initialization time by ~40%
- Minor changes
- Tasks: ensuring more correct statistics are detected for notes
- Added a caching mechanism for arbitrary note-level data
- Caching tasks statistics for improved performance
- Ensuring renaming a tag takes care of all of its children too, recursively
- Webpack: removed unused DLL bundle
- Webpack: using esbuild wherever possible
- Updated some dependencies
- Monaco: improved known languages registration
- Electron: ensuring the main process process bundle doesn’t contain any heavy dependencies
- Ensuring Monaco is not included directly in the renderer process bundle
- Editor: ensuring the JSON language is loaded only when needed
- Shrinked context keys’ parser by ~75%
- Removed "string-matches-generator" dependency
- Removed "string-matches" dependency
- Removed "is-fullwidth-code-point" dependency
- Replaced "fast-levenshtein" with "fastest-levenshtein"
- Removed "resize-observer-polyfill" dependency
- Removed "markdown-table" dependency
- Settings: replaced some heavy dependencies with lighter alternatives
- Reimplemented the subset of lodash that we need in a much lighter library, nanodash
- Replaced "lodash", "debounce" and some redundant helper functions with "nanodash"
- Added a "typescript:check" script
- Updated some dependencies
- Optimized tags tree mutations, bringing the time required to build it for 50k notes down from ~110s to ~60ms
- UUID: reduced length from 32 to 24
- Optimized natural sorting significantly
- Optimized proxy traps checks away from search
- Optimized chokidar configuration for a large number of files
- Optimized reading of a large number of files significantly
- Optimized handling of a large number of changed paths in the state management library
- Optimized YAML parsing for files without a frontmatter section
- Removed some unused dependencies from the dependency graph
- nanodash: added a "cloneJSON" method
- Moved the YAML compiler to a web worker
- Moved file system watching to a web worker
- Tasker: removed some useless wrapper functions and promises
- Optimizied startup time when loading lots of notes significantly
- Further optimizied YAML parsing for notes without a frontmatter section
- Generating randomness ~twice as fast
- nanodash: sligtly optimized some methods when dealing with empty arrays
- Fetching stats objects slightly more efficiently
- Quick pick: ensuring search is run once rather than twice some times
- Search: ensuring it is run once rather than twice sometimes
- Bypassing proxy traps in some strategic places, improving performance
- Minor changes
- New nanodash methods: camelCase, pascalCase
- New package: css-rule-parser
- New package: reac-css2style
- New package: react-attributes2props
- New React hook: useCache
- Removed "html-react-parser" in favor of some custom React components
- Updated some dependencies
- Minor changes
- Slightly optimized tags tree generation
- Ensuring localStorage and sessionStorage aren’t used anywhere, making the app start quickly when other versions of it are open too
- New command: window.show
- Showing new windows in a more strategic way, trying to optimize for quick feedback and reduced flickers
- Markdown: highlighting dividers in a more spec-compliant way
- Export: ensuring the content in the editor is taken into account when exporting notes to Markdown
- New export mode: Markdown (No Metadata), making it easier for people to move to something else if they want to :(
- Ensuring uncollapsible tags are not shown as being collapsed
- Added support for collapsing tags with a middle-click
- Markdown: ensuring HTML entities are detected and stripped away properly
- Shortcuts screencaster: ensuring buggy keyup events from autocomplete aren’t taken into consideration
- Editor: ensuring folding icons are replaced properly
- Added a trivial "Logger" library
- Tasker: reverted some of the previous changes for the sake of cleaness
- Replaced actual enums with const object literals, since enums are implemented weirdly in TypeScript
- Updated some dependencies
- New script: lint:report
- Addressed many linting issues
- Updated linter configuration
- nanodash: added "flattenDepth"
- Addressed most TypeScript issues
- New nanodash methods: entries, has, includes, keys, isFalsy, isTruthy
- Removed many type assertions
- Minor changes
- Improved error handling: centralized, wired with telemetry, handling more potential errors, showing more details when possible, showing errors in a more friendly way when possible
- Removed many implicit anys
- nanodash: more closely matching the behavior of lodash’s throttle method
- Ensuring tabs are serialized properly
- Ensuring the global "edit" menu has a "Formatting" submenu too
- Ensuring "Esc" or "Shift+Esc" clears single selections in editors
- Removed "Esc Esc" in favor of a single "Esc" for exiting focus mode or zen mode
- Light theme: inverted background colors for tabs
- nanodash: rewritten throttle and debounce to much more closely match lodash’s counterparts
- Updated usage of throttling and debouncing throuout the codebase
- Ensuring graphviz/dot diagrams have an "open in app" button too
- String.getMatches: ensuring all matches are returned, no matter what the initial
lastIndex
was - Editor: ensuring models are not disposed before using them
- Ensuring restoring selections doesn’t throw errors if the wrong ranges are set
- Ensuring no native dependencies are used
- Replaced "chokidar", "chokidar-watcher" and "calls-batch" with "nsfw"
- Removed "react-property" dependency
- "command" URLs: added support for separating arguments by slashes instead, for convenience
- Preview: removed an unnecessary renderer occurring when saving the note
- HTMLCached: ensuring no sparse arrays are created
- Minor changes
- Markdown: ensuring cached tokens are cloned as the array could get mutated
- Preview: ensuring segments are not re-rendered if they didn’t change
- Tree: scrolling to the last item more reliably
- Word: generalized some functions to allow for custom word regexes
- Formatting: ensuring all simple formatting wrappers can be toggled easily
- Formatting: ensuring trailing hashes are updated too when change a heading’s level
- Markdown: ensuring abiguous not-really-relative paths are supported too for linking to other notes or attachments
- Updated some dependencies
- Updated skeleton
- Commands: exposing "contextKey.set"
- Waiting for the database to finish loading before handling "notable://" urls
- Schema urls: ensuring they are handled even if the app is not open when triggering them
- Schema urls: ensuring they are handled even if the app is open but without any windows open when triggering them
- Ensuring opening the "About" window doesn’t cause the app to crash on exit
- Added an error dialog for when a path to a data directory to switch to has not been provided
- CWD: ensuring paths are normalized before adding or removing them from the recents map
- Avoiding mutating the database’s documents maps directly
- New package: "event-emitter"
- Minor changes
- Database: added an event system
- Database: added a simple "Revision" backend
- Database: duplicating documents and files more efficiently
- New package: event-emitter-batched
- Database: batching events
- Database: batching all events happening during initialization
- event-emitter-batched: ensuring events can also be emitted synchronously manually
- New database events: init, reset
- New database events: init:before, init:after
- event-emitter-batched: ensuring synchronous events aren’t paused
- Ensuring large arrays/maps/sets are mutated efficiently too
- Ensuring the tags tree is updated efficiently
- Ensuring notes get pruned for root groups properly
- Avoiding using the Date global directly, or at all in some cases
- Generating effimeral files and documents more cleanly
- Database: keeping track of creation and modification dates for attachments too
- Fetch: added a "status" function
- Attachment: added some convenience functions for fetching creation and moficiation date
- Refreshing rendered attachments as soon as a change is detected
- Ensuring attachments are renamed automatically when they are renamed on disk
- attachment.rename command: ensuring it allows for renaming attachments directly from within the app
- Ensuring attachments listed in the popover can be renamed on Alt+Click too
- Ensuring a "Rename" action is available in context menus for notes too
- Ensuring intermediate filesystem change events are ignored when the document in memory is likely ahead of that already
- Quick pick: ensuring inserted dynamic items don’t conflict with existing items
- Ensuring the changelog is opened automatically when needed
- Ensuring manually editing notes titles directly from the metadata section sets the "title_custom" flag automatically
- Ensuring that if loading a native dependency fails the error is handled gracefully
- New command: export.markdownRaw
- Ensuring "export.*" commands can accept an array of notes to export too
- Ensuring all "export.*" commands list all supported arguments
- Clipboard: added support for fetching copied filepaths directly
- Added support for copy/pasting arbitrary files in note editors (macOS) (Windows)
- Settings Synchronizer: avoiding some race conditions when setting multiple settings at once
- Updated some dependencies
- Ensuring all icons are rendered properly across all systems (no even-odd usage)
- Added support for definition lists
- Ensuring native dependencies work correctly under all tested environments
- Minor changes
- Replaced "nsfw" with "watcher"
- New nanodash methods: castError, isBuffer