Compare commits

...
Author SHA1 Message Date
StandardNotes CI fb14233747 chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
2026-07-20 13:05:39 +00:00
Antonella Sgarlatta be928defcc fix: Fixes hardware key authentication (#3029) 2026-07-20 09:59:42 -03:00
StandardNotes CI 084bc14b6a chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
2026-07-18 20:55:08 +00:00
Wyatt Childers 0f65f7061c fix: Fixes blurry context menus on desktop (#2882)
* Fix blurry right click menus

* Restore previous translate3d call

After doing some reading, the original call is likely better for rendering performance and that's why it was used.
2026-07-18 17:49:10 -03:00
Antonella Sgarlatta 09bcc2f937 fix: Fixes hardware key authentication on Web Clipper (#3028) 2026-07-18 17:46:41 -03:00
StandardNotes CI 8ac51afa76 chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].4
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].4
 - @standardnotes/[email protected].8
 - @standardnotes/[email protected].8
 - @standardnotes/[email protected]
2026-07-18 19:44:57 +00:00
Antonella Sgarlatta eec6bc2782 fix: Fixes text alignment in Super linked items (#3027) 2026-07-18 16:38:45 -03:00
Antonella Sgarlatta ee56c858ab fix: Fix keyboard shortcut handling from within iframe editors (#3025) 2026-07-18 16:37:47 -03:00
Antonella Sgarlatta 44a1a6c374 fix: Fixes incorrect rendering of some special characters on Super PDF export (#3024) 2026-07-18 16:37:26 -03:00
Antonella Sgarlatta 883cd4fda9 fix: Fixes gaps after linked items within bullet lists on Super PDF export (#3023) 2026-07-18 16:37:07 -03:00
Antonella Sgarlatta 981a8149f5 chore: add mobile beta workflow [skip ci] 2026-07-17 12:38:07 -03:00
StandardNotes CI 4e3aa7d69f chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].7
 - @standardnotes/[email protected]
2026-07-06 17:27:09 +00:00
Antonella Sgarlatta 8a20206cf3 fix: Allows demo login on demo host only (#3021) 2026-07-06 14:21:19 -03:00
Antonella Sgarlatta 386d73ffb8 fix: Fixes Super replace functionality not correctly hidden when toggling Prevent editing on a note (#3022) 2026-07-06 14:21:02 -03:00
Michael Lee 9d026df49a fix: Fixes default language for newly created code blocks in Super notes (#2999) 2026-07-06 14:20:39 -03:00
Antonella Sgarlatta 089bc421fc chore: fixes unsigned build workflow [skip ci] 2026-06-25 13:48:54 -03:00
Antonella Sgarlatta 29223e96c0 chore: fixes unsigned build workflow [skip ci] 2026-06-25 01:24:28 -03:00
Antonella Sgarlatta 12503f7c5a chore: remove rebuild modules step from manual build workflow [skip ci] 2026-06-24 23:57:53 -03:00
Antonella Sgarlatta 195d1a6233 chore: add workflows for manual builds [skip ci] 2026-06-24 15:50:09 -03:00
StandardNotes CI 3d8bae26e8 chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].6
 - @standardnotes/[email protected]
2026-06-08 03:51:58 +00:00
Antonella Sgarlatta fe4d0aacbf chore: temporarily disallow android purchases (#3019) 2026-06-08 00:45:49 -03:00
StandardNotes CI ed1cd0c366 chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
2026-06-07 03:12:16 +00:00
Antonella Sgarlatta c2bdda2ccb chore: temporarily remove manage sub button for android 2026-06-07 00:06:33 -03:00
55 changed files with 845 additions and 82 deletions
@@ -0,0 +1,19 @@
name: Desktop Manual Build
on:
workflow_dispatch:
inputs:
platform:
description: Platform to build
required: true
type: choice
options:
- mac
- linux
- windows
jobs:
build:
uses: ./.github/workflows/desktop.build.reuse.yml
with:
platform: ${{ inputs.platform }}
+254
View File
@@ -0,0 +1,254 @@
name: Desktop Reusable Manual Build Workflow
on:
workflow_call:
inputs:
platform:
required: true
type: string
jobs:
Mac:
if: inputs.platform == 'mac'
runs-on: macos-latest
env:
CSC_IDENTITY_AUTO_DISCOVERY: false
defaults:
run:
working-directory: packages/desktop
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
registry-url: 'https://registry.npmjs.org'
node-version-file: '.nvmrc'
cache: 'yarn'
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- run: yarn install --immutable
- name: Rebuild Electron Native Modules
run: yarn workspace @standardnotes/desktop rebuild:home-server
- run: yarn build:desktop
- run: echo APP_VERSION=$(node -p "require('./../web/package.json').version") >> $GITHUB_ENV
- name: Compile Mac
run: yarn run webpack --config desktop.webpack.prod.js
- name: MacX64
run: |
yarn run electron-builder --mac --x64 --publish=never --config electron-builder.unsigned.cjs --c.extraMetadata.version=${{ env.APP_VERSION }}
node scripts/fixMacZip.js ${{ env.APP_VERSION }}
- name: MacArm64
run: yarn run electron-builder --mac --arm64 --publish=never --config electron-builder.unsigned.cjs --c.extraMetadata.version=${{ env.APP_VERSION }}
- name: Upload
uses: actions/upload-artifact@v4
with:
name: dist-macos
retention-days: 7
path: |
packages/desktop/dist/*.dmg
packages/desktop/dist/*.zip
packages/desktop/dist/*.blockmap
packages/desktop/dist/*.yml
packages/desktop/dist/*.yaml
Linux-AppImage-X64:
name: Linux AppImage X64
if: inputs.platform == 'linux'
runs-on: ubuntu-latest
defaults:
run:
working-directory: packages/desktop
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
registry-url: 'https://registry.npmjs.org'
node-version-file: '.nvmrc'
cache: 'yarn'
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install FPM
run: sudo gem install fpm -f
- run: yarn install --immutable
- name: Rebuild Electron Native Modules
run: yarn workspace @standardnotes/desktop rebuild:home-server
- run: yarn build:desktop
- run: echo APP_VERSION=$(node -p "require('./../web/package.json').version") >> $GITHUB_ENV
- name: Compile for AppImage
run: yarn run webpack --config desktop.webpack.prod.js
- name: AppImageX64
run: yarn run electron-builder --linux --x64 -c.linux.target=AppImage --publish=never --c.extraMetadata.version=${{ env.APP_VERSION }}
- name: Upload
uses: actions/upload-artifact@v4
with:
name: dist-linux-appimage-x64
retention-days: 7
path: |
packages/desktop/dist/*.AppImage
packages/desktop/dist/*.yml
packages/desktop/dist/*.yaml
Linux-AppImage-ARM64:
name: Linux AppImage ARM64
if: inputs.platform == 'linux'
runs-on: ubuntu-24.04-arm
defaults:
run:
working-directory: packages/desktop
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
registry-url: 'https://registry.npmjs.org'
node-version-file: '.nvmrc'
cache: 'yarn'
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install FPM
run: sudo gem install fpm -f
- run: yarn install --immutable
- name: Rebuild Electron Native Modules
run: yarn workspace @standardnotes/desktop rebuild:home-server
- run: yarn build:desktop
- run: echo APP_VERSION=$(node -p "require('./../web/package.json').version") >> $GITHUB_ENV
- name: Compile for AppImage
run: yarn run webpack --config desktop.webpack.prod.js
- name: AppImageArm64
run: yarn run electron-builder --linux --arm64 -c.linux.target=AppImage --publish=never --c.extraMetadata.version=${{ env.APP_VERSION }}
- name: Upload
uses: actions/upload-artifact@v4
with:
name: dist-linux-appimage-arm64
retention-days: 7
path: |
packages/desktop/dist/*.AppImage
packages/desktop/dist/*.yml
packages/desktop/dist/*.yaml
Linux-Deb-X64:
name: Linux Deb X64
if: inputs.platform == 'linux'
runs-on: ubuntu-latest
defaults:
run:
working-directory: packages/desktop
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
registry-url: 'https://registry.npmjs.org'
node-version-file: '.nvmrc'
cache: 'yarn'
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install FPM
run: sudo gem install fpm -f
- run: yarn install --immutable
- name: Rebuild Electron Native Modules
run: yarn workspace @standardnotes/desktop rebuild:home-server
- run: yarn build:desktop
- run: echo APP_VERSION=$(node -p "require('./../web/package.json').version") >> $GITHUB_ENV
- name: Deb
run: |
yarn run webpack --config desktop.webpack.prod.js --env deb
yarn run electron-builder --linux --x64 -c.linux.target=deb --publish=never --c.extraMetadata.version=${{ env.APP_VERSION }}
- name: Upload
uses: actions/upload-artifact@v4
with:
name: dist-linux-deb-x64
retention-days: 7
path: |
packages/desktop/dist/*.deb
packages/desktop/dist/*.yml
packages/desktop/dist/*.yaml
Linux-Deb-ARM64:
name: Linux Deb ARM64
if: inputs.platform == 'linux'
runs-on: ubuntu-24.04-arm
defaults:
run:
working-directory: packages/desktop
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
registry-url: 'https://registry.npmjs.org'
node-version-file: '.nvmrc'
cache: 'yarn'
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install FPM
run: sudo gem install fpm -f
- run: yarn install --immutable
- name: Rebuild Electron Native Modules
run: yarn workspace @standardnotes/desktop rebuild:home-server
- run: yarn build:desktop
- run: echo APP_VERSION=$(node -p "require('./../web/package.json').version") >> $GITHUB_ENV
- name: DebArm64
env:
USE_SYSTEM_FPM: 'true'
run: |
yarn run webpack --config desktop.webpack.prod.js --env deb
yarn run electron-builder --linux --arm64 -c.linux.target=deb --publish=never --c.extraMetadata.version=${{ env.APP_VERSION }}
- name: Upload
uses: actions/upload-artifact@v4
with:
name: dist-linux-deb-arm64
retention-days: 7
path: |
packages/desktop/dist/*.deb
packages/desktop/dist/*.yml
packages/desktop/dist/*.yaml
Windows:
name: Windows
if: inputs.platform == 'windows'
runs-on: windows-latest
env:
NODE_OPTIONS: --max-old-space-size=8192
CSC_IDENTITY_AUTO_DISCOVERY: false
defaults:
run:
working-directory: packages/desktop
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
registry-url: 'https://registry.npmjs.org'
node-version-file: '.nvmrc'
cache: 'yarn'
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- run: corepack enable
- run: yarn install --immutable
- run: yarn build:desktop
- name: Set app version
shell: bash
run: echo APP_VERSION=$(node -p "require('./../web/package.json').version") >> $GITHUB_ENV
- name: Compile
run: yarn run webpack --config desktop.webpack.prod.js
- name: Build Windows installers
shell: bash
run: yarn run electron-builder --windows --x64 --ia32 --publish=never --config electron-builder.unsigned.cjs --c.extraMetadata.version=$APP_VERSION
- name: Upload
uses: actions/upload-artifact@v4
with:
name: dist-windows
retention-days: 7
path: |
packages/desktop/dist/*.exe
packages/desktop/dist/*.yml
packages/desktop/dist/*.yaml
packages/desktop/dist/*.blockmap
@@ -0,0 +1,48 @@
name: Mobile Release Closed Beta
on:
workflow_dispatch:
jobs:
android:
defaults:
run:
working-directory: packages/mobile
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Java version
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'
- name: Export version from package.json
run:
echo "PACKAGE_VERSION=$(grep '"version"' ../web/package.json | cut -d '"' -f 4 | cut -d "-" -f 1)" >> $GITHUB_ENV
- name: Setup react-native kernel and increase watchers
run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
- name: Decode Production Android keystore
run: |
echo "${{ secrets.ANDROID_KEYSTORE }}" > keystore.keystore.asc
gpg -d --passphrase "${{ secrets.KEYSTORE_PASSPHRASE }}" --batch keystore.keystore.asc > android/app/keystore.keystore
- name: Install dependencies
run: yarn install --immutable
- run: yarn build:mobile
- name: Ruby Setup for Fastlane
uses: ruby/setup-ruby@v1
with:
working-directory: 'packages/mobile'
- name: fastlane
uses: maierj/[email protected]
env:
PACKAGE_VERSION: ${{ env.PACKAGE_VERSION }}
BUILD_NUMBER: ${{ github.run_number }}
ANDROID_KEYSTORE_ALIAS: ${{ secrets.ANDROID_KEYSTORE_ALIAS }}
ANDROID_KEYSTORE_PRIVATE_KEY_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PRIVATE_KEY_PASSWORD }}
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
GOOGLE_PLAY_JSON_KEY_DATA: ${{ secrets.GOOGLE_PLAY_JSON_KEY_DATA }}
with:
lane: 'android closed_beta'
subdirectory: 'packages/mobile'
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.26.98](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/api
## [1.26.97](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-04-24)
**Note:** Version bump only for package @standardnotes/api
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/api",
"version": "1.26.97",
"version": "1.26.98",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.1.594](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-20)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.593](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.592](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.591](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-06)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.590](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-08)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.589](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-07)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.588](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-05)
**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.588",
"version": "1.1.594",
"private": true,
"scripts": {
"build-mv2": "yarn clean && webpack --config ./webpack.config.prod.js",
+1 -1
View File
@@ -5,7 +5,7 @@ module.exports = {
project: './tsconfig.json',
tsconfigRootDir: __dirname,
},
ignorePatterns: ['**/*.spec.ts', '@types', 'node_modules', 'dist'],
ignorePatterns: ['**/*.spec.ts', '@types', 'node_modules', 'dist', 'electron-builder.unsigned.cjs'],
rules: {
'no-console': ['warn', { allow: ['warn', 'error'] }],
'@typescript-eslint/no-var-requires': 'off',
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.110.199](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-20)
**Note:** Version bump only for package @standardnotes/desktop
## [3.110.198](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/desktop
## [3.110.197](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/desktop
## [3.110.196](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-06)
**Note:** Version bump only for package @standardnotes/desktop
## [3.110.195](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-08)
**Note:** Version bump only for package @standardnotes/desktop
## [3.110.194](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-07)
**Note:** Version bump only for package @standardnotes/desktop
## [3.110.193](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-05)
**Note:** Version bump only for package @standardnotes/desktop
@@ -0,0 +1,13 @@
const packageJson = require('./package.json')
module.exports = {
...packageJson.build,
afterSign: null,
win: {
...packageJson.build.win,
certificateSubjectName: null,
publisherName: null,
sign: null,
signDlls: false,
},
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@standardnotes/desktop",
"main": "./app/dist/index.js",
"version": "3.110.193",
"version": "3.110.199",
"license": "AGPL-3.0",
"author": "Standard Notes.",
"private": true,
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.21.114](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/encryption
## [1.21.113](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-04-24)
**Note:** Version bump only for package @standardnotes/encryption
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/encryption",
"version": "1.21.113",
"version": "1.21.114",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.28.135](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/filepicker
## [1.28.134](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-04-24)
**Note:** Version bump only for package @standardnotes/filepicker
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/filepicker",
"version": "1.28.134",
"version": "1.28.135",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.20.18](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/files
## [1.20.17](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-04-24)
**Note:** Version bump only for package @standardnotes/files
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/files",
"version": "1.20.17",
"version": "1.20.18",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.58.261](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-20)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.260](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.259](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.258](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-06)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.257](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-08)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.256](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-07)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.255](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-05)
**Note:** Version bump only for package @standardnotes/mobile
+6
View File
@@ -161,4 +161,10 @@ platform :android do
version = 3_004_000 + ENV['BUILD_NUMBER'].to_i
deploy_android 'prod', version
end
desc 'Deploy production app to Play Store closed testing (alpha track)'
lane :closed_beta do
version = 3_004_000 + ENV['BUILD_NUMBER'].to_i
deploy_android 'prod', version, 'alpha'
end
end
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/mobile",
"version": "3.58.255",
"version": "3.58.261",
"author": "Standard Notes.",
"private": true,
"license": "AGPL-3.0",
+6
View File
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.58.4](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
### Bug Fixes
* Fix keyboard shortcut handling from within iframe editors ([#3025](https://github.com/standardnotes/app/issues/3025)) ([ee56c85](https://github.com/standardnotes/app/commit/ee56c858ab2c0d7d5a158e29c070b4bf55c1bd8b))
## [1.58.3](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-04-24)
**Note:** Version bump only for package @standardnotes/models
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/models",
"version": "1.58.3",
"version": "1.58.4",
"publishConfig": {
"access": "public"
},
@@ -27,4 +27,10 @@ export type MessageData = Partial<{
content_type?: string
/** Related to key-pressed action */
keyboardModifier?: KeyboardModifier
key?: string
code?: string
ctrlKey?: boolean
metaKey?: boolean
shiftKey?: boolean
altKey?: boolean
}>
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.4.901](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-20)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.900](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.899](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.898](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-06)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.897](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-08)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.896](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-07)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.895](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-05)
**Note:** Version bump only for package @standardnotes/releases
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/releases",
"version": "1.4.895",
"version": "1.4.901",
"repository": {
"type": "git",
"url": "https://github.com/standardnotes/app",
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.72.4](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/services
## [1.72.3](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-04-24)
**Note:** Version bump only for package @standardnotes/services
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/services",
"version": "1.72.3",
"version": "1.72.4",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.211.8](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
**Note:** Version bump only for package @standardnotes/snjs
## [2.211.7](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-04-24)
**Note:** Version bump only for package @standardnotes/snjs
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/snjs",
"version": "2.211.7",
"version": "2.211.8",
"repository": {
"type": "git",
"url": "https://github.com/standardnotes/app",
+16
View File
@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.39.8](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
### Bug Fixes
* Fix keyboard shortcut handling from within iframe editors ([#3025](https://github.com/standardnotes/app/issues/3025)) ([ee56c85](https://github.com/standardnotes/app/commit/ee56c858ab2c0d7d5a158e29c070b4bf55c1bd8b))
## [1.39.7](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-06)
### Bug Fixes
* Allows demo login on demo host only ([#3021](https://github.com/standardnotes/app/issues/3021)) ([8a20206](https://github.com/standardnotes/app/commit/8a20206cf3957d6f89a89e84b5d5eebe95dd2539))
## [1.39.6](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-08)
**Note:** Version bump only for package @standardnotes/ui-services
## [1.39.5](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-05)
### Bug Fixes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/ui-services",
"version": "1.39.5",
"version": "1.39.8",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -0,0 +1,11 @@
export type ComponentKeyboardEventInit = Pick<
KeyboardEvent,
'key' | 'code' | 'ctrlKey' | 'metaKey' | 'shiftKey' | 'altKey'
>
export function isComponentKeyboardEventInit(data: {
key?: string
code?: string
}): data is ComponentKeyboardEventInit {
return data.key !== undefined && data.code !== undefined
}
@@ -1,4 +1,5 @@
import { Environment, Platform, UuidGenerator } from '@standardnotes/snjs'
import { ComponentKeyboardEventInit } from './ComponentKeyboardEventInit'
import { eventMatchesKeyAndModifiers } from './eventMatchesKeyAndModifiers'
import { KeyboardCommand } from './KeyboardCommands'
import { KeyboardKeyEvent } from './KeyboardKeyEvent'
@@ -101,6 +102,12 @@ export class KeyboardService {
this.removeActiveModifier(modifier)
}
public handleComponentKeyboardEvent = (eventInit: ComponentKeyboardEventInit, keyEvent: KeyboardKeyEvent): void => {
const event = new KeyboardEvent(keyEvent === KeyboardKeyEvent.Down ? 'keydown' : 'keyup', eventInit)
this.updateAllModifiersFromEvent(event)
this.handleKeyboardEvent(event, keyEvent)
}
private handleKeyDown = (event: KeyboardEvent): void => {
this.updateAllModifiersFromEvent(event)
@@ -20,6 +20,13 @@ describe('route parser', () => {
expect(parser.demoParams.token).toEqual('eyJhY2Nlc3NUb2tl')
})
it('ignores demo-token on non-demo hosts', () => {
const url = 'https://app.standardnotes.com/?demo-token=eyJhY2Nlc3NUb2tl'
const parser = new RouteParser(url)
expect(parser.type).toEqual(RouteType.None)
})
it('routes to settings', () => {
const url = 'https://app.standardnotes.com/?settings=account'
const parser = new RouteParser(url)
+11 -1
View File
@@ -97,6 +97,10 @@ export class RouteParser implements RouteParserInterface {
}
}
private get isDemoHost(): boolean {
return this.url.host === 'app-demo.standardnotes.com'
}
private parseTypeFromQueryParameters(): RouteType {
if (this.path === RootRoutes.Onboarding) {
return RouteType.Onboarding
@@ -119,7 +123,13 @@ export class RouteParser implements RouteParserInterface {
for (const rootQueryParam of rootQueryParametersMap.keys()) {
if (this.searchParams.has(rootQueryParam)) {
return rootQueryParametersMap.get(rootQueryParam) as RouteType
const routeType = rootQueryParametersMap.get(rootQueryParam) as RouteType
if (routeType === RouteType.Demo && !this.isDemoHost) {
return RouteType.None
}
return routeType
}
}
@@ -0,0 +1,10 @@
import { Result, SyncUseCaseInterface } from '@standardnotes/domain-core'
import { Platform } from '@standardnotes/models'
export class IsAndroid implements SyncUseCaseInterface<boolean> {
constructor(private platform: Platform) {}
execute(): Result<boolean> {
return Result.ok(this.platform === Platform.Android)
}
}
@@ -1,13 +0,0 @@
import { Result, SyncUseCaseInterface } from '@standardnotes/domain-core'
import { Environment, Platform } from '@standardnotes/models'
export class IsNativeAndroid implements SyncUseCaseInterface<boolean> {
constructor(
private environment: Environment,
private platform: Platform,
) {}
execute(): Result<boolean> {
return Result.ok(this.environment === Environment.Mobile && this.platform === Platform.Android)
}
}
+3 -1
View File
@@ -7,6 +7,8 @@ export * from './Changelog/ChangelogServiceInterface'
export * from './Keyboard/KeyboardService'
export * from './Keyboard/KeyboardShortcut'
export * from './Keyboard/KeyboardCommands'
export * from './Keyboard/KeyboardKeyEvent'
export * from './Keyboard/ComponentKeyboardEventInit'
export * from './Keyboard/platformCheck'
export * from './Keyboard/KeyboardKey'
export * from './Keyboard/KeyboardModifier'
@@ -37,7 +39,7 @@ export * from './UseCase/IsGlobalSpellcheckEnabled'
export * from './UseCase/IsNativeMobileWeb'
export * from './UseCase/IsMobileDevice'
export * from './UseCase/IsNativeIOS'
export * from './UseCase/IsNativeAndroid'
export * from './UseCase/IsAndroid'
export * from './UseCase/GetItemTags'
export * from './Theme/ThemeManager'
+37
View File
@@ -3,6 +3,43 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.201.35](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-20)
### Bug Fixes
* Fixes hardware key authentication ([#3029](https://github.com/standardnotes/app/issues/3029)) ([be928de](https://github.com/standardnotes/app/commit/be928defccdc4ff3e877ab83886cf0d7d0092246))
## [3.201.34](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
### Bug Fixes
* Fixes blurry context menus on desktop ([#2882](https://github.com/standardnotes/app/issues/2882)) ([0f65f70](https://github.com/standardnotes/app/commit/0f65f7061cd0d67150a76cbb9a2bd1bf3919952b))
* Fixes hardware key authentication on Web Clipper ([#3028](https://github.com/standardnotes/app/issues/3028)) ([09bcc2f](https://github.com/standardnotes/app/commit/09bcc2f937f90f340e84a14474fa207d13da6a3f))
## [3.201.33](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)
### Bug Fixes
* Fix keyboard shortcut handling from within iframe editors ([#3025](https://github.com/standardnotes/app/issues/3025)) ([ee56c85](https://github.com/standardnotes/app/commit/ee56c858ab2c0d7d5a158e29c070b4bf55c1bd8b))
* Fixes gaps after linked items within bullet lists on Super PDF export ([#3023](https://github.com/standardnotes/app/issues/3023)) ([883cd4f](https://github.com/standardnotes/app/commit/883cd4fda968c01648b8465f5cf02cd72d16f514))
* Fixes incorrect rendering of some special characters on Super PDF export ([#3024](https://github.com/standardnotes/app/issues/3024)) ([44a1a6c](https://github.com/standardnotes/app/commit/44a1a6c374ea1d5ee05cc938dce77afe369a1ce5))
* Fixes text alignment in Super linked items ([#3027](https://github.com/standardnotes/app/issues/3027)) ([eec6bc2](https://github.com/standardnotes/app/commit/eec6bc2782fd3b499961f73c33b2b284a69a49b5))
## [3.201.32](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-06)
### Bug Fixes
* Fixes default language for newly created code blocks in Super notes ([#2999](https://github.com/standardnotes/app/issues/2999)) ([9d026df](https://github.com/standardnotes/app/commit/9d026df49aedc49b143e7cf91576576c73e49986))
* Fixes Super replace functionality not correctly hidden when toggling Prevent editing on a note ([#3022](https://github.com/standardnotes/app/issues/3022)) ([386d73f](https://github.com/standardnotes/app/commit/386d73ffb839e7a6b3c4bc7578c674fa6b29f658))
## [3.201.31](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-08)
**Note:** Version bump only for package @standardnotes/web
## [3.201.30](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-07)
**Note:** Version bump only for package @standardnotes/web
## [3.201.29](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-05)
### Bug Fixes
+88
View File
@@ -1,5 +1,93 @@
{
"versions": [
{
"version": "3.201.35",
"title": "[3.201.35](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-20)",
"date": null,
"body": "### Bug Fixes\n\n* Fixes hardware key authentication ([#3029](https://github.com/standardnotes/app/issues/3029)) ([be928de](https://github.com/standardnotes/app/commit/be928defccdc4ff3e877ab83886cf0d7d0092246))",
"parsed": {
"_": [
"Fixes hardware key authentication (#3029) (be928de)"
],
"Bug Fixes": [
"Fixes hardware key authentication (#3029) (be928de)"
]
}
},
{
"version": "3.201.34",
"title": "[3.201.34](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)",
"date": null,
"body": "### Bug Fixes\n\n* Fixes blurry context menus on desktop ([#2882](https://github.com/standardnotes/app/issues/2882)) ([0f65f70](https://github.com/standardnotes/app/commit/0f65f7061cd0d67150a76cbb9a2bd1bf3919952b))\n* Fixes hardware key authentication on Web Clipper ([#3028](https://github.com/standardnotes/app/issues/3028)) ([09bcc2f](https://github.com/standardnotes/app/commit/09bcc2f937f90f340e84a14474fa207d13da6a3f))",
"parsed": {
"_": [
"Fixes blurry context menus on desktop (#2882) (0f65f70)",
"Fixes hardware key authentication on Web Clipper (#3028) (09bcc2f)"
],
"Bug Fixes": [
"Fixes blurry context menus on desktop (#2882) (0f65f70)",
"Fixes hardware key authentication on Web Clipper (#3028) (09bcc2f)"
]
}
},
{
"version": "3.201.33",
"title": "[3.201.33](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-18)",
"date": null,
"body": "### Bug Fixes\n\n* Fix keyboard shortcut handling from within iframe editors ([#3025](https://github.com/standardnotes/app/issues/3025)) ([ee56c85](https://github.com/standardnotes/app/commit/ee56c858ab2c0d7d5a158e29c070b4bf55c1bd8b))\n* Fixes gaps after linked items within bullet lists on Super PDF export ([#3023](https://github.com/standardnotes/app/issues/3023)) ([883cd4f](https://github.com/standardnotes/app/commit/883cd4fda968c01648b8465f5cf02cd72d16f514))\n* Fixes incorrect rendering of some special characters on Super PDF export ([#3024](https://github.com/standardnotes/app/issues/3024)) ([44a1a6c](https://github.com/standardnotes/app/commit/44a1a6c374ea1d5ee05cc938dce77afe369a1ce5))\n* Fixes text alignment in Super linked items ([#3027](https://github.com/standardnotes/app/issues/3027)) ([eec6bc2](https://github.com/standardnotes/app/commit/eec6bc2782fd3b499961f73c33b2b284a69a49b5))",
"parsed": {
"_": [
"Fix keyboard shortcut handling from within iframe editors (#3025) (ee56c85)",
"Fixes gaps after linked items within bullet lists on Super PDF export (#3023) (883cd4f)",
"Fixes incorrect rendering of some special characters on Super PDF export (#3024) (44a1a6c)",
"Fixes text alignment in Super linked items (#3027) (eec6bc2)"
],
"Bug Fixes": [
"Fix keyboard shortcut handling from within iframe editors (#3025) (ee56c85)",
"Fixes gaps after linked items within bullet lists on Super PDF export (#3023) (883cd4f)",
"Fixes incorrect rendering of some special characters on Super PDF export (#3024) (44a1a6c)",
"Fixes text alignment in Super linked items (#3027) (eec6bc2)"
]
}
},
{
"version": "3.201.32",
"title": "[3.201.32](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-07-06)",
"date": null,
"body": "### Bug Fixes\n\n* Fixes default language for newly created code blocks in Super notes ([#2999](https://github.com/standardnotes/app/issues/2999)) ([9d026df](https://github.com/standardnotes/app/commit/9d026df49aedc49b143e7cf91576576c73e49986))\n* Fixes Super replace functionality not correctly hidden when toggling Prevent editing on a note ([#3022](https://github.com/standardnotes/app/issues/3022)) ([386d73f](https://github.com/standardnotes/app/commit/386d73ffb839e7a6b3c4bc7578c674fa6b29f658))",
"parsed": {
"_": [
"Fixes default language for newly created code blocks in Super notes (#2999) (9d026df)",
"Fixes Super replace functionality not correctly hidden when toggling Prevent editing on a note (#3022) (386d73f)"
],
"Bug Fixes": [
"Fixes default language for newly created code blocks in Super notes (#2999) (9d026df)",
"Fixes Super replace functionality not correctly hidden when toggling Prevent editing on a note (#3022) (386d73f)"
]
}
},
{
"version": "3.201.31",
"title": "[3.201.31](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-08)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.201.30",
"title": "[3.201.30](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-07)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.201.29",
"title": "[3.201.29](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2026-06-05)",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/web",
"version": "3.201.29",
"version": "3.201.35",
"license": "AGPL-3.0",
"main": "dist/app.js",
"author": "Standard Notes",
@@ -48,7 +48,7 @@ export const Web_TYPES = {
IsGlobalSpellcheckEnabled: Symbol.for('IsGlobalSpellcheckEnabled'),
IsMobileDevice: Symbol.for('IsMobileDevice'),
IsNativeIOS: Symbol.for('IsNativeIOS'),
IsNativeAndroid: Symbol.for('IsNativeAndroid'),
IsAndroid: Symbol.for('IsAndroid'),
IsNativeMobileWeb: Symbol.for('IsNativeMobileWeb'),
IsTabletOrMobileScreen: Symbol.for('IsTabletOrMobileScreen'),
LoadPurchaseFlowUrl: Symbol.for('LoadPurchaseFlowUrl'),
@@ -7,7 +7,7 @@ import {
IsGlobalSpellcheckEnabled,
IsMobileDevice,
IsNativeIOS,
IsNativeAndroid,
IsAndroid,
IsNativeMobileWeb,
KeyboardService,
PluginsService,
@@ -78,8 +78,8 @@ export class WebDependencies extends DependencyContainer {
return new IsNativeIOS(application.environment, application.platform)
})
this.bind(Web_TYPES.IsNativeAndroid, () => {
return new IsNativeAndroid(application.environment, application.platform)
this.bind(Web_TYPES.IsAndroid, () => {
return new IsAndroid(application.platform)
})
this.bind(Web_TYPES.OpenSubscriptionDashboard, () => {
@@ -336,7 +336,7 @@ export class WebDependencies extends DependencyContainer {
application.mobileDevice,
this.get<LoadPurchaseFlowUrl>(Web_TYPES.LoadPurchaseFlowUrl),
this.get<IsNativeIOS>(Web_TYPES.IsNativeIOS),
this.get<IsNativeAndroid>(Web_TYPES.IsNativeAndroid),
this.get<IsAndroid>(Web_TYPES.IsAndroid),
application.events,
)
})
@@ -37,7 +37,7 @@ import {
IsGlobalSpellcheckEnabled,
IsMobileDevice,
IsNativeIOS,
IsNativeAndroid,
IsAndroid,
IsNativeMobileWeb,
KeyboardService,
PluginsServiceInterface,
@@ -258,12 +258,12 @@ export class WebApplication extends SNApplication implements WebApplicationInter
return this.deps.get<IsNativeIOS>(Web_TYPES.IsNativeIOS).execute().getValue()
}
isNativeAndroid(): boolean {
return this.deps.get<IsNativeAndroid>(Web_TYPES.IsNativeAndroid).execute().getValue()
isAndroid(): boolean {
return this.deps.get<IsAndroid>(Web_TYPES.IsAndroid).execute().getValue()
}
canShowPurchaseFlow(): boolean {
return !this.isNativeAndroid()
return !this.isAndroid()
}
get isMobileDevice(): boolean {
@@ -271,7 +271,7 @@ export class WebApplication extends SNApplication implements WebApplicationInter
}
get hideOutboundSubscriptionLinks() {
return this.isNativeIOS() || this.isNativeAndroid()
return this.isNativeIOS() || this.isAndroid()
}
get mobileDevice(): MobileDeviceInterface {
@@ -7,6 +7,7 @@ import {
ComponentInterface,
SubscriptionManagerEvent,
} from '@standardnotes/snjs'
import { KeyboardKeyEvent, type KeyboardModifier } from '@standardnotes/ui-services'
import { FunctionComponent, useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { observer } from 'mobx-react-lite'
import OfflineRestricted from '@/Components/ComponentView/OfflineRestricted'
@@ -153,12 +154,50 @@ const IframeFeatureView: FunctionComponent<Props> = ({
useEffect(() => {
const removeActionObserver = componentViewer.addActionObserver((action, data) => {
const keyboardData = data as {
key?: string
code?: string
ctrlKey?: boolean
metaKey?: boolean
shiftKey?: boolean
altKey?: boolean
keyboardModifier?: KeyboardModifier
}
switch (action) {
case ComponentAction.KeyDown:
application.keyboardService.handleComponentKeyDown(data.keyboardModifier)
if (keyboardData.key !== undefined && keyboardData.code !== undefined) {
application.keyboardService.handleComponentKeyboardEvent(
{
key: keyboardData.key,
code: keyboardData.code,
ctrlKey: keyboardData.ctrlKey ?? false,
metaKey: keyboardData.metaKey ?? false,
shiftKey: keyboardData.shiftKey ?? false,
altKey: keyboardData.altKey ?? false,
},
KeyboardKeyEvent.Down,
)
} else {
application.keyboardService.handleComponentKeyDown(keyboardData.keyboardModifier)
}
break
case ComponentAction.KeyUp:
application.keyboardService.handleComponentKeyUp(data.keyboardModifier)
if (keyboardData.key !== undefined && keyboardData.code !== undefined) {
application.keyboardService.handleComponentKeyboardEvent(
{
key: keyboardData.key,
code: keyboardData.code,
ctrlKey: keyboardData.ctrlKey ?? false,
metaKey: keyboardData.metaKey ?? false,
shiftKey: keyboardData.shiftKey ?? false,
altKey: keyboardData.altKey ?? false,
},
KeyboardKeyEvent.Up,
)
} else {
application.keyboardService.handleComponentKeyUp(keyboardData.keyboardModifier)
}
break
case ComponentAction.Click:
application.notesController.setContextMenuOpen(false)
@@ -50,9 +50,11 @@ const NotEntitledBanner: FunctionComponent<Props> = ({ featureStatus, feature })
</div>
</div>
<div className={'right'}>
<Button onClick={manageSubscription} primary colorStyle="success" small>
Manage subscription
</Button>
{application.canShowPurchaseFlow() && (
<Button onClick={manageSubscription} primary colorStyle="success" small>
Manage subscription
</Button>
)}
</div>
</div>
</div>
@@ -111,9 +111,9 @@ const LinkedItemBubble = ({
ref={(el) => (ref.current = el as HTMLElement)}
tabIndex={0}
className={classNames(
'group cursor-pointer rounded ',
'group inline-flex min-h-6 cursor-pointer items-center rounded align-middle',
'bg-passive-4-opacity-variant outline-1 outline-info hover:bg-contrast focus:bg-contrast focus:outline',
'whitespace-pre-wrap text-left text-sm text-text hover:no-underline focus:no-underline lg:text-xs',
'text-left text-sm text-text hover:no-underline focus:no-underline lg:text-xs',
'py-1 pl-1 pr-2',
className,
)}
@@ -123,17 +123,19 @@ const LinkedItemBubble = ({
title={tagTitle ? tagTitle.longTitle : link.item.title}
onKeyDown={onKeyDown}
>
<Icon type={icon} className={classNames('mr-1 inline h-[1.15em] align-text-top', iconClassName)} size="small" />
{tagTitle && <span className="text-passive-1">{tagTitle.titlePrefix}</span>}
{link.type === 'linked-by' && link.item.content_type !== ContentType.TYPES.Tag && (
<span className={!isBidirectional ? 'hidden group-focus:inline' : ''}>Linked By:</span>
)}
<span>{getItemTitleInContextOfLinkBubble(link.item)}</span>
<Icon type={icon} className={classNames('mr-1 flex-shrink-0', iconClassName)} size="small" />
<span className="whitespace-pre-wrap">
{tagTitle && <span className="text-passive-1">{tagTitle.titlePrefix}</span>}
{link.type === 'linked-by' && link.item.content_type !== ContentType.TYPES.Tag && (
<span className={!isBidirectional ? 'hidden group-focus:inline' : ''}>Linked By:</span>
)}
{getItemTitleInContextOfLinkBubble(link.item)}
</span>
{showUnlinkButton && !readonly && (
<button
ref={(el) => (unlinkButtonRef.current = el as HTMLElement)}
role="button"
className="-mr-1 ml-2 inline-flex h-[1.15em] cursor-pointer border-0 bg-transparent p-0 align-middle"
className="-mr-1 ml-2 inline-flex cursor-pointer border-0 bg-transparent p-0"
onClick={onUnlinkClick}
>
<Icon type="close" className="text-neutral hover:text-info" size="small" />
@@ -78,10 +78,22 @@ const getStylesFromRect = (options: {
const shouldApplyMobileWidth = isMobileScreen() && disableMobileFullscreenTakeover && !disableApplyingMobileWidth
const marginForMobile = percentOf(10, window.innerWidth)
let xTranslation = shouldApplyMobileWidth ? marginForMobile / 2 : Math.floor(rect.x)
let yTranslation = Math.floor(rect.y)
// There is a bug in Chrome that results in blurry results from translate calls:
//
// https://stackoverflow.com/questions/32034574/font-looks-blurry-after-translate-in-chrome
//
// To work around this issue and ensure the right click menu is always pixel perfect,
// ensure even numbers are used.
xTranslation = Math.floor(xTranslation / 2) * 2
yTranslation = Math.floor(yTranslation / 2) * 2
return {
willChange: 'transform',
'--translate-x': `${shouldApplyMobileWidth ? marginForMobile / 2 : Math.floor(rect.x)}px`,
'--translate-y': `${Math.floor(rect.y)}px`,
'--translate-x': `${xTranslation}px`,
'--translate-y': `${yTranslation}px`,
'--offset': `${options.offset}px`,
transform: 'translate3d(var(--translate-x), var(--translate-y), 0)',
'--transform-origin': getTransformOrigin(options.side, options.align),
@@ -14,7 +14,7 @@ const SubscriptionInformation = () => {
return (
<>
<SubscriptionStatusText />
{!isSharedSubscription && (
{!isSharedSubscription && application.canShowPurchaseFlow() && (
<Button className="mr-3 mt-3 min-w-20" label="Manage subscription" onClick={manageSubscription} />
)}
</>
@@ -3,6 +3,13 @@ import { LexicalNode } from 'lexical'
// @ts-expect-error No typing for this package
import { unicodeScripts } from 'unicode-script'
const SYMBOLS_FONT_CHARACTERS_PATTERN =
/[\u2160-\u218F\u2190-\u21FF\u2300-\u23FF\u2460-\u24FF\u2600-\u26FF\u2700-\u27BF]/
const textNeedsSymbolsFont = (text: string): boolean => {
return SYMBOLS_FONT_CHARACTERS_PATTERN.test(text)
}
enum UnicodeScript {
Latin = 'Latin',
Common = 'Common',
@@ -59,6 +66,7 @@ export enum FontFamily {
NotoSansSC = 'Noto Sans SC',
NotoSansJP = 'Noto Sans JP',
NotoSansKR = 'Noto Sans KR',
NotoSansSymbols = 'Noto Sans Symbols',
Courier = 'Courier',
Helvetica = 'Helvetica',
}
@@ -174,6 +182,9 @@ const FONT_FAMILY_TO_FONT_SOURCES: Partial<Record<FontFamily, Partial<Record<Fon
[FontFamily.NotoSansKR]: {
[FontVariant.Normal]: '/noto-sans-kr/NotoSansKR-Regular.ttf',
},
[FontFamily.NotoSansSymbols]: {
[FontVariant.Normal]: '/noto-sans-symbols/NotoSansSymbols-VariableFont_wght.ttf',
},
}
export const getFontFamilyForUnicodeScript = (script: UnicodeScript): FontFamily => {
@@ -270,7 +281,8 @@ const getFontRegisterOptions = (fontFamily: FontFamily) => {
}
export const getFontFamiliesFromLexicalNode = (node: LexicalNode) => {
const scripts: UnicodeScript[] = Array.from(unicodeScripts(node.getTextContent()))
const text = node.getTextContent()
const scripts: UnicodeScript[] = Array.from(unicodeScripts(text))
const fontFamilies = [FontFamily.NotoSans]
scripts.forEach((script) => {
const fontFamilyForScript = getFontFamilyForUnicodeScript(script)
@@ -278,6 +290,11 @@ export const getFontFamiliesFromLexicalNode = (node: LexicalNode) => {
fontFamilies.unshift(fontFamilyForScript)
}
})
if (textNeedsSymbolsFont(text)) {
fontFamilies.unshift(FontFamily.NotoSansSymbols)
}
const fontFamiliesSet = new Set(fontFamilies)
return Array.from(fontFamiliesSet)
}
@@ -19,6 +19,7 @@ import { $isTableNode, $isTableRowNode, $isTableCellNode } from '@lexical/table'
import { $isCodeHighlightNode, $isCodeNode } from '@lexical/code'
import { $isInlineFileNode } from '../../../Plugins/InlineFilePlugin/InlineFileNode'
import { $isRemoteImageNode } from '../../../Plugins/RemoteImagePlugin/RemoteImageNode'
import { $isBubbleNode } from '../../../Plugins/ItemBubblePlugin/Nodes/BubbleUtils'
import { $isCollapsibleContainerNode } from '../../../Plugins/CollapsiblePlugin/CollapsibleContainerNode'
import { $isCollapsibleContentNode } from '../../../Plugins/CollapsiblePlugin/CollapsibleContentNode'
import { $isCollapsibleTitleNode } from '../../../Plugins/CollapsiblePlugin/CollapsibleTitleNode'
@@ -141,10 +142,10 @@ const getListItemNode = ({
],
},
{
type: 'Text',
type: 'View',
style: {
flex: 1,
lineHeight: PDF_BASE_FONT_SIZE * PDF_LINE_HEIGHT_MULTIPLIER,
flexDirection: 'column',
},
children,
},
@@ -363,6 +364,13 @@ const getPDFDataNodeFromLexicalNode = (
}
}
if ($isBubbleNode(node)) {
return {
type: 'Text',
children: node.getTextContent(),
}
}
if ($isInlineFileNode(node) || $isRemoteImageNode(node)) {
if (!node.__src.startsWith('data:')) {
return {
@@ -470,6 +478,10 @@ const getPDFDataNodeFromLexicalNode = (
}
if ($isParagraphNode(node) && node.getTextContent().length === 0) {
if ($isListItemNode(parent)) {
return null
}
return getPDFVerticalSpacer()
}
@@ -13,10 +13,10 @@ export const CodeBlock = {
const selection = $getSelection()
if ($isRangeSelection(selection)) {
if (selection.isCollapsed()) {
$setBlocksType(selection, () => $createCodeNode())
$setBlocksType(selection, () => $createCodeNode('plain'))
} else {
const textContent = selection.getTextContent()
const codeNode = $createCodeNode()
const codeNode = $createCodeNode('plain')
selection.insertNodes([codeNode])
selection.insertRawText(textContent)
}
@@ -1,4 +1,5 @@
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
import { useLexicalEditable } from '@lexical/react/useLexicalEditable'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useApplication } from '../../../ApplicationProvider'
import {
@@ -28,6 +29,7 @@ import Icon from '../../../Icon/Icon'
export function SearchPlugin() {
const application = useApplication()
const [editor] = useLexicalComposerContext()
const isEditable = useLexicalEditable()
const [isSearchActive, setIsSearchActive] = useState(false)
@@ -43,6 +45,12 @@ export function SearchPlugin() {
const toggleReplaceMode = useCallback(() => setIsReplaceMode((enabled) => !enabled), [])
const [replaceQuery, setReplaceQuery] = useState('')
useEffect(() => {
if (!isEditable) {
setIsReplaceMode(false)
}
}, [isEditable])
const highlightRendererRef = useRef<SearchHighlightRendererMethods>(null)
const [currentResultIndex, setCurrentResultIndex] = useState(-1)
@@ -126,7 +134,7 @@ export function SearchPlugin() {
category: 'Super notes',
description: 'Search and replace in current note',
onKeyDown: (event) => {
if (!editor.isEditable()) {
if (!isEditable) {
return
}
event.preventDefault()
@@ -161,7 +169,15 @@ export function SearchPlugin() {
},
},
])
}, [application.keyboardService, editor, goToNextResult, goToPrevResult, toggleCaseSensitivity, toggleReplaceMode])
}, [
application.keyboardService,
editor,
goToNextResult,
goToPrevResult,
isEditable,
toggleCaseSensitivity,
toggleReplaceMode,
])
const searchQueryAndHighlight = useCallback(
(query: string, isCaseSensitive: boolean) => {
@@ -222,6 +238,9 @@ export function SearchPlugin() {
)
const replaceCurrentResult = useCallback(() => {
if (!isEditable) {
return
}
const currentResult = results[currentResultIndex]
if (!currentResult) {
return
@@ -236,9 +255,12 @@ export function SearchPlugin() {
},
)
searchQueryAndHighlight(query, isCaseSensitive)
}, [$replaceResult, currentResultIndex, editor, isCaseSensitive, query, results, searchQueryAndHighlight])
}, [$replaceResult, currentResultIndex, editor, isCaseSensitive, isEditable, query, results, searchQueryAndHighlight])
const replaceAllResults = useCallback(() => {
if (!isEditable) {
return
}
if (results.length === 0) {
return
}
@@ -258,7 +280,7 @@ export function SearchPlugin() {
},
)
searchQueryAndHighlight(query, isCaseSensitive)
}, [$replaceResult, editor, isCaseSensitive, query, results, searchQueryAndHighlight])
}, [$replaceResult, editor, isCaseSensitive, isEditable, query, results, searchQueryAndHighlight])
const [isMounted, setElement] = useLifecycleAnimation({
open: isSearchActive,
@@ -295,11 +317,11 @@ export function SearchPlugin() {
<div
className={classNames(
'absolute left-2 right-6 top-2 z-10 flex select-none rounded border border-border bg-default font-sans md:left-auto',
editor.isEditable() ? 'md:top-13' : 'md:top-3',
isEditable ? 'md:top-13' : 'md:top-3',
)}
ref={setElement}
>
{editor.isEditable() && (
{isEditable && (
<button
className="focus:ring-none border-r border-border px-1 hover:bg-contrast focus:shadow-inner focus:shadow-info"
onClick={toggleReplaceMode}
@@ -392,7 +414,7 @@ export function SearchPlugin() {
<CloseIcon className="h-4 w-4 fill-current text-text" />
</button>
</div>
{isReplaceMode && (
{isReplaceMode && isEditable && (
<div className="flex flex-wrap items-center gap-2 md:flex-nowrap">
<input
type="text"
@@ -3,22 +3,32 @@ import Button from '../Button/Button'
import { startAuthentication } from '@simplewebauthn/browser'
import { log, LoggingDomain } from '@/Logging'
const CHROME_CLIPPER_EXTENSION_ORIGIN = 'chrome-extension://heapafmadojoodklnkhjanbinemaagok'
const FIREFOX_CLIPPER_EXTENSION_ORIGIN = 'moz-extension://2a461925-d1b1-4ed3-99a6-91fe7633cc2c'
const ALLOWED_PARENT_ORIGINS = ['file://', CHROME_CLIPPER_EXTENSION_ORIGIN, FIREFOX_CLIPPER_EXTENSION_ORIGIN]
const isAllowedParentOrigin = (origin: string): boolean => {
return ALLOWED_PARENT_ORIGINS.includes(origin)
}
/**
* An iframe for use in the desktop and mobile application that allows them to load app.standardnotes.com to perform
* U2F authentication. Web applications do not need this iframe, as they can perform U2F authentication directly.
* An iframe for use in the desktop app and web clipper extension that allows them to load app.standardnotes.com
* to perform U2F authentication. Web applications do not need this iframe, as they can perform U2F authentication
* directly.
*/
const U2FAuthIframe = () => {
const [username, setUsername] = useState('')
const [apiHost, setApiHost] = useState<string | null>(null)
const [source, setSource] = useState<MessageEvent['source'] | null>(null)
const NATIVE_CLIENT_ORIGIN = 'file://'
const [parentOrigin, setParentOrigin] = useState<string | null>(null)
useEffect(() => {
window.parent.postMessage(
{
mountedAuthView: true,
},
NATIVE_CLIENT_ORIGIN,
'*',
)
}, [])
@@ -26,9 +36,8 @@ const U2FAuthIframe = () => {
const messageHandler = (event: MessageEvent) => {
log(LoggingDomain.U2F, 'U2F iframe received message', event)
const eventDoesNotComeFromNativeClient = event.origin !== NATIVE_CLIENT_ORIGIN
if (eventDoesNotComeFromNativeClient) {
log(LoggingDomain.U2F, 'Not setting username; origin does not match', event.origin, NATIVE_CLIENT_ORIGIN)
if (!isAllowedParentOrigin(event.origin)) {
log(LoggingDomain.U2F, 'Not setting username; origin is not allowed', event.origin)
return
}
@@ -36,6 +45,7 @@ const U2FAuthIframe = () => {
setUsername(event.data.username)
setApiHost(event.data.apiHost)
setSource(event.source)
setParentOrigin(event.origin)
}
}
@@ -54,7 +64,7 @@ const U2FAuthIframe = () => {
setError('')
try {
if (!username || !source) {
if (!username || !source || !parentOrigin) {
throw new Error('No username provided')
}
@@ -81,7 +91,7 @@ const U2FAuthIframe = () => {
{
assertionResponse,
},
NATIVE_CLIENT_ORIGIN,
parentOrigin,
)
setInfo('Authentication successful!')
@@ -92,7 +102,7 @@ const U2FAuthIframe = () => {
setError(JSON.stringify(error))
console.error(error)
}
}, [source, username, apiHost])
}, [source, username, apiHost, parentOrigin])
return (
<div className="flex h-full w-full flex-col items-center justify-center gap-2">
@@ -11,7 +11,7 @@ import { action, makeObservable, observable } from 'mobx'
import { AbstractViewController } from '../Abstract/AbstractViewController'
import { PurchaseFlowPane } from './PurchaseFlowPane'
import { LoadPurchaseFlowUrl } from '@/Application/UseCase/LoadPurchaseFlowUrl'
import { IsNativeIOS, IsNativeAndroid } from '@standardnotes/ui-services'
import { IsNativeIOS, IsAndroid } from '@standardnotes/ui-services'
export class PurchaseFlowController extends AbstractViewController {
isOpen = false
@@ -25,7 +25,7 @@ export class PurchaseFlowController extends AbstractViewController {
private mobileDevice: MobileDeviceInterface | undefined,
private _loadPurchaseFlowUrl: LoadPurchaseFlowUrl,
private _isNativeIOS: IsNativeIOS,
private _isNativeAndroid: IsNativeAndroid,
private _isAndroid: IsAndroid,
eventBus: InternalEventBusInterface,
) {
super(eventBus)
@@ -45,7 +45,7 @@ export class PurchaseFlowController extends AbstractViewController {
}
openPurchaseFlow = async (plan = AppleIAPProductId.ProPlanYearly) => {
if (this._isNativeAndroid.execute().getValue()) {
if (this._isAndroid.execute().getValue()) {
return
}
@@ -63,7 +63,7 @@ export class PurchaseFlowController extends AbstractViewController {
}
openPurchaseWebpage = async () => {
if (this._isNativeAndroid.execute().getValue()) {
if (this._isAndroid.execute().getValue()) {
return
}