Compare commits

..

8 Commits

Author SHA1 Message Date
Philipinho b97bbba77d fix: remove redundant breadcrumb from destination modal 2026-05-28 16:13:25 +01:00
Philipinho d5db7fea2d fix flickers 2026-05-28 16:08:34 +01:00
Philipinho 0b14c529d8 fix page updated time object 2026-05-28 16:05:06 +01:00
Philipinho c71e9ee919 fix clipped emoji in templates editor 2026-05-28 15:52:47 +01:00
Philipinho 2cac7d6fce date localization 2026-05-28 15:38:34 +01:00
Philipinho 5a6b9503a7 support fixed toolbar in templates editor 2026-05-27 18:08:44 +01:00
Philipinho cb3b409a5a fix page position collation 2026-05-27 13:27:31 +01:00
Philipinho 41aaeddac4 util 2026-05-27 10:43:43 +01:00
38 changed files with 1034 additions and 1093 deletions
+13 -13
View File
@@ -1,7 +1,7 @@
{
"name": "client",
"private": true,
"version": "0.90.1",
"version": "0.90.0",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
@@ -20,13 +20,13 @@
"@casl/react": "5.0.1",
"@docmost/editor-ext": "workspace:*",
"@excalidraw/excalidraw": "0.18.0-3a5ef40",
"@mantine/core": "9.3.2",
"@mantine/dates": "9.3.2",
"@mantine/form": "9.3.2",
"@mantine/hooks": "9.3.2",
"@mantine/modals": "9.3.2",
"@mantine/notifications": "9.3.2",
"@mantine/spotlight": "9.3.2",
"@mantine/core": "8.3.18",
"@mantine/dates": "8.3.18",
"@mantine/form": "8.3.18",
"@mantine/hooks": "8.3.18",
"@mantine/modals": "8.3.18",
"@mantine/notifications": "8.3.18",
"@mantine/spotlight": "8.3.18",
"@slidoapp/emoji-mart": "5.8.7",
"@slidoapp/emoji-mart-data": "1.2.4",
"@slidoapp/emoji-mart-react": "1.1.5",
@@ -43,7 +43,7 @@
"i18next-http-backend": "3.0.6",
"jotai": "2.18.1",
"jotai-optics": "0.4.0",
"js-cookie": "3.0.7",
"js-cookie": "3.0.5",
"jwt-decode": "4.0.0",
"katex": "0.16.40",
"lowlight": "3.3.0",
@@ -51,9 +51,9 @@
"mermaid": "11.15.0",
"mitt": "3.0.1",
"posthog-js": "1.372.2",
"react": "19.2.7",
"react": "18.3.1",
"react-clear-modal": "^2.0.18",
"react-dom": "19.2.7",
"react-dom": "^18.3.1",
"react-drawio": "1.0.7",
"react-error-boundary": "6.1.1",
"react-helmet-async": "3.0.0",
@@ -73,8 +73,8 @@
"@types/js-cookie": "3.0.6",
"@types/katex": "0.16.8",
"@types/node": "22.19.1",
"@types/react": "19.2.17",
"@types/react-dom": "19.2.3",
"@types/react": "18.3.12",
"@types/react-dom": "18.3.1",
"@vitejs/plugin-react": "6.0.1",
"eslint": "9.28.0",
"eslint-plugin-react": "7.37.5",
@@ -978,7 +978,7 @@
"Search pages and spaces...": "Search pages and spaces...",
"No results found": "No results found",
"You don't have permission to create pages here": "You don't have permission to create pages here",
"Chat menu for {{title}}": "Chat menu for {{title}}",
"Chat menu": "Chat menu",
"API key menu": "API key menu",
"Jump to comment selection": "Jump to comment selection",
"Slash commands": "Slash commands",
@@ -1064,7 +1064,7 @@
"Filter": "Filter",
"Page title": "Page title",
"Page content": "Page content",
"Member actions for {{name}}": "Member actions for {{name}}",
"Member actions": "Member actions",
"Toggle password visibility": "Toggle password visibility",
"Send comment": "Send comment",
"Token actions": "Token actions",
@@ -105,7 +105,7 @@ export default function GlobalSidebar() {
<Divider my="xs" />
<div className={classes.section}>
<Text component="h2" className={classes.sectionHeader}>{t("Favorite spaces")}</Text>
<Text className={classes.sectionHeader}>{t("Favorite spaces")}</Text>
{!isFavoritesPending && sortedFavoriteSpaces.length === 0 ? (
<Text size="xs" c="dimmed" pl="xs" py={4}>
{t("Favorite spaces appear here")}
+10 -18
View File
@@ -16,10 +16,13 @@ interface CustomAvatarProps {
mt?: string | number;
}
// color.shade picks whose FILLED variant (white text on the shade) meets WCAG AA 4.5:1.
// Avoids lime/yellow/green/orange, too light even at dark shades.
// For non-filled variants, initials text is forced to the .9 shade at render time:
// Mantine otherwise caps light-variant placeholder text at .6, dropping contrast to ~3:1.
// `color.shade` pairs whose contrast meets WCAG AA (4.5:1) in BOTH variants:
// - filled: white text on the shade as bg
// - light: shade as text on the color's light-bg (10% color.6 over white)
// Avoids lime/yellow/green/orange — even their dark shades have weak
// contrast. grape and indigo were bumped from .7 to darker shades because
// the original picks failed: grape.7 was 4.02/3.61 (both fail) and
// indigo.7 was 4.98/4.39 (light fails by a hair).
const SAFE_INITIALS_COLORS: MantineColor[] = [
"blue.8",
"cyan.9",
@@ -51,21 +54,12 @@ function sanitizeInitialsSource(name: string) {
export const CustomAvatar = React.forwardRef<
HTMLInputElement,
CustomAvatarProps
>(({ avatarUrl, name, type, color, variant, ...props }: CustomAvatarProps, ref) => {
>(({ avatarUrl, name, type, color, ...props }: CustomAvatarProps, ref) => {
const avatarLink = getAvatarUrl(avatarUrl, type);
const isInitials = !color || color === "initials";
const resolvedColor = isInitials ? pickInitialsColor(name ?? "") : color;
const resolvedColor =
!color || color === "initials" ? pickInitialsColor(name ?? "") : color;
const initialsSource = sanitizeInitialsSource(name ?? "");
const placeholderStyles =
isInitials && variant !== "filled"
? {
placeholder: {
color: `var(--mantine-color-${resolvedColor.split(".")[0]}-9)`,
},
}
: undefined;
return (
<Avatar
ref={ref}
@@ -73,8 +67,6 @@ export const CustomAvatar = React.forwardRef<
name={initialsSource}
alt={name}
color={resolvedColor}
variant={variant}
styles={placeholderStyles}
{...props}
/>
);
@@ -1,12 +0,0 @@
import { UnstyledButton } from "@mantine/core";
import { type ComponentPropsWithoutRef, forwardRef } from "react";
// Menu.Item hard-codes role="menuitem"; use as its `component` to restore role="menuitemradio" so aria-checked works.
export const RadioMenuItem = forwardRef<
HTMLButtonElement,
ComponentPropsWithoutRef<"button">
>((props, ref) => (
<UnstyledButton ref={ref} {...props} role="menuitemradio" />
));
RadioMenuItem.displayName = "RadioMenuItem";
@@ -66,8 +66,6 @@ export default function AiChatSidebarItem({
[chat.updatedAt, i18n.language],
);
const chatTitle = chat.title || t("Untitled chat");
useEffect(() => {
if (renaming) {
// Wait for the input to be mounted before selecting.
@@ -122,7 +120,9 @@ export default function AiChatSidebarItem({
className={classes.chatItem}
data-active={isActive || undefined}
>
<span className={classes.chatItemTitle}>{chatTitle}</span>
<span className={classes.chatItemTitle}>
{chat.title || t("Untitled chat")}
</span>
<span className={classes.chatItemDate}>{formattedDate}</span>
<div className={classes.chatItemActions}>
<Menu position="bottom-end" withinPortal>
@@ -132,7 +132,7 @@ export default function AiChatSidebarItem({
size="xs"
color="gray"
onClick={(e) => e.preventDefault()}
aria-label={t("Chat menu for {{title}}", { title: chatTitle })}
aria-label={t("Chat menu")}
>
<IconDots size={14} />
</ActionIcon>
@@ -1,4 +1,4 @@
import { useCallback, useId, useRef, useEffect, useState } from "react";
import { useCallback, useRef, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { IconArrowUp, IconPaperclip, IconPlayerStopFilled, IconX, IconFile, IconPhoto, IconPlus, IconAt, IconFileText } from "@tabler/icons-react";
import { Popover } from "@mantine/core";
@@ -107,7 +107,6 @@ export default function ChatInput({
const [isEmpty, setIsEmpty] = useState(true);
const [pendingAttachments, setPendingAttachments] = useState<PendingAttachment[]>([]);
const [plusMenuOpen, setPlusMenuOpen] = useState(false);
const plusMenuId = useId();
const fileInputRef = useRef<HTMLInputElement>(null);
const onSendRef = useRef(onSend);
onSendRef.current = onSend;
@@ -343,7 +342,6 @@ export default function ChatInput({
position="top-start"
width={220}
shadow="md"
withRoles={false}
trapFocus
returnFocus
>
@@ -353,17 +351,13 @@ export default function ChatInput({
className={classes.plusButton}
onClick={() => setPlusMenuOpen((o) => !o)}
aria-label="Add content"
aria-haspopup="menu"
aria-expanded={plusMenuOpen}
aria-controls={plusMenuOpen ? plusMenuId : undefined}
>
<IconPlus size={14} />
</button>
</Popover.Target>
<Popover.Dropdown id={plusMenuId} role="menu" p={4}>
<Popover.Dropdown p={4}>
<button
type="button"
role="menuitem"
className={classes.plusMenuItem}
onClick={() => {
fileInputRef.current?.click();
@@ -383,7 +377,6 @@ export default function ChatInput({
</button>
<button
type="button"
role="menuitem"
className={classes.plusMenuItem}
onClick={() => {
editor?.commands.insertContent("@");
@@ -392,7 +385,7 @@ export default function ChatInput({
}}
>
<IconAt size={16} className={classes.plusMenuIcon} />
{t("Mention a page")}
Mention a page
</button>
</Popover.Dropdown>
</Popover>
@@ -76,6 +76,7 @@
padding: var(--mantine-spacing-xs) var(--mantine-spacing-lg) var(--mantine-spacing-lg);
}
/* Empty state - Notion AI style centered layout */
.emptyState {
flex: 1;
display: flex;
@@ -1,14 +1,7 @@
import { Editor } from "@tiptap/react";
import { ActionIcon, TextInput } from "@mantine/core";
import { useDebouncedCallback, useMediaQuery } from "@mantine/hooks";
import {
useCallback,
useEffect,
useMemo,
useRef,
useState,
type JSX,
} from "react";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { createPortal } from "react-dom";
import { useAtom } from "jotai";
import { IconArrowUp } from "@tabler/icons-react";
@@ -301,7 +301,7 @@ export default function AuditLogsTable({
{expandable && (
<Table.Tr className={classes.detailRow}>
<Table.Td colSpan={4} p={0}>
<Collapse expanded={isExpanded}>
<Collapse in={isExpanded}>
<Box
px="md"
py="sm"
@@ -103,7 +103,7 @@ export default function BillingPlans() {
label="Team size"
description="Select the number of users"
value={selectedTierValue}
onChange={(value) => setSelectedTierValue(value)}
onChange={setSelectedTierValue}
data={selectData}
w={250}
size="md"
@@ -193,7 +193,7 @@ export function MfaSetupModal({
</Group>
</UnstyledButton>
<Collapse expanded={manualEntryOpen}>
<Collapse in={manualEntryOpen}>
<Alert
icon={<IconAlertCircle size={20} />}
color="gray"
@@ -58,7 +58,6 @@ export default function PdfRenderPage() {
title={data.title}
content={data.content}
pageId={data.pageId}
printMode
/>
</Container>
);
@@ -69,7 +69,7 @@ export function ColumnsMenu({ editor }: EditorMenuProps) {
const { t } = useTranslation();
const [isCountOpen, setIsCountOpen] = useState(false);
const [copied, setCopied] = useState(false);
const copyTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);
const copyTimerRef = useRef<ReturnType<typeof setTimeout>>();
const nodesWithMenus = [
"callout",
@@ -767,34 +767,18 @@ export const getSuggestionItems = ({
for (const [group, items] of Object.entries(CommandGroups)) {
const filteredItems = items.filter((item) => {
if (excludeItems?.has(item.title)) return false;
const translatedTitle = i18n.t(item.title);
const translatedDescription = i18n.t(item.description);
return (
fuzzyMatch(search, item.title) ||
fuzzyMatch(search, translatedTitle) ||
item.description.toLowerCase().includes(search) ||
translatedDescription.toLowerCase().includes(search) ||
(item.searchTerms &&
item.searchTerms.some(
(term: string) =>
term.includes(search) ||
i18n.t(term).toLowerCase().includes(search),
))
item.searchTerms.some((term: string) => term.includes(search)))
);
});
if (filteredItems.length) {
filteredGroups[group] = filteredItems.sort((a, b) => {
const aTitle =
a.title.toLowerCase().includes(search) ||
i18n.t(a.title).toLowerCase().includes(search)
? 0
: 1;
const bTitle =
b.title.toLowerCase().includes(search) ||
i18n.t(b.title).toLowerCase().includes(search)
? 0
: 1;
const aTitle = a.title.toLowerCase().includes(search) ? 0 : 1;
const bTitle = b.title.toLowerCase().includes(search) ? 0 : 1;
return aTitle - bTitle;
});
}
@@ -1,7 +1,7 @@
import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus";
import { posToDOMRect, findParentNode } from "@tiptap/react";
import { Node as PMNode } from "@tiptap/pm/model";
import React, { useCallback, type JSX } from "react";
import React, { useCallback } from "react";
import { ActionIcon, Tooltip } from "@mantine/core";
import { IconTrash } from "@tabler/icons-react";
import { useTranslation } from "react-i18next";
@@ -1,4 +1,4 @@
import React, { useCallback, type JSX } from "react";
import React, { useCallback } from "react";
import {
EditorMenuProps,
ShouldShowProps,
@@ -1,6 +1,6 @@
import { posToDOMRect, findParentNode } from "@tiptap/react";
import { Node as PMNode } from "@tiptap/pm/model";
import React, { useCallback, type JSX } from "react";
import React, { useCallback } from "react";
import {
EditorMenuProps,
ShouldShowProps,
@@ -15,7 +15,6 @@ interface PageEditorProps {
title: string;
content: any;
pageId?: string;
printMode?: boolean;
/**
* When rendering inside a public share, pass the share's id (or key). Lookups
* for transclusion content then resolve against the share graph instead of
@@ -29,7 +28,6 @@ export default function ReadonlyPageEditor({
title,
content,
pageId,
printMode = false,
shareId,
}: PageEditorProps) {
const [, setReadOnlyEditor] = useAtom(readOnlyEditorAtom);
@@ -50,12 +48,8 @@ export default function ReadonlyPageEditor({
}, []);
const extensions = useMemo(() => {
const excludedExtensions = new Set([
"uniqueID",
...(printMode ? ["tableHeaderPin", "tableReadonlySort"] : []),
]);
const filteredExtensions = mainExtensions.filter(
(ext) => !excludedExtensions.has(ext.name),
(ext) => ext.name !== "uniqueID",
);
return [
@@ -65,7 +59,7 @@ export default function ReadonlyPageEditor({
updateDocument: false,
}),
];
}, [printMode]);
}, []);
const titleExtensions = [
Document.extend({
@@ -103,13 +103,13 @@
margin: 0;
@mixin where-light {
background-color: var(--mantine-color-gray-1);
color: var(--mantine-color-text);
background-color: var(--code-bg, var(--mantine-color-gray-1));
color: var(--mantine-color-pink-7);
}
@mixin where-dark {
background-color: var(--mantine-color-dark-5) !important;
color: var(--mantine-color-text);
background-color: var(--mantine-color-dark-8);
color: var(--mantine-color-pink-7);
}
}
}
@@ -163,13 +163,8 @@
@media print {
.tableWrapper.tableHeaderPinned table tr:first-child {
position: static !important;
top: auto !important;
transform: none !important;
}
.tableReadonlySortChevron {
display: none !important;
position: static;
transform: none;
}
}
@@ -209,6 +204,10 @@
opacity: 1;
}
.ProseMirror table th:has(.tableReadonlySortChevron) {
padding-right: 30px;
}
.tableReadonlySortChevron:hover {
background: light-dark(
rgba(55, 53, 47, 0.16),
@@ -273,4 +272,4 @@
.prosemirror-dropcursor-inline {
display: none;
}
}
}
@@ -91,9 +91,7 @@ export default function GroupMembersList() {
<ActionIcon
variant="subtle"
c="gray"
aria-label={t("Member actions for {{name}}", {
name: user.name,
})}
aria-label={t("Member actions")}
>
<IconDots size={20} stroke={2} />
</ActionIcon>
@@ -1,4 +1,4 @@
import { useId, useState } from "react";
import { useState } from "react";
import {
ActionIcon,
Group,
@@ -31,7 +31,6 @@ import classes from "../notification.module.css";
export function NotificationPopover() {
const { t } = useTranslation();
const titleId = useId();
const [opened, setOpened] = useState(false);
const [tab, setTab] = useState<NotificationTab>("direct");
const [filter, setFilter] = useState<NotificationFilter>("all");
@@ -84,11 +83,10 @@ export function NotificationPopover() {
<Popover.Dropdown
p={0}
aria-labelledby={titleId}
style={{ width: "min(420px, calc(100vw - 24px))" }}
>
<Group justify="space-between" px="md" py="sm">
<Title id={titleId} order={2} fz="sm" fw={600}>
<Title order={2} fz="sm" fw={600}>
{t("Notifications")}
</Title>
<Group gap={4}>
@@ -34,7 +34,6 @@ import { treeDataAtom } from "@/features/page/tree/atoms/tree-data-atom.ts";
import { treeModel } from "@/features/page/tree/model/tree-model";
import { useTreeMutation } from "@/features/page/tree/hooks/use-tree-mutation.ts";
import type { SpaceTreeNode } from "@/features/page/tree/types.ts";
import classes from "@/features/page/tree/styles/tree.module.css";
export interface NodeMenuProps {
node: SpaceTreeNode;
@@ -124,9 +123,8 @@ export function NodeMenu({ node, canEdit }: NodeMenuProps) {
<Menu shadow="md" width={200}>
<Menu.Target>
<ActionIcon
variant="subtle"
color="gray"
className={classes.actionIcon}
variant="transparent"
c="gray"
aria-label={t("Page menu for {{name}}", { name: node.name || t("untitled") })}
tabIndex={-1}
onClick={(e) => {
@@ -201,13 +201,13 @@ function PageArrow({ isOpen, hasChildren, onToggle }: PageArrowProps) {
return (
<span
aria-hidden
className={classes.actionIcon}
style={{
width: 20,
height: 20,
display: "inline-flex",
alignItems: "center",
justifyContent: "center",
color: "var(--mantine-color-gray-6)",
flexShrink: 0,
}}
>
@@ -220,8 +220,7 @@ function PageArrow({ isOpen, hasChildren, onToggle }: PageArrowProps) {
<ActionIcon
size={20}
variant="subtle"
color="gray"
className={classes.actionIcon}
c="gray"
aria-label={isOpen ? t("Collapse") : t("Expand")}
aria-expanded={isOpen}
tabIndex={-1}
@@ -273,9 +272,8 @@ function CreateNode({
return (
<ActionIcon
variant="subtle"
color="gray"
className={classes.actionIcon}
variant="transparent"
c="gray"
aria-label={t("Create subpage of {{name}}", { name: node.name || t("untitled") })}
tabIndex={-1}
onClick={(e) => {
@@ -57,10 +57,6 @@
flex-shrink: 0;
}
.actionIcon {
color: light-dark(var(--mantine-color-dark-3), var(--mantine-color-gray-4));
}
.text {
flex: 1;
/* min-width: 0 lets a flex child shrink below its content size — required
@@ -17,7 +17,6 @@ import {
import { useTranslation } from "react-i18next";
import { useGetSpacesQuery } from "@/features/space/queries/space-query";
import { SpaceFilterMenu } from "@/features/space/components/space-filter-menu";
import { RadioMenuItem } from "@/components/ui/radio-menu-item";
import { useHasFeature } from "@/ee/hooks/use-feature";
import { Feature } from "@/ee/features";
import classes from "./search-spotlight-filters.module.css";
@@ -176,7 +175,7 @@ export function SearchSpotlightFilters({
{contentTypeOptions.map((option) => (
<Menu.Item
key={option.value}
component={RadioMenuItem}
role="menuitemradio"
aria-checked={contentType === option.value}
onClick={() =>
!option.disabled &&
@@ -64,7 +64,7 @@ export default function ShareShell({
const [fullWidth, setFullWidth] = useAtom(sharedPageFullWidthAtom);
const [sidebarWidth, setSidebarWidth] = useAtom(sidebarWidthAtom);
const [isResizing, setIsResizing] = useState(false);
const sidebarRef = useRef<HTMLDivElement>(null);
const sidebarRef = useRef<HTMLElement | null>(null);
const startResizing = useCallback((e: React.MouseEvent) => {
e.preventDefault();
@@ -13,7 +13,6 @@ import { useDebouncedValue } from "@mantine/hooks";
import { IconCheck, IconSearch } from "@tabler/icons-react";
import { useTranslation } from "react-i18next";
import { useGetSpacesQuery } from "@/features/space/queries/space-query";
import { RadioMenuItem } from "@/components/ui/radio-menu-item";
type SpaceFilterMenuProps = {
value: string | null;
@@ -76,7 +75,7 @@ export function SpaceFilterMenu({
<ScrollArea.Autosize mah={280}>
<Menu.Item
component={RadioMenuItem}
role="menuitemradio"
aria-checked={!value}
onClick={() => onChange(null)}
>
@@ -104,7 +103,7 @@ export function SpaceFilterMenu({
{orderedSpaces.map((space) => (
<Menu.Item
key={space.id}
component={RadioMenuItem}
role="menuitemradio"
aria-checked={value === space.id}
onClick={() => onChange(space.id)}
>
@@ -210,9 +210,7 @@ export default function SpaceMembersList({
<ActionIcon
variant="subtle"
c="gray"
aria-label={t("Member actions for {{name}}", {
name: member.name,
})}
aria-label={t("Member actions")}
>
<IconDots size={20} stroke={2} />
</ActionIcon>
@@ -12,14 +12,9 @@ import useUserRole from "@/hooks/use-user-role.tsx";
interface Props {
userId: string;
name: string;
deactivatedAt: Date | null;
}
export default function MemberActionMenu({
userId,
name,
deactivatedAt,
}: Props) {
export default function MemberActionMenu({ userId, deactivatedAt }: Props) {
const { t } = useTranslation();
const deleteWorkspaceMemberMutation = useDeleteWorkspaceMemberMutation();
const deactivateMutation = useDeactivateWorkspaceMemberMutation();
@@ -91,7 +86,7 @@ export default function MemberActionMenu({
<ActionIcon
variant="subtle"
c="gray"
aria-label={t("Member actions for {{name}}", { name })}
aria-label={t("Member actions")}
>
<IconDots size={20} stroke={2} />
</ActionIcon>
@@ -80,7 +80,7 @@ export function WorkspaceInviteForm({ onClose }: Props) {
defaultValue={UserRole.MEMBER}
allowDeselect={false}
checkIconPosition="right"
onChange={(value) => setRole(value)}
onChange={setRole}
/>
<MultiGroupSelect
@@ -111,7 +111,6 @@ export default function WorkspaceMembersTable() {
{isAdmin && (
<MemberActionMenu
userId={user.id}
name={user.name}
deactivatedAt={user.deactivatedAt}
/>
)}
-4
View File
@@ -3,7 +3,6 @@ import {
CSSVariablesResolver,
MantineColorsTuple,
Tabs,
v8CssVariablesResolver,
} from "@mantine/core";
const blue: MantineColorsTuple = [
@@ -69,11 +68,9 @@ export const theme = createTheme({
export const mantineCssResolver: CSSVariablesResolver = (theme) => ({
variables: {
...v8CssVariablesResolver(theme).variables,
"--input-error-size": theme.fontSizes.sm,
},
light: {
...v8CssVariablesResolver(theme).light,
"--mantine-color-dimmed": "#4b5563",
"--mantine-color-dark-light-color": "#4e5359",
"--mantine-color-dark-light-hover": "var(--mantine-color-gray-light-hover)",
@@ -108,7 +105,6 @@ export const mantineCssResolver: CSSVariablesResolver = (theme) => ({
"--mantine-color-green-light-color": "#1B5E20",
},
dark: {
...v8CssVariablesResolver(theme).dark,
"--mantine-color-dark-light-color": "var(--mantine-color-gray-4)",
"--mantine-color-dark-light-hover": "var(--mantine-color-default-hover)",
},
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "server",
"version": "0.90.1",
"version": "0.90.0",
"description": "",
"author": "",
"private": true,
@@ -106,7 +106,7 @@
"pino-pretty": "^13.1.3",
"postgres": "^3.4.8",
"postmark": "^4.0.7",
"react": "19.2.7",
"react": "^18.3.1",
"react-email": "6.0.8",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.2",
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "docmost",
"homepage": "https://docmost.com",
"version": "0.90.1",
"version": "0.90.0",
"private": true,
"scripts": {
"build": "nx run-many -t build",
@@ -103,7 +103,7 @@
"glob": "13.0.6",
"ws": "8.20.1",
"dompurify": "3.4.1",
"tmp": "0.2.6",
"tmp": "0.2.5",
"hono": "4.12.18",
"mermaid": "11.15.0",
"nanoid@^3": "3.3.8",
+954 -930
View File
File diff suppressed because it is too large Load Diff