Compare commits

...
18 changed files with 227 additions and 127 deletions
+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.1.395](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-21)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.394](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.393](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.392](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/clipper
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@standardnotes/clipper",
"description": "Web clipper browser extension for Standard Notes",
"version": "1.1.392",
"version": "1.1.395",
"private": true,
"scripts": {
"build-mv2": "yarn clean && webpack --config ./webpack.config.prod.js",
+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.108.333](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-21)
**Note:** Version bump only for package @standardnotes/desktop
## [3.108.332](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/desktop
## [3.108.331](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/desktop
## [3.108.330](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/desktop
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@standardnotes/desktop",
"main": "./app/dist/index.js",
"version": "3.108.330",
"version": "3.108.333",
"license": "AGPL-3.0",
"author": "Standard Notes.",
"private": true,
+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.58.54](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-21)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.53](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.52](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.51](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/mobile
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/mobile",
"version": "3.58.51",
"version": "3.58.54",
"author": "Standard Notes.",
"private": true,
"license": "AGPL-3.0",
+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.4.689](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-21)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.688](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.687](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.686](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/releases
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/releases",
"version": "1.4.686",
"version": "1.4.689",
"license": "AGPL-3.0",
"main": "dist/releases.json",
"types": "dist/index.d.ts",
+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.185.3](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-21)
**Note:** Version bump only for package @standardnotes/web
## [3.185.2](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/web
## [3.185.1](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
**Note:** Version bump only for package @standardnotes/web
# [3.185.0](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)
### Features
+33
View File
@@ -1,5 +1,38 @@
{
"versions": [
{
"version": "3.185.3",
"title": "[3.185.3](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-21)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.185.2",
"title": "[3.185.2](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.185.1",
"title": "[3.185.1](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.185.0",
"title": "[3.185.0](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2024-01-20)",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/web",
"version": "3.185.0",
"version": "3.185.3",
"license": "AGPL-3.0",
"main": "dist/app.js",
"author": "Standard Notes",
@@ -989,7 +989,7 @@ class NoteView extends AbstractComponent<NoteViewProps, State> {
)}
{editorMode === 'super' && (
<div className={classNames('blocks-editor w-full flex-grow overflow-hidden overflow-y-auto')}>
<div className={classNames('blocks-editor w-full flex-grow overflow-hidden')}>
<SuperEditor
key={this.note.uuid}
application={this.application}
@@ -3,7 +3,7 @@ import { isMobileScreen } from '@/Utils'
import { CSSProperties } from 'react'
import { PopoverAlignment, PopoverSide } from './Types'
import { OppositeSide, checkCollisions, getNonCollidingAlignment } from './Utils/Collisions'
import { getAppRect, getPopoverMaxHeight, getPositionedPopoverRect } from './Utils/Rect'
import { getPopoverMaxHeight, getPositionedPopoverRect } from './Utils/Rect'
const percentOf = (percent: number, value: number) => (percent / 100) * value
@@ -154,7 +154,7 @@ export const getPositionedPopoverStyles = ({
)
let maxHeight = getPopoverMaxHeight(
getAppRect(),
documentRect,
anchorRect,
disableFlip ? side : sideWithLessOverflows,
finalAlignment,
@@ -24,7 +24,7 @@ export const getPopoverMaxHeight = (
if (buttonRect) {
switch (side) {
case 'top':
constraint = appRect.height - buttonRect.top
constraint = Math.abs(appRect.height - buttonRect.top)
if (topSafeAreaInset > 0) {
constraint += topSafeAreaInset
}
@@ -12,7 +12,6 @@ import { classNames } from '@standardnotes/snjs'
import Icon from '@/Components/Icon/Icon'
import StyledTooltip from '@/Components/StyledTooltip/StyledTooltip'
import { TOGGLE_LINK_COMMAND } from '@lexical/link'
import Portal from '@/Components/Portal/Portal'
import { mergeRegister } from '@lexical/utils'
import { KeyboardKey } from '@standardnotes/ui-services'
import Button from '@/Components/Button/Button'
@@ -20,6 +19,9 @@ import { sanitizeUrl } from '../../Lexical/Utils/sanitizeUrl'
import { getSelectedNode } from '../../Lexical/Utils/getSelectedNode'
import { $isLinkTextNode } from './ToolbarLinkTextEditor'
import { useElementResize } from '@/Hooks/useElementRect'
import { createPortal } from 'react-dom'
import { ElementIds } from '@/Constants/ElementIDs'
import { getAdjustedStylesForNonPortalPopover } from '@/Components/Popover/Utils/getAdjustedStylesForNonPortal'
const FloatingLinkEditor = ({
linkUrl,
@@ -90,7 +92,8 @@ const FloatingLinkEditor = ({
maxHeightFunction: () => 'none',
})
if (calculatedStyles) {
Object.entries(calculatedStyles).forEach(([key, value]) => {
const adjustedStyles = getAdjustedStylesForNonPortalPopover(linkEditorElement, calculatedStyles)
Object.entries(adjustedStyles).forEach(([key, value]) => {
linkEditorElement.style.setProperty(key, value)
})
linkEditorElement.style.opacity = '1'
@@ -145,50 +148,28 @@ const FloatingLinkEditor = ({
setTimeout(updateLinkEditorPosition)
}, [isEditMode, updateLinkEditorPosition])
return (
<Portal>
<div
id="super-link-editor"
className="absolute bottom-12 left-1/2 z-modal w-[calc(100%_-_1rem)] -translate-x-1/2 rounded-lg border border-border bg-contrast px-2 py-1 shadow-sm shadow-contrast translucent-ui:border-[--popover-border-color] translucent-ui:bg-[--popover-background-color] translucent-ui:[backdrop-filter:var(--popover-backdrop-filter)] md:bottom-[unset] md:left-0 md:top-0 md:w-auto md:translate-x-0 md:opacity-0"
ref={linkEditorRef}
>
{isEditMode ? (
<div
className="flex flex-col gap-2 py-1"
onBlur={(event) => {
if (!linkEditorRef.current?.contains(event.relatedTarget as Node)) {
setEditMode(false)
}
}}
>
{isLinkText && (
<div className="flex items-center gap-1.5">
<Icon type="plain-text" className="flex-shrink-0" />
<input
value={editedLinkText}
onChange={(event) => {
setEditedLinkText(event.target.value)
}}
onKeyDown={(event) => {
if (event.key === KeyboardKey.Enter) {
event.preventDefault()
handleSubmission()
} else if (event.key === KeyboardKey.Escape) {
event.preventDefault()
setEditMode(false)
}
}}
className="flex-grow rounded-sm bg-contrast p-1 text-text sm:min-w-[20ch]"
/>
</div>
)}
return createPortal(
<div
id="super-link-editor"
className="absolute bottom-12 left-1/2 z-modal w-[calc(100%_-_1rem)] -translate-x-1/2 rounded-lg border border-border bg-contrast px-2 py-1 shadow-sm shadow-contrast translucent-ui:border-[--popover-border-color] translucent-ui:bg-[--popover-background-color] translucent-ui:[backdrop-filter:var(--popover-backdrop-filter)] md:bottom-[unset] md:left-0 md:top-0 md:w-auto md:translate-x-0 md:opacity-0"
ref={linkEditorRef}
>
{isEditMode ? (
<div
className="flex flex-col gap-2 py-1"
onBlur={(event) => {
if (!linkEditorRef.current?.contains(event.relatedTarget as Node)) {
setEditMode(false)
}
}}
>
{isLinkText && (
<div className="flex items-center gap-1.5">
<Icon type="link" className="flex-shrink-0" />
<Icon type="plain-text" className="flex-shrink-0" />
<input
ref={focusInput}
value={editedLinkUrl}
value={editedLinkText}
onChange={(event) => {
setEditedLinkUrl(event.target.value)
setEditedLinkText(event.target.value)
}}
onKeyDown={(event) => {
if (event.key === KeyboardKey.Enter) {
@@ -199,84 +180,105 @@ const FloatingLinkEditor = ({
setEditMode(false)
}
}}
className="flex-grow rounded-sm bg-contrast p-1 text-text sm:min-w-[40ch]"
className="flex-grow rounded-sm bg-contrast p-1 text-text sm:min-w-[20ch]"
/>
</div>
<div className="flex items-center justify-end gap-1.5">
<StyledTooltip showOnMobile showOnHover label="Cancel editing">
<Button
onClick={() => {
setEditMode(false)
editor.focus()
}}
onMouseDown={(event) => event.preventDefault()}
>
Cancel
</Button>
</StyledTooltip>
<StyledTooltip showOnMobile showOnHover label="Save link">
<Button primary onClick={handleSubmission} onMouseDown={(event) => event.preventDefault()}>
Apply
</Button>
</StyledTooltip>
</div>
)}
<div className="flex items-center gap-1.5">
<Icon type="link" className="flex-shrink-0" />
<input
ref={focusInput}
value={editedLinkUrl}
onChange={(event) => {
setEditedLinkUrl(event.target.value)
}}
onKeyDown={(event) => {
if (event.key === KeyboardKey.Enter) {
event.preventDefault()
handleSubmission()
} else if (event.key === KeyboardKey.Escape) {
event.preventDefault()
setEditMode(false)
}
}}
className="flex-grow rounded-sm bg-contrast p-1 text-text sm:min-w-[40ch]"
/>
</div>
) : (
<div className="flex items-center gap-1">
<a
className={classNames(
'mr-1 flex flex-grow items-center gap-2 overflow-hidden whitespace-nowrap underline',
isAutoLink && 'py-2.5',
)}
href={linkUrl}
target="_blank"
rel="noopener noreferrer"
>
<Icon type="open-in" className="ml-1 flex-shrink-0" />
<div className="max-w-[35ch] overflow-hidden text-ellipsis">{linkUrl}</div>
</a>
<StyledTooltip showOnMobile showOnHover label="Copy link">
<button
className="flex select-none items-center justify-center rounded p-2 enabled:hover:bg-default disabled:opacity-50 md:border md:border-transparent enabled:hover:md:translucent-ui:border-[--popover-border-color]"
<div className="flex items-center justify-end gap-1.5">
<StyledTooltip showOnMobile showOnHover label="Cancel editing">
<Button
onClick={() => {
navigator.clipboard.writeText(linkUrl).catch(console.error)
setEditMode(false)
editor.focus()
}}
onMouseDown={(event) => event.preventDefault()}
>
<Icon type="copy" size="medium" />
</button>
Cancel
</Button>
</StyledTooltip>
<StyledTooltip showOnMobile showOnHover label="Save link">
<Button primary onClick={handleSubmission} onMouseDown={(event) => event.preventDefault()}>
Apply
</Button>
</StyledTooltip>
{!isAutoLink && (
<>
<StyledTooltip showOnMobile showOnHover label="Edit link">
<button
className="flex select-none items-center justify-center rounded p-2 enabled:hover:bg-default disabled:opacity-50 md:border md:border-transparent enabled:hover:md:translucent-ui:border-[--popover-border-color]"
onClick={() => {
setEditedLinkUrl(linkUrl)
setEditMode(true)
}}
onMouseDown={(event) => event.preventDefault()}
>
<Icon type="pencil-filled" size="medium" />
</button>
</StyledTooltip>
<StyledTooltip showOnMobile showOnHover label="Remove link">
<button
className="flex select-none items-center justify-center rounded p-2 enabled:hover:bg-default disabled:opacity-50 md:border md:border-transparent enabled:hover:md:translucent-ui:border-[--popover-border-color]"
onClick={() => {
editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)
}}
onMouseDown={(event) => event.preventDefault()}
>
<Icon type="trash-filled" size="medium" />
</button>
</StyledTooltip>
</>
)}
</div>
)}
</div>
</Portal>
</div>
) : (
<div className="flex items-center gap-1">
<a
className={classNames(
'mr-1 flex flex-grow items-center gap-2 overflow-hidden whitespace-nowrap underline',
isAutoLink && 'py-2.5',
)}
href={linkUrl}
target="_blank"
rel="noopener noreferrer"
>
<Icon type="open-in" className="ml-1 flex-shrink-0" />
<div className="max-w-[35ch] overflow-hidden text-ellipsis">{linkUrl}</div>
</a>
<StyledTooltip showOnMobile showOnHover label="Copy link">
<button
className="flex select-none items-center justify-center rounded p-2 enabled:hover:bg-default disabled:opacity-50 md:border md:border-transparent enabled:hover:md:translucent-ui:border-[--popover-border-color]"
onClick={() => {
navigator.clipboard.writeText(linkUrl).catch(console.error)
}}
onMouseDown={(event) => event.preventDefault()}
>
<Icon type="copy" size="medium" />
</button>
</StyledTooltip>
{!isAutoLink && (
<>
<StyledTooltip showOnMobile showOnHover label="Edit link">
<button
className="flex select-none items-center justify-center rounded p-2 enabled:hover:bg-default disabled:opacity-50 md:border md:border-transparent enabled:hover:md:translucent-ui:border-[--popover-border-color]"
onClick={() => {
setEditedLinkUrl(linkUrl)
setEditMode(true)
}}
onMouseDown={(event) => event.preventDefault()}
>
<Icon type="pencil-filled" size="medium" />
</button>
</StyledTooltip>
<StyledTooltip showOnMobile showOnHover label="Remove link">
<button
className="flex select-none items-center justify-center rounded p-2 enabled:hover:bg-default disabled:opacity-50 md:border md:border-transparent enabled:hover:md:translucent-ui:border-[--popover-border-color]"
onClick={() => {
editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)
}}
onMouseDown={(event) => event.preventDefault()}
>
<Icon type="trash-filled" size="medium" />
</button>
</StyledTooltip>
</>
)}
</div>
)}
</div>,
document.getElementById(ElementIds.SuperEditor) ?? document.body,
)
}
@@ -65,6 +65,7 @@ import { useStateRef } from '@/Hooks/useStateRef'
import { getDOMRangeRect } from '../../Lexical/Utils/getDOMRangeRect'
import { getPositionedPopoverStyles } from '@/Components/Popover/GetPositionedPopoverStyles'
import usePreference from '@/Hooks/usePreference'
import { ElementIds } from '@/Constants/ElementIDs'
const TOGGLE_LINK_AND_EDIT_COMMAND = createCommand<string | null>('TOGGLE_LINK_AND_EDIT_COMMAND')
@@ -583,7 +584,8 @@ const ToolbarPlugin = () => {
toolbarStore,
])
const popoverDocumentElement = editor.getRootElement()?.parentElement ?? document.body
const popoverDocumentElement =
document.getElementById(ElementIds.SuperEditor) ?? editor.getRootElement()?.parentElement ?? document.body
return (
<>
@@ -760,7 +762,7 @@ const ToolbarPlugin = () => {
disableMobileFullscreenTakeover
disableFlip
portal={false}
documentElement={isMobile ? popoverDocumentElement : undefined}
documentElement={popoverDocumentElement}
>
<div className="mb-1.5 mt-1 px-3 text-sm font-semibold uppercase text-text">Table of Contents</div>
<LexicalTableOfContents>
@@ -816,7 +818,7 @@ const ToolbarPlugin = () => {
disableFlip
containerClassName="md:!min-w-60 md:!w-auto"
portal={false}
documentElement={isMobile ? popoverDocumentElement : undefined}
documentElement={popoverDocumentElement}
>
<Menu a11yLabel="Text formatting options" className="!px-0" onClick={() => setIsTextFormatMenuOpen(false)}>
<ToolbarMenuItem
@@ -857,7 +859,7 @@ const ToolbarPlugin = () => {
disableFlip
containerClassName="md:!min-w-60 md:!w-auto"
portal={false}
documentElement={isMobile ? popoverDocumentElement : undefined}
documentElement={popoverDocumentElement}
>
<Menu a11yLabel="Text style" className="!px-0" onClick={() => setIsTextStyleMenuOpen(false)}>
<ToolbarMenuItem
@@ -930,7 +932,7 @@ const ToolbarPlugin = () => {
disableFlip
containerClassName="md:!min-w-60 md:!w-auto"
portal={false}
documentElement={isMobile ? popoverDocumentElement : undefined}
documentElement={popoverDocumentElement}
>
<Menu a11yLabel="Alignment" className="!px-0" onClick={() => setIsAlignmentMenuOpen(false)}>
<ToolbarMenuItem
@@ -971,7 +973,7 @@ const ToolbarPlugin = () => {
disableFlip
containerClassName="md:!min-w-60 md:!w-auto"
portal={false}
documentElement={isMobile ? popoverDocumentElement : undefined}
documentElement={popoverDocumentElement}
>
<Menu a11yLabel="Insert" className="!px-0" onClick={() => setIsInsertMenuOpen(false)}>
<ToolbarMenuItem
@@ -39,6 +39,7 @@ import AutoFocusPlugin from './Plugins/AutoFocusPlugin'
import usePreference from '@/Hooks/usePreference'
import BlockPickerMenuPlugin from './Plugins/BlockPickerPlugin/BlockPickerPlugin'
import { EditorEventSource } from '@/Types/EditorEventSource'
import { ElementIds } from '@/Constants/ElementIDs'
export const SuperNotePreviewCharLimit = 160
@@ -187,6 +188,7 @@ export const SuperEditor: FunctionComponent<Props> = ({
return (
<div
id={ElementIds.SuperEditor}
className="font-editor relative flex h-full w-full flex-col"
style={
{
@@ -14,4 +14,5 @@ export const ElementIds = {
ItemLinkAutocompleteInput: 'item-link-autocomplete-input',
SearchBar: 'search-bar',
ConflictResolutionButton: 'conflict-resolution-button',
SuperEditor: 'super-editor',
} as const