Merge pull request #8488 from 01zulfi/global/day-format-setting

global: support day format options & $day$ title format & /day command
This commit is contained in:
Abdullah Atta
2026-01-01 10:51:53 +05:00
committed by GitHub
28 changed files with 3405 additions and 63521 deletions

View File

@@ -505,6 +505,7 @@ const initializeDatabase = async (password?: string) => {
if (db.isInitialized) {
await setAppMessage();
useSettingStore.getState().setAppLoading(false);
useSettingStore.getState().refresh();
Notifications.setupReminders(true);
DatabaseLogger.info("Database initialized");
Notifications.restorePinnedNotes();

View File

@@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import type { ToolbarGroupDefinition } from "@notesnook/editor";
import { useEditor } from "./use-editor";
import { FeatureId, FeatureResult } from "@notesnook/common";
import { DayFormat } from "@notesnook/core";
export type useEditorType = ReturnType<typeof useEditor>;
export type EditorState = {
@@ -61,6 +62,7 @@ export type Settings = {
features: Record<any, any>;
loggedIn: boolean;
defaultLineHeight: number;
dayFormat: DayFormat;
};
export type EditorProps = {

View File

@@ -159,13 +159,13 @@ export const useEditorEvents = (
const fullscreen = useSettingStore((state) => state.fullscreen);
const corsProxy = useSettingStore((state) => state.settings.corsProxy);
const loading = useSettingStore((state) => state.isAppLoading);
const [dateFormat, timeFormat, defaultLineHeight] = useSettingStore(
(state) => [
const [dateFormat, timeFormat, defaultLineHeight, dayFormat] =
useSettingStore((state) => [
state.dateFormat,
state.timeFormat,
state.settings.defaultLineHeight
]
);
state.settings.defaultLineHeight,
state.dayFormat
]);
const handleBack = useRef<NativeEventSubscription>(undefined);
const loggedIn = useUserStore((state) => !!state.user);
const { fontScale } = useWindowDimensions();
@@ -225,6 +225,7 @@ export const useEditorEvents = (
fontFamily: SettingsService.get().defaultFontFamily,
dateFormat: db.settings?.getDateFormat(),
timeFormat: db.settings?.getTimeFormat(),
dayFormat: db.settings?.getDayFormat(),
fontScale,
markdownShortcuts,
features,
@@ -245,6 +246,7 @@ export const useEditorEvents = (
defaultFontFamily,
dateFormat,
timeFormat,
dayFormat,
loading,
fontScale,
markdownShortcuts,

View File

@@ -32,6 +32,7 @@ import {
BackupReminderPicker,
BackupWithAttachmentsReminderPicker,
DateFormatPicker,
DayFormatPicker,
FontPicker,
HomePicker,
SidebarTabPicker,
@@ -57,6 +58,7 @@ export const components: { [name: string]: ReactElement } = {
"title-format": <TitleFormat />,
"date-format-selector": <DateFormatPicker />,
"time-format-selector": <TimeFormatPicker />,
"day-format-selector": <DayFormatPicker />,
"theme-selector": <ThemeSelector />,
"applock-timer": <ApplockTimerPicker />,
autobackupsattachments: <BackupWithAttachmentsReminderPicker />,

View File

@@ -32,6 +32,12 @@ import { strings } from "@notesnook/intl";
import { isFeatureAvailable } from "@notesnook/common";
import PaywallSheet from "../../../components/sheets/paywall";
const DAY_FORMATS = ["short", "long"];
const DayFormatFormats = {
short: "ddd",
long: "dddd"
};
export const FontPicker = createSettingsPicker({
getValue: () => useSettingStore.getState().settings.defaultFontFamily,
updateValue: (item) => {
@@ -111,8 +117,8 @@ export const TrashIntervalPicker = createSettingsPicker({
return item === -1
? strings.never()
: item === 1
? strings.reminderRecurringMode.day()
: strings.days(item);
? strings.reminderRecurringMode.day()
: strings.days(item);
},
getItemKey: (item) => item.toString(),
options: [-1, 1, 7, 30, 365],
@@ -152,6 +158,24 @@ export const DateFormatPicker = createSettingsPicker({
isOptionAvailable: () => true
});
export const DayFormatPicker = createSettingsPicker({
getValue: () => db.settings.getDayFormat(),
updateValue: (item) => {
db.settings.setDayFormat(item);
useSettingStore.setState({
dayFormat: item
});
},
formatValue: (item) => {
return `${strings.dayFormat()} (${dayjs().format(DayFormatFormats[item])})`;
},
getItemKey: (item) => item,
options: DAY_FORMATS,
compareValue: (current, item) => current === item,
isFeatureAvailable: () => true,
isOptionAvailable: () => true
});
const TimeFormats = {
"12-hour": "hh:mm A",
"24-hour": "HH:mm"
@@ -228,10 +252,10 @@ export const ApplockTimerPicker = createSettingsPicker({
return item === -1
? strings.never()
: item === 0 || item === undefined
? strings.immediately()
: item === 1
? strings.minutes(1)
: strings.minutes(item);
? strings.immediately()
: item === 1
? strings.minutes(1)
: strings.minutes(item);
},
getItemKey: (item) => item.toString(),
options: [-1, 0, 1, 5, 15, 30],

View File

@@ -717,6 +717,14 @@ export const settingsGroups: SettingSection[] = [
component: "date-format-selector",
icon: "calendar-blank"
},
{
id: "day-format",
name: strings.dayFormat(),
description: strings.dayFormatDesc(),
type: "component",
component: "day-format-selector",
icon: "calendar-today"
},
{
id: "time-format",
name: strings.timeFormat(),

View File

@@ -24,9 +24,9 @@ import { initialWindowMetrics } from "react-native-safe-area-context";
import { FileType } from "react-native-scoped-storage";
import { create } from "zustand";
import { ThemeDark, ThemeLight, ThemeDefinition } from "@notesnook/theme";
import { Reminder } from "@notesnook/core";
import { EDITOR_LINE_HEIGHT } from "../utils/constants";
import { DayFormat, Reminder } from "@notesnook/core";
import { db } from "../common/database";
export const HostIds = [
"API_HOST",
"AUTH_HOST",
@@ -137,9 +137,11 @@ export interface SettingStore {
setInsets: (insets: Insets) => void;
timeFormat: string;
dateFormat: string;
dayFormat: DayFormat;
dbPassword?: string;
isOldAppLock: () => boolean;
initialUrl: string | null;
refresh: () => void;
}
const { width, height } = Dimensions.get("window");
@@ -226,6 +228,7 @@ export const useSettingStore = create<SettingStore>((set, get) => ({
setInsets: (insets) => set({ insets }),
timeFormat: "12-hour",
dateFormat: "DD-MM-YYYY",
dayFormat: "short",
setAppDidEnterBackgroundForAction: (value: boolean) => {
set({
appDidEnterBackgroundForAction: value
@@ -242,5 +245,12 @@ export const useSettingStore = create<SettingStore>((set, get) => ({
insets: initialWindowMetrics?.insets
? initialWindowMetrics.insets
: { top: 0, right: 0, left: 0, bottom: 0 },
initialUrl: null
initialUrl: null,
refresh: () => {
set({
dayFormat: db.settings.getDayFormat(),
timeFormat: db.settings.getTimeFormat(),
dateFormat: db.settings?.getTimeFormat()
});
}
}));

View File

@@ -117,7 +117,8 @@ const EXTRA_ICON_NAMES = [
"calendar-blank",
"email-newsletter",
"cellphone-arrow-down",
"format-line-spacing"
"format-line-spacing",
"calendar-today"
];
const __filename = fileURLToPath(import.meta.url);

File diff suppressed because one or more lines are too long

View File

@@ -57,7 +57,7 @@ import { ScopedThemeProvider } from "../theme-provider";
import { useStore as useThemeStore } from "../../stores/theme-store";
import { writeToClipboard } from "../../utils/clipboard";
import { useEditorStore } from "../../stores/editor-store";
import { parseInternalLink } from "@notesnook/core";
import { DayFormat, parseInternalLink } from "@notesnook/core";
import Skeleton from "react-loading-skeleton";
import useMobile from "../../hooks/use-mobile";
import useTablet from "../../hooks/use-tablet";
@@ -108,6 +108,7 @@ type TipTapProps = {
doubleSpacedLines: boolean;
dateFormat: string;
timeFormat: TimeFormat;
dayFormat: DayFormat;
markdownShortcuts: boolean;
fontLigatures: boolean;
};
@@ -183,6 +184,7 @@ function TipTap(props: TipTapProps) {
doubleSpacedLines,
dateFormat,
timeFormat,
dayFormat,
markdownShortcuts,
fontLigatures
} = props;
@@ -262,6 +264,7 @@ function TipTap(props: TipTapProps) {
doubleSpacedLines,
dateFormat,
timeFormat,
dayFormat,
element: editorContainer(),
editable: !readonly,
content: content?.(),
@@ -431,6 +434,7 @@ function TipTap(props: TipTapProps) {
doubleSpacedLines,
dateFormat,
timeFormat,
dayFormat,
markdownShortcuts,
fontLigatures
]);
@@ -536,6 +540,7 @@ function TiptapWrapper(
| "doubleSpacedLines"
| "dateFormat"
| "timeFormat"
| "dayFormat"
| "markdownShortcuts"
| "fontLigatures"
>
@@ -552,6 +557,7 @@ function TiptapWrapper(
);
const dateFormat = useSettingsStore((store) => store.dateFormat);
const timeFormat = useSettingsStore((store) => store.timeFormat);
const dayFormat = useSettingsStore((store) => store.dayFormat);
const markdownShortcuts = useSettingsStore(
(store) => store.markdownShortcuts
);
@@ -631,13 +637,14 @@ function TiptapWrapper(
}}
>
<TipTap
key={`tiptap-${props.id}-${doubleSpacedLines}-${dateFormat}-${timeFormat}-${markdownShortcuts}-${fontLigatures}`}
key={`tiptap-${props.id}-${doubleSpacedLines}-${dateFormat}-${timeFormat}-${dayFormat}-${markdownShortcuts}-${fontLigatures}`}
{...props}
isMobile={isMobile}
isTablet={isTablet}
doubleSpacedLines={doubleSpacedLines}
dateFormat={dateFormat}
timeFormat={timeFormat}
dayFormat={dayFormat}
markdownShortcuts={markdownShortcuts}
fontLigatures={fontLigatures}
onLoad={(editor) => {

View File

@@ -24,7 +24,7 @@ import {
useStore as useSettingStore
} from "../../stores/setting-store";
import dayjs from "dayjs";
import { TimeFormat } from "@notesnook/core";
import { TimeFormat, DayFormat } from "@notesnook/core";
import { TrashCleanupInterval } from "@notesnook/core";
import { strings } from "@notesnook/intl";
import { checkFeature } from "../../common";
@@ -141,6 +141,26 @@ export const BehaviourSettings: SettingsGroup[] = [
]
}
]
},
{
key: "day-format",
title: strings.dayFormat(),
description: strings.dayFormatDesc(),
keywords: [],
onStateChange: (listener) =>
useSettingStore.subscribe((s) => s.dayFormat, listener),
components: [
{
type: "dropdown",
onSelectionChanged: (value) =>
useSettingStore.getState().setDayFormat(value as DayFormat),
selectedOption: () => useSettingStore.getState().dayFormat,
options: [
{ value: "short", title: "Short (Mon, Tue)" },
{ value: "long", title: "Long (Monday, Tuesday)" }
]
}
]
}
]
},

View File

@@ -23,7 +23,7 @@ import { desktop } from "../common/desktop-bridge";
import createStore from "../common/store";
import Config from "../utils/config";
import BaseStore from "./index";
import { TimeFormat } from "@notesnook/core";
import { TimeFormat, DayFormat } from "@notesnook/core";
import { Profile, TrashCleanupInterval } from "@notesnook/core";
import { showToast } from "../utils/toast";
import { ConfirmDialog } from "../dialogs/confirm";
@@ -68,6 +68,7 @@ class SettingStore extends BaseStore<SettingStore> {
hideNoteTitle = Config.get("hideNoteTitle", false);
dateFormat = "DD-MM-YYYY";
timeFormat: TimeFormat = "12-hour";
dayFormat: DayFormat = "short";
titleFormat = "Note $date$ $time$";
profile?: Profile;
@@ -95,6 +96,7 @@ class SettingStore extends BaseStore<SettingStore> {
this.set({
dateFormat: db.settings.getDateFormat(),
timeFormat: db.settings.getTimeFormat(),
dayFormat: db.settings.getDayFormat(),
titleFormat: db.settings.getTitleFormat(),
trashCleanupInterval: db.settings.getTrashCleanupInterval(),
profile: db.settings.getProfile(),
@@ -121,6 +123,11 @@ class SettingStore extends BaseStore<SettingStore> {
this.set({ timeFormat });
};
setDayFormat = async (dayFormat: DayFormat) => {
await db.settings.setDayFormat(dayFormat);
this.set({ dayFormat });
};
setTitleFormat = async (titleFormat: string) => {
await db.settings.setTitleFormat(titleFormat);
this.set({ titleFormat });

View File

@@ -27,6 +27,7 @@ Notesnook supports the following (Markdown) shortcuts in the editor:
| Codeblock | \`\`\`javascript<br>function hello() { }<br>\`\`\` |
| Math block | $$$<br>2 + 2 = 4<br>$$$ |
| Current Date | `/date` |
| Current Day | `/day` |
| Date Time | `/time` |
| Current Date & Time | `/now` |
| Current Date & Time with timezone | `/nowz` |

View File

@@ -28,6 +28,8 @@ Go to `Settings` > `Editor` > `Title format` to customize the title formatting.
**$date$**: Today's date
**$day$**: Today's day name
**$time$**: The current time
**$count$**: Current note count + 1

View File

@@ -137,6 +137,7 @@ export class Notes implements ICollection {
this.db.settings.getTitleFormat(),
this.db.settings.getDateFormat(),
this.db.settings.getTimeFormat(),
this.db.settings.getDayFormat(),
headlineTitle,
this.totalNotes
);

View File

@@ -30,7 +30,8 @@ import {
ToolbarConfig,
ToolbarConfigPlatforms,
TrashCleanupInterval,
TimeFormat
TimeFormat,
DayFormat
} from "../types.js";
import { ICollection } from "./collection.js";
import { SQLCachedCollection } from "../database/sql-cached-collection.js";
@@ -53,6 +54,7 @@ const DEFAULT_GROUP_OPTIONS = (key: GroupingKey) =>
const defaultSettings: SettingItemMap = {
timeFormat: "12-hour",
dayFormat: "short",
dateFormat: "DD-MM-YYYY",
titleFormat: "Note $date$ $time$",
defaultNotebook: undefined,
@@ -204,6 +206,14 @@ export class Settings implements ICollection {
return this.set("timeFormat", format);
}
getDayFormat() {
return this.get("dayFormat");
}
setDayFormat(format: DayFormat) {
return this.set("dayFormat", format);
}
getSideBarOrder(section: SideBarSection) {
return this.get(`sideBarOrder:${section}`);
}

View File

@@ -21,6 +21,7 @@ import { Cipher } from "@notesnook/crypto";
import { isCipher } from "./utils/index.js";
export type TimeFormat = "12-hour" | "24-hour";
export type DayFormat = "short" | "long";
export type SortOptions = {
sortBy:
@@ -472,6 +473,7 @@ export type SettingItemMap = {
trashCleanupInterval: TrashCleanupInterval;
titleFormat: string;
timeFormat: TimeFormat;
dayFormat: DayFormat;
dateFormat: string;
defaultNotebook: string | undefined;
defaultTag: string | undefined;

View File

@@ -24,6 +24,7 @@ import { test, expect, describe, beforeAll, afterAll } from "vitest";
const templates = {
$time$: "11:25",
$date$: "DD-MM-YYYY",
$day$: "Wed",
$timestamp$: "DDMMYYYY1125",
$count$: "1",
$headline$: "HEADLINE"
@@ -45,8 +46,35 @@ afterAll(() => {
describe("pairs should be equal", () => {
test.each(cases)("%s", (one, two) => {
expect(formatTitle(one, "[DD-MM-YYYY]", "[hh:mm]", "HEADLINE", 0)).toBe(
two
);
expect(
formatTitle(one, "[DD-MM-YYYY]", "[hh:mm]", "short", "HEADLINE", 0)
).toBe(two);
});
});
describe("day format", () => {
test("$day$ with long format", () => {
expect(
formatTitle(
"Note $day$",
"[DD-MM-YYYY]",
"[hh:mm]",
"long",
"HEADLINE",
0
)
).toBe("Note Wednesday");
});
test("$day$ with short format", () => {
expect(
formatTitle(
"Note $day$",
"[DD-MM-YYYY]",
"[hh:mm]",
"short",
"HEADLINE",
0
)
).toBe("Note Wed");
});
});

View File

@@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import dayjs from "dayjs";
import advancedFormat from "dayjs/plugin/advancedFormat.js";
import timezone from "dayjs/plugin/timezone.js";
import { TimeFormat } from "../types.js";
import { TimeFormat, DayFormat } from "../types.js";
dayjs.extend(advancedFormat);
dayjs.extend(timezone);
@@ -68,6 +68,10 @@ export function getTimeFormat(format: TimeFormat) {
return format === "12-hour" ? "hh:mm A" : "HH:mm";
}
function getDayFormat(format: DayFormat) {
return format === "short" ? "ddd" : "dddd";
}
export type TimeZoneOptions = {
type: "timezone";
};
@@ -79,6 +83,10 @@ export type DateOptions = {
type: "date";
dateFormat: string;
};
export type DayOptions = {
type: "day";
dayFormat: DayFormat;
};
export type DateTimeOptions = {
type: "date-time";
dateFormat: string;
@@ -93,6 +101,7 @@ export type FormatDateOptions =
| TimeZoneOptions
| TimeOptions
| DateOptions
| DayOptions
| DateTimeOptions
| DateTimeWithTimeZoneOptions;
@@ -117,6 +126,8 @@ export function formatDate(
return dayjs(date).format(getTimeFormat(options.timeFormat));
case "date":
return dayjs(date).format(options.dateFormat);
case "day":
return dayjs(date).format(getDayFormat(options.dayFormat));
case "timezone":
return dayjs(date).format("ZZ");
}

View File

@@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import { TimeFormat } from "../types.js";
import { TimeFormat, DayFormat } from "../types.js";
import { formatDate } from "./date.js";
export const NEWLINE_STRIP_REGEX = /[\r\n\t\v]+/gm;
@@ -26,6 +26,7 @@ export const HEADLINE_REGEX = /\$headline\$/g;
const DATE_REGEX = /\$date\$/g;
const COUNT_REGEX = /\$count\$/g;
const TIME_REGEX = /\$time\$/g;
const DAY_REGEX = /\$day\$/g;
const TIMESTAMP_REGEX = /\$timestamp\$/g;
const TIMESTAMP_Z_REGEX = /\$timestampz\$/g;
const DATE_TIME_STRIP_REGEX = /[\\\-:./, ]/g;
@@ -34,6 +35,7 @@ export function formatTitle(
titleFormat: string,
dateFormat: string,
timeFormat: TimeFormat,
dayFormat: DayFormat,
headline = "",
totalNotes = 0
) {
@@ -49,6 +51,11 @@ export function formatTitle(
const timezone = formatDate(Date.now(), {
type: "timezone"
});
const day = formatDate(Date.now(), {
dayFormat,
type: "day"
});
const timestamp = `${date}${time}`.replace(DATE_TIME_STRIP_REGEX, "");
const timestampWithTimeZone = `${timestamp}${timezone}`;
@@ -56,6 +63,7 @@ export function formatTitle(
.replace(NEWLINE_STRIP_REGEX, " ")
.replace(DATE_REGEX, date)
.replace(TIME_REGEX, time)
.replace(DAY_REGEX, day)
.replace(HEADLINE_REGEX, headline || "")
.replace(TIMESTAMP_REGEX, timestamp)
.replace(TIMESTAMP_Z_REGEX, timestampWithTimeZone)

View File

@@ -242,6 +242,7 @@ const Tiptap = ({
},
dateFormat: settings.dateFormat,
timeFormat: settings.timeFormat as "12-hour" | "24-hour" | undefined,
dayFormat: settings.dayFormat,
enableInputRules: settings.markdownShortcuts
};
// eslint-disable-next-line react-hooks/exhaustive-deps

View File

@@ -55,6 +55,7 @@ export type Settings = {
features: Record<any, any>;
loggedIn: boolean;
defaultLineHeight: number;
dayFormat: "short" | "long";
};
/* eslint-disable no-var */

View File

@@ -32,11 +32,17 @@ declare module "@tiptap/core" {
* Insert time at current position
*/
insertTime: () => ReturnType;
/**
* Insert date at current position
*/
insertDate: () => ReturnType;
/**
* Insert day at current position
*/
insertDay: () => ReturnType;
/**
* Insert date & time at current position
*/
@@ -53,6 +59,7 @@ declare module "@tiptap/core" {
export type DateTimeOptions = {
dateFormat: string;
timeFormat: "12-hour" | "24-hour";
dayFormat: "short" | "long";
};
export const DateTime = Extension.create<DateTimeOptions>({
@@ -61,7 +68,8 @@ export const DateTime = Extension.create<DateTimeOptions>({
addOptions() {
return {
dateFormat: "DD-MM-YYYY",
timeFormat: "12-hour"
timeFormat: "12-hour",
dayFormat: "short"
};
},
@@ -98,6 +106,15 @@ export const DateTime = Extension.create<DateTimeOptions>({
type: "time"
})
),
insertDay:
() =>
({ commands }) =>
commands.insertContent(
formatDate(Date.now(), {
dayFormat: this.options.dayFormat,
type: "day"
})
),
insertDateTime:
() =>
({ commands }) =>
@@ -141,6 +158,15 @@ export const DateTime = Extension.create<DateTimeOptions>({
});
}
}),
shortcutInputRule({
shortcut: "/day",
replace: () => {
return formatDate(Date.now(), {
dayFormat: this.options.dayFormat,
type: "day"
});
}
}),
shortcutInputRule({
shortcut: "/now",
replace: () => {
@@ -206,7 +232,8 @@ function textInputRule(config: {
export function replaceDateTime(
value: string,
dateFormat = "DD-MM-YYYY",
timeFormat: "12-hour" | "24-hour" = "12-hour"
timeFormat: "12-hour" | "24-hour" = "12-hour",
dayFormat: DateTimeOptions["dayFormat"] = "short"
) {
value = value.replaceAll(
"/time ",
@@ -242,5 +269,13 @@ export function replaceDateTime(
}) + " "
);
value = value.replaceAll(
"/day ",
formatDate(Date.now(), {
dayFormat: dayFormat,
type: "day"
}) + " "
);
return value;
}

View File

@@ -130,7 +130,8 @@ export function TaskListComponent(
e.target.value = replaceDateTime(
e.target.value,
editor.storage.dateFormat,
editor.storage.timeFormat
editor.storage.timeFormat,
editor.storage.dayFormat
);
updateAttributes(
{ title: e.target.value },

View File

@@ -92,6 +92,7 @@ import "simplebar-react/dist/simplebar.min.css";
interface TiptapStorage {
dateFormat?: DateTimeOptions["dateFormat"];
timeFormat?: DateTimeOptions["timeFormat"];
dayFormat?: DateTimeOptions["dayFormat"];
openLink?: (url: string, openInNewTab?: boolean) => void;
downloadAttachment?: (attachment: Attachment) => void;
openAttachmentPicker?: (type: AttachmentType) => void;
@@ -148,6 +149,7 @@ const useTiptap = (
onBeforeCreate,
dateFormat,
timeFormat,
dayFormat,
copyToClipboard,
createInternalLink,
@@ -322,7 +324,7 @@ const useTiptap = (
KeepInView.configure({
scrollIntoViewOnWindowResize: !isMobile
}),
DateTime.configure({ dateFormat, timeFormat }),
DateTime.configure({ dateFormat, timeFormat, dayFormat }),
KeyMap,
WebClipNode,
CheckList,
@@ -375,6 +377,7 @@ const useTiptap = (
onBeforeCreate: ({ editor }) => {
editor.storage.dateFormat = dateFormat;
editor.storage.timeFormat = timeFormat;
editor.storage.dayFormat = dayFormat;
editor.storage.openLink = openLink;
editor.storage.downloadAttachment = downloadAttachment;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -422,7 +422,8 @@ $time$: Current time.
$timestamp$: Full date and time without any spaces or other symbols.
(e.g 202305261253).
$count$: Number of notes + 1.
$headline$: Use starting line of the note as title.`,
$headline$: Use starting line of the note as title.
$day$: Current day (eg. Monday)`,
setYourName: () => t`Set your name`,
presets: () => t`PRESETS`,
group: () => t`GROUP`,
@@ -2614,5 +2615,7 @@ Use this if changes from other devices are not appearing on this device. This wi
clickToSave: () => t`Click to save`,
lineHeight: () => t`Line height`,
lineHeightDesc: () => t`Adjust the line height of the editor`,
enterTitle: () => t`Enter title`
enterTitle: () => t`Enter title`,
dayFormat: () => t`Day format`,
dayFormatDesc: () => t`Choose how day is displayed in the app`
};