├── .gitignore ├── .gitmodules ├── .vscode └── launch.json ├── Documentation ├── .tangent │ └── workspace-settings.json ├── Attachments │ ├── .tangentfolder │ ├── Focus Mode Buttons.png │ ├── Lens Settings Hint.png │ ├── Lense Selection.png │ ├── Map View Button.png │ ├── Query Example.png │ ├── System Menu Icon.png │ ├── Thread View Button.png │ └── Wiki Link Autocomplete Example.png ├── Calling Home.md ├── Changelog │ ├── .tangentfolder │ ├── v0.3.0-alpha.10.md │ ├── v0.3.0-alpha.11.md │ ├── v0.3.0-alpha.12.md │ ├── v0.3.0-alpha.5.md │ ├── v0.3.0-alpha.6.md │ ├── v0.3.0-alpha.7.md │ ├── v0.3.0-alpha.8.md │ ├── v0.3.0-alpha.9.md │ ├── v0.3.0-beta.1.md │ ├── v0.3.0-beta.2.md │ ├── v0.3.0-beta.3.md │ ├── v0.3.0-beta.4.md │ ├── v0.3.0-beta.5.md │ ├── v0.3.0-beta.6.md │ ├── v0.3.0-beta.7.md │ ├── v0.3.0.md │ ├── v0.3.1.md │ ├── v0.3.2-beta.1.md │ ├── v0.3.2.md │ ├── v0.3.3-beta.1.md │ ├── v0.3.3-beta.2.md │ ├── v0.3.3-beta.3.md │ ├── v0.3.3-beta.4.md │ ├── v0.3.3-beta.5.md │ ├── v0.3.3-beta.6.md │ ├── v0.3.3.md │ ├── v0.3.4-beta.1.md │ ├── v0.3.4-beta.2.md │ ├── v0.3.4-beta.3.md │ ├── v0.3.4-beta.4.md │ ├── v0.3.4.md │ ├── v0.4.0-alpha.1.md │ ├── v0.4.0-alpha.10.md │ ├── v0.4.0-alpha.2.md │ ├── v0.4.0-alpha.3.md │ ├── v0.4.0-alpha.4.md │ ├── v0.4.0-alpha.5.md │ ├── v0.4.0-alpha.6.md │ ├── v0.4.0-alpha.7.md │ ├── v0.4.0-alpha.8.md │ ├── v0.4.0-alpha.9.md │ ├── v0.4.0-beta.1.md │ ├── v0.4.0-beta.2.md │ ├── v0.4.0-beta.3.md │ ├── v0.4.0-beta.4.md │ ├── v0.4.0-beta.5.md │ ├── v0.4.0.md │ ├── v0.4.1.md │ ├── v0.5.0-alpha.1.md │ ├── v0.5.0-alpha.2.md │ ├── v0.5.0-alpha.3.md │ ├── v0.5.0-alpha.4.md │ ├── v0.5.0-alpha.5.md │ ├── v0.5.0-alpha.6.md │ ├── v0.5.0-alpha.7.md │ ├── v0.5.0-alpha.8.md │ ├── v0.5.0-beta.1.md │ ├── v0.5.0-beta.2.md │ ├── v0.5.0-beta.3.md │ ├── v0.5.0-beta.4.md │ ├── v0.5.0-beta.5.md │ ├── v0.5.0.md │ ├── v0.5.1.md │ ├── v0.5.2.md │ ├── v0.5.3-beta.1.md │ ├── v0.5.3-beta.2.md │ ├── v0.5.3-beta.3.md │ ├── v0.5.3-beta.4.md │ ├── v0.5.3-beta.5.md │ ├── v0.5.3-beta.6.md │ ├── v0.5.3-beta.7.md │ ├── v0.5.3.md │ ├── v0.5.4.md │ ├── v0.5.5-beta.1.md │ ├── v0.5.5.md │ ├── v0.5.6.md │ ├── v0.6.0-alpha.1.md │ ├── v0.6.0-alpha.10.md │ ├── v0.6.0-alpha.11.md │ ├── v0.6.0-alpha.12.md │ ├── v0.6.0-alpha.13.md │ ├── v0.6.0-alpha.14.md │ ├── v0.6.0-alpha.2.md │ ├── v0.6.0-alpha.3.md │ ├── v0.6.0-alpha.4.md │ ├── v0.6.0-alpha.5.md │ ├── v0.6.0-alpha.6.md │ ├── v0.6.0-alpha.7.md │ ├── v0.6.0-alpha.8.md │ ├── v0.6.0-alpha.9.md │ ├── v0.6.0-beta.1.md │ ├── v0.6.0-beta.10.md │ ├── v0.6.0-beta.11.md │ ├── v0.6.0-beta.12.md │ ├── v0.6.0-beta.13.md │ ├── v0.6.0-beta.14.md │ ├── v0.6.0-beta.2.md │ ├── v0.6.0-beta.3.md │ ├── v0.6.0-beta.4.md │ ├── v0.6.0-beta.5.md │ ├── v0.6.0-beta.6.md │ ├── v0.6.0-beta.7.md │ ├── v0.6.0-beta.8.md │ ├── v0.6.0-beta.9.md │ ├── v0.6.0.md │ ├── v0.6.1.md │ ├── v0.6.2.md │ ├── v0.7.0-alpha.1.md │ ├── v0.7.0-alpha.2.md │ ├── v0.7.0-alpha.3.md │ ├── v0.7.0-alpha.4.md │ ├── v0.7.0-alpha.5.md │ ├── v0.7.0-alpha.6.md │ ├── v0.7.0-beta.1.md │ ├── v0.7.0-beta.2.md │ ├── v0.7.0.md │ ├── v0.7.1.md │ ├── v0.7.2.md │ ├── v0.7.3.md │ ├── v0.7.4.md │ ├── v0.7.5.md │ ├── v0.7.6.md │ ├── v0.8.0-alpha.1.md │ ├── v0.8.0-alpha.2.md │ ├── v0.8.0-alpha.3.md │ ├── v0.8.0-alpha.4.md │ ├── v0.8.0-alpha.5.md │ ├── v0.8.0-alpha.6.md │ ├── v0.8.0-alpha.7.md │ ├── v0.8.0-beta.1.md │ ├── v0.8.0-beta.2.md │ ├── v0.8.0-beta.3.md │ ├── v0.8.0-beta.4.md │ ├── v0.8.0.md │ ├── v0.8.1.md │ ├── v0.8.2.md │ ├── v0.8.3.md │ ├── v0.8.4.md │ ├── v0.9.0-alpha.1.md │ ├── v0.9.0-alpha.10.md │ ├── v0.9.0-alpha.11.md │ ├── v0.9.0-alpha.2.md │ ├── v0.9.0-alpha.3.md │ ├── v0.9.0-alpha.4.md │ ├── v0.9.0-alpha.5.md │ ├── v0.9.0-alpha.6.md │ ├── v0.9.0-alpha.7.md │ ├── v0.9.0-alpha.8.md │ ├── v0.9.0-alpha.9.md │ ├── v0.9.0-beta.1.md │ ├── v0.9.0-beta.2.md │ ├── v0.9.0-beta.3.md │ ├── v0.9.0-beta.4.md │ └── v0.9.0-beta.5.md ├── Command Palette.md ├── Configuration │ ├── .tangentfolder │ ├── Appearance.md │ ├── Attachments.md │ ├── Creation Rules.md │ ├── Custom Styles.md │ ├── Database.md │ ├── Debug.md │ ├── Dictionary.md │ ├── Maps.md │ ├── Notes.md │ ├── System Menu.md │ └── Updates.md ├── Features │ ├── .tangentfolder │ ├── Line & Section Shifting.md │ ├── Note Aliases.md │ ├── Queries.md │ ├── Query Syntax.md │ ├── Sessions.md │ ├── Thread History.md │ ├── Unicode Autocomplete.md │ └── Zooming & Font Size.md ├── Feedback.md ├── Formatting │ ├── .tangentfolder │ ├── Backslash Escapes.md │ ├── Bold and Italics.md │ ├── Code.md │ ├── Comments.md │ ├── Embedding.md │ ├── Front Matter.md │ ├── Headers.md │ ├── Highlights.md │ ├── KaTeX Equations.md │ ├── Lists.md │ ├── Markdown Links.md │ ├── Markdown Syntax.md │ ├── Strikethrough.md │ ├── Tags.md │ ├── Todos.md │ └── Wiki Links.md ├── Getting Started.md ├── The Workspace.md └── Views │ ├── .tangentfolder │ ├── Backlinks.md │ ├── Cards Lens.md │ ├── Feed Lens.md │ ├── Focus Modes.md │ ├── Lenses.md │ ├── List Lens.md │ ├── Map View.md │ ├── The Sidebar.md │ └── Thread View.md ├── LICENSE.txt ├── README.md ├── apps ├── tangent-electron │ ├── .gitignore │ ├── LICENSE.txt │ ├── README.md │ ├── build │ │ ├── entitlements.mac.plist │ │ ├── flatpak │ │ │ ├── io.github.suchnsuch.Tangent.desktop │ │ │ └── io.github.suchnsuch.Tangent.metainfo.xml │ │ ├── icon.icns │ │ ├── icon.ico │ │ ├── icon.png │ │ ├── icon.svg │ │ ├── icon.xcf │ │ ├── icons │ │ │ ├── 128x128.png │ │ │ ├── 16x16.png │ │ │ ├── 256x256.png │ │ │ ├── 32x32.png │ │ │ ├── 48x48.png │ │ │ └── 64x64.png │ │ ├── index.js │ │ ├── jsign.js │ │ ├── notarize.js │ │ ├── readme.md │ │ └── svgtoicns.sh │ ├── defaults │ │ └── workspace-settings.json │ ├── dev.js │ ├── electron-builder.json │ ├── jest.config.js │ ├── package.json │ ├── playwright.config.ts │ ├── src │ │ ├── app │ │ │ ├── App.svelte │ │ │ ├── WindowBar.svelte │ │ │ ├── WorkspaceSelector.svelte │ │ │ ├── app.js │ │ │ ├── events.ts │ │ │ ├── global.d.ts │ │ │ ├── modal │ │ │ │ ├── Changelog.svelte │ │ │ │ ├── CommandPalette.svelte │ │ │ │ ├── CreateFileDialog.svelte │ │ │ │ ├── ModalConfirm.svelte │ │ │ │ ├── ModalInputSelect.svelte │ │ │ │ ├── ModalStateView.svelte │ │ │ │ ├── ModalStyles.scss │ │ │ │ └── MoveFileDialog.svelte │ │ │ ├── model │ │ │ │ ├── DataFile.ts │ │ │ │ ├── EmbedFile.ts │ │ │ │ ├── File.ts │ │ │ │ ├── Folder.ts │ │ │ │ ├── ModalState.ts │ │ │ │ ├── NodeHandle.ts │ │ │ │ ├── NoteFile.ts │ │ │ │ ├── SystemMenu.ts │ │ │ │ ├── Tag.ts │ │ │ │ ├── Tangent.ts │ │ │ │ ├── UpdateState.ts │ │ │ │ ├── Workspace.ts │ │ │ │ ├── WorkspaceTreeNode.ts │ │ │ │ ├── WorkspaceViewState.ts │ │ │ │ ├── commands │ │ │ │ │ ├── ArchivePreviousSessions.ts │ │ │ │ │ ├── ChangeCurrentFile.ts │ │ │ │ │ ├── CloseFile.ts │ │ │ │ │ ├── Command.ts │ │ │ │ │ ├── CommandAction.ts │ │ │ │ │ ├── CreateNewFile.test.ts │ │ │ │ │ ├── CreateNewFile.ts │ │ │ │ │ ├── CreateNewFolder.ts │ │ │ │ │ ├── CreateNewSession.ts │ │ │ │ │ ├── DeleteNode.ts │ │ │ │ │ ├── DuplicateNode.ts │ │ │ │ │ ├── FloatWindow.ts │ │ │ │ │ ├── KeyboardEventProxy.ts │ │ │ │ │ ├── MergeWithPreviousSession.ts │ │ │ │ │ ├── MoveFileCommand.ts │ │ │ │ │ ├── NoteKeyboardProxy.ts │ │ │ │ │ ├── OpenChangelog.ts │ │ │ │ │ ├── OpenLogs.ts │ │ │ │ │ ├── OpenPreferences.ts │ │ │ │ │ ├── OpenQueryPane.ts │ │ │ │ │ ├── OpenWorkspace.ts │ │ │ │ │ ├── RemoveFromMap.ts │ │ │ │ │ ├── SaveCurrentFile.ts │ │ │ │ │ ├── SetFocusLevel.ts │ │ │ │ │ ├── ShiftThreadHistory.ts │ │ │ │ │ ├── ShowAllChildMapNodes.ts │ │ │ │ │ ├── ShowCommandPalette.ts │ │ │ │ │ ├── ShowInFileBrowser.ts │ │ │ │ │ ├── ShowPreviousSession.ts │ │ │ │ │ ├── ToggleFocusMode.ts │ │ │ │ │ ├── ToggleSidebar.ts │ │ │ │ │ ├── WorkspaceCommand.ts │ │ │ │ │ ├── Zoom.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── contextmenu.ts │ │ │ │ ├── directoryView.ts │ │ │ │ ├── index.ts │ │ │ │ └── nodeViewStates │ │ │ │ │ ├── CardsViewState.ts │ │ │ │ │ ├── FeedViewState.ts │ │ │ │ │ ├── FolderViewState.ts │ │ │ │ │ ├── ImageViewState.ts │ │ │ │ │ ├── LensViewState.ts │ │ │ │ │ ├── ListViewState.ts │ │ │ │ │ ├── LoadingViewState.ts │ │ │ │ │ ├── NodeViewState.ts │ │ │ │ │ ├── NoteViewState.ts │ │ │ │ │ ├── QueryViewState.ts │ │ │ │ │ ├── SetViewState.ts │ │ │ │ │ ├── TagViewState.ts │ │ │ │ │ ├── UnhandledViewState.ts │ │ │ │ │ ├── ViewStateContext.ts │ │ │ │ │ └── index.ts │ │ │ ├── style │ │ │ │ ├── CodeThemeManager.ts │ │ │ │ ├── CustomStyleManager.ts │ │ │ │ ├── highlights.scss │ │ │ │ ├── input.scss │ │ │ │ └── note.scss │ │ │ ├── utils │ │ │ │ ├── ClassStoreAction.ts │ │ │ │ ├── DocumentationLink.svelte │ │ │ │ ├── LazyScrolledList.svelte │ │ │ │ ├── Menu.svelte │ │ │ │ ├── MenuItem.svelte │ │ │ │ ├── PaletteActionView.svelte │ │ │ │ ├── PopUpButton.svelte │ │ │ │ ├── ScrollingItemList.svelte │ │ │ │ ├── SearchSegmentHighlight.svelte │ │ │ │ ├── Tooltip.svelte │ │ │ │ ├── WorkspaceFileHeader.svelte │ │ │ │ ├── arrowNavigate.ts │ │ │ │ ├── dragDrop.ts │ │ │ │ ├── dragging.ts │ │ │ │ ├── editable.ts │ │ │ │ ├── events.ts │ │ │ │ ├── focus.ts │ │ │ │ ├── index.ts │ │ │ │ ├── resizeObserver.ts │ │ │ │ ├── scrollCaching.ts │ │ │ │ ├── scrolling.ts │ │ │ │ ├── scrollto.ts │ │ │ │ ├── shortcuts.ts │ │ │ │ ├── style.ts │ │ │ │ ├── svelte-popper.ts │ │ │ │ ├── svelte.ts │ │ │ │ ├── tooltips.ts │ │ │ │ └── types.ts │ │ │ ├── views │ │ │ │ ├── FileTree │ │ │ │ │ ├── FileTree.svelte │ │ │ │ │ └── SortingOptions.svelte │ │ │ │ ├── LeftSidebar.svelte │ │ │ │ ├── MessageToast.svelte │ │ │ │ ├── System │ │ │ │ │ ├── About.svelte │ │ │ │ │ ├── Appearance.svelte │ │ │ │ │ ├── Attachments.svelte │ │ │ │ │ ├── CreationRules.svelte │ │ │ │ │ ├── Database.svelte │ │ │ │ │ ├── Debug.svelte │ │ │ │ │ ├── Dictionary.svelte │ │ │ │ │ ├── Maps.svelte │ │ │ │ │ ├── Notes.svelte │ │ │ │ │ ├── SettingView.svelte │ │ │ │ │ ├── Styles.svelte │ │ │ │ │ ├── System.svelte │ │ │ │ │ └── Updates.svelte │ │ │ │ ├── Tangent │ │ │ │ │ ├── MapConnectionView.svelte │ │ │ │ │ ├── MapNodeView.svelte │ │ │ │ │ ├── MapView.svelte │ │ │ │ │ ├── MapsView.svelte │ │ │ │ │ ├── TangentView.svelte │ │ │ │ │ ├── ThreadView.svelte │ │ │ │ │ └── ThreadViewVerticalTitleBar.svelte │ │ │ │ ├── WorkspaceView.svelte │ │ │ │ ├── creation-rules │ │ │ │ │ ├── CreationRuleEditor.svelte │ │ │ │ │ └── CreationRuleItem.svelte │ │ │ │ ├── editors │ │ │ │ │ ├── NoteEditor │ │ │ │ │ │ ├── EmbedRoot.svelte │ │ │ │ │ │ ├── MarkdownEditor.test.ts │ │ │ │ │ │ ├── MarkdownEditor.ts │ │ │ │ │ │ ├── MarkdownView.ts │ │ │ │ │ │ ├── MarkdownViewComponent.svelte │ │ │ │ │ │ ├── NoteEditor.svelte │ │ │ │ │ │ ├── editorModule.ts │ │ │ │ │ │ ├── t-checkbox.ts │ │ │ │ │ │ ├── t-embed.ts │ │ │ │ │ │ ├── t-link.ts │ │ │ │ │ │ └── t-math.ts │ │ │ │ │ ├── OneLineEditor │ │ │ │ │ │ └── OneLineEditor.ts │ │ │ │ │ ├── QueryEditor │ │ │ │ │ │ ├── QueryAutocompleteMenu.svelte │ │ │ │ │ │ ├── QueryAutocompleter.ts │ │ │ │ │ │ ├── QueryEditor.ts │ │ │ │ │ │ ├── QueryTextEditor.svelte │ │ │ │ │ │ ├── editorModule.ts │ │ │ │ │ │ └── query.scss │ │ │ │ │ ├── TLinkTooltip.svelte │ │ │ │ │ ├── autobraces │ │ │ │ │ │ ├── autoBraces.test.ts │ │ │ │ │ │ ├── autoBracesModule.ts │ │ │ │ │ │ └── autoWrappingModule.ts │ │ │ │ │ ├── autocomplete │ │ │ │ │ │ ├── AutoCompleteMenu.svelte │ │ │ │ │ │ ├── CodeBlockAutoCompleter.ts │ │ │ │ │ │ ├── CodeBlockAutocompleteMenu.svelte │ │ │ │ │ │ ├── TagAutocompleteItem.svelte │ │ │ │ │ │ ├── TagAutocompleteMenu.svelte │ │ │ │ │ │ ├── TagAutocompleter.ts │ │ │ │ │ │ ├── UnicodeAutocompleteMenu.svelte │ │ │ │ │ │ ├── UnicodeAutocompleter.ts │ │ │ │ │ │ ├── WikiLinkAutocompleteMenu.svelte │ │ │ │ │ │ ├── WikiLinkAutocompleter.ts │ │ │ │ │ │ ├── autocomplete.scss │ │ │ │ │ │ ├── autocompleteModule.test.ts │ │ │ │ │ │ └── autocompleteModule.ts │ │ │ │ │ ├── selectionBuster.ts │ │ │ │ │ ├── selectionEvents.ts │ │ │ │ │ ├── t-checkboxModule.ts │ │ │ │ │ └── t-linkModule.ts │ │ │ │ ├── node-views │ │ │ │ │ ├── CardsSettingsView.svelte │ │ │ │ │ ├── CardsView.svelte │ │ │ │ │ ├── FeedSettingsView.svelte │ │ │ │ │ ├── FeedView.svelte │ │ │ │ │ ├── FolderSettingsView.svelte │ │ │ │ │ ├── ImageView.svelte │ │ │ │ │ ├── ListSettingsView.svelte │ │ │ │ │ ├── ListView.svelte │ │ │ │ │ ├── LoadingView.svelte │ │ │ │ │ ├── NodeViewSelector.svelte │ │ │ │ │ ├── NoteSettingsView.svelte │ │ │ │ │ ├── QuerySettingsView.svelte │ │ │ │ │ ├── SetCreationRules.svelte │ │ │ │ │ ├── TagSettingsView.svelte │ │ │ │ │ ├── UnhandledView.svelte │ │ │ │ │ ├── common │ │ │ │ │ │ └── SetLensSelector.svelte │ │ │ │ │ └── lensSettings.scss │ │ │ │ ├── smart-icons │ │ │ │ │ ├── FocusLevelIcon.svelte │ │ │ │ │ ├── NodeIcon.svelte │ │ │ │ │ ├── SVGIcon.svelte │ │ │ │ │ ├── SortModeIcon.svelte │ │ │ │ │ └── smartIcons.ts │ │ │ │ └── summaries │ │ │ │ │ ├── CreationRuleName.svelte │ │ │ │ │ ├── ExtractedEmojiIcon.svelte │ │ │ │ │ ├── LinkInfoView.svelte │ │ │ │ │ ├── NodeLine.svelte │ │ │ │ │ ├── NodePreview.svelte │ │ │ │ │ └── ThreadHistoryListView.svelte │ │ │ └── webpack.config.js │ │ ├── common │ │ │ ├── NodeSet.ts │ │ │ ├── SidebarState.ts │ │ │ ├── WindowApi.ts │ │ │ ├── annotations │ │ │ │ ├── nodeAnnotations.test.ts │ │ │ │ └── nodeAnnotations.ts │ │ │ ├── collections.test.ts │ │ │ ├── collections.ts │ │ │ ├── dataTypes │ │ │ │ ├── DataType.ts │ │ │ │ ├── FolderInfo.ts │ │ │ │ ├── QueryInfo.ts │ │ │ │ ├── Session.test.ts │ │ │ │ ├── Session.ts │ │ │ │ ├── SetInfo.ts │ │ │ │ ├── TagInfo.ts │ │ │ │ ├── TagSettingsSet.ts │ │ │ │ ├── TangentInfo.ts │ │ │ │ ├── WorkspaceSettings.ts │ │ │ │ └── index.ts │ │ │ ├── dates.test.ts │ │ │ ├── dates.ts │ │ │ ├── email.test.ts │ │ │ ├── email.ts │ │ │ ├── embedding.ts │ │ │ ├── fileExtensions.test.ts │ │ │ ├── fileExtensions.ts │ │ │ ├── geometry.ts │ │ │ ├── icons.ts │ │ │ ├── indexing │ │ │ │ ├── IndexTreeStore.ts │ │ │ │ ├── Indexer.ts │ │ │ │ ├── TagNode.ts │ │ │ │ ├── indexTypes.ts │ │ │ │ ├── queryAnnotations.test.ts │ │ │ │ ├── queryAnnotations.ts │ │ │ │ ├── queryResults.ts │ │ │ │ ├── querySolving.ts │ │ │ │ ├── structureUtiles.test.ts │ │ │ │ └── structureUtils.ts │ │ │ ├── links.test.ts │ │ │ ├── links.ts │ │ │ ├── markdownModel │ │ │ │ ├── CharacterFeeder.test.ts │ │ │ │ ├── CharacterFeeder.ts │ │ │ │ ├── DocumentFeeder.ts │ │ │ │ ├── LinesBuilder.ts │ │ │ │ ├── NoteParser.ts │ │ │ │ ├── code.ts │ │ │ │ ├── codeSyntax.ts │ │ │ │ ├── documentParsing.test.ts │ │ │ │ ├── formatting.ts │ │ │ │ ├── header.test.ts │ │ │ │ ├── header.ts │ │ │ │ ├── html.test.ts │ │ │ │ ├── html.ts │ │ │ │ ├── index.ts │ │ │ │ ├── line.ts │ │ │ │ ├── links.test.ts │ │ │ │ ├── links.ts │ │ │ │ ├── list.test.ts │ │ │ │ ├── list.ts │ │ │ │ ├── matches.ts │ │ │ │ ├── math.ts │ │ │ │ ├── parser.test.ts │ │ │ │ ├── parser.ts │ │ │ │ ├── parsingContext.ts │ │ │ │ ├── sections.test.ts │ │ │ │ ├── sections.ts │ │ │ │ ├── selection.ts │ │ │ │ ├── tag.test.ts │ │ │ │ ├── tag.ts │ │ │ │ └── typewriterTypes.ts │ │ │ ├── menus.ts │ │ │ ├── nodeReferences.ts │ │ │ ├── paths.test.ts │ │ │ ├── paths.ts │ │ │ ├── platform.ts │ │ │ ├── plurals.ts │ │ │ ├── queryModel │ │ │ │ ├── index.ts │ │ │ │ └── typewriterTypes.ts │ │ │ ├── search.test.ts │ │ │ ├── search.ts │ │ │ ├── settings │ │ │ │ ├── CardsLensSettings.ts │ │ │ │ ├── CreationRule.ts │ │ │ │ ├── FeedLensSettings.ts │ │ │ │ ├── ListLensSettings.ts │ │ │ │ ├── Setting.ts │ │ │ │ ├── Settings.test.ts │ │ │ │ ├── Settings.ts │ │ │ │ ├── Sorting.ts │ │ │ │ ├── TagSettings.ts │ │ │ │ └── ZoomSetting.ts │ │ │ ├── sorting.ts │ │ │ ├── stats.test.ts │ │ │ ├── stats.ts │ │ │ ├── stores │ │ │ │ ├── CachingStore.ts │ │ │ │ ├── EventList.ts │ │ │ │ ├── ForwardingStore.ts │ │ │ │ ├── ObjectStore.test.ts │ │ │ │ ├── ObjectStore.ts │ │ │ │ ├── Patchable.ts │ │ │ │ ├── PatchableList.test.ts │ │ │ │ ├── PatchableList.ts │ │ │ │ ├── PatchableMap.test.ts │ │ │ │ ├── PatchableMap.ts │ │ │ │ ├── PatchableStore.ts │ │ │ │ ├── ReadableStore.ts │ │ │ │ ├── SelfStore.ts │ │ │ │ ├── StoreUndoStack.test.ts │ │ │ │ ├── StoreUndoStack.ts │ │ │ │ ├── TranslatingPatcher.ts │ │ │ │ ├── ValidatingStore.ts │ │ │ │ ├── WritableStore.ts │ │ │ │ ├── index.ts │ │ │ │ └── subscribeUntil.ts │ │ │ ├── stringUtils.test.ts │ │ │ ├── stringUtils.ts │ │ │ ├── tangentMap │ │ │ │ ├── MapConnection.ts │ │ │ │ ├── MapNode.ts │ │ │ │ ├── MapNodeStore.ts │ │ │ │ ├── TangentMap.ts │ │ │ │ └── placeMapNodes.ts │ │ │ ├── trees │ │ │ │ ├── directory.test.ts │ │ │ │ ├── directory.ts │ │ │ │ ├── directoryStore.test.ts │ │ │ │ ├── directoryStore.ts │ │ │ │ ├── index.ts │ │ │ │ └── treeReferences.ts │ │ │ ├── typewriterUtils │ │ │ │ ├── LinesBuilder.ts │ │ │ │ ├── index.test.ts │ │ │ │ └── index.ts │ │ │ ├── urlData.ts │ │ │ ├── utils.test.ts │ │ │ ├── utils.ts │ │ │ └── workspaceState.ts │ │ ├── main │ │ │ ├── DataFile.ts │ │ │ ├── File.ts │ │ │ ├── Folder.ts │ │ │ ├── Tag.ts │ │ │ ├── WindowHandle.ts │ │ │ ├── Workspace.ts │ │ │ ├── WorkspaceTreeNode.ts │ │ │ ├── debugging.ts │ │ │ ├── documentation.ts │ │ │ ├── environment.ts │ │ │ ├── files.ts │ │ │ ├── grammarLoader.ts │ │ │ ├── index.ts │ │ │ ├── ioQueue.ts │ │ │ ├── logging.test.ts │ │ │ ├── logging.ts │ │ │ ├── menus.ts │ │ │ ├── messages │ │ │ │ ├── dictionary.ts │ │ │ │ ├── index.ts │ │ │ │ ├── queries.ts │ │ │ │ ├── themes.ts │ │ │ │ └── urlData.ts │ │ │ ├── migrations │ │ │ │ ├── viewStateMigrator.ts │ │ │ │ └── workspaceMigrator.ts │ │ │ ├── settings.ts │ │ │ ├── shutdown.ts │ │ │ ├── tests │ │ │ │ ├── workspace-indexing.integration-test.ts │ │ │ │ ├── workspace-io.integration-test.ts │ │ │ │ └── workspace-querying.integration-test.ts │ │ │ ├── tsconfig.json │ │ │ ├── updates.ts │ │ │ ├── webpack.config.js │ │ │ ├── windows.ts │ │ │ └── workspaces.ts │ │ └── preload │ │ │ ├── index.ts │ │ │ ├── tsconfig.json │ │ │ └── webpack.config.js │ ├── static │ │ ├── arrows.svg │ │ ├── bigarrow.svg │ │ ├── close.svg │ │ ├── favicon.png │ │ ├── file.svg │ │ ├── focus.svg │ │ ├── folder.svg │ │ ├── global.css │ │ ├── index.html │ │ ├── map.svg │ │ ├── mapNode.svg │ │ ├── math.css │ │ ├── opener.svg │ │ ├── plus.svg │ │ ├── query.svg │ │ ├── reset.svg │ │ ├── settings-hint.svg │ │ ├── sidebar.svg │ │ ├── sorting.svg │ │ ├── system.svg │ │ ├── t-checkbox.css │ │ ├── t-checkbox.svg │ │ ├── t-embed.css │ │ ├── tag.svg │ │ ├── tangent-icon-nocolor.svg │ │ ├── tangent-icon-small-full-circle.svg │ │ ├── tangent-icon-small.svg │ │ ├── tangent-icon.svg │ │ ├── tangent_256.png │ │ ├── themes │ │ │ ├── atom-one-dark.tangentcodetheme │ │ │ ├── atom-one-light.tangentcodetheme │ │ │ ├── duotone-dark.tangentcodetheme │ │ │ ├── duotone-earth.tangentcodetheme │ │ │ ├── duotone-forest.tangentcodetheme │ │ │ ├── duotone-light.tangentcodetheme │ │ │ ├── duotone-sea.tangentcodetheme │ │ │ ├── duotone-space.tangentcodetheme │ │ │ ├── gruvbox-dark.tangentcodetheme │ │ │ ├── gruvbox-light.tangentcodetheme │ │ │ ├── nord.tangentcodetheme │ │ │ ├── vscode-dark.tangentcodetheme │ │ │ ├── vscode-light.tangentcodetheme │ │ │ └── xonokai.tangentcodetheme │ │ ├── thread.svg │ │ ├── undo.svg │ │ ├── update.svg │ │ └── window.svg │ ├── svelte.config.js │ ├── tests-integration │ │ ├── TangentApp.ts │ │ ├── TangentWindow.ts │ │ ├── essential.test.ts │ │ ├── keyboard.ts │ │ ├── screenshots │ │ │ ├── blades-map.screenshot.ts │ │ │ ├── command-palette.screenshot.ts │ │ │ ├── focus-mode.screenshot.ts │ │ │ ├── markdown-syntax.screenshot.ts │ │ │ ├── queries.screenshot.ts │ │ │ ├── screenshots.ts │ │ │ ├── settings.screenshot.ts │ │ │ ├── thread.screenshot.ts │ │ │ ├── todo-tag.screenshot.ts │ │ │ └── wiki-links.screenshot.ts │ │ ├── tangent.ts │ │ ├── typing-performance.bench.ts │ │ └── wiklinks-and-sessions.test.ts │ ├── tsconfig.json │ ├── tsconfig.main.json │ ├── vitest.config.integration.mts │ ├── vitest.config.unit-core.mts │ ├── vitest.config.unit-web.mts │ ├── vitest.shared.mts │ └── vitest.workspace.mts └── tangent-test-workspace-generator │ ├── README.md │ ├── package.json │ ├── src │ └── index.ts │ └── tsconfig.json ├── package-lock.json ├── package.json ├── packages ├── tangent-html-to-markdown │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── jest.config.js │ ├── package.json │ ├── src │ │ └── index.ts │ ├── tests │ │ ├── compare-files.test.ts │ │ ├── google-docs-copy-test.html │ │ ├── google-docs-copy-test.md │ │ ├── google-sheets-copy-test.html │ │ ├── google-sheets-copy-test.md │ │ ├── raw-test.html │ │ ├── raw-test.md │ │ ├── textedit-copy-test.html │ │ └── textedit-copy-test.md │ ├── tsconfig.build.json │ └── tsconfig.json └── tangent-query-parser │ ├── LICENSE │ ├── README.md │ ├── jest.config.js │ ├── package.json │ ├── src │ ├── index.ts │ ├── parser.ts │ ├── tags.ts │ ├── types.ts │ └── utils.ts │ ├── syntaxes │ └── tangentquery.tmLanguage.json │ ├── tests │ ├── basic.test.ts │ ├── errors.test.ts │ ├── groups.test.ts │ ├── regex.test.ts │ ├── simple.test.tqr │ ├── subquery.test.tqr │ ├── subquery.test.ts │ ├── tags.test.tqr │ ├── tags.test.ts │ ├── test-loader.ts │ ├── todos.test.tqr │ └── todos.test.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── test-files ├── QueryTestWorkspace │ ├── .tangent │ │ └── workspace-settings.json │ ├── A Folder │ │ ├── .tangentfolder │ │ ├── A Subfolder │ │ │ └── Note in Subfolder.md │ │ ├── Note in A Folder 1.md │ │ ├── Note in A Folder 2.md │ │ └── Note in A Folder 3.md │ ├── A Multi Link Note.md │ ├── A Note to Link To.md │ ├── Another Folder │ │ ├── .tangentfolder │ │ ├── Note in Another Folder 1.md │ │ └── Note in Another Folder 2.md │ ├── Another Link Note.md │ ├── Another Note to Link To.md │ ├── Note With Links.md │ ├── Note With Tag.md │ ├── Note with Keyword.md │ ├── Notes Named Folder.tangentquery │ ├── Tags │ │ ├── .tangentfolder │ │ ├── Deep Child Tags.md │ │ ├── Note With Child A.md │ │ ├── Note With Child B.md │ │ └── Note With Parent.md │ └── Todos │ │ ├── .tangentfolder │ │ ├── Note With Canceled Todos.md │ │ ├── Note With Closed Todos.md │ │ ├── Note With Mixed Todos.md │ │ └── Note With Open Todos.md ├── ScreenshotWorkspace │ └── My Workspace │ │ ├── .tangent │ │ └── workspace-settings.json │ │ ├── Blades │ │ ├── .tangentfolder │ │ ├── Anat.md │ │ ├── Arvo Daltless.md │ │ ├── Bastion.md │ │ ├── Captain Elshvader.md │ │ ├── Kaisik Fogmoon.md │ │ ├── Laroze.md │ │ ├── Log │ │ │ ├── 2023 │ │ │ │ ├── .tangentfolder │ │ │ │ ├── 10-October │ │ │ │ │ ├── .tangentfolder │ │ │ │ │ └── 2023-10-22.md │ │ │ │ └── 11-November │ │ │ │ │ └── 2023-11-12.md │ │ │ └── .tangentfolder │ │ ├── Naria Helles.md │ │ └── The Sunken.md │ │ ├── Derrick Marshal.md │ │ ├── Expressing Thoughts is Difficult.md │ │ ├── Language is Serialized Data.md │ │ ├── Log │ │ ├── 2023 │ │ │ ├── 02-February │ │ │ │ ├── .tangentfolder │ │ │ │ └── 2023-02-05.md │ │ │ ├── 05-May │ │ │ │ ├── .tangentfolder │ │ │ │ ├── 2023-05-17.md │ │ │ │ └── 2023-05-19.md │ │ │ ├── 06-June │ │ │ │ ├── .tangentfolder │ │ │ │ └── 2023-06-14.md │ │ │ ├── 08-August │ │ │ │ ├── .tangentfolder │ │ │ │ └── 2023-08-16.md │ │ │ └── 11-November │ │ │ │ ├── 2023-11-10.md │ │ │ │ ├── 2023-11-12.md │ │ │ │ ├── 2023-11-13.md │ │ │ │ ├── 2023-11-15.md │ │ │ │ ├── 2023-11-18.md │ │ │ │ └── 2023-11-20.md │ │ └── .tangentfolder │ │ ├── Manuscript │ │ ├── .tangentfolder │ │ └── The Delivery.md │ │ ├── Project Zebra.md │ │ ├── Some Thoughts.md │ │ ├── Speak in TCP, Not UDP.md │ │ ├── Status.tangentquery │ │ ├── Stories │ │ ├── .tangentfolder │ │ ├── Add User Feedback Portal.md │ │ ├── Create Receipt Scanner.md │ │ ├── Improve Ideation Capture.md │ │ ├── Logging Time for a Ticket.md │ │ ├── Project Status Overview.md │ │ ├── Sprint Planner.md │ │ └── Ticket Update Tracking.md │ │ ├── Threads Record the Context of Thought.md │ │ └── Writing is Crystalization.md └── TestWorkspace │ ├── .hiddenfolder │ └── fileinhiddenfolder.md │ ├── .tangent │ ├── styles │ │ ├── test.css │ │ └── test2.css │ ├── tags │ │ ├── SomeTagWithCapitals.taginfo │ │ ├── Soon™.taginfo │ │ ├── front-matter-tag.taginfo │ │ ├── tag.taginfo │ │ ├── tags.taginfo │ │ ├── tags.with-seperators.taginfo │ │ ├── tags.with-things.taginfo │ │ ├── ❄️.taginfo │ │ └── ❤️.taginfo │ └── workspace-settings.json │ ├── A Folder │ ├── .tangentfolder │ ├── A File In a Folder.md │ ├── Same Name.md │ └── Subfolder │ │ ├── .tangentfolder │ │ ├── A File In a Folder.md │ │ ├── Same Name.md │ │ └── Subfile.md │ ├── An MDX file.mdx │ ├── Attachments │ ├── .tangentfolder │ ├── Pasted on 2021-11-01 at 14.58.47.png │ └── Pasted on 2021-11-01 at 16.39.06.png │ ├── I want mindmaps.md │ ├── Inbox │ └── .tangentfolder │ ├── Integration Tests │ ├── .tangentfolder │ ├── A Note Name.md │ ├── A Note Name │ │ ├── .tangentfolder │ │ ├── Ambiguous.md │ │ └── Content.md │ ├── A folder with emoji 😊 │ │ └── A file with emoji 👌.md │ ├── A very long folder name that is a pain in the butt │ │ ├── .tangentfolder │ │ └── Some long name for a file–very long.md │ ├── External & Local Links.md │ ├── Indent Everything │ │ ├── .tangentfolder │ │ ├── Indented Blockquotes.md │ │ ├── Indented Code.md │ │ ├── Indented HR.md │ │ ├── Indented Headers.md │ │ └── Indented Math.md │ ├── Line Swapping.md │ ├── Link Interspersing.md │ ├── Link Preview.md │ ├── Link to Rich Text.md │ ├── Link to notes with periods.md │ ├── Note With Aliases.md │ ├── Note With Image Links.md │ ├── Note With Link To A.md │ ├── Note With Link To B.md │ ├── Note With Links With Bad Characters.md │ ├── Note.with.periods.md │ ├── Noté With Dîacritics.md │ ├── RTL Languages │ │ ├── .tangentfolder │ │ ├── RTL 1.md │ │ ├── RTL 2.md │ │ ├── RTL 3.md │ │ └── RTL Languages.md │ ├── Rich Text.rtf │ ├── Tests for Sentence Focus.md │ ├── Thing Name │ │ ├── .tangentfolder │ │ ├── Ambiguous.md │ │ └── Thing Name.md │ ├── Virtual Link Shenanigans.md │ └── Youtube Preview.md │ ├── Link Tests │ ├── .tangentfolder │ ├── Item 10b.md │ ├── Item 1a1.md │ ├── Item 1a10.md │ ├── Item 1a2.md │ ├── Item 9a.md │ ├── Markdown Links to Local Markdown Files.md │ ├── Misc References.md │ ├── Nexus.md │ ├── Reference 1.md │ ├── Reference 10 is actually a very long title that just keeps going and going for way too long.md │ ├── Reference 11.md │ ├── Reference 12.md │ ├── Reference 2.md │ ├── Reference 3.md │ ├── Reference 4.md │ ├── Reference 5.md │ ├── Reference 6.md │ ├── Reference 7.md │ ├── Reference 8.md │ ├── Reference 9.md │ ├── Referencing NotATag.md │ └── Referencing OtherTag.md │ ├── Log │ ├── .tangentfolder │ ├── 2021-06-21.md │ ├── 2021-06-22.md │ ├── 2021-06-23.md │ ├── 2022-01-30.md │ ├── 2022-02-02.md │ ├── 2022-02-04.md │ ├── 2022-02-15.md │ ├── 2022-10-03.md │ ├── 2022-10-04.md │ └── Subfolder │ │ ├── .tangentfolder │ │ └── 2023-08-23.md │ ├── Markdown Compatibility │ ├── .tangentfolder │ ├── Blockquotes.md │ ├── Code.md │ ├── Comments.md │ ├── Empty Front Matter.md │ ├── External Links.md │ ├── Front Matter.md │ ├── HTML.md │ ├── Headers.md │ ├── Highlights.md │ ├── Horizontal Rule.md │ ├── Images.md │ ├── Inline Code.md │ ├── Inline Formatting.md │ ├── Lists.md │ ├── Math Notation.md │ ├── More Tags.md │ ├── Strikethrough.md │ └── Tags.md │ ├── Obsidian Compatibility │ ├── .tangentfolder │ ├── Header Link Source.md │ ├── Header Links.md │ ├── Math Rendering.md │ └── Wiki Links.md │ ├── Query of Test.tangentquery │ ├── Same Name.md │ ├── Something Cool.md │ ├── Test File The Second.md │ ├── Test Image.jpg │ └── TestFile.md └── vitest.workspace.ts /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *.env 3 | 4 | /packages/**/lib/ 5 | 6 | **/.tangent/**/*.workspace 7 | **/.tangent/tangents/ 8 | **/.tangent/Temp/ 9 | **/.tangent/Generated/ 10 | .obsidian -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/typewriter"] 2 | path = lib/typewriter 3 | url = https://github.com/taylorhadden/typewriter.git 4 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Debug Tangent Electron Main", 6 | "type": "node", 7 | "request": "launch", 8 | "cwd": "${workspaceFolder}/apps/tangent-electron", 9 | "preLaunchTask": { 10 | "type": "npm", 11 | "script": "build:dev", 12 | "path": "apps/tangent-electron" 13 | }, 14 | "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", 15 | "windows": { 16 | "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" 17 | }, 18 | "args": ["."], 19 | "outputCapture": "std" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /Documentation/.tangent/workspace-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "creationRules": [ 4 | { 5 | "name": "📥 Inbox Note", 6 | "nameTemplate": "%name%", 7 | "folder": "Inbox", 8 | "description": "Creates a new note for quickly capturing thoughts that are not yet completely formed." 9 | }, 10 | { 11 | "name": "📆 Daily Note", 12 | "nameTemplate": "%YYYY%-%MM%-%DD%", 13 | "folder": "Log", 14 | "mode": "createOrOpen", 15 | "description": "Creates or opens a timestamped note for the current day for journaling and quickly jotting down quick thoughts." 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /Documentation/Attachments/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /Documentation/Attachments/Focus Mode Buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/Documentation/Attachments/Focus Mode Buttons.png -------------------------------------------------------------------------------- /Documentation/Attachments/Lens Settings Hint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/Documentation/Attachments/Lens Settings Hint.png -------------------------------------------------------------------------------- /Documentation/Attachments/Lense Selection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/Documentation/Attachments/Lense Selection.png -------------------------------------------------------------------------------- /Documentation/Attachments/Map View Button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/Documentation/Attachments/Map View Button.png -------------------------------------------------------------------------------- /Documentation/Attachments/Query Example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/Documentation/Attachments/Query Example.png -------------------------------------------------------------------------------- /Documentation/Attachments/System Menu Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/Documentation/Attachments/System Menu Icon.png -------------------------------------------------------------------------------- /Documentation/Attachments/Thread View Button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/Documentation/Attachments/Thread View Button.png -------------------------------------------------------------------------------- /Documentation/Attachments/Wiki Link Autocomplete Example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/Documentation/Attachments/Wiki Link Autocomplete Example.png -------------------------------------------------------------------------------- /Documentation/Calling Home.md: -------------------------------------------------------------------------------- 1 | Tangent is a locally focused application. However, it does access the internet for a couple of purposes: 2 | 3 | * **Checking for Updates** – Tangent calls into an Amazon S3 instance to check for updates when it starts up. 4 | * **Crash Reporting** (Optional) – When enabled and if Tangent crashes, Tangent will upload crash dumps to [BugSplat](https://BugSplat.com). The information found in the crashes will only be used to fix errors. Crash dumps are automatically purged after three months. -------------------------------------------------------------------------------- /Documentation/Changelog/.tangentfolder: -------------------------------------------------------------------------------- 1 | { 2 | "displayMode": "Feed", 3 | "feed": { 4 | "sorting": { 5 | "sortKey": "modified" 6 | }, 7 | "startAt": "end" 8 | } 9 | } -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.0-alpha.10.md: -------------------------------------------------------------------------------- 1 | This update adds date & time information to the map. 2 | + Map Nodes & Connections track when they are added to the map. 3 | + Dates & times of root nodes are automatically displayed. 4 | + Dates & times of connections and child nodes are shown when hovering over them. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.0-alpha.5.md: -------------------------------------------------------------------------------- 1 | + __Added support for editing and creating [[Creation Rules]] for notes.__ 2 | * Creation Rules let you create quick actions for making new notes with templated names in specific locations. 3 | * Rules show up in the "New Note" button and in the [[Command Palette]]. 4 | * Tangent ships with "Inbox Note" and "Daily Note" rules by default, mirroring previous functionality. 5 | + Exposed tooltips for commands in the [[Command Palette]]. 6 | - Fixed an issue where new files might not be added to the internal file mapping. 7 | - Fixed an issue where cancelling setting the "Attachments" folder caused the value to be reset. 8 | - Fixed an issue where threads with duplicate files could break the UI. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.0-alpha.6.md: -------------------------------------------------------------------------------- 1 | + Added new File, Edit, View, etc menu to non-Mac platforms 2 | * Small Tangent icon in the upper left 3 | * Exposes some commands previously invisible on these platforms: 4 | * Opening a workspace 5 | * Toggling wiki & markdown links 6 | * Opening the command palette 7 | + Added shortcut display to items in the [[Command Palette]] with shortcuts. 8 | + Added spellcheck options to the [[Notes]] options. 9 | * Enabling/Disabling spellcheck 10 | * Adding additional language dictionaries for spellcheck – not available on Mac 11 | * Moved the "Notes" section of the [[Appearance]] menu to an "Appearance" section in [[Notes]] options. 12 | - Fixed an issue on Windows where context menus had trailing, leading, or adjacent menu separators. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.0-alpha.7.md: -------------------------------------------------------------------------------- 1 | A minor update in preparation for larger changes. 2 | 3 | User facing changes: 4 | - Fixes display issues in the link autocomplete and file opening menus. 5 | + Adds file or folder icons to the aforementioned menus. 6 | - Fixes an issue where the command palette's actions were not refreshed properly. 7 | - Fixes an issue where hitting enter with the cursor within line formatting caused duplicate formatting characters to be placed. 8 | * Updated the syntax revealing system to only reveal syntax for the current note. 9 | * Updated the initialization of selection when opening new notes to prefer paragraphs over headers and front matter. 10 | * Darkened the background color for code blocks in dark mode. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.0-beta.1.md: -------------------------------------------------------------------------------- 1 | + Improves initialization performance of large, heavily interlinked workspaces by up to 19 times. 2 | + Drag-selecting text now pauses selection reveal, stopping a "reveal flickering issue" that could occur. 3 | + Adds a link to my Patreon page. Please consider supporting! 4 | - Fixed an issue where regex characters were not handled correctly in search. 5 | - Fixed some issues with the display of menu items in Windows & Linux. 6 | - Fixed an issue in the Windows & Linux menus where the Zoom In option was shown twice. 7 | - Fixed an issue where clicking caused the page to scroll to your selection in File Focus mode. 8 | - Fixed an issue where thread file controls were still usable when invisible. 9 | - Fixed an issue with the Pop-Up buttons having a gap space. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.0-beta.2.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue that caused workspaces with just a single note to freeze when trying to open that single note. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.0-beta.3.md: -------------------------------------------------------------------------------- 1 | + Significantly improves initial render speed of exceptionally long lists, including: 2 | + Displaying very long file trees 3 | + Displaying large numbers of backlinks 4 | + Displaying large numbers of search results 5 | + Displaying large numbers of cards in the Cards Lens of a folder -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.0-beta.5.md: -------------------------------------------------------------------------------- 1 | + Added "Remove All But This Thread" context option to the map. 2 | - Fixed a regression where clicking on cards did not open the corresponding file. 3 | - Fixed a regression where navigating to an empty wiki link before it was fully indexed didn't create a new file. 4 | - Fixed a bug that broke the sorting of root map nodes when removing & undoing them. 5 | - Fixed several outstanding bugs related to handling & reacting to list glyph changes. 6 | * Added a number of logs to the workspace initialization process to help better diagnose potential issues. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.0-beta.7.md: -------------------------------------------------------------------------------- 1 | - Fixed a regression where changing the sorting options of the sidebar did not actually change the sort order of the files in the sidebar. 2 | - Fixes an issue on linux where windows are missing an icon (in theory). -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.1.md: -------------------------------------------------------------------------------- 1 | + Added `Cmd/Ctrl+` shortcuts for setting lines to different header levels. 2 | + Added `Cmd/Ctrl+0` shortcut for resetting a line back to being a paragraph. 3 | + Added `Cmd/Ctrl+Shift+Equals` shortcut to toggle ==highlighting== syntax. 4 | - Fixed an issue where markdown links to local images outside of the workspace didn't work. 5 | - Fixed an issue where the "Create New" button in the [[Feed Lens]] could sometimes appear behind text. 6 | - Fixed an issue where dates could be squished in the Open File dialog. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.2-beta.1.md: -------------------------------------------------------------------------------- 1 | + Refactored how keyboard shortcuts are handled. 2 | - Fixed an issue where the zoom in/out shortcuts on windows didn't work. 3 | - Changed "Reset Zoom" to `Cmd/Ctrl+Shift+0` to avoid collision with the paragraph shortcut. 4 | - Changed "Zoom In" / "Zoom Out" to `Cmd/Ctrl+Shift+Plus` and `Cmd/Ctrl+Shift+Minus` respectively. 5 | - Changed "Toggle Highlight" to `Cmd/Ctrl+Equals` -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.2.md: -------------------------------------------------------------------------------- 1 | New in this version: 2 | - Fixed an issue where you couldn't write in virtual notes from "links to nowhere" 3 | 4 | From v0.3.2-beta.1: 5 | + Refactored how keyboard shortcuts are handled. 6 | - Fixed an issue where the zoom in/out shortcuts on windows didn't work. 7 | - Changed "Reset Zoom" to `Cmd/Ctrl+Shift+0` to avoid collision with the paragraph shortcut. 8 | - Changed "Zoom In" / "Zoom Out" to `Cmd/Ctrl+Shift+Plus` and `Cmd/Ctrl+Shift+Minus` respectively. 9 | - Changed "Toggle Highlight" to `Cmd/Ctrl+Equals` -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.3-beta.1.md: -------------------------------------------------------------------------------- 1 | + Updates to typewriter v0.7.11 2 | + Added support for opening links within the same panel with `Cmd/Ctrl+Shift+Click` 3 | + Added support for opening local files and folders that are not part of the workspace via markdown links. 4 | - Fixed an issue where pasting an image copied from a browser (and thus containing both text and image data) could cause both a markdown image using the image's url and a wiki link to the pasted embedded image. Tangent now just uses the embedded image. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.3-beta.2.md: -------------------------------------------------------------------------------- 1 | + Adds preliminary support for opening files and directories in Tangent via command line and drag & drop onto the application. 2 | - Fixed an issue where opening documentation didn't open the correct documentation page. 3 | - Fixed a bug where missing workspace data could cause unexpected behavior. 4 | - Fixed a regression where the the note font selection option wasn't working correctly. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.3-beta.3.md: -------------------------------------------------------------------------------- 1 | + Added support for encoded URI links in local markdown links. 2 | - Fixed a critical issue that broke windows builds. 3 | - Fixed an issue with relative arguments from the command line. 4 | - Fixed an issue where toggling inline formatting could affect formatting on the next line. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.3-beta.4.md: -------------------------------------------------------------------------------- 1 | - Fixed a bug where clicking on backlinks resulted in new files being named incorrectly. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.3-beta.5.md: -------------------------------------------------------------------------------- 1 | + Added support for displaying change logs from any workspace. New changes will be (optionally) displayed when launching a new version for the first time. 2 | + Added the option to set the font for code. 3 | + Added the [[Notes#Smart Paragraph Breaks]] editing option. When enabled, pressing Enter while in a paragraph will insert an extra blank line. Deleting will automatically remove that blank line. 4 | - Removed the Windows & Linux menu replacement in MacOS. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.3-beta.6.md: -------------------------------------------------------------------------------- 1 | + Added support for moving files and folders by dragging and dropping them in the sidebar. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.4-beta.1.md: -------------------------------------------------------------------------------- 1 | + Open-sourced the code used in the conversion of html to markdown on paste. Can be found in the [tangent-public repository](https://github.com/suchnsuch/tangent-public). 2 | + Improved italic, bold, and line spacing support when copy/pasting from google docs. 3 | - Fixed an issue where some copy/paste operations would insert css styling text. 4 | - Fixed an issue where the [[Feed Lens]] would not consistently auto-load notes when "Start At" was set to "Beginning". -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.4-beta.2.md: -------------------------------------------------------------------------------- 1 | + Improved handling of tables when pasting from Google Sheets. 2 | - Fixed a potential crash that could occur when initializing a workspace. Cleaned up logs and added user messaging on this problem. 3 | - Fixed an issue where cards in the card view did not always load in while scrolling. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.4-beta.3.md: -------------------------------------------------------------------------------- 1 | - Fixes an issue where documentation wasn't allowed to fully update before changelogs were queried. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.3.4-beta.4.md: -------------------------------------------------------------------------------- 1 | - Fixed several issues relating to how Tangent's editor interacts with IMEs: 2 | * Windows 10's emoji selector should no longer produce duplicate characters. 3 | * Dictation on Mac should work correctly. 4 | * Other IMEs should function correctly. 5 | - Fixed an issue where deleting an emoji or other compound unicode character was not handled correctly. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-alpha.1.md: -------------------------------------------------------------------------------- 1 | + Introduces [[Queries]] with the new [[Query Syntax]]. 2 | * Open a new Query Pane with `Cmd/Ctrl+Shift+F`, 3 | * The results of queries can be visualized as cards or as a feed. 4 | * The UX surrounding this experience is very much "minimum viable product" and will be dramatically changed in subsequent alpha releases. 5 | * Changes the [[Feed Lens]] to default to the start of the list rather than the end. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-alpha.10.md: -------------------------------------------------------------------------------- 1 | + Added support for renaming & saving queries into the workspace. 2 | + Saved queries can be searched for and linked to with wiki links. 3 | + Queries can be directed to sort above normal notes in the sidebar. 4 | + Added icons to the sidebar, with new icons for notes, images, and queries. 5 | + Added an indicator to collapsed folders that contain selected files. 6 | + Added the name of the workspace to the top of the sidebar. Right click to open in your file browser. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-alpha.2.md: -------------------------------------------------------------------------------- 1 | - Fixes a critical issue where files required for supporting queries were not packaged with the production app. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-alpha.3.md: -------------------------------------------------------------------------------- 1 | * Includes the fixes for IME issues from [[v0.3.4-beta.4]]. 2 | + Added basic syntax highlighting to the query field. 3 | + Added support for autocompleting wiki link references within queries. 4 | + Added support for showing folders inside of the [[Feed Lens]]. 5 | + Added support for showing folders inside of the [[Cards Lens]]. 6 | - Query Fixes: 7 | - Fixed an issue when querying folders with `with [[Folder]]`. 8 | - Fixed an issue where folders wouldn't show up as results on their own. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-alpha.4.md: -------------------------------------------------------------------------------- 1 | + Added highlights that show the text a query found when using `with` in a query. 2 | + Removed spellcheck within wiki links and the query editor. 3 | + Added support for locking note headers to the top of the pane. 4 | - Fixed some issues when scrolling to center something in the pane. 5 | - Fixed a regression that caused clicking on a link in the [[Feed Lens]] to insert an extra pane of the note that was clicked on in the feed. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-alpha.5.md: -------------------------------------------------------------------------------- 1 | + Added support for [[Query Syntax#Subqueries]]. 2 | + Added the ability to sort the [[Cards Lens]]. 3 | + Made clicking below the last note in the [[Feed Lens]] select the last character in the last note in the feed. 4 | - Fixed an issue where the [[Feed Lens]] didn't correctly restore scroll position. 5 | - Fixed an issue where opening a new note in the context of a Feed Lens with [[Creation Rules]] didn't place the cursor correctly. 6 | - Fixed an issue where scrolling up in the [[Feed Lens]] wouldn't correctly handle large notes being loaded in. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-alpha.6.md: -------------------------------------------------------------------------------- 1 | + Improved sentence highlighting with significantly better end-of-sentence detection. Now other punctuation (!, ?), and dot.notation work as expected. 2 | + Added autocomplete help to the Query editor. 3 | + Added the ability to create a new file from the `Ctrl/Cmd+O` file search menu. 4 | + Added a "copy url" action to external links. 5 | + Made the middle mouse button open links, mirroring Ctrl/Cmd + left mouse button. 6 | + Added experimental RTL language support. I do not use and cannot read RTL languages, so feedback is very much necessary! 7 | - Fixed a regression where the tops of cards were not rounded correctly. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-alpha.7.md: -------------------------------------------------------------------------------- 1 | + Added support for directing the system to natively open workspace files Tangent cannot represent. 2 | - Fixed a regression where `Cmd/Ctrl+Enter` didn't open wiki links. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-alpha.8.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where pasting text with newlines into titles broke saving for that file. 2 | - Fixed an issue where pasting styled text into titles caused title to contain styled text. 3 | -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-alpha.9.md: -------------------------------------------------------------------------------- 1 | - Fixed a regression where card titles were not rendered. 2 | -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-beta.1.md: -------------------------------------------------------------------------------- 1 | * Tweaked sorting for note search results so that notes with many more incoming links are prioritized above notes with fewer incoming links. Notes that have roughly the same amount of links (on a logarithmic scale) are sorted by date modified as normal. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-beta.2.md: -------------------------------------------------------------------------------- 1 | + Added support for restoring workspace windows to their last opened location. 2 | - Fixed several selection and cursor movement issues related to embedded images. 3 | - Fixed an issue with resuming selection when swapping between Thread and Map view. 4 | * Tweaked sorting again. Steps are no longer discrete and intra-item comparison should be smoother. 5 | * Updated social links to include Mastodon. 6 | -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-beta.3.md: -------------------------------------------------------------------------------- 1 | + Added the option to open links to the left of the current pane with `Cmd/Ctrl+Alt+Click` or `Cmd/Ctrl+Alt+Enter`. 2 | + Markdown links inferred to point to files outside of the workspace now show up as "untracked" purple links. 3 | + Added alert messages when trying to follow an untracked link fails. 4 | + Added a setting that opens the [[Map View]] when the last item in a Thread is closed. This is enabled by default. 5 | + Added a setting that shows the word count of notes in the [[Cards Lens]]. This is on by default. 6 | - Fixed an issue where toggling bold/italic/etc at the end of a word with a collapsed selection placed the cursor inside of the resulting formatting characters rather than outside. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.0-beta.5.md: -------------------------------------------------------------------------------- 1 | + Adds support for weekday and month replacement tokens in [[Creation Rules]]. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.4.1.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where renaming a note just by changing the case (e.g. `My Note.md --> my note.md`) would cause duplicate entries to be created. 2 | - Fixed an issue where renaming a note did not update link information for its outgoing links, leaving behind ghost incoming links from the old path. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-alpha.1.md: -------------------------------------------------------------------------------- 1 | + Added support for [[Tags]] & [[Todos]]! 2 | * Supports #tags & #nested/tags 3 | * [ ] Create checkboxes 4 | * [x] And check them off! 5 | * Full Query support for both! 6 | -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-alpha.2.md: -------------------------------------------------------------------------------- 1 | + Added autocomplete support for #Tags 2 | + Added 🟥Color🟥 🟣Highlights🟣 using colored square & circle emoji as highlighting characters. 3 | + Added support for // double slash [[Comments]] -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-alpha.3.md: -------------------------------------------------------------------------------- 1 | + Added partial indexing of tags in [[Front Matter]] (though not yet in queries). 2 | + Made tags case-insensitive. 3 | + Added a shortcut for toggling line comments with `Cmd/Ctrl+/`. 4 | - Fixed an issue that was raising errors with blank indented lines. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-alpha.4.md: -------------------------------------------------------------------------------- 1 | + Refactored tag storage, search, and note title search. You can now fuzzy search by the full path of your note or tag. 2 | - Fixed an issue with emoji and tags where emoji caused tags to not terminate correctly, requiring multiple spaces. 3 | - Fixed an issue where inserting emoji that relied on the zero-width-joiner character did not work correctly, splitting the emoji into their component parts. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-alpha.5.md: -------------------------------------------------------------------------------- 1 | + Improved file search to include non-`.md` files. 2 | - Fixed a regression where the `---`/`***`/`__` section break formatting no longer worked. 3 | - Fixed a regression where `.md` filetypes were showing up in search. 4 | - Fixed an indexing error that caused metadata mismatches. 5 | - Theoretically fixed an issue where Tangent could be restored to an inaccessible window location. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-alpha.6.md: -------------------------------------------------------------------------------- 1 | + Added a simple tag tree view that displays the tags in your workspace and lets you view the notes connected to those tags. 2 | + Changed the trigger requirements of tag autocomplete so that autocomplete does not start until the first character after `#` has been pressed. This prevents awkward interactions when writing headers. 3 | + Added a "Command/Control+\\" shortcut while in tag autocomplete that prepends a backslash before the `#`, disabling the tag. Useful for when you want to refer to "item \#4", for example. 4 | - Fixed an issue where checkboxes were vertically centered on their line when the line wrapped. Checkboxes are now correctly aligned to the top of their line. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-alpha.7.md: -------------------------------------------------------------------------------- 1 | - Fixed a critical bug in alpha 6 that prevented workspaces from being opened. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-alpha.8.md: -------------------------------------------------------------------------------- 1 | + Added full indexing & querying of [[Formatting/Tags#Tags In Front Matter|Front Matter Tags]]. 2 | + Added autocomplete support for tags in the query editor. 3 | + Added support for copying an entire line when no text is selected. 4 | * Made the cursor color never change, regardless of color the text is. 5 | * Improved search sort tuning, hopefully promoting what you expect to find above others. 6 | - Fixed a regression where `Alt+Up` from the bottom line did not work. 7 | - Fixed an issue where clicking on some autocomplete menu items in the query editor did not select those items. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-beta.2.md: -------------------------------------------------------------------------------- 1 | * Added exploratory error handling & logging for queries in order to better diagnose issues with tag queries and queries in general. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-beta.3.md: -------------------------------------------------------------------------------- 1 | * More error handling improvements for diagnosing query issues. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-beta.4.md: -------------------------------------------------------------------------------- 1 | + Added support for searching for tags from the [[Command Palette]]. 2 | - Fixed an issue where resolving front matter tags could fail. 3 | - Fixed an issue with regex building for search. 4 | - Fixed an issue in the logging system that could cause exceptions when trying to log a message. 5 | - Fixed an issue where wiki link autocomplete would use full paths when not strictly necessary. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.0-beta.5.md: -------------------------------------------------------------------------------- 1 | + Added a tag-exclusive search mode to the [[Command Palette]] by prefixing your tag searches with `#`. 2 | + Added additional context labels for when a query no longer matches the displayed results or when the query is running. 3 | + Added simple performance logging for queries. Improved query error/warning logs with more context. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.1.md: -------------------------------------------------------------------------------- 1 | * Updated logging to better handle file saving issues & report those issues to the user. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.2.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue that caused scary (but benign) file save error messages to be presented to the user when Tangent tried to save a file with identical contents to what was currently on disk. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.3-beta.1.md: -------------------------------------------------------------------------------- 1 | - Updated the windows icon to (hopefully) have better quality and no broken white square border at 48x48. 2 | - Fixed an issue where links to files that don't exist in folders didn't create virtual files. 3 | * Added additional messaging around file manipulation errors. 4 | -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.3-beta.2.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue that caused clicking on folders or opening a workspace with open folders failed to work. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.3-beta.3.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where workspaces in network drives mapped to drive letters could cause constant, critical failures. 2 | - Fixed an issue where options for todos weren't autocompleting in the query editor. 3 | - Fixed an issue where toggling a [[Comments|line comment]] was placing the `//` characters at the beginning of the line rather than after any indentation. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.3-beta.4.md: -------------------------------------------------------------------------------- 1 | + Added a testing setting that disables virtual file creation to aid in debugging efforts. 2 | - Fixed an issue that caused problems when working with workspaces that were inside other active workspaces. 3 | - Fixed an issue with index case sensitivity initialization. 4 | - Fixed an issue where workspaces weren't completely shut down when the windows accessing them were closed. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.3-beta.5.md: -------------------------------------------------------------------------------- 1 | * Tweaks logging of disabled virtual files to reduce log spam. 2 | - Fixes a regression from beta.4 that broke the visualization of the current settings tab. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.3-beta.6.md: -------------------------------------------------------------------------------- 1 | - Fixed a major bug with how raw links were being parsed that could result in extra text being created on save. 2 | - Blocked external urls in wiki links from having virtual files created for them. 3 | - Added user-facing error messages when clicking on an external link failed to go anywhere. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.3-beta.7.md: -------------------------------------------------------------------------------- 1 | + Added support for uploading crash dumps to BugSplat should Tangent crash. Uploads are _disabled_ by default. Crash uploads can be enabled in the [[Debug]] settings. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.4.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue with RTL languages did not work correctly in the feed lens. 2 | - Fixed an issue where typing ## could open the tag autocomplete system. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.5-beta.1.md: -------------------------------------------------------------------------------- 1 | * Normalized how note creation handles paths, allowing [[Creation Rules]] to define folders in their name template. 2 | * e.g. a name template of `%YYYY%/%Month%/%name%` would place your named note in folders matching the year and the month. 3 | - Fixed an issue that caused invoking the "Open Changelog" command from the Command Palette to not actually show the changelog. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.5.md: -------------------------------------------------------------------------------- 1 | New from the v0.5.5 beta: 2 | * Normalized how note creation handles paths, allowing [[Creation Rules]] to define folders in their name template. 3 | * e.g. a name template of `%YYYY%/%Month%/%name%` would place your named note in folders matching the year and the month. 4 | - Fixed an issue that caused invoking the "Open Changelog" command from the Command Palette to not actually show the changelog. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.5.6.md: -------------------------------------------------------------------------------- 1 | + Added support for ordinal dates in [[Creation Rules]] with the `%DDo%` and `%Do%` template tokens. Now your notes can be on the "1st"! 2 | - Fixed a bug where [[Creation Rules]] could with the workspace as its parent context, creating navigation issues. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-alpha.10.md: -------------------------------------------------------------------------------- 1 | + Added differentiation between `*` and `-` list items, giving the former more margin around itself than a standard line of text. 2 | + Restored the ability to pan the [[Map View]] by dragging on the background. 3 | - Fixed an issue where dragging between map nodes to create threads was not correctly adjusting the current node. 4 | - Fixed some issues with undo/redo of map changes, making them more reliable. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-alpha.11.md: -------------------------------------------------------------------------------- 1 | + Added support for visualizing previous threads on the [[Map View]]. 2 | + Updated to Electron 25.8.1. 3 | - Fixed an issue with empty links in the connection list for a map node. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-alpha.13.md: -------------------------------------------------------------------------------- 1 | + Improved file search ordering to allow files within folders to not be completely buried. 2 | - Fixed an issue on Mac where the "Show Incoming Links" menu item did not work. 3 | - Fixed an issue where clicking on an autocomplete item in the middle of the document dropped cursor selection to the end of the document and did not autocomplete. 4 | - Fixed an issue with "Show All Child Map Nodes" that could cause bad state if there was no session data. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-alpha.14.md: -------------------------------------------------------------------------------- 1 | + Sessions now track the previous session, allowing you to restore sessions that were previously archived (but only for new sessions). 2 | + Improved the appearance of the buttons between sessions and added more visual affordances for their actions. 3 | + Updated the auto-updater. Will it fix the auto-update bug on windows since alpha 11? Who knows! 🤞 4 | - Fixed an issue where attempts to write to the log on exit could cause a crash. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-alpha.2.md: -------------------------------------------------------------------------------- 1 | + Restored undo/redo functionality in the [[Map View]]. 2 | + Added a "Paste Without Formatting" option, bound to `Cmd/Ctrl+Shift+V` that pastes plaintext regardless of whatever HTML may be in the clipboard. 3 | + Added a `Cmd/Ctrl+\` shortcut for toggling inline code styling. 4 | + Added a setting to control the size of the hotspot for revealing the sidebar. Increased the default hotspot size to 12 pixels. 5 | * Tweaked the display of file lines in the open file palette. 6 | - Fixed a regression where adding and removing links in a note was not updating the map. 7 | - Fixed a freeze that could occur on the command palette caused by the new tooltip display. 8 | - Fixed an issue where code blocks could appear above the note details drawer. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-alpha.5.md: -------------------------------------------------------------------------------- 1 | - Fixed a critical regression where creating folders could error out. 2 | - Fixed a regression where map node generation could error out. 3 | - Fixed an issue where Session files could enter a never-ending change loop. 4 | - Fixed a regression where adding notes to a [[Feed Lens]] would place that new note to the right of the feed in the thread instead of just creating it at the bottom of the feed. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-alpha.7.md: -------------------------------------------------------------------------------- 1 | + Added the ability for code blocks to expand beyond the normal width of a note. 2 | - Fixed an issue with migrating v0.5.x workspaces to v0.6.x. 3 | - Fixed an issue where feed connections didn't mark children-of-children as connected. 4 | - Fixed an issue where whitespace around code block language specifiers broke syntax highlighting. 5 | - Fixed an issue where the settings menu could get stuck on the "Updates" section. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-alpha.8.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where creating a link to a note that does not yet exist could cause errors. Most egregiously, this could remove the current note from the feed view it was active in. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-alpha.9.md: -------------------------------------------------------------------------------- 1 | - Fixed a critical regression where moving a note with the "Move File" command completely failed to function correctly. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.10.md: -------------------------------------------------------------------------------- 1 | - Fixed a freezing issue that could occur if a note's rename was rejected. 2 | - Fixed an issue that prevented notes from being renamed with trailing periods. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.11.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where editing long file names in the sidebar could overflow out of the sidebar. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.12.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where the middle mouse button on windows did not correctly open links when the note could scroll. 2 | - Removed the "directional" link cursor option from non-Mac platforms as Windows does not correctly render the "east" and "west" pointers. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.13.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where session maps did not correctly swap out nodes & connections when a virtual note was removed due to another note being renamed into its place. 2 | - Fixed an issue where virtual notes were not being correctly communicated between the backend & front end. 3 | - Fixed a bug where renaming a note to the same name as a folder-scoped virtual link would incorrectly stomp & redirect the virtual note and its connections. 4 | - e.g. having `[[My Folder/My Note]]` somewhere and renaming a note to "My Note". 5 | - Fixed a bug where moving a note in a folder over a virtual note updated notes linking to the moved note to use the folder path when that was not necessary. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.14.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where deleting a folder could have various members of that folder or the folder itself retained to the map. 2 | - Fixed a number of issues with the behavior of deleting and responding to deleted files, especially with regards to files that should convert to virtual. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.2.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where tag parsing included punctuation characters. 2 | - Fixed an issue where errors with indexing virtual files were not handled correctly. 3 | - Improved error handling for failed file parsing. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.3.md: -------------------------------------------------------------------------------- 1 | - Fixed a regression that caused links and tags to not be properly indexed. 2 | - Fixed a regression that caused wiki link autocomplete on windows to incorrectly include the path to the note as the note text. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.4.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where "virtual" files that were linked to but didn't exist could show up in the folder view. 2 | - Fixed an issue where moving a note to the same path as a virtual file was not correctly handled, resulting in the visual disappearance of the file. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.5.md: -------------------------------------------------------------------------------- 1 | + Added an error message in the case that Tangent fails to initialize, with an email link for error reporting. 2 | + Added the current version number to the [[Updates]] settings pane. 3 | - Fixed a regression where wiki links to files Tangent couldn't display were not opened in their default app. 4 | - Fixed a class of path errors that could cause Tangent to not initialize. 5 | - Fixed several issues with Session file integrity checking that could cause Tangent to not initialize. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.6.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where interactions that created new sessions could lose thread context. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.7.md: -------------------------------------------------------------------------------- 1 | - Removed all links to the bird app. 2 | - Fixed an issue with opening the command palette when in a completely empty workspace. 3 | - Fixed an issue with creating a new note inside several folders that do not yet exist (e.g. via [[Creation Rules]]). -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.8.md: -------------------------------------------------------------------------------- 1 | + Made zooming on the map mouse-relative. This makes zooming much more comfortable. 2 | - Fixed an issue where map nodes could be positioned incorrectly if the map was toggled off and on while zoomed out. 3 | - Fixed an issue where there could be a graphical flicker as the checkbox visualization appeared. 4 | - Fixed an issue where tag autocomplete did not trigger when the tag was the first thing in a note. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.0-beta.9.md: -------------------------------------------------------------------------------- 1 | - Fixed issues with ordering of asynchronous and synchronous operations related to creation of new files and updates to the session files. 2 | - Fixed issues with the placeholder nodes (e.g. for deleted notes) created by session files that caused other aspects of the session to be incorrectly loaded. 3 | - Fixed an issue where nodes that couldn't be displayed showed up as nothing. 4 | - Found & Fixed a very old workspace promise tracking issue. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.1.md: -------------------------------------------------------------------------------- 1 | + Updated exceptional contributors on the "About" page. 2 | - Fixed a design flaw where the link markup for embedded images did not act like other links. You can now `Ctrl/Cmd+Click` and `Ctrl/Cmd+Enter` on embed links like you'd expect. 3 | - Removed some no-longer-needed debug logs. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.6.2.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where pasting ordered list text corrupted the pasted text. 2 | - Fixed an issue where editing ordered list numbers of sufficient length corrupted the list's text. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.0-alpha.1.md: -------------------------------------------------------------------------------- 1 | + Tangent is now open source! This is the first release built from the open source package. 2 | + Updated electron to 27.2.2 -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.0-alpha.2.md: -------------------------------------------------------------------------------- 1 | + Added support for creating new folders from the "Move to Folder" command. 2 | - Fixed a regression where clicking on white space at the bottom of notes didn't move selection to the end of the note. 3 | - Fixed a bug where archiving maps could cause map rendering issues. 4 | - Fixed an issue where hitting escape while editing a filename didn't return the note's name to its original state. 5 | - Fixed an issue where you could rename a note to empty string. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.0-alpha.3.md: -------------------------------------------------------------------------------- 1 | + Added support for going backward & forward in thread history with the backward & forward buttons on a mouse. 2 | + Added a setting that controls the hotspot size of the settings pane for a panel. 3 | - Fixed an issue where creating notes from the sidebar with another folder selected would create the note in the selected folder rather than in the root of the workspace. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.0-alpha.4.md: -------------------------------------------------------------------------------- 1 | + Added support for duplicating notes and folders with the new "Duplicate" command. 2 | - In theory fixed a regression with queries not working in release builds. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.0-alpha.5.md: -------------------------------------------------------------------------------- 1 | - Actually fixes the query system! -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.0-alpha.6.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where using inline formatting shortcuts with cross-line selections didn't correctly apply formatting to each individual line. 2 | - Fixed an issue where toggling inline formatting with a selection that included or intersected other inline formatting blindly added additional formatting characters, breaking formatting. All intersecting formatting is now removed in this case. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.0-beta.2.md: -------------------------------------------------------------------------------- 1 | + Updated link tooltips so that they can provide more context about where they're going. 2 | - Fixed a regression where attempting to rename queries failed. Further a previous bug where renaming queries could rename themselves back. 3 | - Fixed a bug where clicking checkboxes could fail and erroneously toggle other checkboxes instead. 4 | - Fixed a bug where toggling on bold formatting could place your cursor in a non-optimal position. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.1.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where errors from some file interactions were not correctly handled. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.2.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where virtual files could be created by clicking on their links and they would appear to lose all incoming connection information. 2 | - Fixed an issue where shift-clicking with a text selection would not grow the selection. 3 | - Fixed an issue where toggling off markdown links with `Ctrl/Cmd+K` didn't remove the formatting correctly. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.3.md: -------------------------------------------------------------------------------- 1 | + Added some simple start & end lines for front matter. 2 | - Fixed an issue where files with completely empty front matter failed to be indexed and caused editing issues. 3 | - Fixed an issue where files and folders that started with a "." (and are thus hidden by default) were still indexed. 4 | - Fixed an issue where clicking on "Manage Rules" in the new note drop down didn't correctly open the [[Creation Rules]] section of system settings. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.4.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where text compositions systems (e.g. applying an accent to a letter) failed at the end of a line. 2 | - Fixed the display of floating titles when in focus modes. 3 | - Fixed an error caused by a regression in editor selection manipulation. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.5.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where YAML parsing errors could derail file parsing. 2 | - Fixed an issue with Floating Titles in the [[Feed Lens]]. 3 | - Fixed an issue where the sidebar could be larger than Tangent's window was wide, and sets a minimum size for Tangent's window. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.7.6.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where the parsing of empty code blocks could break the display of downstream lines. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.0-alpha.1.md: -------------------------------------------------------------------------------- 1 | + Added support for [[Unicode Autocomplete]] that can replace ascii arrows (-->) and sequential dashes (--) with unicode arrows (➞) and n/m dashes (—). 2 | + Added a [[Dictionary]] section to the [[System Menu]] that lets you review and remove all words added to the custom user dictionary. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.0-alpha.2.md: -------------------------------------------------------------------------------- 1 | + Added support for canceling todo items with `[-]`. 2 | + Added the ability to choose between all todo states by right clicking on a checkbox. 3 | + Added query support for canceled todos. 4 | + Added a query shorthand for all complete _or_ canceled todos, e.g. `Notes with closed todos`. 5 | - Fixed an issue where [[KaTeX Equations]] were not loading their fonts and thus rendering incorrectly. 6 | - Fixed an issue where toggling inline formatting from the end of a word incorrectly left the ending formatting character selected. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.0-alpha.3.md: -------------------------------------------------------------------------------- 1 | + Active queries refresh on file changes. 2 | + Added diacritic-insensitivity for filename searches. 3 | + Opening a code block will automatically create a matching closing line. 4 | + Added autocomplete for code block languages. 5 | + Added a debug option to disable using the trash/recycling bin when deleting files & folders. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.0-alpha.4.md: -------------------------------------------------------------------------------- 1 | + Added index caching. Tangent will cache workspace indexes and restore them on first load. This should speed up startup times for large workspaces. 2 | + Sped up index link resolution, reducing the time taken linking notes by ~50%. 3 | + Added the ability to click on nodes & threads within old Session Maps to add those nodes and threads to the current Session. 4 | - Fixed an issue where the text cursor in code blocks in light mode was essentially invisible. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.0-alpha.5.md: -------------------------------------------------------------------------------- 1 | - Fixed a regression where the [[Map View]] would scroll every time you returned to it. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.0-alpha.6.md: -------------------------------------------------------------------------------- 1 | + Added support for wrapping selected text in quotes, brackets, and other formatting characters when the appropriate keys are pressed. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.0-alpha.7.md: -------------------------------------------------------------------------------- 1 | + Renamed "Paragraph" focus to a new "Line" focus mode, which better reflects the actual behavior. 2 | + Added a new "Paragraph" focus that highlights the current line and any adjacent non-empty lines or code blocks. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.0-beta.2.md: -------------------------------------------------------------------------------- 1 | - Fixed a bug where duplicate processing could scramble lists. 2 | - Fixed a bug where the window title didn't update when a note was renamed. 3 | - Fixed an issue where math blocks had black-on-black text in light mode. 4 | + Added a background color to math figures that have their source code exposed. 5 | + Added a user facing error message for critical indexing errors. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.0-beta.3.md: -------------------------------------------------------------------------------- 1 | - Fixed an indexing issue where virtual folders could be mistaken for virtual files, breaking queries. 2 | - Fixed an issue where moving virtual files based on more specific links would update the text in the source files. 3 | - Fixed an indexing issue where unsuccessful linking could cause downstream null errors. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.0-beta.4.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where file tree parsing errors could leave null nodes and cause downstream issues. Added logging for said errors. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.1.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where resolving to a note's alias would include the directory information. 2 | - Fixed an issue where virtual notes could show up at the top when sorting by date created or date modified. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.2.md: -------------------------------------------------------------------------------- 1 | - Updated Electron to 33.0.2, fixing an issue on Windows with filenames containing emoji. 2 | - Tweaked button styling on hover to be more obvious. 3 | - Fixed an issue where autocomplete menus were not dismissed by clicking outside of the menu. 4 | - Fixed an issue where query refreshes could be caused by routine internal file changes within the `.tangent` folder. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.3.md: -------------------------------------------------------------------------------- 1 | * Removed donation links in compliance with new work terms. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.8.4.md: -------------------------------------------------------------------------------- 1 | + Updated to Electron v34.0.0, fixing an issue with the file browser in linux. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-alpha.1.md: -------------------------------------------------------------------------------- 1 | + Added support for inline formatting within link text. // This required a sizable refactor of the note parser that should set Tangent up for more robust features in the future. 2 | - Fixed some cursor movement issues with embedded images. Using the arrow keys to move around image links should feel much less broken. 3 | - Fixed an issue that caused image links to have inconsistent underlines. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-alpha.10.md: -------------------------------------------------------------------------------- 1 | + Added support for [[Line & Section Shifting|Shifting Sections]] with Alt+Shift+Up/Down on Windows & Linux and ⌃⌥+Up/Down on Mac. 2 | + Added an option to always use the full workspace path when autocompleting [[Wiki Links]]. 3 | - Fixed several issues that could cause terrible performance in [[Queries]]. 4 | - Fixed a regression where [[Highlights]] and [[Strikethrough]] were broken. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-alpha.11.md: -------------------------------------------------------------------------------- 1 | + Added support for indenting headers, code blocks, math blocks, and block quotes. 2 | - Fixed a regression where editing code caused visual issues. 3 | - Fixed a bug where un/tabbing multiple lines could shift selection incorrectly. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-alpha.2.md: -------------------------------------------------------------------------------- 1 | + Massively expanded [[Embedding]] & link previews! Raw links on their own line are automatically treated as "embed" links. Markdown embed links (i.e. image links) will also display link previews & embeds. Audio, video, and YouTube links are displayed in the note natively. 2 | - Fixed a regression where `inline code` would consume the entire line. 3 | - Fixed a regression where [[Code]] blocks would always show their closing backticks. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-alpha.3.md: -------------------------------------------------------------------------------- 1 | - Fixed an issue where the link preview backend didn't work in production. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-alpha.4.md: -------------------------------------------------------------------------------- 1 | + Added a setting to disable the automatic embedding of raw links on their own line. Raw links can still be embedded by prepending them with `!`. 2 | + Improved preview display, and switched to using the "googlebot" user agent, improving scraped results. 3 | + Improved how link preview errors are handled and displayed to the user. 4 | - Fixed an issue where markdown links had strange vertical alignment. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-alpha.5.md: -------------------------------------------------------------------------------- 1 | + Added initial support for HTML syntax parsing. This fills a major parsing hole and fixes several issues users saw related to HTML syntax being parsed as something else. 2 | + Changed scrolling cards in the [[Cards Lens]] to require `alt` by default. This can be changed within settings. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-alpha.6.md: -------------------------------------------------------------------------------- 1 | + Updated to Electron v34.0.0, fixing an issue with the file browser in linux. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-alpha.7.md: -------------------------------------------------------------------------------- 1 | + Added support for selecting different code highlighting themes, with different options for block and inline (e.g. HTML) code in both light mode and dark mode. 2 | - Fixed an issue where pasting images caused a loop of inserting the link over and over again. 3 | - Fixed a regression where some code languages were not correctly highlighted on initial load. 4 | - Fixed an issue where renamed notes could have their old names retained in the saved session files. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-alpha.9.md: -------------------------------------------------------------------------------- 1 | + Added wiki link previews using a new custom tooltip system. 2 | + Added an option to follow links with unmodified left clicks. 3 | + Improved panel behavior when Tangent's windows are thinner than the set minimum panel width. 4 | + Added an experimental IO Queue system for debugging query solving issues. 5 | - Fixed an issue where some system settings documentation links didn't work. 6 | - Fixed an issue where the [[List Lens]] didn't correctly buffer itself from its parent's settings. 7 | - Removed the (always incorrect) hotkey from the set creation rule button. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-beta.2.md: -------------------------------------------------------------------------------- 1 | + Changed default [[Bold and Italics]] behavior so that underscores surrounded by text does not trigger formatting. 2 | + Added error & warning indicators for YAML parsing errors in [[Front Matter]]. 3 | + Added the ability to wrap from the first to the last item (and vice-versa) in the command palette & autocomplete menus. 4 | - Fixed an issue where unclosed front matter still inserted a horizontal line. 5 | - Fixed a regression where new [[Wiki Links]] to virtual files would not show up green once the file was actually created. 6 | - Fixed an issue where using `Ctrl+Shift+Click` on a wiki link to replace the current pane when clicking on a link in a file in a [[Feed Lens]] didn't correctly replace that pane with the linked file. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-beta.3.md: -------------------------------------------------------------------------------- 1 | - Fixed a regression where pasting images didn't actually insert the image. 2 | - Fixed an issue where deleting a note referenced by other notes didn't clear out that note's content. 3 | - Hardened a potential issue surrounding map node syncing & reduced related log bloat. 4 | - Fixed an issue with saving settings when there were no customizations. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-beta.4.md: -------------------------------------------------------------------------------- 1 | - Fixed a critical issue where non-terminated code blocks threw unhandled errors and could make the editor appear blank. Added a stripped-down fallback to better handle & message any future errors of this class. -------------------------------------------------------------------------------- /Documentation/Changelog/v0.9.0-beta.5.md: -------------------------------------------------------------------------------- 1 | + Added description extraction for preview of Wikipedia links. 2 | + Added an option to control whether finished [[Todos]] are crossed out. 3 | + Updated Electron to v35.4.0; updated many other dependencies as well. 4 | - Fixed an issue where external links had a blank tooltip. 5 | - Fixed an issue where links with preview errors could show two different tooltips at once. -------------------------------------------------------------------------------- /Documentation/Configuration/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /Documentation/Configuration/Attachments.md: -------------------------------------------------------------------------------- 1 | The attachments options for Tangent are found in the [[System Menu]]. 2 | 3 | The __Pasted Image Folder__ setting lets you choose where [[Embedding|Embedded Images]] go by default when pasted into notes. 4 | * This setting supports relative paths by prefixing with `./` or `../`. A path of `./` would save images as siblings of the note they are pasted into. 5 | -------------------------------------------------------------------------------- /Documentation/Configuration/Debug.md: -------------------------------------------------------------------------------- 1 | The debug options for Tangent are found in the [[System Menu]]. These options are only displayed when the [[Updates#Update Channels|update channel]] is set to "Beta" or "Alpha". 2 | 3 | **Send Crash Reports** configures whether or not crashes should be uploaded should Tangent crash. This option is _disabled_ by default. 4 | 5 | Disabling the **Links Can Create Virtual Files** option will prevent Tangent from indexing [[Wiki Links]] to files that don't yet exist. Disabling this option _will_ cause issues with several of Tangent's features, and is should only be used for troubleshooting. -------------------------------------------------------------------------------- /Documentation/Configuration/Dictionary.md: -------------------------------------------------------------------------------- 1 | The Dictionary list is found in the [[System Menu]]. 2 | 3 | Tangent uses Chromium's integration with your OS dictionary to provide spell checking. As part of that built-in functionality, you can add words Tangent thinks are misspelled to the custom dictionary. 4 | 5 | Sometimes words are added to the dictionary by mistake. You can review the words you have added to the dictionary and remove them from this settings panel. -------------------------------------------------------------------------------- /Documentation/Configuration/System Menu.md: -------------------------------------------------------------------------------- 1 | ![[System Menu Icon.png|32]] 2 | The system menu in the upper-right-corner of the window gives you access to the various configuration options within Tangent. You can also access the menu with the `Ctrl/Cmd+,` shortcut. 3 | 4 | There are multiple sections: 5 | * [[Appearance]] 6 | * [[Attachments]] 7 | * [[Creation Rules]] 8 | * [[Database]] 9 | * [[Maps]] 10 | * [[Notes]] 11 | * [[Custom Styles]] 12 | * [[Dictionary]] 13 | * [[Updates]] 14 | * [[Debug]] -------------------------------------------------------------------------------- /Documentation/Features/.tangentfolder: -------------------------------------------------------------------------------- 1 | { 2 | "displayMode": "Cards" 3 | } -------------------------------------------------------------------------------- /Documentation/Features/Line & Section Shifting.md: -------------------------------------------------------------------------------- 1 | Tangent implements the `Alt+Up` and `Alt+Down` shortcuts from code editors to shift your currently selected line(s) up and down. 2 | 3 | You can also shift entire sections of content across other sections. On Mac, the shortcut is "⌃⌥ ↑" and "⌃⌥ ↓". On Windows & Linux, the shortcut is `Ctrl+Shift+Up` and `Ctrl+Shift+Down`. 4 | 5 | What constitutes a section depends on what you have selected. If you just have a line selected, you will just shift that line. If you have a list item with children selected, that list item and all of its children will shift. If you have a header selected, the header and all of the content below it will shift. -------------------------------------------------------------------------------- /Documentation/Features/Sessions.md: -------------------------------------------------------------------------------- 1 | Sessions keep track of your actions as you create, open, and connect notes. These actions build up a connected map of where you've gone in your notes and how you got there. 2 | 3 | A new session is automatically created when you interact with Tangent 8 hours after your last tracked action. This keeps your maps relevant even when you haven't looked at them for weeks. 4 | 5 | The [[Map View]] shows the map of your current session, as well as the maps of any previous sessions that you have not yet archived. -------------------------------------------------------------------------------- /Documentation/Features/Thread History.md: -------------------------------------------------------------------------------- 1 | [[Sessions]] track the history of the Threads of notes you've looked at, as well as the current note in that Thread. 2 | 3 | You can navigate back and forward through your thread history via: 4 | * The back and forward buttons in the top bar of Tangent. 5 | * The "Go Back" and "Go Forward" menu items in the "Go" menu. 6 | * Using the `Cmd/Ctrl+Shift+[` and `Cmd/Ctrl+Shift+]` keyboard shortcuts. 7 | 8 | You can also right-click on the back/forward buttons in the top bar to get a list of your history. Click on a history item jump back to that history item. -------------------------------------------------------------------------------- /Documentation/Features/Unicode Autocomplete.md: -------------------------------------------------------------------------------- 1 | Tangent features a small selection of helper replacements that make inserting unicode characters via ascii characters easier. 2 | 3 | ## Arrows 4 | Tangent will automatically detect ascii arrows (e.g,. <- or -->) and offer to replace them with unicode arrow characters (e.g. ← or ➞). 5 | 6 | ## Dashes 7 | Tangent will offer to turn -- or --- into n or m dashes. 8 | 9 | To avoid collision with [[Markdown Syntax]], this only happens automatically when the dashes are _not_ at the start of a line. You can press `Ctrl+Space` to invoke autocomplete manually. -------------------------------------------------------------------------------- /Documentation/Features/Zooming & Font Size.md: -------------------------------------------------------------------------------- 1 | Tangent uses `Cmd/Ctrl+Shift+Plus` and `Cmd/Ctrl+Shift+Minus` to control the zoom level in the [[Map View]] and image panels as well as change the font size for notes. 2 | 3 | You can reset the zoom level or font size with `Cmd/Ctrl+Shift+0`. 4 | 5 | 6 | # `Ctrl+Shift+0` Bug On Windows 7 | On Windows, there is a bug that can cause any `Ctrl+Shift+0` shortcut to fail. This is caused by a key binding for switching language modes, and can affect you even if you only have a single language enabled. 8 | 9 | [This is the best resource I found to help work around this issue](https://www.reddit.com/r/starcraft/comments/9k3m0e/help_with_ctrlshift0/). -------------------------------------------------------------------------------- /Documentation/Formatting/.tangentfolder: -------------------------------------------------------------------------------- 1 | { 2 | "displayMode": "Cards" 3 | } -------------------------------------------------------------------------------- /Documentation/Formatting/Backslash Escapes.md: -------------------------------------------------------------------------------- 1 | The backslash character prevents the character immediately following it from being recognized as a formatting character. For example \_this\_ was not italicized because the underscores were written as `\_`. 2 | 3 | Since the backslash is hidden when used like this, you can type a \\ by using two: `\\`. 4 | 5 | This is useful to write out exactly what you want without the formatting syntax making a mess of it. -------------------------------------------------------------------------------- /Documentation/Formatting/Comments.md: -------------------------------------------------------------------------------- 1 | Comments let you mark up meta-commentary on the text of your notes. They can be treated as an aside, or as notes to yourself in the middle of writing. 2 | 3 | You invoke a comment by typing two slashes: // The rest of the line after those slashes becomes a comment. 4 | 5 | // Comments can contain _italics_, __bolded text__, and even [[Wiki Links|links]]. 6 | 7 | Comments are designed to be easily stripped out of notes when published or exported. 8 | 9 | You can press `Cmd+/` on Mac or `Ctrl+/` elsewhere to toggle comments for a line, or for multiple lines. -------------------------------------------------------------------------------- /Documentation/Formatting/Front Matter.md: -------------------------------------------------------------------------------- 1 | Tangent supports [YAML](https://yaml.org) front matter in your notes. 2 | 3 | To create a YAML front matter block, the first line of your note _must_ be three dashes on their own line: `---`. Anything after this will be interpreted as YAML until a closing `---` line. 4 | 5 | Here is a simple example of a markdown file with front matter: 6 | ```md 7 | --- 8 | title: 'My Note' 9 | date-published: 2022-03-27 10 | --- 11 | 12 | The markdown content of my note. 13 | ``` -------------------------------------------------------------------------------- /Documentation/Formatting/Headers.md: -------------------------------------------------------------------------------- 1 | You can mark a line as a header by adding `#` characters to the beginning of the line. A single `#` will create the largest, __H1__ header, while more `#` characters will create __H2__, __H3__ headers, and so on. For example: 2 | 3 | ```md 4 | # This will be an H1 Header 5 | 6 | ### This will be an H3 Header 7 | ``` 8 | 9 | The space between the `#` characters and the text of the header is required. 10 | 11 | You can use `Cmd/Ctrl+1` through `Cmd/Ctrl+6` to set the header level for the currently selected line or lines. `Cmd/Ctrl+0` clears the header formatting and sets the lines back to being paragraphs. -------------------------------------------------------------------------------- /Documentation/Formatting/Highlights.md: -------------------------------------------------------------------------------- 1 | You can ==highlight text== by surrounding text with pairs of `==two equals==` characters. 2 | 3 | You can toggle whether or not a selection of text is highlighted with `Cmd/Ctrl+=`. 4 | 5 | You can also 🟥highlight🟥 🟧text🟧 🟨with🟨 🟩square🟩 🟦color🟦 🟪emoji🟪. You can use 🔵circle color emoji🔵 to 🟢highlight with a rounded pill🟢. -------------------------------------------------------------------------------- /Documentation/Formatting/KaTeX Equations.md: -------------------------------------------------------------------------------- 1 | Tangent supports block-level and inline math with [KaTeX](https://katex.org). 2 | 3 | You can write block level math by surrounding your KaTeX source with `$$` characters on their own line: 4 | $$ 5 | H = \frac{f^2}{Nc} + f 6 | $$ 7 | 8 | You can write inline math by surrounding the KaTeX source with single `$` characters, such as: $f(x) = 2x^2$ 9 | 10 | # Chemical Equations 11 | Tangent also includes the [KaTeX mhchem extensions](https://mhchem.github.io/MathJax-mhchem/) for chemical equations. This provides the `\ce{}` function, and allows for beautiful chemical equations with minimal effort: 12 | $$ 13 | \ce{CO2 + C -> 2 CO} 14 | $$ -------------------------------------------------------------------------------- /Documentation/Formatting/Strikethrough.md: -------------------------------------------------------------------------------- 1 | The strikethrough syntax lets you ~~cross out~~ text. You can do this by surrounding text in `~~two tilde~~` characters. -------------------------------------------------------------------------------- /Documentation/Views/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /Documentation/Views/Cards Lens.md: -------------------------------------------------------------------------------- 1 | The Cards Lens is one of several [[Lenses]] that can be used to visualize multiple files. It displays notes and other files as a grid of cards. 2 | 3 | # Settings 4 | ## Sorting 5 | You can select both the key that files will be sorted by and the direction (ascending/descending). 6 | 7 | ## Display 8 | ### Show Word Count 9 | With this enabled, the word count for notes is displayed in the bottom corner of the card. 10 | -------------------------------------------------------------------------------- /Documentation/Views/Lenses.md: -------------------------------------------------------------------------------- 1 | Lenses let you view your notes and folders in different ways. At the moment, lenses is a nascent feature that is intended to be developed further. 2 | 3 | Panels that support different lenses and view settings will have these two small lines above them: 4 | ![[Lens Settings Hint.png|300]] 5 | Mousing to the top of the panel will reveal the settings panel, letting you switch lenses and change any settings applicable to that setting. 6 | ![[Lense Selection.png|200]] 7 | 8 | Lenses are available when looking at folders and queries. The lenses available to them include: 9 | * The [[List Lens]] 10 | * The [[Cards Lens]] 11 | * The [[Feed Lens]] -------------------------------------------------------------------------------- /Documentation/Views/List Lens.md: -------------------------------------------------------------------------------- 1 | The List Lens is one of several [[Lenses]] that can be used to visualize multiple files. It displays the name of files in a list. 2 | 3 | # Settings 4 | ## Sorting 5 | You can select both the key that files will be sorted by and the direction (ascending/descending). -------------------------------------------------------------------------------- /Documentation/Views/The Sidebar.md: -------------------------------------------------------------------------------- 1 | The Sidebar shows a tree of all supported files and folders (see [[The Workspace]] for the list of supported file types). 2 | 3 | Click on any folder or file to open it. You can also Command or Control click to add the file to the end of your current thread. 4 | 5 | Double clicking on a file or folder will let you rename it in place. 6 | 7 | You can move files and folders by dragging them to a new folder in the sidebar. 8 | 9 | The right click context menu on the files and folders let you rename, delete, locate the file in Explorer or Finder, and add sub folders and sub files. 10 | 11 | At the top of the sidebar, you will find buttons that let you add a new root folder and change the sorting of files and folders. -------------------------------------------------------------------------------- /apps/tangent-electron/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | __build/ 3 | dist/ 4 | 5 | *.env 6 | -------------------------------------------------------------------------------- /apps/tangent-electron/README.md: -------------------------------------------------------------------------------- 1 | # Tangent Electron 2 | This is an implementation of the Tangent note-writing toolset using Electron. 3 | 4 | ## Installation & Setup 5 | As this exists inside of a monorepo, be sure to run `npm i` or `npm ci` at the root of the repository. 6 | 7 | You will also need to build Typewriter in `../../lib/typewriter` with `npm run build`. 8 | 9 | Once dependencies have been installed, you can run `npm run dev` to start up a development version of the editor. 10 | -------------------------------------------------------------------------------- /apps/tangent-electron/build/entitlements.mac.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-unsigned-executable-memory 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/tangent-electron/build/flatpak/io.github.suchnsuch.Tangent.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Tangent 3 | Comment=Record and connect your thoughts 4 | Type=Application 5 | Exec=run.sh 6 | Terminal=false 7 | Categories=Office; 8 | Keywords=markdown;notes;pkm;brain;writing;Obsidian; 9 | Icon=io.github.suchnsuch.Tangent 10 | -------------------------------------------------------------------------------- /apps/tangent-electron/build/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/build/icon.icns -------------------------------------------------------------------------------- /apps/tangent-electron/build/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/build/icon.ico -------------------------------------------------------------------------------- /apps/tangent-electron/build/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/build/icon.png -------------------------------------------------------------------------------- /apps/tangent-electron/build/icon.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/build/icon.xcf -------------------------------------------------------------------------------- /apps/tangent-electron/build/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/build/icons/128x128.png -------------------------------------------------------------------------------- /apps/tangent-electron/build/icons/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/build/icons/16x16.png -------------------------------------------------------------------------------- /apps/tangent-electron/build/icons/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/build/icons/256x256.png -------------------------------------------------------------------------------- /apps/tangent-electron/build/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/build/icons/32x32.png -------------------------------------------------------------------------------- /apps/tangent-electron/build/icons/48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/build/icons/48x48.png -------------------------------------------------------------------------------- /apps/tangent-electron/build/icons/64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/build/icons/64x64.png -------------------------------------------------------------------------------- /apps/tangent-electron/build/jsign.js: -------------------------------------------------------------------------------- 1 | exports.default = async function(config) { 2 | const jsignPath = process.env.JSIGN_PATH 3 | const jsignStorepass = process.env.JSIGN_STOREPASS 4 | 5 | if (!jsignPath) { 6 | throw "JSIGN_PATH environment variable must be configured." 7 | } 8 | 9 | if (!jsignStorepass) { 10 | throw "JSIGN_STOREPASS environment variable must be configured." 11 | } 12 | 13 | require('child_process').execSync( 14 | `java -jar ${jsignPath} --storetype YUBIKEY --storepass ${jsignStorepass} --alg ${config.hash} --tsaurl http://timestamp.digicert.com ${config.path}`, 15 | { 16 | stdio: 'inherit' 17 | } 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/build/readme.md: -------------------------------------------------------------------------------- 1 | # Creating Icons 2 | __Windows__ needs a `.icns` file. I am using [ImageMagick](https://imagemagick.org/index.php) by [recommendation](https://superuser.com/questions/491180/how-do-i-embed-multiple-sizes-in-an-ico-file). 3 | 4 | ```bash 5 | convert icon_16.png icon_32.png icon_48.png icon_64.png icon_128.png icon_256.png -colors 256 icon.ico 6 | ``` 7 | 8 | I use "tangent-icon-small" for the 32x32 size, which looks much nicer than the naively scaled down original. 9 | 10 | __Mac__ needs a `.ico` file. [Convertio](https://convertio.co) does a good job with this. 11 | -------------------------------------------------------------------------------- /apps/tangent-electron/defaults/workspace-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "creationRules": [ 4 | { 5 | "name": "📥 Inbox Note", 6 | "nameTemplate": "%name%", 7 | "folder": "Inbox", 8 | "description": "Creates a new note for quickly capturing thoughts that are not yet completely formed." 9 | }, 10 | { 11 | "name": "📆 Daily Note", 12 | "nameTemplate": "%YYYY%/%MM%-%Month%/%YYYY%-%MM%-%DD%", 13 | "folder": "Log", 14 | "mode": "createOrOpen", 15 | "description": "Creates or opens a timestamped note for the current day for journaling and quickly jotting down quick thoughts." 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /apps/tangent-electron/dev.js: -------------------------------------------------------------------------------- 1 | const { buildAll } = require('./build') 2 | const electron = require('electron') 3 | const proc = require('child_process') 4 | 5 | let watcher = null 6 | 7 | async function start() { 8 | watcher = await buildAll() 9 | 10 | console.log(electron) 11 | 12 | let args = [] 13 | if (process.env.DEBUG) { 14 | args = ['.', `--inspect-brk=${process.env.DEBUG}`] 15 | } 16 | else { 17 | args = ['.'] 18 | } 19 | 20 | const child = proc.spawn(electron, args, { 21 | stdio: 'inherit' 22 | }) 23 | 24 | child.on('close', close) 25 | } 26 | 27 | function close() { 28 | if (watcher && watcher.close) { 29 | watcher.close() 30 | } 31 | } 32 | 33 | start().catch(e => { 34 | console.error('There was an error running the application') 35 | console.log(e) 36 | 37 | close() 38 | }) 39 | -------------------------------------------------------------------------------- /apps/tangent-electron/playwright.config.ts: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import { defineConfig } from '@playwright/test' 3 | import { TangentOptions } from './tests-integration/tangent' 4 | 5 | export default defineConfig({ 6 | projects: [ 7 | { 8 | name: 'Tests', 9 | testMatch: /.*tests-integration.*\.test\.(ts)/, 10 | }, 11 | { 12 | name: 'Benchmarks', 13 | testMatch: /.*tests-integration.*\.bench\.(ts)/, 14 | }, 15 | { 16 | name: 'Screenshots', 17 | testMatch: /.*tests-integration.*\.screenshot\.ts/, 18 | use: { 19 | workspace: path.resolve(path.join( 20 | __dirname, '../../test-files/ScreenshotWorkspace/My Workspace' 21 | )), 22 | resetWorkspace: 'test' 23 | } 24 | } 25 | ], 26 | workers: 1 27 | }) 28 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/app.js: -------------------------------------------------------------------------------- 1 | import App from './App.svelte' 2 | 3 | import './style/input.scss' 4 | import './style/note.scss' 5 | 6 | const app = new App({ 7 | target: document.body, 8 | }) 9 | 10 | export default app 11 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/global.d.ts: -------------------------------------------------------------------------------- 1 | declare type DndEvent = import("svelte-dnd-action").DndEvent; 2 | declare namespace svelte.JSX { 3 | interface HTMLAttributes { 4 | onconsider?: (event: CustomEvent & {target: EventTarget & T}) => void; 5 | onfinalize?: (event: CustomEvent & {target: EventTarget & T}) => void; 6 | } 7 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/modal/ModalStyles.scss: -------------------------------------------------------------------------------- 1 | .ModalContainer { 2 | background-color: var(--backgroundColor); 3 | padding: 1rem; 4 | width: 550px; 5 | 6 | border-bottom-left-radius: var(--borderRadius); 7 | border-bottom-right-radius: var(--borderRadius); 8 | 9 | h1 { 10 | margin-top: 0; 11 | margin-bottom: 1rem; 12 | font-size: 180%; 13 | font-weight: 500; 14 | } 15 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/model/SystemMenu.ts: -------------------------------------------------------------------------------- 1 | import { ObjectStore, WritableStore } from 'common/stores' 2 | 3 | export default class SystemMenu extends ObjectStore { 4 | 5 | showMenu = new WritableStore(false) 6 | section = new WritableStore(null) 7 | 8 | constructor() { 9 | super() 10 | this.setupObservables() 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/model/commands/NoteKeyboardProxy.ts: -------------------------------------------------------------------------------- 1 | import type Workspace from '../Workspace'; 2 | import KeyboardEventProxyCommand, { KeyboardEventProxyCommandOptions } from './KeyboardEventProxy'; 3 | 4 | export type NoteKeyboardProxyCommandOptions = 5 | Partial 6 | & Pick 7 | 8 | export default class NoteKeyboardProxyCommand extends KeyboardEventProxyCommand { 9 | 10 | constructor(workspace: Workspace, options: NoteKeyboardProxyCommandOptions) { 11 | const opts: KeyboardEventProxyCommandOptions = { 12 | selector: '.nodeContainer.current main.noteEditor article', 13 | ...options 14 | } 15 | super(workspace, opts) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/model/commands/OpenChangelog.ts: -------------------------------------------------------------------------------- 1 | import type { CommandContext } from './Command' 2 | import WorkspaceCommand from './WorkspaceCommand' 3 | 4 | import Changelog from '../../modal/Changelog.svelte' 5 | 6 | export default class OpenChangelogCommand extends WorkspaceCommand { 7 | execute(context: CommandContext): void { 8 | this.workspace.viewState.modal.set(Changelog, {}) 9 | } 10 | 11 | getLabel(context: CommandContext) { 12 | return 'Open Changelog' 13 | } 14 | 15 | getTooltip(context?: CommandContext) { 16 | return 'Opens Tangent\'s changelog dialog.' 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/model/commands/OpenLogs.ts: -------------------------------------------------------------------------------- 1 | import type Workspace from '../Workspace' 2 | import type { CommandContext } from './Command' 3 | import WorkspaceCommand from './WorkspaceCommand' 4 | 5 | export default class OpenLogsCommand extends WorkspaceCommand { 6 | constructor(workspace: Workspace) { 7 | super(workspace) 8 | } 9 | 10 | execute(_context) { 11 | this.workspace.api.file.showInFileBrowser('logs') 12 | } 13 | 14 | getLabel(context: CommandContext) { 15 | return 'Show Logs' 16 | } 17 | 18 | getTooltip(context?: CommandContext) { 19 | return 'Opens the folder containing Tangent\'s log file.' 20 | } 21 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/model/commands/OpenWorkspace.ts: -------------------------------------------------------------------------------- 1 | import type { Workspace } from '..' 2 | import WorkspaceCommand from './WorkspaceCommand' 3 | 4 | export default class OpenWorkspaceCommand extends WorkspaceCommand { 5 | constructor(workspace: Workspace) { 6 | super(workspace, { shortcut: 'Mod+Shift+O'}) 7 | } 8 | 9 | execute(_context) { 10 | this.workspace.api.window.create() 11 | } 12 | 13 | getLabel(_context) { 14 | return 'Open Workspace' 15 | } 16 | 17 | getTooltip(_context) { 18 | return 'Opens a new window that can be opened to any workspace or folder.' 19 | } 20 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/model/index.ts: -------------------------------------------------------------------------------- 1 | import WorkspaceTreeNode from './WorkspaceTreeNode' 2 | import File from './File' 3 | import NoteFile from './NoteFile' 4 | import EmbedFile from './EmbedFile' 5 | import Folder from './Folder' 6 | import Tangent from './Tangent' 7 | import Workspace from './Workspace' 8 | 9 | export { 10 | WorkspaceTreeNode, 11 | File, 12 | NoteFile, 13 | EmbedFile, 14 | Folder, 15 | Tangent, 16 | Workspace 17 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/model/nodeViewStates/LoadingViewState.ts: -------------------------------------------------------------------------------- 1 | import { SvelteConstructor } from 'app/utils/svelte' 2 | import LensViewState from './LensViewState' 3 | import NodeViewState from './NodeViewState' 4 | import LoadingView from 'app/views/node-views/LoadingView.svelte' 5 | 6 | export default class LoadingViewState implements LensViewState { 7 | readonly parent: NodeViewState; 8 | 9 | constructor(parent: NodeViewState) { 10 | this.parent = parent 11 | } 12 | 13 | get viewComponent(): SvelteConstructor { 14 | return LoadingView 15 | } 16 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/model/nodeViewStates/NodeViewState.ts: -------------------------------------------------------------------------------- 1 | import { Readable } from 'svelte/store' 2 | import type { SvelteConstructor } from 'app/utils/svelte' 3 | import type { TreeChange, TreeNode } from 'common/trees' 4 | import type { ReadableStore } from 'common/stores' 5 | import type LensViewState from './LensViewState' 6 | 7 | export default interface NodeViewState { 8 | // Can be implemented as a property backed by the real object 9 | readonly node: TreeNode 10 | 11 | readonly currentLens: ReadableStore 12 | 13 | settingsComponent?: SvelteConstructor 14 | readonly pinSettings?: Readable 15 | 16 | dispose?() 17 | focus?(element: HTMLElement): boolean 18 | onTreeChange?(change: TreeChange) 19 | } 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/model/nodeViewStates/index.ts: -------------------------------------------------------------------------------- 1 | import type NodeViewState from './NodeViewState' 2 | export type { NodeViewState } 3 | 4 | import FolderViewState from './FolderViewState' 5 | export { FolderViewState } 6 | 7 | import NoteViewState from './NoteViewState' 8 | export { NoteViewState } 9 | 10 | import ImageViewState from './ImageViewState' 11 | export { ImageViewState } 12 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/style/highlights.scss: -------------------------------------------------------------------------------- 1 | .match-highlight { 2 | position: relative; 3 | &::after { 4 | content: ''; 5 | position: absolute; 6 | inset: 0; 7 | background: var(--textColor); 8 | opacity: .25; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/utils/SearchSegmentHighlight.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | {@html content} 17 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/utils/dragDrop.ts: -------------------------------------------------------------------------------- 1 | import type { TreeNode, DirectoryStore } from 'common/trees' 2 | 3 | const treeNodeType = 'tangent/treenode' 4 | 5 | export function setTreeNodeTransfer(transfer: DataTransfer, node: TreeNode) { 6 | transfer.setData(treeNodeType, node.path) 7 | transfer.effectAllowed = 'all' 8 | } 9 | 10 | export function hasTreeNodeTransfer(transfer: DataTransfer) { 11 | return transfer.types.includes(treeNodeType) 12 | } 13 | 14 | export function getTreeNodeTransfer(transfer: DataTransfer, directory: DirectoryStore) { 15 | return directory.get(transfer.getData(treeNodeType)) 16 | } 17 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/utils/events.ts: -------------------------------------------------------------------------------- 1 | import { isMac } from 'common/platform'; 2 | 3 | export function isModKey(event: KeyboardEvent | MouseEvent) { 4 | if (isMac) { 5 | return event.metaKey 6 | } 7 | else { 8 | return event.ctrlKey 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/utils/index.ts: -------------------------------------------------------------------------------- 1 | import scrollTo from './scrollto' 2 | 3 | import { focusLayer, Focus } from './focus' 4 | import { isMac } from 'common/platform' 5 | export * from './dragging' 6 | 7 | export { 8 | scrollTo, 9 | focusLayer, 10 | Focus 11 | } 12 | 13 | export function getFileBrowserName() { 14 | if (isMac) { 15 | return 'Finder' 16 | } 17 | return 'Explorer' 18 | } 19 | 20 | export function isLeftClick(event: MouseEvent) { 21 | if (event.button !== 0) return false 22 | if (isMac && event.ctrlKey) return false 23 | return true 24 | } 25 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/utils/resizeObserver.ts: -------------------------------------------------------------------------------- 1 | export function resizeObserver(node: HTMLElement, callback: ResizeObserverCallback) { 2 | const observer = new ResizeObserver(callback) 3 | observer.observe(node) 4 | 5 | return { 6 | destroy() { 7 | observer.disconnect() 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/utils/scrolling.ts: -------------------------------------------------------------------------------- 1 | export function findParentScrollContainer(element: HTMLElement): HTMLElement { 2 | let walker = element.parentElement 3 | while (walker) { 4 | if (walker.scrollHeight > walker.getBoundingClientRect().height + 10) { 5 | // Found a scrollable 6 | return walker 7 | } 8 | walker = walker.parentElement 9 | } 10 | 11 | return null 12 | } 13 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/utils/style.ts: -------------------------------------------------------------------------------- 1 | export function classesToSelector(classes: string) { 2 | const split = classes.split(/\s+/).filter(i => i) 3 | if (split.length) { 4 | return '.' + split.join('.') 5 | } 6 | return '' 7 | } 8 | 9 | export function getPixelValue(someCssString: string) { 10 | return parseFloat(someCssString.substring(0, someCssString.length - 2)) 11 | } 12 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/utils/types.ts: -------------------------------------------------------------------------------- 1 | export type Props = { [key: string]: any } -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/System/Attachments.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 |
13 |
14 | 15 |

16 | A direct path (e.g. "Some/Path") will be interpretted from the root of the workspace. 17 |

18 |

19 | Relative paths (e.g. "./Path", "./", "../") will resolve based on the note the attachment is coming from. 20 |

21 |
22 |
23 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/System/Database.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 |
13 |

Files

14 |
15 | 16 |
17 |

Links

18 |
19 | 20 |
21 |
22 | 23 |
24 |
25 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/System/Maps.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 |
11 |
12 | 13 | 14 |
15 |
16 | 17 | 18 | 19 |
20 |
21 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/node-views/CardsSettingsView.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | 23 | 28 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/node-views/ListSettingsView.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | 23 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/node-views/LoadingView.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 |

Loading {state.parent.node.name}

9 |

10 |
11 | 12 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/node-views/UnhandledView.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 |

Cannot present "{state.parent.node.name}"

8 |

Tangent cannot display "{state.parent.node.path}".

9 |

The file type may not be supported, or perhaps the file does not exist.

10 |
11 | 12 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/node-views/common/SetLensSelector.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | {#if info?.displayMode} 15 | 22 | {/if} 23 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/node-views/lensSettings.scss: -------------------------------------------------------------------------------- 1 | .lens-settings-row { 2 | display: flex; 3 | flex-wrap: wrap; 4 | align-items: center; 5 | 6 | column-gap: 1em; 7 | row-gap: .25em; 8 | } 9 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/smart-icons/NodeIcon.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | {#each iconForNode(node) as icon} 17 | 18 | {/each} 19 | 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/smart-icons/smartIcons.ts: -------------------------------------------------------------------------------- 1 | export function rawOrPx(value: string | number) { 2 | return typeof value === 'number' ? `${value}px` : value 3 | } 4 | 5 | export function sizeToStyle(size: number | string, width?: number | string, height?: number | string) { 6 | const realWidth = rawOrPx(width ?? size ?? 24) 7 | const realHeight = rawOrPx(height ?? size ?? 24) 8 | return `width: ${realWidth}; height: ${realHeight};` 9 | } 10 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/app/views/summaries/CreationRuleName.svelte: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/NodeSet.ts: -------------------------------------------------------------------------------- 1 | import type { Readable } from 'svelte/store' 2 | import type { TreeNodeOrReference } from './nodeReferences' 3 | import type { CreationRuleOrDefinition } from './settings/CreationRule' 4 | 5 | export default interface NodeSet { 6 | nodes: Readable 7 | creationRules: Readable 8 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/dataTypes/DataType.ts: -------------------------------------------------------------------------------- 1 | import type { TreeNode, DirectoryStore } from 'common/trees' 2 | import type { ObjectStore } from 'common/stores' 3 | 4 | export type DataTypeConstructionContext = { 5 | store: DirectoryStore // The store the data file is a member of 6 | file: TreeNode // The node representing the data file 7 | json: any // The raw contents of the file 8 | } 9 | 10 | export default interface DataType { 11 | new (args: DataTypeConstructionContext): ObjectStore 12 | isType(store: DirectoryStore, node: TreeNode): boolean 13 | rawToPatch?(raw: string): any 14 | saveDelay?: number 15 | } 16 | 17 | // A magic word that triggers resaving a file without any changes 18 | export const RESAVE_DATA_FILE = 'RESAVE' 19 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/dataTypes/FolderInfo.ts: -------------------------------------------------------------------------------- 1 | import type { TreeNode, DirectoryStore } from 'common/trees' 2 | import type DataType from './DataType' 3 | import SetInfo from './SetInfo' 4 | 5 | export default class FolderInfo extends SetInfo { 6 | 7 | constructor({ json }) { 8 | super() 9 | 10 | this.applyPatch(json) 11 | this.setupObservables() 12 | } 13 | 14 | static isType(store: DirectoryStore, node: TreeNode): boolean { 15 | return node.name === '.tangentfolder' 16 | } 17 | } 18 | 19 | FolderInfo satisfies DataType 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/dataTypes/TagInfo.ts: -------------------------------------------------------------------------------- 1 | import type { DirectoryStore, TreeNode } from 'common/trees' 2 | import type DataType from './DataType' 3 | import SetInfo from './SetInfo' 4 | 5 | export default class TagInfo extends SetInfo { 6 | constructor({ json }) { 7 | super() 8 | 9 | this.applyPatch(json) 10 | this.setupObservables() 11 | } 12 | 13 | static isType(store: DirectoryStore, node: TreeNode): boolean { 14 | return node.fileType === '.taginfo' 15 | } 16 | } 17 | 18 | // To confirm the type 19 | TagInfo satisfies DataType 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/dataTypes/index.ts: -------------------------------------------------------------------------------- 1 | import type DataType from './DataType' 2 | import WorkspaceSettings from './WorkspaceSettings' 3 | import FolderInfo from './FolderInfo' 4 | import QueryInfo from './QueryInfo' 5 | import TagSettingsSet from './TagSettingsSet' 6 | import TagInfo from './TagInfo' 7 | import Session from './Session' 8 | import TangentInfo from './TangentInfo' 9 | 10 | export const dataTypes: DataType[] = [ 11 | WorkspaceSettings, 12 | FolderInfo, 13 | QueryInfo, 14 | Session, 15 | TagSettingsSet, 16 | TagInfo, 17 | TangentInfo 18 | ] 19 | 20 | export type { DataType } 21 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/email.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | 3 | import { mailTo } from './email' 4 | 5 | describe('mailTo', () => { 6 | it('Should produce mailto hrefs', () => { 7 | expect(mailTo('me@test.com')).toEqual('mailto:me@test.com') 8 | }) 9 | 10 | it('Should encode uris for body', () => { 11 | expect(mailTo('guy@foo.bar', { 12 | body: '

Some Test

' 13 | })).toEqual('mailto:guy@foo.bar?body=%3Cp%3ESome%20Test%3Cp%3E') 14 | }) 15 | }) 16 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/email.ts: -------------------------------------------------------------------------------- 1 | type MailToOptions = { 2 | subject?: string, 3 | body?: string 4 | } 5 | 6 | export function mailTo(address: string, opts?: MailToOptions) { 7 | let href = 'mailto:' + address 8 | 9 | if (opts) { 10 | let first = true 11 | for (const key of Object.keys(opts)) { 12 | if (first) { 13 | href += '?' 14 | first = false 15 | } 16 | else { 17 | href += '&' 18 | } 19 | 20 | href += key 21 | href += '=' 22 | href += encodeURIComponent(opts[key]) 23 | } 24 | } 25 | 26 | return href 27 | } 28 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/embedding.ts: -------------------------------------------------------------------------------- 1 | import type { TreeNode } from 'common/trees' 2 | import { imageExtensionMatch, styleExtensionMatch } from './fileExtensions' 3 | 4 | 5 | export enum EmbedType { 6 | Invalid, 7 | Image, 8 | Style 9 | } 10 | 11 | export function getEmbedType(target: TreeNode) { 12 | if (target) { 13 | const fileType = target.fileType 14 | if (fileType.match(imageExtensionMatch)) { 15 | return EmbedType.Image 16 | } 17 | if (fileType.match(styleExtensionMatch)) { 18 | return EmbedType.Style 19 | } 20 | } 21 | return EmbedType.Invalid 22 | } 23 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/fileExtensions.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | 3 | import { getFileTypeRegex } from './fileExtensions' 4 | 5 | describe('File Extension Utils', () => { 6 | it('Should always line up with the end', () => { 7 | const mdMatch = getFileTypeRegex(['.md', 'folder']) 8 | expect('.mdx'.match(mdMatch)).toBeNull() 9 | }) 10 | it('Should always line up with the end', () => { 11 | const mdMatch = getFileTypeRegex(['.md', '.txt']) 12 | expect('.mdx'.match(mdMatch)).toBeNull() 13 | expect('.md'.match(mdMatch)).not.toBeNull() 14 | }) 15 | }) 16 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/indexing/TagNode.ts: -------------------------------------------------------------------------------- 1 | import { tokenizeTagName } from '@such-n-such/tangent-query-parser' 2 | import type { TreeNode } from 'common/trees' 3 | 4 | export function getTagPath(names: string[]) 5 | export function getTagPath(name: string) 6 | export function getTagPath(names: string | string[]) { 7 | if (typeof names === 'string') { 8 | names = tokenizeTagName(names) 9 | } 10 | return '#/' + names.map(n => n.toLocaleUpperCase()).join('/') 11 | } 12 | 13 | export interface TagTreeNode extends TreeNode { 14 | names: string[] 15 | } 16 | 17 | export function isTagTreeNode(node: TreeNode): node is TagTreeNode { 18 | if ('names' in node) return true 19 | return false 20 | } 21 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/indexing/queryResults.ts: -------------------------------------------------------------------------------- 1 | import type { Query, QueryError, QueryParseResult } from '@such-n-such/tangent-query-parser' 2 | import type { TreeNodeReference } from 'common/nodeReferences' 3 | 4 | export interface QueryResult { 5 | query: Query | QueryParseResult 6 | items?: TreeNodeReference[] 7 | errors?: QueryError[] 8 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/links.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest' 2 | 3 | import { isExternalLink } from './links' 4 | 5 | describe('isExternalLink', () => { 6 | it('Should match a normal url', () => { 7 | expect(isExternalLink('http://google.com')).toBe(true) 8 | expect(isExternalLink('https://www.apple.com')).toBe(true) 9 | expect(isExternalLink('ftp://place.it/location')).toBe(true) 10 | }) 11 | 12 | it('Should not match a relative path', () => { 13 | expect(isExternalLink('../../My relative path')).toBe(false) 14 | expect(isExternalLink('./My relative path')).toBe(false) 15 | }) 16 | 17 | it('Should not match a root path', () => { 18 | expect(isExternalLink('/My root path')).toBe(false) 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/links.ts: -------------------------------------------------------------------------------- 1 | // From http://urlregex.com 2 | const externalLinkMatch = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/ 3 | 4 | export function isExternalLink(link: string) { 5 | return link?.match(externalLinkMatch) != null 6 | } 7 | 8 | // Dead simple 9 | const rootLinkMatch = /^\/|\\/ 10 | export function isRootLink(link: string) { 11 | return link?.match(rootLinkMatch) 12 | } 13 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/markdownModel/index.ts: -------------------------------------------------------------------------------- 1 | export * as matches from './matches' 2 | export * from './parser' 3 | export * from './selection' 4 | 5 | import noteTypeset, { negativeInlineFormats } from './typewriterTypes' 6 | export { noteTypeset, negativeInlineFormats } 7 | 8 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/markdownModel/matches.ts: -------------------------------------------------------------------------------- 1 | // TODO: Remove 2 | export const horizontalRuleText = /^((- *){3,}|(\* *){3,}|(_ *){3,})$/ 3 | 4 | // TODO: provide a contextual wrapper of what this parses 5 | 6 | export const indentMatcher = /^\s*/ 7 | 8 | export function isWhitespace(char: string) { 9 | switch(char) { 10 | case '': 11 | return true 12 | case '\n': 13 | return true 14 | case ' ': 15 | return true 16 | case '\t': 17 | return true 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/platform.ts: -------------------------------------------------------------------------------- 1 | export const isMac = typeof global === 'undefined' ? 2 | navigator.userAgent.indexOf('Macintosh') !== -1 : 3 | process.platform === 'darwin' 4 | 5 | export const isWindows = typeof global === 'undefined' ? 6 | navigator.userAgent.indexOf('Windows') !== -1 : 7 | process.platform === "win32" 8 | 9 | export const isLinux = typeof global === 'undefined' ? 10 | navigator.userAgent.indexOf('Linux') !== -1 : 11 | (process.platform !== 'darwin' && process.platform !== 'win32') 12 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/plurals.ts: -------------------------------------------------------------------------------- 1 | export function pluralize(value: number, plural: string, single: string, none?: string) { 2 | if (value === 1) { 3 | return injectValue(single, value) 4 | } 5 | if (value === 0 && none) { 6 | return injectValue(none, value) 7 | } 8 | return injectValue(plural, value) 9 | } 10 | 11 | function injectValue(text: string, value) { 12 | // There is probably some convention I should follow, but I'm 13 | // not going searching for something I don't know how to find 14 | return text.replace('$$', value) 15 | } 16 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/queryModel/index.ts: -------------------------------------------------------------------------------- 1 | import { EditorRange } from '@typewriter/document' 2 | 3 | export function getInitialQuerySelection(text: string, previous: EditorRange = null): EditorRange | null { 4 | if (!text) return null 5 | 6 | let match = text.match(/^Notes with ['"]([^"']*)['"]$/di) 7 | if (match) { 8 | console.log(match) 9 | return (match as any).indices[1] 10 | } 11 | 12 | if (previous && previous[0] >= 0 && previous[0] <= text.length 13 | && previous[1] >= 0 && previous[1] <= text.length 14 | ) { 15 | return previous 16 | } 17 | 18 | return [text.length, text.length] 19 | } 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/settings/CardsLensSettings.ts: -------------------------------------------------------------------------------- 1 | import { ObjectStore } from 'common/stores' 2 | import type { SettingDefinition } from './Setting' 3 | import Setting from './Setting' 4 | import { NodeSortStore } from './Sorting' 5 | 6 | const showWordCountDefinition: SettingDefinition = { 7 | name: 'Show Word Count', 8 | defaultValue: true 9 | } 10 | 11 | export default class CardsLensSettings extends ObjectStore { 12 | sorting = new NodeSortStore() 13 | 14 | showWordCount = new Setting(showWordCountDefinition) 15 | 16 | constructor() { 17 | super() 18 | this.setupObservables() 19 | } 20 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/settings/ListLensSettings.ts: -------------------------------------------------------------------------------- 1 | import { ObjectStore } from 'common/stores'; 2 | import { NodeSortStore } from './Sorting'; 3 | 4 | export default class ListLensSettings extends ObjectStore { 5 | sorting = new NodeSortStore() 6 | 7 | constructor() { 8 | super() 9 | this.setupObservables() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/settings/Settings.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, test, expect } from 'vitest' 2 | 3 | import Settings from './Settings' 4 | import Setting from './Setting' 5 | 6 | describe('Setting serialization', () => { 7 | test('Setting does not send files for changes', () => { 8 | const setting = new Setting({ 9 | defaultValue: 'foo' 10 | }) 11 | 12 | expect(setting.value).toEqual('foo') 13 | expect(setting.getRawValues('file')).toBeUndefined() 14 | }) 15 | 16 | test('Settings do not store default values', () => { 17 | const settings = new Settings() 18 | const raw = settings.getRawValues('file') as any 19 | expect(raw?.updateChannel).toBeUndefined 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/settings/TagSettings.ts: -------------------------------------------------------------------------------- 1 | import { ObjectStore } from 'common/stores' 2 | 3 | export default class TagSettings extends ObjectStore { 4 | 5 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/settings/ZoomSetting.ts: -------------------------------------------------------------------------------- 1 | import Setting from "./Setting" 2 | 3 | export default class ZoomSetting extends Setting { 4 | applyWheelEvent(event: WheelEvent, sensitivity: number = .25) { 5 | let change = event.deltaY 6 | if (Math.abs(change) > 25) { 7 | // Assume this is a mouse wheel and clamp hard 8 | change *= 0.005 9 | } 10 | else { 11 | // Assume this is a trackpad and clamp less 12 | change *= 0.1 13 | } 14 | 15 | let newScale = this.value 16 | newScale -= (change * newScale) * sensitivity 17 | this.set(newScale) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/stats.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, test, expect } from 'vitest' 2 | 3 | import { percentRange } from './stats' 4 | 5 | describe('Percent Range', () => { 6 | test('Can find top quarter', () => { 7 | expect(percentRange([1, 2, 3, 4], .75, 1)).toEqual(4) 8 | }) 9 | test('Can find bottom quarter', () => { 10 | expect(percentRange([1, 2, 3, 4], 0, .25)).toEqual(1) 11 | }) 12 | test('Can find middle half', () => { 13 | expect(percentRange([1, 2, 3, 4], .25, .75)).toEqual(2.5) 14 | }) 15 | 16 | test('Can handle unsorted lists', () => { 17 | expect(percentRange([3, 2, 4, 1], .75, 1)).toEqual(4) 18 | }) 19 | }) 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/stats.ts: -------------------------------------------------------------------------------- 1 | export function mean(values: number[]) { 2 | return values.reduce((prev, next) => prev + next, 0) / values.length 3 | } 4 | 5 | export function percentRange(values: number[], lowerBound: number, upperBound: number) { 6 | const sortedNumbers = values.slice().sort((a, b) => a - b) 7 | const count = sortedNumbers.length 8 | 9 | const lowerIndex = Math.ceil(lowerBound * count) 10 | const higherIndex = Math.floor(upperBound * count) 11 | 12 | return mean(sortedNumbers.slice(lowerIndex, higherIndex)) 13 | } 14 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/stores/EventList.ts: -------------------------------------------------------------------------------- 1 | export function lazyInitializeSubscriptionList(target: any, key: string, handler: T) { 2 | if (!target[key]) target[key] = [] 3 | const list = target[key] 4 | 5 | list.push(handler) 6 | return () => { 7 | const index = list.indexOf(handler) 8 | if (index === list.length - 1) { 9 | list.pop() 10 | } 11 | else { 12 | const shift = list.pop() 13 | list[index] = shift 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/stores/Patchable.ts: -------------------------------------------------------------------------------- 1 | export type PatchObserver = (patch: any, reverse:any, source?: any) => void 2 | 3 | export interface Patchable { 4 | applyPatch(patch: any): boolean 5 | observePatch(observer: PatchObserver): () => void 6 | unobservePatch(observer: PatchObserver) 7 | } 8 | 9 | export namespace Patchable { 10 | export function isPatchable(obj: any): obj is Patchable { 11 | return obj 12 | && typeof obj.applyPatch === 'function' 13 | && typeof obj.observePatch === 'function' 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/stores/TranslatingPatcher.ts: -------------------------------------------------------------------------------- 1 | import { PatchableStore } from './PatchableStore' 2 | 3 | export class TranslatingPatcher extends PatchableStore { 4 | 5 | _translateFromPatch: (P) => T 6 | _translateToPatch: (T) => P 7 | 8 | constructor( 9 | value: T, 10 | fromPatch: (P) => T, 11 | toPatch: (T) => P 12 | ) 13 | { 14 | super(value) 15 | this._translateFromPatch = fromPatch 16 | this._translateToPatch = toPatch 17 | } 18 | 19 | protected convertFromPatch(patch) { 20 | return this._translateFromPatch(patch) 21 | } 22 | 23 | protected convertToPatch(value) { 24 | return this._translateToPatch(value) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/stores/ValidatingStore.ts: -------------------------------------------------------------------------------- 1 | import { WritableStore } from './WritableStore' 2 | 3 | export class ValidatingStore extends WritableStore { 4 | 5 | private validator: (value: T) => T 6 | 7 | constructor(value: T, validator: (value: T) => T) { 8 | super(value) 9 | this.validator = validator 10 | } 11 | 12 | get value() { return this._value } 13 | set value(value: T) { 14 | const validatedValue = this.validator(value) 15 | if (this._value !== validatedValue || validatedValue !== value) { 16 | const oldValue = this._value 17 | this._value = validatedValue 18 | this.onValueChanged(oldValue) 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/stores/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ReadableStore' 2 | export * from './WritableStore' 3 | export * from './ValidatingStore' 4 | export * from './CachingStore' 5 | export * from './ForwardingStore' 6 | export * from './SelfStore' 7 | export * from './ObjectStore' 8 | export * from './Patchable' 9 | export * from './PatchableList' 10 | export * from './PatchableMap' 11 | export * from './PatchableStore' 12 | export * from './StoreUndoStack' 13 | export * from './TranslatingPatcher' 14 | export * from './EventList' 15 | export * from './subscribeUntil' -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/trees/index.ts: -------------------------------------------------------------------------------- 1 | export * from './directory' 2 | export * from './directoryStore' 3 | export * from './treeReferences' 4 | 5 | import DirectoryStore from './directoryStore' 6 | 7 | export { 8 | DirectoryStore 9 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/common/urlData.ts: -------------------------------------------------------------------------------- 1 | import type { getLinkPreview } from 'link-preview-js' 2 | 3 | export type WebsiteData = { 4 | url: string 5 | title: string 6 | siteName: string 7 | description: string 8 | images: string[] 9 | mediaType: string 10 | contentType: string 11 | favicons: string[] 12 | } 13 | 14 | export type UrlDataError = { 15 | mediaType: 'error', 16 | message: string 17 | } 18 | 19 | export type UrlData = Awaited> | UrlDataError 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/main/Folder.ts: -------------------------------------------------------------------------------- 1 | import type { TreeNode } from 'common/trees' 2 | import WorkspaceTreeNode from "./WorkspaceTreeNode" 3 | 4 | export default class Folder extends WorkspaceTreeNode { 5 | 6 | children: TreeNode[] 7 | 8 | constructor(node: TreeNode) { 9 | super(node) 10 | this.children = node.children || [] 11 | } 12 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/main/WorkspaceTreeNode.ts: -------------------------------------------------------------------------------- 1 | import type { TreeNode } from 'common/trees' 2 | import type { IndexData } from 'common/indexing/indexTypes' 3 | 4 | export default class WorkspaceTreeNode implements TreeNode { 5 | path: string 6 | name: string 7 | fileType: string 8 | depth: number 9 | 10 | created: Date 11 | modified: Date 12 | 13 | meta: IndexData 14 | 15 | state: 'idle' | 'loaded' | 'deleted' 16 | 17 | constructor(node: TreeNode) { 18 | this.path = node.path 19 | this.name = node.name 20 | this.fileType = node.fileType 21 | this.depth = node.depth 22 | 23 | this.created = node.created 24 | this.modified = node.modified 25 | 26 | this.meta = node.meta 27 | 28 | this.state = 'idle' 29 | } 30 | 31 | onExternalChange() { 32 | // Implemented in children 33 | } 34 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/main/debugging.ts: -------------------------------------------------------------------------------- 1 | import Logger from 'js-logger' 2 | import { getSettings } from './settings' 3 | import { app, crashReporter } from 'electron' 4 | 5 | const log = Logger.get('debugging') 6 | 7 | export async function initializeDebugging() { 8 | log.info('Starting crash reporter') 9 | crashReporter.start({ 10 | submitURL: 'https://tangent.bugsplat.com/post/electron/crash.php', 11 | uploadToServer: true, // Override with settings later 12 | compress: true, 13 | ignoreSystemCrashHandler: false, 14 | rateLimit: false, 15 | globalExtra: { 16 | key: 'Tangent_' + app.getVersion() 17 | } 18 | }) 19 | 20 | getSettings().debug_sendCrashReports.subscribe(send => { 21 | log.info('Upload crashes to server:', send) 22 | crashReporter.setUploadToServer(send) 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/main/messages/dictionary.ts: -------------------------------------------------------------------------------- 1 | import { ipcMain } from 'electron' 2 | import Logger from 'js-logger' 3 | 4 | const log = Logger.get('dictionary') 5 | 6 | ipcMain.handle('dictionary', async (event, type, payload) => { 7 | try { 8 | switch (type) { 9 | case 'getAllWords': 10 | return event.sender.session.listWordsInSpellCheckerDictionary() 11 | case 'remove': 12 | return event.sender.session.removeWordFromSpellCheckerDictionary(payload) 13 | } 14 | } 15 | catch (err) { 16 | log.error(`Failed to parse dictionary message: ${type}, ${payload}`) 17 | } 18 | }) 19 | -------------------------------------------------------------------------------- /apps/tangent-electron/src/main/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "../__build", 4 | "sourceMap": true, 5 | "baseUrl": "../src", 6 | "lib": ["ESNext", "DOM"], 7 | "moduleResolution": "Node", 8 | "allowJs": true, 9 | "esModuleInterop": true, 10 | "target": "ESNext", 11 | "paths": { 12 | "main/*": ["../main/*"], 13 | "common/*": ["../common/*"] 14 | } 15 | }, 16 | "include": [ 17 | ".", 18 | "../common" 19 | ] 20 | } -------------------------------------------------------------------------------- /apps/tangent-electron/src/preload/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "../__build", 4 | "sourceMap": true, 5 | "baseUrl": "../src", 6 | "lib": ["ESNext", "DOM"], 7 | "types": ["jest"], 8 | "moduleResolution": "Node", 9 | "allowJs": true, 10 | "esModuleInterop": true, 11 | "target": "ESNext", 12 | "paths": { 13 | "main/*": ["../main/*"], 14 | "common/*": ["../common/*"] 15 | } 16 | }, 17 | "include": [ 18 | ".", 19 | "../common" 20 | ] 21 | } -------------------------------------------------------------------------------- /apps/tangent-electron/static/arrows.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/bigarrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/static/favicon.png -------------------------------------------------------------------------------- /apps/tangent-electron/static/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/mapNode.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/math.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This works on top of Katex, and is loaded in a shadow-dom element 3 | */ 4 | .error { 5 | color: red; 6 | 7 | .block & { 8 | display: block; 9 | max-width: 80%; 10 | margin-left: auto; 11 | margin-right: auto; 12 | } 13 | 14 | > span:last-child { 15 | font-family: 'FiraCode-Retina', FiraCode, Consolas, Menlo, Monaco, 'Courier New', monospace; 16 | 17 | .block & { 18 | display: block; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/opener.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/query.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/reset.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/t-checkbox.css: -------------------------------------------------------------------------------- 1 | :host { 2 | cursor: pointer; 3 | } 4 | 5 | svg { 6 | --boxStroke: var(--accentBackgroundColor); 7 | --boxFill: var(--accentBackgroundColor); 8 | --boxFillOpacity: 0; 9 | 10 | --checkStroke: white; 11 | --checkOpacity: 0; 12 | 13 | --cancelStroke: white; 14 | --cancelOpacity: 0; 15 | } 16 | 17 | :host(:hover) svg { 18 | --boxFillOpacity: .25; 19 | } 20 | 21 | :host([state="checked"]) svg { 22 | --boxFillOpacity: 1; 23 | --checkOpacity: 1; 24 | } 25 | :host([state="checked"]:hover) svg { 26 | --boxFillOpacity: .75; 27 | } 28 | 29 | :host([state="canceled"]) svg { 30 | --boxFillOpacity: 1; 31 | --boxFill: #666; 32 | --boxStroke: #666; 33 | --cancelOpacity: 1; 34 | } 35 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/tag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/tangent_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/apps/tangent-electron/static/tangent_256.png -------------------------------------------------------------------------------- /apps/tangent-electron/static/thread.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/tangent-electron/static/update.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /apps/tangent-electron/svelte.config.js: -------------------------------------------------------------------------------- 1 | const SveltePreprocess = require('svelte-preprocess'); 2 | 3 | module.exports = { 4 | preprocess: SveltePreprocess({ 5 | scss: { 6 | silenceDeprecations: ['legacy-js-api'] 7 | } 8 | }) 9 | }; -------------------------------------------------------------------------------- /apps/tangent-electron/tests-integration/TangentApp.ts: -------------------------------------------------------------------------------- 1 | import type { ElectronApplication } from '@playwright/test' 2 | import TangentWindow from './TangentWindow' 3 | 4 | export default class TangentApp { 5 | 6 | app: ElectronApplication 7 | workspacePath: string 8 | 9 | constructor(app: ElectronApplication, workspace: string) { 10 | this.app = app 11 | this.workspacePath = workspace 12 | } 13 | 14 | async firstWindow(waitForReady=true) { 15 | const window = await this.app.firstWindow() 16 | const tangentWindow = new TangentWindow(this, window) 17 | 18 | if (waitForReady) { 19 | await tangentWindow.waitForReady() 20 | } 21 | 22 | return tangentWindow 23 | } 24 | 25 | close() { 26 | return this.app.close() 27 | } 28 | } -------------------------------------------------------------------------------- /apps/tangent-electron/tests-integration/keyboard.ts: -------------------------------------------------------------------------------- 1 | import type { Keyboard } from 'playwright' 2 | import { isMac } from '../src/common/platform' 3 | 4 | const modReplacement = isMac ? 'Meta' : 'Control' 5 | 6 | export function shortcut(keyboard: Keyboard, combo: string) { 7 | return keyboard.press(combo.replace(/Mod/ig, modReplacement)) 8 | } 9 | -------------------------------------------------------------------------------- /apps/tangent-electron/tests-integration/screenshots/command-palette.screenshot.ts: -------------------------------------------------------------------------------- 1 | import { test, wait } from '../tangent' 2 | import { prepForScreenshots, screenshot } from './screenshots' 3 | 4 | test('Command Palette', async ({ tangent }) => { 5 | const window = await tangent.firstWindow() 6 | await prepForScreenshots(window, { sizeScale: 1.5 }) 7 | 8 | await window.setFocusLevel(0) // Thread 9 | 10 | await window.setThread({ 11 | paths: [ 12 | 'Some Thoughts.md' 13 | ] 14 | }) 15 | 16 | await window.shortcut('Mod+P') 17 | await window.keyboard.press('p') 18 | 19 | await wait(500) 20 | 21 | await screenshot(window, { 22 | path: 'command-palette' 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /apps/tangent-electron/tests-integration/screenshots/markdown-syntax.screenshot.ts: -------------------------------------------------------------------------------- 1 | import { test, wait } from '../tangent' 2 | import { prepForScreenshots, screenshot } from './screenshots' 3 | 4 | test('Markdown Syntax', async ({ tangent }) => { 5 | const window = await tangent.firstWindow() 6 | await prepForScreenshots(window) 7 | 8 | await window.setFocusLevel(0) // Thread 9 | 10 | await window.setThread({ 11 | paths: [ 12 | 'Some Thoughts.md' 13 | ] 14 | }) 15 | 16 | await wait(500) 17 | 18 | await window.keyboard.press('ArrowDown') 19 | 20 | await screenshot(window, { 21 | path: 'markdown-syntax' 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /apps/tangent-electron/tests-integration/screenshots/queries.screenshot.ts: -------------------------------------------------------------------------------- 1 | import { test, wait } from '../tangent' 2 | import { prepForScreenshots, screenshot } from './screenshots' 3 | 4 | test('Queries', async ({ tangent }) => { 5 | const window = await tangent.firstWindow() 6 | await prepForScreenshots(window, { sizeScale: 1 }) 7 | 8 | await window.setFocusLevel(0) // Thread 9 | 10 | await window.setThread({ 11 | paths: [ 12 | 'Status.tangentquery' 13 | ] 14 | }) 15 | 16 | await wait(500) 17 | 18 | await screenshot(window, { 19 | path: 'queries' 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /apps/tangent-electron/tests-integration/screenshots/todo-tag.screenshot.ts: -------------------------------------------------------------------------------- 1 | import { test, wait } from '../tangent' 2 | import { prepForScreenshots, screenshot } from './screenshots' 3 | 4 | test('Todo and Tags', async ({ tangent }) => { 5 | const window = await tangent.firstWindow() 6 | await prepForScreenshots(window, { sizeScale: 1 }) 7 | 8 | await window.setFocusLevel(0) // Thread 9 | 10 | await window.setThread({ 11 | paths: [ 12 | 'Stories/Add User Feedback Portal.md' 13 | ] 14 | }) 15 | 16 | await wait(500) 17 | 18 | await screenshot(window, { 19 | path: 'todo-tag' 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /apps/tangent-electron/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/svelte/tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "__build", 5 | "sourceMap": true, 6 | "baseUrl": "src", 7 | "paths": { 8 | "svelte/*": ["../node_modules/svelte/src/runtime/*"] 9 | }, 10 | "target": "ES2022", 11 | "lib": ["ESNext", "DOM"], 12 | "types": ["svelte"], 13 | "moduleResolution": "Node", 14 | "allowJs": true, 15 | "esModuleInterop": true, 16 | "strict": false, 17 | "verbatimModuleSyntax": false 18 | }, 19 | "exclude": [ "__build", "node_modules", "out" ] 20 | } 21 | -------------------------------------------------------------------------------- /apps/tangent-electron/tsconfig.main.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/svelte/tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "__build", 5 | "sourceMap": true, 6 | "baseUrl": "src", 7 | "paths": { 8 | 9 | }, 10 | "module": "CommonJS", 11 | "lib": ["ESNext", "DOM"] 12 | }, 13 | "exclude": [ "__build", "node_modules", "out", "src/app" ] 14 | } 15 | -------------------------------------------------------------------------------- /apps/tangent-electron/vitest.config.integration.mts: -------------------------------------------------------------------------------- 1 | import { defineProject, mergeConfig } from 'vitest/config' 2 | import sharedConfig from './vitest.shared.mjs' 3 | 4 | export default mergeConfig( 5 | sharedConfig, 6 | defineProject({ 7 | test: { 8 | name: 'tangent-electron-integration', 9 | environment: 'node', 10 | include: [ 11 | 'src/main/**/*.integration-test.[jt]s' 12 | ], 13 | maxConcurrency: 1 14 | }, 15 | }) 16 | ) 17 | 18 | -------------------------------------------------------------------------------- /apps/tangent-electron/vitest.config.unit-core.mts: -------------------------------------------------------------------------------- 1 | import { defineProject, mergeConfig } from 'vitest/config' 2 | import sharedConfig from './vitest.shared.mjs' 3 | 4 | export default mergeConfig( 5 | sharedConfig, 6 | defineProject({ 7 | test: { 8 | name: 'tangent-electron-unit-core', 9 | environment: 'node', 10 | include: [ 11 | 'src/{main,common}/**/*.test.[jt]s' 12 | ] 13 | }, 14 | }) 15 | ) 16 | 17 | -------------------------------------------------------------------------------- /apps/tangent-electron/vitest.shared.mts: -------------------------------------------------------------------------------- 1 | import { defineProject } from 'vitest/config' 2 | import tsconfigPaths from 'vite-tsconfig-paths' 3 | 4 | export default defineProject({ 5 | test: { 6 | server: { 7 | deps: { 8 | // Typewriter has weird ESM export issues 9 | inline: [ 10 | /@typewriter\/(document|delta)/, 11 | /@such-n-such/ 12 | ] 13 | } 14 | } 15 | }, 16 | plugins: [ 17 | tsconfigPaths() 18 | ] 19 | }) 20 | -------------------------------------------------------------------------------- /apps/tangent-electron/vitest.workspace.mts: -------------------------------------------------------------------------------- 1 | export default [ 2 | 'vitest.config.*' 3 | ] 4 | -------------------------------------------------------------------------------- /apps/tangent-test-workspace-generator/README.md: -------------------------------------------------------------------------------- 1 | # Tangent Test Workspace Generator 2 | A simple CLI tool for generating test notes for the Tangent project. 3 | 4 | Run with `npx ts-node src/index.ts` and any arguments. -------------------------------------------------------------------------------- /apps/tangent-test-workspace-generator/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tangent-test-workspace-generator", 3 | "version": "0.0.1", 4 | "description": "A package that will generate test workspaces for Tangent.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest" 8 | }, 9 | "author": "Taylor Hadden", 10 | "license": "MIT", 11 | "dependencies": { 12 | "lorem-ipsum": "^2.0.8", 13 | "ts-node": "^10.9.1", 14 | "yargs": "^17.7.1" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apps/tangent-test-workspace-generator/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "dist", 4 | "target": "ESNext", 5 | "moduleResolution": "node", 6 | "esModuleInterop": true, 7 | "allowJs": true 8 | } 9 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tangent-public", 3 | "version": "0.1.0", 4 | "description": "The Tangent Project's monorepo", 5 | "repository": "https://github.com/suchnsuch/tangent-public", 6 | "type": "module", 7 | "scripts": { 8 | "test": "npm run test --workspaces --if-present", 9 | "build": "npm run build --workspaces --if-present" 10 | }, 11 | "author": "Taylor Hadden", 12 | "license": "Apache-2.0", 13 | "workspaces": [ 14 | "lib/typewriter", 15 | "packages/tangent-query-parser", 16 | "packages/tangent-html-to-markdown", 17 | "apps/tangent-electron", 18 | "apps/tangent-test-workspace-generator" 19 | ], 20 | "devDependencies": { 21 | "@vitest/browser": "^3.1.4", 22 | "vitest": "^3.1.4" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /packages/tangent-html-to-markdown/.gitignore: -------------------------------------------------------------------------------- 1 | .tangentfolder -------------------------------------------------------------------------------- /packages/tangent-html-to-markdown/jest.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | transform: { 3 | '^.+\\.(t|j)sx?$': 'ts-jest' 4 | }, 5 | transformIgnorePatterns: [ 6 | "node\_modules/(?!(@such-n-such))" 7 | ], 8 | testEnvironment: 'jsdom', 9 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$' 10 | }; -------------------------------------------------------------------------------- /packages/tangent-html-to-markdown/tests/google-docs-copy-test.md: -------------------------------------------------------------------------------- 1 | # This Is A Header 2 | Here is a paragraph under the header. 3 | This line should be right under that previous line. 4 | 5 | This line should have a break above it. 6 | 7 | This line should also have a break above it; the previous paragraph had space below. 8 | 9 | This line should _also_ have a break; it has space above. 10 | * This should be a list 11 | * The list should be right under the paragraph 12 | * More list 13 | 14 | This should be a paragraph broken up from the list. 15 | 16 | ## This is an H2 Header 17 | This is some more text under that header. 18 | 19 | -------------------------------------------------------------------------------- /packages/tangent-html-to-markdown/tests/google-sheets-copy-test.md: -------------------------------------------------------------------------------- 1 | 1 Test 2 | 2 Foo 3 | 3 Boom 4 | 4 Clang 5 | 6 | 5 Bam -------------------------------------------------------------------------------- /packages/tangent-html-to-markdown/tests/raw-test.html: -------------------------------------------------------------------------------- 1 |

This is an h1 header

2 | 3 | 4 |

This is a paragraph. It should be right under the header.

5 |

This paragraph should be spaced out from the paragraph above.

6 | 7 |

8 | This paragraph has bold and italic text. 9 | Also a link. 10 |

-------------------------------------------------------------------------------- /packages/tangent-html-to-markdown/tests/raw-test.md: -------------------------------------------------------------------------------- 1 | # This is an h1 header 2 | This is a paragraph. It should be right under the header. 3 | 4 | This paragraph should be spaced out from the paragraph above. 5 | 6 | This paragraph has **bold** and _italic_ text. Also a [link](google.com). -------------------------------------------------------------------------------- /packages/tangent-html-to-markdown/tests/textedit-copy-test.md: -------------------------------------------------------------------------------- 1 | **This is a test** 2 | 3 | And this is something else 4 | 5 | And something else still. -------------------------------------------------------------------------------- /packages/tangent-html-to-markdown/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src/**/*"], 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "outDir": "lib", 6 | "target": "ESNext", 7 | "moduleResolution": "node", 8 | "esModuleInterop": true, 9 | "types": ["node", "jest"], 10 | 11 | "sourceMap": true, 12 | "declaration": true, 13 | "declarationMap": true 14 | } 15 | } -------------------------------------------------------------------------------- /packages/tangent-html-to-markdown/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "lib", 4 | "target": "ESNext", 5 | "moduleResolution": "node", 6 | "esModuleInterop": true, 7 | "allowJs": true, 8 | "types": ["node", "jest"] 9 | } 10 | } -------------------------------------------------------------------------------- /packages/tangent-query-parser/README.md: -------------------------------------------------------------------------------- 1 | # Tangent Query Parser 2 | An parser implementation for the Tangent Query language. 3 | -------------------------------------------------------------------------------- /packages/tangent-query-parser/jest.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | transform: { 3 | '^.+\\.(t|j)sx?$': 'ts-jest' 4 | }, 5 | transformIgnorePatterns: [ 6 | "node\_modules/(?!(@such-n-such))" 7 | ], 8 | testEnvironment: 'node', 9 | testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$' 10 | }; -------------------------------------------------------------------------------- /packages/tangent-query-parser/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './types' 2 | export * from './parser' 3 | export * from './utils' 4 | export * from './tags' 5 | -------------------------------------------------------------------------------- /packages/tangent-query-parser/src/tags.ts: -------------------------------------------------------------------------------- 1 | export const tagNameSeperatorMatch = /[\.\/]/ 2 | 3 | export function tokenizeTagName(name: string) { 4 | return name.split(tagNameSeperatorMatch) 5 | } 6 | 7 | export function tagContainsTag(containingTagNames: string[], testingTagNames: string[]) { 8 | if (containingTagNames === testingTagNames) return true 9 | if (containingTagNames.length > testingTagNames.length) return false 10 | 11 | for (let i = 0; i < containingTagNames.length; i++) { 12 | if (containingTagNames[i] !== testingTagNames[i]) return false 13 | } 14 | return true 15 | } 16 | -------------------------------------------------------------------------------- /packages/tangent-query-parser/src/utils.ts: -------------------------------------------------------------------------------- 1 | import { last } from '@such-n-such/core' 2 | import type { IToken } from 'vscode-textmate' 3 | import type { QueryParseResult } from './parser' 4 | 5 | export function getTokenIndex(source: QueryParseResult | IToken[], textPosition: number) { 6 | const tokens = Array.isArray(source) ? source : source.tokens 7 | 8 | for (let tokenIndex = 0; tokenIndex < tokens.length; tokenIndex++) { 9 | const token = tokens[tokenIndex] 10 | if (token.startIndex <= textPosition && token.endIndex > textPosition) { 11 | return tokenIndex 12 | } 13 | } 14 | if (textPosition === last(tokens).endIndex) { 15 | return tokens.length - 1 16 | } 17 | return -1 18 | } 19 | -------------------------------------------------------------------------------- /packages/tangent-query-parser/tests/tags.test.tqr: -------------------------------------------------------------------------------- 1 | // SYNTAX TEST "source.tangentquery" 2 | 3 | Notes with #my-tag#badtag 4 | // <~- keyword.other.form 5 | // ^^^^ keyword.other.clause 6 | // ^ punctuation.definition.tag 7 | // ^^^^^^^ string.tag 8 | // ^^^^^^^ - string.tag -------------------------------------------------------------------------------- /packages/tangent-query-parser/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src/**/*"], 3 | "compilerOptions": { 4 | "rootDir": "src", 5 | "outDir": "lib", 6 | "target": "ESNext", 7 | "moduleResolution": "node", 8 | "esModuleInterop": true, 9 | "types": ["node", "jest"], 10 | 11 | "sourceMap": true, 12 | "declaration": true, 13 | "declarationMap": true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/tangent-query-parser/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "dist", 4 | "target": "ESNext", 5 | "moduleResolution": "node", 6 | "esModuleInterop": true, 7 | "allowJs": true, 8 | "types": ["node", "jest"] 9 | } 10 | } -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/.tangent/workspace-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "creationRules": [ 4 | { 5 | "name": "📥 Inbox Note", 6 | "nameTemplate": "%name%", 7 | "folder": "Inbox", 8 | "description": "Creates a new note for quickly capturing thoughts that are not yet completely formed." 9 | }, 10 | { 11 | "name": "📆 Daily Note", 12 | "nameTemplate": "%YYYY%-%MM%-%DD%", 13 | "folder": "Log", 14 | "mode": "createOrOpen", 15 | "description": "Creates or opens a timestamped note for the current day for journaling and quickly jotting down quick thoughts." 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/A Folder/.tangentfolder: -------------------------------------------------------------------------------- 1 | { 2 | "displayMode": "Cards" 3 | } -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/A Folder/A Subfolder/Note in Subfolder.md: -------------------------------------------------------------------------------- 1 | This note is in a subfolder. 2 | -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/A Folder/Note in A Folder 1.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/test-files/QueryTestWorkspace/A Folder/Note in A Folder 1.md -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/A Folder/Note in A Folder 2.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/test-files/QueryTestWorkspace/A Folder/Note in A Folder 2.md -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/A Folder/Note in A Folder 3.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/test-files/QueryTestWorkspace/A Folder/Note in A Folder 3.md -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/A Multi Link Note.md: -------------------------------------------------------------------------------- 1 | This links to [[A Note to Link To]] and [[Another Note to Link To]] -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/A Note to Link To.md: -------------------------------------------------------------------------------- 1 | This is a note that can be linked to. -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Another Folder/.tangentfolder: -------------------------------------------------------------------------------- 1 | { 2 | "displayMode": "Cards" 3 | } -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Another Folder/Note in Another Folder 1.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/test-files/QueryTestWorkspace/Another Folder/Note in Another Folder 1.md -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Another Folder/Note in Another Folder 2.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/test-files/QueryTestWorkspace/Another Folder/Note in Another Folder 2.md -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Another Link Note.md: -------------------------------------------------------------------------------- 1 | This note also links to [[A Note to Link To]]. -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Another Note to Link To.md: -------------------------------------------------------------------------------- 1 | This is a note to link to. -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Note With Links.md: -------------------------------------------------------------------------------- 1 | This note links to [[A Note to Link To]]. -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Note With Tag.md: -------------------------------------------------------------------------------- 1 | This note has a #test-tag 2 | -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Note with Keyword.md: -------------------------------------------------------------------------------- 1 | This note contains Zaboomaphoo. 2 | 3 | This note contains Zabomaphoo. -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Notes Named Folder.tangentquery: -------------------------------------------------------------------------------- 1 | { 2 | "queryString": "Notes named /Folder.*\\d/" 3 | } -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Tags/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Tags/Deep Child Tags.md: -------------------------------------------------------------------------------- 1 | #deep/tag/hierarchy/that/goes/forever/wow -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Tags/Note With Child A.md: -------------------------------------------------------------------------------- 1 | This is tagged with #parent/child-a -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Tags/Note With Child B.md: -------------------------------------------------------------------------------- 1 | This is tagged with #parent.child-b 2 | -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Tags/Note With Parent.md: -------------------------------------------------------------------------------- 1 | This has a #parent tag. -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Todos/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Todos/Note With Canceled Todos.md: -------------------------------------------------------------------------------- 1 | - [-] A canceled todo -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Todos/Note With Closed Todos.md: -------------------------------------------------------------------------------- 1 | This note 2 | 3 | - [x] Only has 4 | - [x] Closed todos -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Todos/Note With Mixed Todos.md: -------------------------------------------------------------------------------- 1 | This note has: 2 | 3 | - [ ] Incomplete todos 4 | - [x] and completed ones -------------------------------------------------------------------------------- /test-files/QueryTestWorkspace/Todos/Note With Open Todos.md: -------------------------------------------------------------------------------- 1 | This note 2 | - [ ] Only has 3 | - [ ] Open Todos -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/.tangent/workspace-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "creationRules": [ 4 | { 5 | "name": "📥 Inbox Note", 6 | "nameTemplate": "%name%", 7 | "folder": "Inbox", 8 | "description": "Creates a new note for quickly capturing thoughts that are not yet completely formed." 9 | }, 10 | { 11 | "name": "📆 Daily Note", 12 | "nameTemplate": "%YYYY%/%MM%-%Month%/%YYYY%-%MM%-%DD%", 13 | "folder": "Log", 14 | "mode": "createOrOpen", 15 | "description": "Creates or opens a timestamped note for the current day for journaling and quickly jotting down quick thoughts.", 16 | "openInContext": "Log" 17 | } 18 | ], 19 | "styleFiles": [] 20 | } -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Anat.md: -------------------------------------------------------------------------------- 1 | Nicole's character. A Hound and former [[Spirit Warden]]. Her right arm is just bones, but somehow manages to work just fine. Naturally, known as "Bones". Doesn't like the name. 2 | 3 | Her hunting cat, [[Bombay]] is a faithful and near-constant companion. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Arvo Daltless.md: -------------------------------------------------------------------------------- 1 | Trick's character. A Whisper of mysterious origin. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Bastion.md: -------------------------------------------------------------------------------- 1 | Curtis' character. A Lurk and general master thief. Quite good at cracking locks. 2 | 3 | He frequents [[The Docks]], keeping up with the comings and goings of [[Captain Elshvader]]. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Captain Elshvader.md: -------------------------------------------------------------------------------- 1 | The captain of [[The Windswept]]. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Kaisik Fogmoon.md: -------------------------------------------------------------------------------- 1 | A vampire who initially possessed the body of [[Reginald Pinkerworthy]]'s butler. He had been planning (along with his underlings [[Boxer]] and [[Derby]]) to transfer himself into Reginald's body instead. A chance encounter with [[The Sunken]] ended up accelerating those plans somewhat, though the loss of Reginald's house means that his plans have been temporarily dashed… -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Laroze.md: -------------------------------------------------------------------------------- 1 | A low-ranking inspector in [[The Bluecoats]]. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Log/.tangentfolder: -------------------------------------------------------------------------------- 1 | { 2 | "displayMode": "Feed", 3 | "feed": { 4 | "startAt": "end" 5 | } 6 | } -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Log/2023/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Log/2023/10-October/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Log/2023/10-October/2023-10-22.md: -------------------------------------------------------------------------------- 1 | [[The Sunken]] meets for the first time. The crew establishes itself in [[The Docks]]. 2 | 3 | They end up paying [[The Wraiths]] for access to [[The Silkshore]]. They also somewhat endear themselves to [[The Docks]] to steal a boat from [[The Gondoliers]]. 4 | 5 | In their first heist, they end up semi-fumbling their way through stealing the payroll box of [[The Gondoliers]]. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/Naria Helles.md: -------------------------------------------------------------------------------- 1 | Elke's character. A noble fallen on hard times, now a Slide of the underworld. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Blades/The Sunken.md: -------------------------------------------------------------------------------- 1 | A "Shadows" Crew. 2 | 3 | Lair is a run-aground freighter ship in [[The Docks]]. 4 | Hunting Ground (Burglary) is in [[The Silkshore]]. 5 | 6 | Has a known [[The Bluecoats|Bluecoat]] contact: [[Laroze]]. 7 | 8 | Consists Of: 9 | - [[Anat]] (Nicole) – A Hound, with [[Bombay]], the Ghost Hunter hunting pet. 10 | - [[Arvo Daltless]] (Trick) – A Whisper 11 | - [[Naria Helles]] (Elke) – A Slide 12 | - [[Bastion]] (Curtis) – A Lurk -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Derrick Marshal.md: -------------------------------------------------------------------------------- 1 | Vice President of [[Demo Corp]]. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Expressing Thoughts is Difficult.md: -------------------------------------------------------------------------------- 1 | Thoughts can be a hard enough thing to nail down within your own head. When trying to translate them from your head to another, the difficulty is compounded. 2 | 3 | This is the essence of communication. One of the key aphorisms of communication education is to "repeat what you hear back". On the face of it, it seems ridiculous—nobody talks like that. However, this is truly a critical component of communication. [[Language is Serialized Data]]. [[Speak in TCP, Not UDP]]. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Language is Serialized Data.md: -------------------------------------------------------------------------------- 1 | Just in the way that you can serialize complex models from a computer to JSON or XML and share them, human language serializes the complex structures and relationships within one mind and attempts to carry them over to another. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/.tangentfolder: -------------------------------------------------------------------------------- 1 | { 2 | "displayMode": "Feed", 3 | "feed": { 4 | "startAt": "end" 5 | } 6 | } -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/02-February/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/02-February/2023-02-05.md: -------------------------------------------------------------------------------- 1 | Today marks the kickoff of [[Project Zebra]]. The team is excited to get started. It's the largest project we've ever taken on. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/05-May/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/05-May/2023-05-17.md: -------------------------------------------------------------------------------- 1 | There have been some concerns with the progress of [[Project Zebra]]. On a technical level, the project is forming a strong foundation. However, the client has voiced concern that we don't have enough velocity to close out on time. I will reach out to [[Derrick Marshal]] to try and get some visibility and seed some options. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/05-May/2023-05-19.md: -------------------------------------------------------------------------------- 1 | I spoke with [[Derrick Marshal]] about [[Project Zebra]]. Given that the client represents a significant portion of our current business, he's given the green light to move additional people onto the project. 2 | 3 | The team will be roughly doubling in size (if not more). We're going to have to change up our communication structure. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/06-June/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/06-June/2023-06-14.md: -------------------------------------------------------------------------------- 1 | After the past several weeks of onboarding our additional team members onto [[Project Zebra]], I think we've proven we're in a good place. We're definitely still behind, but our velocity looks like it's trending in the right direction. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/08-August/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/08-August/2023-08-16.md: -------------------------------------------------------------------------------- 1 | It's official, [[Project Zebra]] has crossed over to on-time! -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/11-November/2023-11-10.md: -------------------------------------------------------------------------------- 1 | Morbi in fringilla orci. Vestibulum cursus sed leo accumsan dapibus. Phasellus volutpat justo tincidunt, rutrum magna eu, finibus ante. 2 | 3 | Aenean eget maximus velit, non feugiat sem. Vivamus vulputate sit amet enim nec sagittis. Proin nec felis eu est dapibus mollis ut vel risus. Integer efficitur mi quis ex hendrerit, ut laoreet libero vestibulum. Maecenas tincidunt volutpat tempor. Maecenas eu dui nisl. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/11-November/2023-11-12.md: -------------------------------------------------------------------------------- 1 | Etiam a velit at erat egestas placerat: 2 | * Ut sed suscipit tellus, at congue arcu. 3 | * Lorem ipsum dolor sit amet, consectetur adipiscing elit. 4 | - Nulla libero lorem, laoreet vitae laoreet ut, eleifend viverra magna. 5 | - Phasellus interdum molestie ligula, at venenatis enim rutrum sed. 6 | * Mauris ac massa et lacus molestie faucibus ac non augue. Quisque ultrices ligula nec ligula lacinia viverra. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/11-November/2023-11-15.md: -------------------------------------------------------------------------------- 1 | It really is incredible how [[Threads Record the Context of Thought]]. While in the process of thinking about one thing, I can jump to a new, adjacent thought, quickly jot down whatever I need, and move on. [[Sliding Panels]] means my thought process can move up and down the thread easily. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/11-November/2023-11-18.md: -------------------------------------------------------------------------------- 1 | I've been preparing a presentation on [[Project Zebra]] these past few days to show to [[Derrick Marshal]] and the rest of upper management. I want to highlight: 2 | * Our team has pulled off some incredible feature velocity. 3 | * The design quality bar is the highest we've achieved so far as a company. 4 | * User focus groups have been going well. We're getting a lot of positive responses and quite a bit of useful feedback. 5 | 6 | I do think we need to strengthen our QA practices. We have an _okay_ automated testing suite, but it's not hitting every aspect of the experience. We either need to invest more in hitting the more ephemeral aspects of the user experience with automated tests or we need to expand our QA department. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Log/2023/11-November/2023-11-20.md: -------------------------------------------------------------------------------- 1 | [[Project Zebra]] continues apace. With the final snarls removed, we're going to have no issue closing it out in the next month. I have a progress report meeting with [[Derrick Marshal]] tomorrow. I expect this news will go over great. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Manuscript/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Project Zebra.md: -------------------------------------------------------------------------------- 1 | **Zebra** is the biggest project our team has taken on to date. It encompasses three departments across five disciplines. The client is easily the largest and most influential one we've worked with so far. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Speak in TCP, Not UDP.md: -------------------------------------------------------------------------------- 1 | [[Language is Serialized Data]]. If you just send off that data and never get anything back in confirmation, you never know if you actually delivered your information. When you're talking about something complex, this can quickly become a serious problem. 2 | 3 | If your conversational partner can express back the same concepts to you with new language, you can be extremely confident that the concepts actually unfolded into their mind in the way you intended. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Status.tangentquery: -------------------------------------------------------------------------------- 1 | { 2 | "queryString": "Notes with #status and Open Todos" 3 | } -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Stories/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Stories/Add User Feedback Portal.md: -------------------------------------------------------------------------------- 1 | #status/in-progress 2 | 3 | [[Derrick Marshal]] wants users to be able to easily send us feedback. 4 | 5 | * [x] Integrate feedback form into UI. 6 | * [ ] Add route to take in feedback. 7 | * [ ] Create admin page to provide an overview. -------------------------------------------------------------------------------- /test-files/ScreenshotWorkspace/My Workspace/Writing is Crystalization.md: -------------------------------------------------------------------------------- 1 | Thoughts in a pure form can be [[Expressing Thoughts is Difficult|difficult to express]]. They can be a vague feeling that shifts underneath you as you poke and prod it. 2 | 3 | By actually forcing a thought out into written words, you force it to collapse into a steady state. From there, you can examine it without it changing on you. From there, you can see if what you have written down truly matches the veiled creature in your head. -------------------------------------------------------------------------------- /test-files/TestWorkspace/.hiddenfolder/fileinhiddenfolder.md: -------------------------------------------------------------------------------- 1 | This is a file in a hidden folder. 2 | 3 | [[Virtual Link from a hidden folder]] -> Should not resolve. 4 | #Tag_In_Hidden_Folder -> Should not resolve either. -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/styles/test.css: -------------------------------------------------------------------------------- 1 | /* A test of custom styles in Tangent */ 2 | body { 3 | --textColor: green; 4 | } 5 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/styles/test2.css: -------------------------------------------------------------------------------- 1 | /* A test of custom styles in Tangent */ 2 | .note { 3 | color: red; 4 | } 5 | article.note h1.line { 6 | font-size: 400%; 7 | color: blue; 8 | } 9 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/tags/SomeTagWithCapitals.taginfo: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/tags/Soon™.taginfo: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/tags/front-matter-tag.taginfo: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/tags/tag.taginfo: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/tags/tags.taginfo: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/tags/tags.with-seperators.taginfo: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/tags/tags.with-things.taginfo: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/tags/❄️.taginfo: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/.tangent/tags/❤️.taginfo: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/A Folder/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/A Folder/Same Name.md: -------------------------------------------------------------------------------- 1 | This is a file with the same name as other files. This one is in `A Folder` -------------------------------------------------------------------------------- /test-files/TestWorkspace/A Folder/Subfolder/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/A Folder/Subfolder/A File In a Folder.md: -------------------------------------------------------------------------------- 1 | I made a new thing. This is pretty cool. I can *definitely* feel the extra latency vs just typing. -------------------------------------------------------------------------------- /test-files/TestWorkspace/A Folder/Subfolder/Same Name.md: -------------------------------------------------------------------------------- 1 | This is a file with the same name as other files. This one is in `A Folder/Subfolder` -------------------------------------------------------------------------------- /test-files/TestWorkspace/A Folder/Subfolder/Subfile.md: -------------------------------------------------------------------------------- 1 | # A further sub folder! 2 | My, it just keeps on going, doesn't it? 3 | 4 | [[A Folder/A File In a Folder]] 5 | 6 | [[A Folder/Subfolder/A File In a Folder]] 7 | 8 | [[Test File The Second]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/An MDX file.mdx: -------------------------------------------------------------------------------- 1 | # This is an MDX file 2 | It uses the [MDX](https://mdxjs.com) file format. 3 | 4 | In __Tangent__, MDX files should be treated just like MD files, at least for now. 5 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Attachments/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Attachments/Pasted on 2021-11-01 at 14.58.47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/test-files/TestWorkspace/Attachments/Pasted on 2021-11-01 at 14.58.47.png -------------------------------------------------------------------------------- /test-files/TestWorkspace/Attachments/Pasted on 2021-11-01 at 16.39.06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/test-files/TestWorkspace/Attachments/Pasted on 2021-11-01 at 16.39.06.png -------------------------------------------------------------------------------- /test-files/TestWorkspace/I want mindmaps.md: -------------------------------------------------------------------------------- 1 | This is a paragraph. 2 | This is some other paragraph. 3 | 4 | [[Subfile]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/Inbox/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/A Note Name.md: -------------------------------------------------------------------------------- 1 | This is a note with some content. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/A Note Name/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/A Note Name/Ambiguous.md: -------------------------------------------------------------------------------- 1 | This note is _also_ ambiguous. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/A Note Name/Content.md: -------------------------------------------------------------------------------- 1 | This folder has some information related to [[A Note Name]]. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/A folder with emoji 😊/A file with emoji 👌.md: -------------------------------------------------------------------------------- 1 | THis file has emoji in its filename. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/A very long folder name that is a pain in the butt/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/A very long folder name that is a pain in the butt/Some long name for a file–very long.md: -------------------------------------------------------------------------------- 1 | Here is your damned file. ![[Test Image]] 2 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/External & Local Links.md: -------------------------------------------------------------------------------- 1 | I should be able to link [to some folder on my computer](../../../Documentation) 2 | 3 | I should be able to link [to some file on my computer](../../../Documentation/Getting Started.md) 4 | 5 | Trying to link to [something that doesn't exist](../../Nothing) should present an error. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Indent Everything/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Indent Everything/Indented Blockquotes.md: -------------------------------------------------------------------------------- 1 | Quotes should be indentable 2 | indent 3 | > My indented quote 4 | > Is two lines long, with the second one being quite long. Gotta hit the wrapping mark. 5 | > And this should be not indented -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Indent Everything/Indented Code.md: -------------------------------------------------------------------------------- 1 | Code should be able to be indented. 2 | Indent 3 | 4 | ```js 5 | function SomeFunction() { return 1.0; } // and this goes off the page for quite a while. 6 | 7 | function thing() { 8 | var some = 'test' 9 | } 10 | 11 | ``` 12 | And this should be text again -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Indent Everything/Indented HR.md: -------------------------------------------------------------------------------- 1 | I should be able to indent horizontal rules: 2 | Indent 3 | --- 4 | And more text -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Indent Everything/Indented Headers.md: -------------------------------------------------------------------------------- 1 | # Headers Should be Indentable and wrap around the edge 2 | And content below should follow that indent. 3 | 4 | ## This is Another Header 5 | Text 6 | 7 | ### And Another 8 | Text 9 | 10 | #### And Another 11 | Text 12 | 13 | ##### And Another 14 | And Some Text 15 | 16 | ###### And Another Still 17 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Indent Everything/Indented Math.md: -------------------------------------------------------------------------------- 1 | Math should be indentable 2 | indent 3 | $$ 4 | \begin{vmatrix}a & b\\ 5 | c & d 6 | \end{vmatrix}=ad-bc 7 | $$ 8 | And this is no longer an indent -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Line Swapping.md: -------------------------------------------------------------------------------- 1 | I should be able to swap lines with Alt+Arrows. 2 | Swapping lines up and down should be fun and easy. 3 | 4 | ## Testing 5 | Let's try! -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Link Interspersing.md: -------------------------------------------------------------------------------- 1 | I should be able to have a [web link](https://google.com) and a [[TestFile]] wiki link on the same line. 2 | 3 | This should also be able to be reversed: [[TestFile]] and then [web link](https://google.com). -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Link Preview.md: -------------------------------------------------------------------------------- 1 | Raw links on their own line should provide a reasonable preview by default. 2 | https://en.wikipedia.org/wiki/Capuchin_monkey 3 | 4 | I should be able to get a preview for any link with markdown: 5 | ![](https://en.wikipedia.org/wiki/Capuchin_monkey) 6 | 7 | https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow 8 | 9 | Errors should make the text visible: 10 | https://foo.bar 11 | 12 | # Media 13 | ## Youtube 14 | Youtube links should embed the video: 15 | https://youtu.be/qAuwW7Wzrng 16 | 17 | Or: 18 | https://www.youtube.com/watch?v=qAuwW7Wzrng 19 | 20 | ## Raw Audio 21 | https://www.computerhope.com/jargon/m/example.mp3 22 | 23 | ## Raw Video 24 | https://download.samplelib.com/mp4/sample-5s.mp4 -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Link to Rich Text.md: -------------------------------------------------------------------------------- 1 | I want to link to [[Rich Text.rtf]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Link to notes with periods.md: -------------------------------------------------------------------------------- 1 | This links to [[Note.with.periods]] 2 | 3 | This links to [[another.note.with.periods]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Note With Aliases.md: -------------------------------------------------------------------------------- 1 | --- 2 | aliases: 3 | - Aliased Note 4 | - Note With Alias 5 | --- 6 | This note has some aliases. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Note With Image Links.md: -------------------------------------------------------------------------------- 1 | ![](https://cdn.vox-cdn.com/thumbor/hV1KH5_UI6k5mtIDPHvJbmmcJhQ=/0x0:2040x1360/2570x1446/filters:focal(857x517:1183x843):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/70603296/rbaldwin_220217_5051_0011.0.jpg) -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Note With Link To A.md: -------------------------------------------------------------------------------- 1 | This note [[Note With Link To B]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Note With Link To B.md: -------------------------------------------------------------------------------- 1 | This links to [[Note With Link To A]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Note With Links With Bad Characters.md: -------------------------------------------------------------------------------- 1 | [[Note With: Colons]] 2 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Note.with.periods.md: -------------------------------------------------------------------------------- 1 | This note has periods in its name. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Noté With Dîacritics.md: -------------------------------------------------------------------------------- 1 | This is a test note with diacritics in its title. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/RTL Languages/.tangentfolder: -------------------------------------------------------------------------------- 1 | { 2 | "displayMode": "Feed" 3 | } -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/RTL Languages/RTL 1.md: -------------------------------------------------------------------------------- 1 | هذه الفقرة باللغة العربية ولكن بشكل خاطئ من اليسار إلى اليمين -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/RTL Languages/RTL 2.md: -------------------------------------------------------------------------------- 1 | هذه الفقرة باللغة العربية ولكن بشكل خاطئ من اليسار إلى اليمين -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/RTL Languages/RTL 3.md: -------------------------------------------------------------------------------- 1 | هذه الفقرة باللغة العربية ولكن بشكل خاطئ من اليسار إلى اليمين -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/RTL Languages/RTL Languages.md: -------------------------------------------------------------------------------- 1 | Tangent should be able to mix LTR and RTL languages within the same note, so long as the different languages are on different lines. 2 | 3 | هذه الفقرة باللغة العربية ولكن بشكل خاطئ من اليسار إلى اليمين -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Rich Text.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf2706 2 | \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;} 3 | {\colortbl;\red255\green255\blue255;} 4 | {\*\expandedcolortbl;;} 5 | \margl1440\margr1440\vieww11520\viewh8400\viewkind0 6 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 7 | 8 | \f0\fs24 \cf0 This is a 9 | \f1\b rich text document 10 | \f0\b0 .} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Tests for Sentence Focus.md: -------------------------------------------------------------------------------- 1 | This is a normal sentence. And here is one right after. Here is some words.with.adjoining periods. Clearly not a sentence, right? And what about other sentence ends? Like this one! 2 | 3 | And here's an empty line with no punctuation 4 | 5 | And another line, but with punctuation. And "what about quotes?" Those should probably work too. And "quotes". But that's just a normal sentence. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Thing Name/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Thing Name/Ambiguous.md: -------------------------------------------------------------------------------- 1 | This note is ambiguous. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Thing Name/Thing Name.md: -------------------------------------------------------------------------------- 1 | This is a thing with the same name as the thing inside of it. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Virtual Link Shenanigans.md: -------------------------------------------------------------------------------- 1 | Let's make [[Some Virtual File]] 2 | 3 | Which belongs in [[Some Virtual Folder/Some Virtual File]] 4 | 5 | --- 6 | 7 | Let's make [[Some Virtual Folder/Another Virtual File]]. 8 | 9 | And also [[Some Virtual Folder.md]] 10 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Integration Tests/Youtube Preview.md: -------------------------------------------------------------------------------- 1 | https://youtu.be/qAuwW7Wzrng -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Item 10b.md: -------------------------------------------------------------------------------- 1 | More testing of the sorter -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Item 1a1.md: -------------------------------------------------------------------------------- 1 | Where does this sort? -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Item 1a10.md: -------------------------------------------------------------------------------- 1 | Yeah, no confusion, just sorts! -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Item 1a2.md: -------------------------------------------------------------------------------- 1 | And more, bay-bee! -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Item 9a.md: -------------------------------------------------------------------------------- 1 | This is to test the fancy new text editor. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Markdown Links to Local Markdown Files.md: -------------------------------------------------------------------------------- 1 | [A relative link toNexus](./Nexus.md) 2 | [A relative link to TestFile](../TestFile.md) 3 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Misc References.md: -------------------------------------------------------------------------------- 1 | [[A Folder]] 2 | 3 | [[Test Image.jpg]] 4 | 5 | [[Note to nowhere]] 6 | 7 | [[TestFile]] 8 | 9 | [Some Link](https://tangentnotes.com) 10 | 11 | [[Ambiguous]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Nexus.md: -------------------------------------------------------------------------------- 1 | This is a note that is referenced many, many times. This way, we can test the upper limits of how to display links. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 1.md: -------------------------------------------------------------------------------- 1 | [[Nexus]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 10 is actually a very long title that just keeps going and going for way too long.md: -------------------------------------------------------------------------------- 1 | Still links to [[Nexus]] though. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 11.md: -------------------------------------------------------------------------------- 1 | Is a cool cat that links to [[Nexus]]. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 2.md: -------------------------------------------------------------------------------- 1 | [[Nexus]] is a very cool note. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 3.md: -------------------------------------------------------------------------------- 1 | # The [[Nexus]] is a Long Header Thing 2 | I often use links in or as headers. This demonstrates how that will look. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 4.md: -------------------------------------------------------------------------------- 1 | We're all going to the [[Nexus]] today. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 5.md: -------------------------------------------------------------------------------- 1 | Hey ho, to the [[Nexus]] we go. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 6.md: -------------------------------------------------------------------------------- 1 | [[Nexus]] is a cool place. Cool like chilly. Like cold. Antarctic. It would be cool to go to the arctic. I mean, I would be cold, yes, but it would also be pretty neat. Charter a boat, go get (not too) close with an iceberg. Cool stuff. Literally. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 7.md: -------------------------------------------------------------------------------- 1 | Let's all go to [[Nexus]] heaven. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 8.md: -------------------------------------------------------------------------------- 1 | [[Nexus]] is the best. I like to go there all the time. This text is good at taking up space and, yeah. So much space taken up by me just spewing words into this text box. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Reference 9.md: -------------------------------------------------------------------------------- 1 | Let's all have a [[Nexus]] time. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Referencing NotATag.md: -------------------------------------------------------------------------------- 1 | This tests that virtual files and tag references do not conflict. 2 | 3 | Reference [[NotATag]] as a file. 4 | 5 | Reference #NotATag as a tag. 6 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Link Tests/Referencing OtherTag.md: -------------------------------------------------------------------------------- 1 | This tests that virtual files and tag references do not conflict. 2 | 3 | Reference #OtherTag as a tag. 4 | 5 | Reference [[OtherTag]] as a file. 6 | 7 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Log/.tangentfolder: -------------------------------------------------------------------------------- 1 | { 2 | "displayMode": "Feed", 3 | "feed": { 4 | "startAt": "end" 5 | } 6 | } -------------------------------------------------------------------------------- /test-files/TestWorkspace/Log/2022-02-02.md: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet consectetur, adipiscing elit luctus potenti, conubia sem molestie eu. Blandit tincidunt nibh consequat ullamcorper torquent ante enim, praesent gravida bibendum posuere nisl sapien, facilisi sociosqu tortor risus cum ultrices. 2 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Log/2022-02-04.md: -------------------------------------------------------------------------------- 1 | Porta senectus ad a eleifend posuere faucibus morbi sociosqu conubia volutpat curabitur vel nulla, euismod luctus hendrerit aptent torquent justo montes egestas tellus dictum praesent sed. 2 | 3 | Fusce cum faucibus sed ac in condimentum convallis facilisi dolor vulputate pulvinar inceptos, ridiculus nulla ultricies sociis odio orci massa gravida duis aenean platea. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Log/2022-02-15.md: -------------------------------------------------------------------------------- 1 | Parturient condimentum nisl nisi viverra aliquam neque, mi consectetur justo per hendrerit varius quam, orci litora etiam lorem fames. 2 | 3 | Taciti imperdiet curae conubia mi sollicitudin ut metus adipiscing, posuere vehicula sociosqu odio diam eget condimentum amet mollis, tempor senectus pharetra lobortis orci torquent ornare. Neque fermentum auctor viverra morbi pellentesque, cras tellus sit rhoncus imperdiet porttitor, nulla ante quam per. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Log/2022-10-03.md: -------------------------------------------------------------------------------- 1 | So today, I am writing some random stuff so that when I demo scrolling up it looks like there are natural English words to read. This is important so that it doesn't _just_ feel like Lorem Ipsum all the time. 2 | 3 | You want some variety in your fake copy, don't you? 4 | 5 | Hi everybody! -------------------------------------------------------------------------------- /test-files/TestWorkspace/Log/2022-10-04.md: -------------------------------------------------------------------------------- 1 | This is a great place to record all of my random thoughts. But what about yesterday? -------------------------------------------------------------------------------- /test-files/TestWorkspace/Log/Subfolder/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Log/Subfolder/2023-08-23.md: -------------------------------------------------------------------------------- 1 | This is a feed note in a folder. [[TestFile]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/Blockquotes.md: -------------------------------------------------------------------------------- 1 | I should be able to 2 | 3 | > Quote things in blockquotes 4 | 5 | And 6 | 7 | > Quotes should be able 8 | > 9 | > to 10 | > 11 | > span multiple lines 12 | 13 | And 14 | 15 | > Quotes should support 16 | >> Double depth quotes 17 | > In 18 | > > Both formats 19 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/Comments.md: -------------------------------------------------------------------------------- 1 | // This is a comment from the first line 2 | 3 | This line has some normal text // then a comment 4 | 5 | // Comments still support _other_ __styles__, and even [[TestFile|Links]]. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/Empty Front Matter.md: -------------------------------------------------------------------------------- 1 | --- 2 | --- -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/External Links.md: -------------------------------------------------------------------------------- 1 | Need to support [external links](https://google.com) to other places. 2 | 3 | Also want to support raw links. eg. https://google.com should go where you'd expect when clicked. 4 | 5 | Raw links on a new line should work fine. 6 | 7 | https://www.newegg.com/zotac-gh3070a5800x01bl-u-w2b/p/N82E16883218097 -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/Front Matter.md: -------------------------------------------------------------------------------- 1 | --- 2 | this: value 3 | mspled: thng # Should not offer spellcheck 4 | some: 0.55 5 | published: true 6 | a list: 7 | - Here is a list value 8 | - and here is another value 9 | - and another 10 | tags: ['front-matter-tag', 'tag'] 11 | --- 12 | 13 | And then the rest of the text continues as normal. 14 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/HTML.md: -------------------------------------------------------------------------------- 1 | This is a thing. 2 | 3 |
And more! and some some other things
So endeth the lesson. Nice! 4 | 5 | Here is a test of spans. 6 | 7 | Some
More Tests 8 | 9 | with some more
things -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/Highlights.md: -------------------------------------------------------------------------------- 1 | You should be able to highlight text with ==double quote marks==. This should look reasonable in both dark and light color schemes. 2 | 3 | 🟢And Now, for some serious color!🟢 -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/Horizontal Rule.md: -------------------------------------------------------------------------------- 1 | Horizontal rules break up blocks of text. This is currently just a visual thing, but I intend for it to be logical in the future. 2 | 3 | --- 4 | 5 | The line expects to see the same amount of vertical white space above and below it. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/Images.md: -------------------------------------------------------------------------------- 1 | # External Images 2 | I should be able to link to an external image with standard markdown. e.g. 3 | ![200](https://vignette.wikia.nocookie.net/htm/images/a/af/Video_Color_Test_Pattern.jpg/revision/latest?cb=20140102004737) And this should resolve itself nicely 4 | 5 | # Local Images 6 | You should be able to embed _local_ images via wiki links, e.g. 7 | ![[Test Image.jpg|500]] 8 | You should also be able to embed local images through relative markdown links, e.g. ![200](../Test Image.jpg) 9 | 10 | And also with encoded URIs: 11 | ![200](../Test%20Image.jpg) 12 | 13 | ![[Test Image]] 14 | 15 | 16 | ![[Attachments/Pasted on 2021-11-01 at 14.58.47.png]] 17 | 18 | ![[Attachments/Pasted on 2021-11-01 at 16.39.06.png]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/Inline Formatting.md: -------------------------------------------------------------------------------- 1 | _Italics_ 2 | 3 | _Italics_, ending with punctuation 4 | 5 | Em_pha_sis 6 | 7 | Em*pha*sis -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/More Tags.md: -------------------------------------------------------------------------------- 1 | I want to get some more #tags/with-seperators 2 | 3 | #SomeTagWithCapitals -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/Strikethrough.md: -------------------------------------------------------------------------------- 1 | I should be able to ~~strikethrough~~ text. 2 | 3 | I should be able to place ~~ in the middle of text and it should not trigger. 4 | 5 | Trailing~~ strikethrough characters should _not_ trigger strikethrough. 6 | 7 | Strike through should _work ~~inside~~ formatting_ and ~~outside _other_ formatting~~. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Markdown Compatibility/Tags.md: -------------------------------------------------------------------------------- 1 | #tags #tags/with-seperators 2 | 3 | Emoji tags: #❤️ 4 | 5 | Coming #Soon™ to a Tangent near you #❄️ 6 | 7 | #tags/with-things 8 | 9 | #tags/with-seperators #test_tag,comma -------------------------------------------------------------------------------- /test-files/TestWorkspace/Obsidian Compatibility/.tangentfolder: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /test-files/TestWorkspace/Obsidian Compatibility/Header Link Source.md: -------------------------------------------------------------------------------- 1 | Using space so that scrolling is more obvious. 2 | 3 | # Header 1 4 | This is the first header. Here is a link to bottom: [[#Sub-Header]] 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | # Header 2 24 | This is the second header 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | ## Sub-Header 43 | Should still work 44 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Obsidian Compatibility/Header Links.md: -------------------------------------------------------------------------------- 1 | Need to be able to link to headers. 2 | 3 | Should link to header 1: [[Header Link Source#Header 1]] 4 | 5 | Should link to header 2: [[Header Link Source#Header 2|with alt text]] 6 | 7 | Should link to header 3: [[Header Link Source#Sub-Header]] 8 | 9 | [[TestFile#I Am a Test Markdown File]] -------------------------------------------------------------------------------- /test-files/TestWorkspace/Obsidian Compatibility/Math Rendering.md: -------------------------------------------------------------------------------- 1 | I should be able to make math blocks: 2 | 3 | $$ 4 | \begin{vmatrix}a & b\\ 5 | c & d 6 | \end{vmatrix}=ad-bc 7 | $$ 8 | 9 | I should be able to make math blocks inline $$y = 2x$$ (because cross compatibility is a bitch) 10 | 11 | "Inline math blocks" that are first on a line should not break: 12 | $$mymath$$ 13 | 14 | Errors should show up nice: 15 | 16 | $$ 17 | \begin{vmatrix}a & b\\ 18 | c & d 19 | \end{vmatrix}=ad-bc^ 20 | $$ 21 | 22 | Should be able to do inline math: $2^{45}$. Inline math should fail unobnoxiously: $2^$ 23 | 24 | Should be able to use `mhchem` style equations: 25 | $$ 26 | \ce{CO2 + C -> 2 CO} 27 | $$ 28 | Should be able to do inline math as the first character of a line: 29 | $math()$ -------------------------------------------------------------------------------- /test-files/TestWorkspace/Obsidian Compatibility/Wiki Links.md: -------------------------------------------------------------------------------- 1 | Should be able to make `[[Wiki Links]]` that link to other files. e.g. TestFile. 2 | 3 | Should be able to [[Nexus|rename links]] to [[TestFile|whatever you want]]. 4 | 5 | [[TestFile|links _should_ support __inline__ formatting]]. 6 | -------------------------------------------------------------------------------- /test-files/TestWorkspace/Query of Test.tangentquery: -------------------------------------------------------------------------------- 1 | { 2 | "queryString": "Notes with 'This'" 3 | } -------------------------------------------------------------------------------- /test-files/TestWorkspace/Same Name.md: -------------------------------------------------------------------------------- 1 | This is a file with the same name as other files. This one is at the root. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Something Cool.md: -------------------------------------------------------------------------------- 1 | Okay, things appear to be working! -------------------------------------------------------------------------------- /test-files/TestWorkspace/Test File The Second.md: -------------------------------------------------------------------------------- 1 | # I Am a More Different Test Markdown File 2 | 3 | There is different text here. A completely different file you might say. 4 | 5 | And now there's more stuff here. And What joy! 6 | 7 | Here is a [[test link]]. Okay, sweet. Here is an [[test link|alternate text link]]. Right on, my dude. Now, let's link to the [[TestFile]] nice and easy like. 8 | 9 | I want links in links ([[A Folder/A File In a Folder]]) to be hidden. Look, it works! Incredible. A different test. 10 | 11 | [[New Test Note]] (Don't edit above this line or tests will break) 12 | 13 | A [[I want mindmaps]]. 14 | 15 | [[Same Name]] 16 | 17 | [[Subfile]] 18 | 19 | Let's go to [[Link to Nowhere]]. -------------------------------------------------------------------------------- /test-files/TestWorkspace/Test Image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suchnsuch/Tangent/234eaa9ff9177563481bd9760e632209a1957e07/test-files/TestWorkspace/Test Image.jpg -------------------------------------------------------------------------------- /vitest.workspace.ts: -------------------------------------------------------------------------------- 1 | export default [ 2 | 'apps/*/vitest.config.*' 3 | ] 4 | --------------------------------------------------------------------------------