From 7e4d519f3477cb4b5f19af09633910fc36a79425 Mon Sep 17 00:00:00 2001 From: jordanl17 Date: Mon, 29 Apr 2024 19:22:37 +0100 Subject: [PATCH] fix: statusButton requires provided aria-label (#6430) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: statusButton requires provided aria-label * fix: commenting on the new translation mapping added * chore(deps): dedupe pnpm-lock.yaml (#6463) Co-authored-by: cngonzalez <3969996+cngonzalez@users.noreply.github.com> * chore(deps): update dependency @sanity/pkg-utils to v6.8.4 (#6460) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(cli): mock matchMedia window function (#6472) * chore: add perf runner to workspace (#6427) * fix(typegen): fixes a bug where we imported the wrong relative path (#6457) * chore(deps): update dependency @sanity/tsdoc to v1.0.39 (#6464) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat(typegen): also search for queries in app and sanity folders (#6475) * feat(typegen): also search for queries in app and sanity folders * feat(typegen): format generated types with prettier * chore: upgrade groq-js (#6474) * chore: upgrade groq-js * chore: always bump groq-js * chore(deps): dedupe pnpm-lock.yaml (#6476) Co-authored-by: github-merge-queue[bot] <118344674+github-merge-queue[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/visual-editing to v1.8.15 (#6465) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency @sanity/react-loader to v1.9.14 (#6466) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency date-fns-tz to v2.0.1 (#6467) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency i18next to v23.11.2 (#6468) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency zod to v3.23.4 (#6470) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency next to v14.2.2 (#6469) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency react-focus-lock to v2.12.1 (#6471) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/pkg-utils to v6.8.6 (#6482) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update react monorepo (#6484) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/tsdoc to v1.0.40 (#6483) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @sanity/presentation to v1.12.8 (#6485) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update react monorepo to ^18.3.0 (#6490) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency @types/react-is to v18.3.0 (#6491) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore: setup next test that embeds the test studio (#6487) * chore: setup next test that embeds the test studio * chore: support HMR same way test-studio does * refactor: replace deprecated `empty()` with `EMPTY` * refactor: shorter `pnpm dev:next-studio` alias * chore: add `dev:turbo-studio` to test with turbopack * chore: remove unused * fix(test): remove hydrateroot warning test (#6494) * chore(deps): dedupe pnpm-lock.yaml (#6493) Co-authored-by: github-merge-queue[bot] <118344674+github-merge-queue[bot]@users.noreply.github.com> * feat: set print width to 40 (#6068) * chore(deps): update dependency @sanity/pkg-utils to v6.8.7 (#6496) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency turbo to ^1.13.3 (#6497) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency @sanity/logos to v2.1.11 (#6498) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency @sanity/react-loader to v1.9.15 (#6499) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(cli): remove comments from moviedb template, hide location field (#6488) * fix(search): revert to old search API for now (#6503) * v3.39.1 * chore(deps): dedupe pnpm-lock.yaml (#6463) Co-authored-by: cngonzalez <3969996+cngonzalez@users.noreply.github.com> * chore(deps): update dependency @sanity/pkg-utils to v6.8.4 (#6460) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore: add perf runner to workspace (#6427) * chore(deps): update dependency @sanity/tsdoc to v1.0.39 (#6464) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore: upgrade groq-js (#6474) * chore: upgrade groq-js * chore: always bump groq-js * chore(deps): dedupe pnpm-lock.yaml (#6476) Co-authored-by: github-merge-queue[bot] <118344674+github-merge-queue[bot]@users.noreply.github.com> * chore(lockfile): update dependency @sanity/react-loader to v1.9.14 (#6466) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency i18next to v23.11.2 (#6468) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency zod to v3.23.4 (#6470) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency next to v14.2.2 (#6469) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency react-focus-lock to v2.12.1 (#6471) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/pkg-utils to v6.8.6 (#6482) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update react monorepo (#6484) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/tsdoc to v1.0.40 (#6483) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @sanity/presentation to v1.12.8 (#6485) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update react monorepo to ^18.3.0 (#6490) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore: setup next test that embeds the test studio (#6487) * chore: setup next test that embeds the test studio * chore: support HMR same way test-studio does * refactor: replace deprecated `empty()` with `EMPTY` * refactor: shorter `pnpm dev:next-studio` alias * chore: add `dev:turbo-studio` to test with turbopack * chore: remove unused * chore(deps): dedupe pnpm-lock.yaml (#6493) Co-authored-by: github-merge-queue[bot] <118344674+github-merge-queue[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/pkg-utils to v6.8.7 (#6496) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency @sanity/logos to v2.1.11 (#6498) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency @sanity/react-loader to v1.9.15 (#6499) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/visual-editing to v1.8.16 (#6500) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @sanity/presentation to v1.12.10 (#6501) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat(core): implement presence cursors (#6081) * feat(portable-text-editor): improve range decorations perf by comparing prev values * test(portable-text-editor): add tests for range decorations rendering * fixup! feat(portable-text-editor): improve range decorations perf by comparing prev values * test(portable-text-editor): improve some minor test things * fix(core): update z-index on PTE activate overlay * feat(core): extend presence data model with `selection` * feat(structure): include `selection` in presence data * feat(core): implement presence cursors in PTE * test(core): add presence cursor workshop story * refactor(core): use `getTheme_v2` to access theme values * fix(core): introduce `OnPathFocusPayload` to improve typing * fix(form/inputs): perf optimization for PT-input decorators * refactor(form/inputs): also display user presence when user is selecting a range, but only the focus point of it * fix(core): render presence cursors inline instead of in a portal * fix(core): broken workshop story * feat(core): reset presence selection on blur in PTE * fix(structure): add accidentially removed setFocusPath (DocumentPaneProvider) This seems to have been lost in a rebase. * fix(core): use `useFormFieldPresence` in `usePresenceCursorDecorations` * fix(core): set `focusPath` when receiving a mutation event if there are pending patches * fix(form/inputs): break don't return * fix(form/inputs): remove ref that should not be set here This ref is supposed to be set elsewhere (on the PTE Editable component) See eca960e37be3307cbc7f4bbca15c69877001d44e * fix(form/inputs): sort hook deps list * fix(form/inputs): reconcile presence decorations for PT-Input Make sure these objects stays as stable as possible in order to not redraw any range decorations unnecessary. * fix(form/inputs): return early if focusPath is already selected in PT-Input * refactor(form/inputs): throttle reporting of focusPath and presence updates for PT-input * fix(core): import of `FormNodePresence` * fix(form/inputs): remove lastActive as dep for PT-presence range decorations uniqueness We are not using this value anyway, and it complicates the reconciliation of the presence decorators * test(core): add presence cursor workshop story * fix(core): remove unnecessary z-index in PTE activate overlay * fix(core): prevent presence cursor user name from being selected * fix(form/inputs): fix issue where perf opt on focusPath tracking broke tests This perf opt. broke some tests. It's not clear if it is a problem with the test or the func. so restoring the old behaviour for now. * test(core): update snapshots in `Studio.test` * refactor(core): move presence decorations according to user edits Use a own state for this. * refactor(core/form): remove complexity from PortableTextInput Handle debouncing in the DocumentProvider instead. Setting focusPath must be synchronous * refactor(structure): announce presence throttled When we introduced presence in the PortableTextInput, we risk calling the presence updates very often. There should be no reason for not doing this throttled, as long as we have leading true. * refactor(core): clean up presence cursors code + add comments --------- Co-authored-by: Per-Kristian Nordnes * fix(deps): Update react monorepo (#6502) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lint): add certain unicorn eslint rules (#6352) * chore(lint): add certain unicorn eslint rules * chore: fix lint errors * test: increase timeout for cross-dataset reference test * chore: fix incorrect path used in workshop story * chore(deps): dedupe pnpm-lock.yaml (#6506) Co-authored-by: rexxars <48200+rexxars@users.noreply.github.com> * fix(structure): uncaught error while swapping images in array in PTE (#6399) * chore(test-studio): add schema for fix * fix(structure): console error for when selection is zero * chore(test-studio): update test schema * chore(core): remove try catch * test(pte): add test for usecase * chore(sanity): remove ? since it will always be defined Co-authored-by: Pedro Bonamin <46196328+pedrobonamin@users.noreply.github.com> * chore(test): fix test file to have .spec. --------- Co-authored-by: Pedro Bonamin <46196328+pedrobonamin@users.noreply.github.com> * chore(deps): update dependency @types/react to v18.3.1 (#6507) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * v3.39.1 * chore(deps): dedupe pnpm-lock.yaml (#6463) Co-authored-by: cngonzalez <3969996+cngonzalez@users.noreply.github.com> * chore(deps): update dependency @sanity/pkg-utils to v6.8.4 (#6460) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore: add perf runner to workspace (#6427) * chore(deps): update dependency @sanity/tsdoc to v1.0.39 (#6464) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore: upgrade groq-js (#6474) * chore: upgrade groq-js * chore: always bump groq-js * chore(deps): dedupe pnpm-lock.yaml (#6476) Co-authored-by: github-merge-queue[bot] <118344674+github-merge-queue[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/visual-editing to v1.8.15 (#6465) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency @sanity/react-loader to v1.9.14 (#6466) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency i18next to v23.11.2 (#6468) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency zod to v3.23.4 (#6470) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency next to v14.2.2 (#6469) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency react-focus-lock to v2.12.1 (#6471) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/pkg-utils to v6.8.6 (#6482) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update react monorepo (#6484) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/tsdoc to v1.0.40 (#6483) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @sanity/presentation to v1.12.8 (#6485) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update react monorepo to ^18.3.0 (#6490) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore: setup next test that embeds the test studio (#6487) * chore: setup next test that embeds the test studio * chore: support HMR same way test-studio does * refactor: replace deprecated `empty()` with `EMPTY` * refactor: shorter `pnpm dev:next-studio` alias * chore: add `dev:turbo-studio` to test with turbopack * chore: remove unused * chore(deps): dedupe pnpm-lock.yaml (#6493) Co-authored-by: github-merge-queue[bot] <118344674+github-merge-queue[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/pkg-utils to v6.8.7 (#6496) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency @sanity/logos to v2.1.11 (#6498) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(lockfile): update dependency @sanity/react-loader to v1.9.15 (#6499) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @sanity/visual-editing to v1.8.16 (#6500) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(deps): update dependency @sanity/presentation to v1.12.10 (#6501) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat(core): implement presence cursors (#6081) * feat(portable-text-editor): improve range decorations perf by comparing prev values * test(portable-text-editor): add tests for range decorations rendering * fixup! feat(portable-text-editor): improve range decorations perf by comparing prev values * test(portable-text-editor): improve some minor test things * fix(core): update z-index on PTE activate overlay * feat(core): extend presence data model with `selection` * feat(structure): include `selection` in presence data * feat(core): implement presence cursors in PTE * test(core): add presence cursor workshop story * refactor(core): use `getTheme_v2` to access theme values * fix(core): introduce `OnPathFocusPayload` to improve typing * fix(form/inputs): perf optimization for PT-input decorators * refactor(form/inputs): also display user presence when user is selecting a range, but only the focus point of it * fix(core): render presence cursors inline instead of in a portal * fix(core): broken workshop story * feat(core): reset presence selection on blur in PTE * fix(structure): add accidentially removed setFocusPath (DocumentPaneProvider) This seems to have been lost in a rebase. * fix(core): use `useFormFieldPresence` in `usePresenceCursorDecorations` * fix(core): set `focusPath` when receiving a mutation event if there are pending patches * fix(form/inputs): break don't return * fix(form/inputs): remove ref that should not be set here This ref is supposed to be set elsewhere (on the PTE Editable component) See eca960e37be3307cbc7f4bbca15c69877001d44e * fix(form/inputs): sort hook deps list * fix(form/inputs): reconcile presence decorations for PT-Input Make sure these objects stays as stable as possible in order to not redraw any range decorations unnecessary. * fix(form/inputs): return early if focusPath is already selected in PT-Input * refactor(form/inputs): throttle reporting of focusPath and presence updates for PT-input * fix(core): import of `FormNodePresence` * fix(form/inputs): remove lastActive as dep for PT-presence range decorations uniqueness We are not using this value anyway, and it complicates the reconciliation of the presence decorators * test(core): add presence cursor workshop story * fix(core): remove unnecessary z-index in PTE activate overlay * fix(core): prevent presence cursor user name from being selected * fix(form/inputs): fix issue where perf opt on focusPath tracking broke tests This perf opt. broke some tests. It's not clear if it is a problem with the test or the func. so restoring the old behaviour for now. * test(core): update snapshots in `Studio.test` * refactor(core): move presence decorations according to user edits Use a own state for this. * refactor(core/form): remove complexity from PortableTextInput Handle debouncing in the DocumentProvider instead. Setting focusPath must be synchronous * refactor(structure): announce presence throttled When we introduced presence in the PortableTextInput, we risk calling the presence updates very often. There should be no reason for not doing this throttled, as long as we have leading true. * refactor(core): clean up presence cursors code + add comments --------- Co-authored-by: Per-Kristian Nordnes * fix(deps): Update react monorepo (#6502) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore: fix incorrect path used in workshop story * chore(deps): dedupe pnpm-lock.yaml (#6506) Co-authored-by: rexxars <48200+rexxars@users.noreply.github.com> * chore(deps): update dependency @types/react to v18.3.1 (#6507) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --------- Co-authored-by: ecospark[bot] <128108030+ecospark[bot]@users.noreply.github.com> Co-authored-by: cngonzalez <3969996+cngonzalez@users.noreply.github.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Sindre Gulseth Co-authored-by: Bjørge Næss Co-authored-by: github-merge-queue[bot] <118344674+github-merge-queue[bot]@users.noreply.github.com> Co-authored-by: Cody Olsen <81981+stipsan@users.noreply.github.com> Co-authored-by: Rostislav Melkumyan Co-authored-by: Espen Hovlandsdal Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Herman Wikner Co-authored-by: Per-Kristian Nordnes Co-authored-by: rexxars <48200+rexxars@users.noreply.github.com> Co-authored-by: RitaDias Co-authored-by: Pedro Bonamin <46196328+pedrobonamin@users.noreply.github.com> --- .../sanity/src/core/components/StatusButton.tsx | 15 +++++++++++---- packages/sanity/src/core/i18n/bundles/studio.ts | 2 ++ .../navbar/configIssues/ConfigIssuesButton.tsx | 1 + .../components/navbar/presence/PresenceMenu.tsx | 1 + .../components/pane/PaneHeaderActionButton.tsx | 8 +++++--- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/sanity/src/core/components/StatusButton.tsx b/packages/sanity/src/core/components/StatusButton.tsx index 5cf12020f5f5..427fd34ef829 100644 --- a/packages/sanity/src/core/components/StatusButton.tsx +++ b/packages/sanity/src/core/components/StatusButton.tsx @@ -1,12 +1,12 @@ import {useTheme} from '@sanity/ui' import {type ForwardedRef, forwardRef, type HTMLProps, type ReactNode, useMemo} from 'react' -import {useTranslation} from 'react-i18next' import {styled} from 'styled-components' import {Button, type ButtonProps} from '../../ui-components' /** @hidden @beta */ export type StatusButtonProps = ButtonProps & { + ['aria-label']: HTMLProps['aria-label'] forwardedAs?: string disabled?: boolean | {reason: ReactNode} mode?: ButtonProps['mode'] @@ -37,9 +37,16 @@ export const StatusButton = forwardRef(function StatusButton( Omit, 'disabled' | 'ref' | 'size' | 'title'>, ref: ForwardedRef, ) { - const {disabled: disabledProp, icon, label, mode = 'bleed', text, tone, ...restProps} = props + const { + 'disabled': disabledProp, + icon, + 'aria-label': label, + mode = 'bleed', + text, + tone, + ...restProps + } = props const theme = useTheme() - const {t} = useTranslation() const toneColor = tone && theme.sanity.color.solid[tone] const dotStyle = useMemo(() => ({backgroundColor: toneColor?.enabled.bg}), [toneColor]) const disabled = Boolean(disabledProp) @@ -48,7 +55,7 @@ export const StatusButton = forwardRef(function StatusButton( diff --git a/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenu.tsx b/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenu.tsx index f6bcc87c82a0..644deb3143f4 100644 --- a/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenu.tsx +++ b/packages/sanity/src/core/studio/components/navbar/presence/PresenceMenu.tsx @@ -50,6 +50,7 @@ export function PresenceMenu() { return ( @@ -70,7 +71,7 @@ export function PaneHeaderMenuItemActionButton(props: PaneHeaderMenuItemActionBu onClick={node.onAction} selected={node.selected} tone={node.tone} - aria-label={ariaLabel} + aria-label={ariaLabel || title || t('status-button.aria-label')} tooltipProps={{ hotkeys: !isDisabled && node.hotkey ? node.hotkey.split('+') : undefined, content: isDisabled ? disabledReason : title, @@ -82,6 +83,7 @@ export function PaneHeaderMenuItemActionButton(props: PaneHeaderMenuItemActionBu function PaneHeaderActionIntentButton(props: {intent: Intent; node: _PaneMenuItem}) { const {intent, node} = props const intentLink = useIntentLink({intent: intent.type, params: intent.params}) + const {t} = useTranslation() const handleClick = useCallback( (event: MouseEvent) => { @@ -102,7 +104,7 @@ function PaneHeaderActionIntentButton(props: {intent: Intent; node: _PaneMenuIte onClick={handleClick} selected={node.selected} tone={node.tone} - aria-label={ariaLabel} + aria-label={ariaLabel || node.title || t('status-button.aria-label')} tooltipProps={{ hotkeys: !isDisabled && node.hotkey ? node.hotkey.split('+') : undefined, content: isDisabled ? disabledReason : node.title,