Compare commits

...

10 Commits

Author SHA1 Message Date
2ffd3a64cb disable paywall
Some checks are pending
Sync Repo / git-sync (push) Waiting to run
2026-03-26 20:03:17 +01:00
Antonella Sgarlatta
62d97413bc chore: fixes xc upgrade test workflow commands 2026-03-23 14:46:45 -03:00
Antonella Sgarlatta
aa19cba156 chore: fixes xc upgrade test workflow commands 2026-03-20 13:38:07 -03:00
Antonella Sgarlatta
d45016468a chore: adds test workflow to verify xc version upgrade 2026-03-20 13:34:28 -03:00
StandardNotes CI
ffd55a77e8 chore(release): publish
- @standardnotes/clipper@1.1.580
 - @standardnotes/desktop@3.110.185
 - @standardnotes/mobile@3.58.245
 - @standardnotes/releases@1.4.885
 - @standardnotes/web@3.201.21
2026-03-06 18:42:34 +00:00
Antonella Sgarlatta
51f7728c17 chore: fix translation strings (#2994) 2026-03-06 15:17:55 -03:00
StandardNotes CI
00ecfc4951 chore(release): publish
- @standardnotes/clipper@1.1.579
 - @standardnotes/desktop@3.110.184
 - @standardnotes/mobile@3.58.244
 - @standardnotes/releases@1.4.884
 - @standardnotes/web@3.201.20
2026-03-06 03:00:09 +00:00
Antonella Sgarlatta
e2f9f636ae fix: Adjusts lists items left marin on iOS (#2991) 2026-03-05 23:48:40 -03:00
Antonella Sgarlatta
8a845df38c fix: Fixes prompt for Cmd/Ctrl+Backspace command on trashed note (#2990) 2026-03-05 23:48:13 -03:00
Antonella Sgarlatta
bdc43d6d54 fix: Fixes dropdowns styling when labels are too long (#2989) 2026-03-05 23:47:54 -03:00
24 changed files with 215 additions and 41 deletions

48
.github/workflows/ios.verify.sdk.yml vendored Normal file
View File

@@ -0,0 +1,48 @@
name: iOS SDK Verify
on: workflow_dispatch
jobs:
verify-ios-sdk:
defaults:
run:
working-directory: packages/mobile
runs-on: macos-15
timeout-minutes: 90
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Select Xcode 26
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: "26.0"
- name: Verify Xcode and available iOS SDKs
run: |
xcodebuild -version
xcodebuild -showsdks | grep -E "iphoneos"
- name: Install dependencies
run: yarn install --immutable && yarn install:pods
- name: Build mobile workspace dependencies
working-directory: ${{ github.workspace }}
run: yarn build:mobile
- name: Archive app without signing or upload
run: |
xcodebuild \
-workspace ios/StandardNotes.xcworkspace \
-scheme StandardNotes \
-configuration Release \
-destination "generic/platform=iOS" \
-archivePath build/StandardNotes.xcarchive \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
archive
- name: Validate archive SDK metadata
run: |
plutil -p build/StandardNotes.xcarchive/Info.plist | grep -E "DTSDKName"
plutil -p build/StandardNotes.xcarchive/Info.plist | grep -E "iphoneos26\\."

29
Dockerfile Normal file
View File

@@ -0,0 +1,29 @@
# Etap 1: build
FROM node:20-alpine AS builder
WORKDIR /app
RUN corepack enable
COPY . .
RUN yarn install --frozen-lockfile
RUN yarn build:web
# Etap 2: serwer nginx
FROM nginx:alpine
COPY --from=builder /app/packages/web/dist /usr/share/nginx/html
# SPA fallback
RUN printf 'server {\n\
listen 80;\n\
server_name _;\n\
root /usr/share/nginx/html;\n\
index index.html;\n\
location / {\n\
try_files $uri /index.html;\n\
}\n\
}\n' > /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.1.580](https://github.com/standardnotes/app/compare/@standardnotes/clipper@1.1.579...@standardnotes/clipper@1.1.580) (2026-03-06)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.579](https://github.com/standardnotes/app/compare/@standardnotes/clipper@1.1.578...@standardnotes/clipper@1.1.579) (2026-03-06)
**Note:** Version bump only for package @standardnotes/clipper
## [1.1.578](https://github.com/standardnotes/app/compare/@standardnotes/clipper@1.1.577...@standardnotes/clipper@1.1.578) (2026-02-24)
**Note:** Version bump only for package @standardnotes/clipper

View File

@@ -1,7 +1,7 @@
{
"name": "@standardnotes/clipper",
"description": "Web clipper browser extension for Standard Notes",
"version": "1.1.578",
"version": "1.1.580",
"private": true,
"scripts": {
"build-mv2": "yarn clean && webpack --config ./webpack.config.prod.js",

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.110.185](https://github.com/standardnotes/app/compare/@standardnotes/desktop@3.201.20...@standardnotes/desktop@3.110.185) (2026-03-06)
**Note:** Version bump only for package @standardnotes/desktop
## [3.110.184](https://github.com/standardnotes/app/compare/@standardnotes/desktop@3.201.19...@standardnotes/desktop@3.110.184) (2026-03-06)
**Note:** Version bump only for package @standardnotes/desktop
## [3.110.183](https://github.com/standardnotes/app/compare/@standardnotes/desktop@3.201.18...@standardnotes/desktop@3.110.183) (2026-02-24)
**Note:** Version bump only for package @standardnotes/desktop

View File

@@ -1,7 +1,7 @@
{
"name": "@standardnotes/desktop",
"main": "./app/dist/index.js",
"version": "3.110.183",
"version": "3.110.185",
"license": "AGPL-3.0",
"author": "Standard Notes.",
"private": true,

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.58.245](https://github.com/standardnotes/app/compare/@standardnotes/mobile@3.58.244...@standardnotes/mobile@3.58.245) (2026-03-06)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.244](https://github.com/standardnotes/app/compare/@standardnotes/mobile@3.58.243...@standardnotes/mobile@3.58.244) (2026-03-06)
**Note:** Version bump only for package @standardnotes/mobile
## [3.58.243](https://github.com/standardnotes/app/compare/@standardnotes/mobile@3.58.242...@standardnotes/mobile@3.58.243) (2026-02-24)
**Note:** Version bump only for package @standardnotes/mobile

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/mobile",
"version": "3.58.243",
"version": "3.58.245",
"author": "Standard Notes.",
"private": true,
"license": "AGPL-3.0",

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.4.885](https://github.com/standardnotes/app/compare/@standardnotes/releases@1.4.884...@standardnotes/releases@1.4.885) (2026-03-06)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.884](https://github.com/standardnotes/app/compare/@standardnotes/releases@1.4.883...@standardnotes/releases@1.4.884) (2026-03-06)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.883](https://github.com/standardnotes/app/compare/@standardnotes/releases@1.4.882...@standardnotes/releases@1.4.883) (2026-02-24)
**Note:** Version bump only for package @standardnotes/releases

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/releases",
"version": "1.4.883",
"version": "1.4.885",
"repository": {
"type": "git",
"url": "https://github.com/standardnotes/app",

View File

@@ -683,7 +683,7 @@ export class LegacyApiService
throw Error('Cannot download offline repo without url and offlineKEy')
}
const TRUSTED_FEATURE_HOSTS = ['api.standardnotes.com', 'localhost']
const TRUSTED_FEATURE_HOSTS = ['api.standardnotes.com', 'localhost', 'apinotes.radmit.pl']
const { hostname } = new URL(featuresUrl)

View File

@@ -60,7 +60,7 @@ export class FeaturesService
private getFeatureStatusUseCase = new GetFeatureStatusUseCase(this.items)
private readonly PROD_OFFLINE_FEATURES_URL = 'https://api.standardnotes.com/v1/offline/features'
private readonly PROD_OFFLINE_FEATURES_URL = 'https://apinotes.radmit.pl/v1/offline/features'
constructor(
private storage: StorageServiceInterface,

View File

@@ -3,6 +3,19 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.201.21](https://github.com/standardnotes/app/compare/@standardnotes/web@3.201.20...@standardnotes/web@3.201.21) (2026-03-06)
**Note:** Version bump only for package @standardnotes/web
## [3.201.20](https://github.com/standardnotes/app/compare/@standardnotes/web@3.201.19...@standardnotes/web@3.201.20) (2026-03-06)
### Bug Fixes
* Adjusts lists items left marin on iOS ([#2991](https://github.com/standardnotes/app/issues/2991)) ([e2f9f63](https://github.com/standardnotes/app/commit/e2f9f636ae61929101ac778fde4a388e48f89179))
* Fixes dropdowns styling when labels are too long ([#2989](https://github.com/standardnotes/app/issues/2989)) ([bdc43d6](https://github.com/standardnotes/app/commit/bdc43d6d5496b10fbcefd501420bd79cea7db39e))
* Fixes prompt for Cmd/Ctrl+Backspace command on trashed note ([#2990](https://github.com/standardnotes/app/issues/2990)) ([8a845df](https://github.com/standardnotes/app/commit/8a845df38c98f774e52e968a94ec40dba64ad8cd))
* Renders single line breaks properly on Super editor Show markdown ([#2988](https://github.com/standardnotes/app/issues/2988)) ([ac07cea](https://github.com/standardnotes/app/commit/ac07cea06efa041957d1ac227dd6e9ff2190b613))
## [3.201.19](https://github.com/standardnotes/app/compare/@standardnotes/web@3.201.18...@standardnotes/web@3.201.19) (2026-02-24)
### Bug Fixes

View File

@@ -1,5 +1,36 @@
{
"versions": [
{
"version": "3.201.21",
"title": "[3.201.21](https://github.com/standardnotes/app/compare/@standardnotes/web@3.201.20...@standardnotes/web@3.201.21) (2026-03-06)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.201.20",
"title": "[3.201.20](https://github.com/standardnotes/app/compare/@standardnotes/web@3.201.19...@standardnotes/web@3.201.20) (2026-03-06)",
"date": null,
"body": "### Bug Fixes\n\n* Adjusts lists items left marin on iOS ([#2991](https://github.com/standardnotes/app/issues/2991)) ([e2f9f63](https://github.com/standardnotes/app/commit/e2f9f636ae61929101ac778fde4a388e48f89179))\n* Fixes dropdowns styling when labels are too long ([#2989](https://github.com/standardnotes/app/issues/2989)) ([bdc43d6](https://github.com/standardnotes/app/commit/bdc43d6d5496b10fbcefd501420bd79cea7db39e))\n* Fixes prompt for Cmd/Ctrl+Backspace command on trashed note ([#2990](https://github.com/standardnotes/app/issues/2990)) ([8a845df](https://github.com/standardnotes/app/commit/8a845df38c98f774e52e968a94ec40dba64ad8cd))\n* Renders single line breaks properly on Super editor Show markdown ([#2988](https://github.com/standardnotes/app/issues/2988)) ([ac07cea](https://github.com/standardnotes/app/commit/ac07cea06efa041957d1ac227dd6e9ff2190b613))",
"parsed": {
"_": [
"Adjusts lists items left marin on iOS (#2991) (e2f9f63)",
"Fixes dropdowns styling when labels are too long (#2989) (bdc43d6)",
"Fixes prompt for Cmd/Ctrl+Backspace command on trashed note (#2990) (8a845df)",
"Renders single line breaks properly on Super editor Show markdown (#2988) (ac07cea)"
],
"Bug Fixes": [
"Adjusts lists items left marin on iOS (#2991) (e2f9f63)",
"Fixes dropdowns styling when labels are too long (#2989) (bdc43d6)",
"Fixes prompt for Cmd/Ctrl+Backspace command on trashed note (#2990) (8a845df)",
"Renders single line breaks properly on Super editor Show markdown (#2988) (ac07cea)"
]
}
},
{
"version": "3.201.19",
"title": "[3.201.19](https://github.com/standardnotes/app/compare/@standardnotes/web@3.201.18...@standardnotes/web@3.201.19) (2026-02-24)",

View File

@@ -1,6 +1,6 @@
{
"name": "@standardnotes/web",
"version": "3.201.19",
"version": "3.201.21",
"license": "AGPL-3.0",
"main": "dist/app.js",
"author": "Standard Notes",

View File

@@ -119,7 +119,7 @@ export class WebApplication extends SNApplication implements WebApplicationInter
/**
* iOS file:// based origin does not work with production cookies
*/
apiVersion: platform === Platform.Ios || platform === Platform.Android ? ApiVersion.v0 : ApiVersion.v1,
apiVersion: platform === Platform.Ios || platform === Platform.Android ? ApiVersion.v0 : ApiVersion.v0,
loadBatchSize:
deviceInterface.environment === Environment.Mobile ? 250 : ApplicationOptionsDefaults.loadBatchSize,
sleepBetweenBatches:

View File

@@ -166,9 +166,22 @@ const ConfirmPassword: FunctionComponent<Props> = ({ setMenuPane, email, passwor
const confirmPasswordForm = (
<>
<div className="mb-3 px-3 text-sm">
{c('Info').jt`Because your notes are encrypted using your password, ${(
<span className="text-danger">Standard Notes does not have a password reset option</span>
)}. If you forget your password, you will permanently lose access to your data.`}
{
// translator: Full sentence: "Because your notes are encrypted using your password, Standard Notes does not have a password reset option. If you forget your password, you will permanently lose access to your data."
c('Info').t`Because your notes are encrypted using your password,`
}{' '}
{
<span className="text-danger">
{
// translator: Full sentence: "Because your notes are encrypted using your password, Standard Notes does not have a password reset option. If you forget your password, you will permanently lose access to your data."
c('Info').t`Standard Notes does not have a password reset option`
}
</span>
}
{
// translator: Full sentence: "Because your notes are encrypted using your password, Standard Notes does not have a password reset option. If you forget your password, you will permanently lose access to your data."
c('Info').t`. If you forget your password, you will permanently lose access to your data.`
}
</div>
<form onSubmit={handleConfirmFormSubmit} className="mb-1 px-3">
{!isRegistering && (

View File

@@ -56,7 +56,7 @@ const Dropdown = ({
</SelectLabel>
<Select
className={classNames(
'flex w-full min-w-55 items-center justify-between rounded border border-passive-3 bg-default px-3.5 py-1.5 text-sm text-foreground md:translucent-ui:bg-transparent',
'flex w-full min-w-55 max-w-full items-center justify-between rounded border border-passive-3 bg-default px-3.5 py-1.5 text-sm text-foreground md:translucent-ui:bg-transparent',
disabled && 'opacity-50',
classNameOverride.button,
!fullWidth && 'md:w-fit',
@@ -64,13 +64,13 @@ const Dropdown = ({
store={select}
disabled={disabled}
>
<div className="flex items-center">
<div className="flex min-w-0 items-center overflow-hidden">
{currentItem?.icon ? (
<div className="mr-2 flex">
<div className="mr-2 flex shrink-0">
<Icon type={currentItem.icon} className={currentItem.iconClassName ?? ''} size="small" />
</div>
) : null}
<div className="text-base lg:text-sm">{currentItem?.label}</div>
<div className="truncate text-base lg:text-sm">{currentItem?.label}</div>
</div>
<Icon type="chevron-down" size="normal" className={isExpanded ? 'rotate-180' : ''} />
</Select>
@@ -84,17 +84,17 @@ const Dropdown = ({
>
{items.map((item) => (
<SelectItem
className="group flex cursor-pointer items-center bg-transparent px-3 py-1.5 text-sm text-text hover:bg-contrast hover:text-foreground [&[data-active-item]]:bg-info [&[data-active-item]]:text-info-contrast"
className="group flex min-w-0 cursor-pointer items-center overflow-hidden bg-transparent px-3 py-1.5 text-sm text-text hover:bg-contrast hover:text-foreground [&[data-active-item]]:bg-info [&[data-active-item]]:text-info-contrast"
key={item.value}
value={item.value}
disabled={item.disabled}
>
{item.icon ? (
<div className="mr-3 flex">
<div className="mr-3 flex shrink-0">
<Icon type={item.icon} className={item.iconClassName ?? ''} size="small" />
</div>
) : null}
<div className="text-base lg:text-sm">{item.label}</div>
<div className="truncate text-base lg:text-sm">{item.label}</div>
</SelectItem>
))}
</SelectPopover>

View File

@@ -761,7 +761,7 @@ class NoteView extends AbstractComponent<NoteViewProps, State> {
registerKeyboardShortcuts() {
const moveNoteToTrash = () => {
this.deleteNote(false).catch(console.error)
this.deleteNote(this.note.trashed).catch(console.error)
}
this.#observers.push(

View File

@@ -6,12 +6,12 @@ import { FunctionComponent, useEffect, useState } from 'react'
import PreferencesGroup from '@/Components/Preferences/PreferencesComponents/PreferencesGroup'
import PreferencesSegment from '@/Components/Preferences/PreferencesComponents/PreferencesSegment'
import { useApplication } from '@/Components/ApplicationProvider'
import { SubscriptionManagerEvent, Subscription } from '@standardnotes/snjs'
import { SubscriptionManagerEvent, Subscription as SubscriptionType } from '@standardnotes/snjs'
const Subscription: FunctionComponent = () => {
const application = useApplication()
const [onlineSubscription, setOnlineSubscription] = useState<Subscription | undefined>(
const [onlineSubscription, setOnlineSubscription] = useState<SubscriptionType | undefined>(
application.subscriptionController.onlineSubscription,
)

View File

@@ -198,10 +198,14 @@ const CreateAccount: FunctionComponent<Props> = ({ application }) => {
<DiamondIcon className="absolute -right-2 top-0 -z-[1] h-18 w-18 translate-x-1/2" />
<div className="mr-0 lg:mr-12">
// translator: Full sentence: "Create your free account"
<h1 className="mb-2 mt-0 text-2xl font-bold">{c('Title').t`Create your free account`}</h1>
// translator: Full sentence: "Create your free account to continue to Standard Notes."
<div className="mb-4 text-sm font-medium">{c('Info').t`to continue to Standard Notes.`}</div>
{
// translator: Full sentence: "Create your free account"
<h1 className="mb-2 mt-0 text-2xl font-bold">{c('Title').t`Create your free account`}</h1>
}
{
// translator: Full sentence: "Create your free account to continue to Standard Notes."
<div className="mb-4 text-sm font-medium">{c('Info').t`to continue to Standard Notes.`}</div>
}
{captchaURL ? captchaIframe : CreateAccountForm}
<div className="flex flex-col-reverse items-start justify-between md:flex-row md:items-center">
<div className="flex flex-col">
@@ -210,8 +214,10 @@ const CreateAccount: FunctionComponent<Props> = ({ application }) => {
disabled={isCreatingAccount}
className="mb-2 flex cursor-pointer items-start border-0 bg-default p-0 font-medium text-info hover:underline"
>
// translator: "Instead" here refers to "instead of creating an account"
{c('Action').t`Sign in instead`}
{
// translator: "Instead" here refers to "instead of creating an account"
c('Action').t`Sign in instead`
}
</button>
{!application.isNativeIOS() && (
<button

View File

@@ -168,14 +168,13 @@ const SignIn: FunctionComponent<Props> = ({ application }) => {
<div className="mb-4 text-sm font-medium">{c('Info').t`to continue to Standard Notes.`}</div>
{showCaptcha ? captchaIframe : signInForm}
<div className="text-sm font-medium text-passive-1">
{c('Info').jt`Dont have an account yet? ${(
<a
className={`text-info ${isSigningIn ? 'cursor-not-allowed' : 'cursor-pointer '}`}
onClick={handleCreateAccountInstead}
>
{c('Action').t`Create account`}
</a>
)}`}
{c('Info').t`Dont have an account yet?`}{' '}
<a
className={`text-info ${isSigningIn ? 'cursor-not-allowed' : 'cursor-pointer '}`}
onClick={handleCreateAccountInstead}
>
{c('Action').t`Create account`}
</a>
</div>
</div>
</div>

View File

@@ -9,6 +9,9 @@
--lexical-list-left-margin: 20px;
}
}
.ios-web {
--lexical-list-left-margin: 24px;
}
.monospace-font {
--lexical-list-left-margin: 42px;
}

View File

@@ -3,7 +3,7 @@ import { KeyboardKey } from '@standardnotes/ui-services'
import { useCallback, useState, useRef } from 'react'
import { useApplication } from '../ApplicationProvider'
import Icon from '../Icon/Icon'
import { Table, TableRow } from './CommonTypes'
import { Table as TableType, TableRow as TableRowType } from './CommonTypes'
function TableRow<Data>({
row,
@@ -13,12 +13,12 @@ function TableRow<Data>({
handleRowContextMenu,
handleActivateRow,
}: {
row: TableRow<Data>
row: TableRowType<Data>
index: number
canSelectRows: Table<Data>['canSelectRows']
canSelectRows: TableType<Data>['canSelectRows']
handleRowClick: (event: React.MouseEvent<HTMLDivElement, MouseEvent>, id: string) => void
handleRowContextMenu: Table<Data>['handleRowContextMenu']
handleActivateRow: Table<Data>['handleActivateRow']
handleRowContextMenu: TableType<Data>['handleRowContextMenu']
handleActivateRow: TableType<Data>['handleActivateRow']
}) {
const [isHovered, setIsHovered] = useState(false)
const [isFocused, setIsFocused] = useState(false)
@@ -96,7 +96,7 @@ const MinRowsToDisplay = 20
const PageSize = Math.ceil(document.documentElement.clientHeight / MinTableRowHeight) || MinRowsToDisplay
const PageScrollThreshold = 200
function Table<Data>({ table }: { table: Table<Data> }) {
function Table<Data>({ table }: { table: TableType<Data> }) {
const application = useApplication()
const [rowsToDisplay, setRowsToDisplay] = useState<number>(PageSize)