diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6bb0d8c18d..f42641eaaf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -217,6 +217,29 @@ jobs: env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + job_i18n: + runs-on: ubuntu-latest + needs: [job_get_metadata, job_install_deps] + name: i18n + if: | + needs.job_get_metadata.outputs.changed_comments_ui == 'true' + || needs.job_get_metadata.outputs.changed_signup_form == 'true' + || needs.job_get_metadata.outputs.changed_portal == 'true' + || needs.job_get_metadata.outputs.changed_core == 'true' + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v3 + with: + node-version: "18.12.1" + + - name: Restore caches + uses: ./.github/actions/restore-cache + env: + DEPENDENCY_CACHE_KEY: ${{ needs.job_install_deps.outputs.dependency_cache_key }} + + - name: Run i18n tests + run: yarn nx run @tryghost/i18n:test + job_admin-tests: runs-on: ubuntu-latest needs: [job_get_metadata, job_install_deps] @@ -264,7 +287,7 @@ jobs: runs-on: labels: ubuntu-latest-4-cores needs: [job_get_metadata, job_install_deps] - if: needs.job_get_metadata.outputs.is_main == 'true' || needs.job_get_metadata.outputs.has_browser_tests_label == 'true' + if: needs.job_get_metadata.outputs.changed_any_code == 'true' && (needs.job_get_metadata.outputs.is_main == 'true' || needs.job_get_metadata.outputs.has_browser_tests_label == 'true') concurrency: group: ${{ github.workflow }} steps: @@ -750,6 +773,22 @@ jobs: - run: mv ghost-*.tgz ghost.tgz working-directory: ghost/core + - name: Install latest v4 + run: | + DIR=$(mktemp -d) + echo "V4_DIR=$DIR" >> $GITHUB_ENV + ghost install v4 --local -d $DIR + + - uses: actions/setup-node@v3 + env: + FORCE_COLOR: 0 + with: + node-version: '18.12.1' + + - name: Update from v4 + run: | + ghost update -f -d $V4_DIR --archive $(pwd)/ghost/core/ghost.tgz + - name: Clean Install run: | DIR=$(mktemp -d) @@ -761,12 +800,6 @@ jobs: ghost install local -d $DIR ghost update -d $DIR --archive $(pwd)/ghost/core/ghost.tgz - - name: Update from latest v4 - run: | - DIR=$(mktemp -d) - ghost install v4 --local -d $DIR - ghost update -f -d $DIR --archive $(pwd)/ghost/core/ghost.tgz - - name: Print debug logs if: failure() run: | @@ -832,11 +865,13 @@ jobs: job_get_metadata, job_install_deps, job_lint, + job_i18n, job_ghost-cli, job_admin-tests, job_unit-tests, job_database-tests, job_regression-tests, + job_browser-tests, job_admin_x_settings, job_comments_ui, job_signup_form, diff --git a/README.md b/README.md index 0824fcf6b3..dff64aaeda 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@

- Love open source? We're hiring JavaScript engineers to work on Ghost full-time. + Love open source? We're hiring DevOps engineers to work on Ghost full-time.

  diff --git a/apps/admin-x-settings/package.json b/apps/admin-x-settings/package.json index 1c506d42aa..6e47942169 100644 --- a/apps/admin-x-settings/package.json +++ b/apps/admin-x-settings/package.json @@ -85,8 +85,8 @@ "rollup-plugin-node-builtins": "2.1.2", "storybook": "7.4.0", "stylelint": "15.10.3", - "tailwindcss": "3.3.3", - "vite": "4.4.11", + "tailwindcss": "3.3.5", + "vite": "4.5.0", "vite-plugin-css-injected-by-js": "^3.3.0", "vite-plugin-svgr": "3.3.0", "vitest": "0.34.3" diff --git a/apps/admin-x-settings/src/App.tsx b/apps/admin-x-settings/src/App.tsx index a0cb1b68b1..39b4ea0073 100644 --- a/apps/admin-x-settings/src/App.tsx +++ b/apps/admin-x-settings/src/App.tsx @@ -43,8 +43,9 @@ const queryClient = new QueryClient({ function App({ghostVersion, officialThemes, zapierTemplates, externalNavigate, darkMode = false, unsplashConfig, fetchKoenigLexical, sentryDSN, onUpdate, onInvalidate, onDelete, upgradeStatus}: AppProps) { const appClassName = clsx( - 'admin-x-settings admin-x-base h-[100vh] w-full overflow-y-auto overflow-x-hidden', + 'admin-x-settings admin-x-base', darkMode && 'dark' + //'!h-[calc(100vh-55px)] w-full overflow-y-auto overflow-x-hidden tablet:!h-[100vh]' ); return ( @@ -57,8 +58,8 @@ function App({ghostVersion, officialThemes, zapierTemplates, externalNavigate, d
diff --git a/apps/admin-x-settings/src/MainContent.tsx b/apps/admin-x-settings/src/MainContent.tsx index 3193a77774..8bcc9a3a3f 100644 --- a/apps/admin-x-settings/src/MainContent.tsx +++ b/apps/admin-x-settings/src/MainContent.tsx @@ -12,11 +12,11 @@ import {useGlobalData} from './components/providers/GlobalDataProvider'; const Page: React.FC<{children: ReactNode}> = ({children}) => { return <> -
+
-
+
{children}
; @@ -54,18 +54,15 @@ const MainContent: React.FC = () => { return ( - {loadingModal &&
} + {loadingModal &&
} {/* Sidebar */} -
-
- Settings -
-
+
+
-
+
diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/at-sign.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/at-sign.svg new file mode 100644 index 0000000000..1b840d38fd --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/at-sign.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/baseline-chart.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/baseline-chart.svg new file mode 100644 index 0000000000..d68f249b56 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/baseline-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/bills.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/bills.svg new file mode 100644 index 0000000000..3440d618c3 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/bills.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/brackets.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/brackets.svg new file mode 100644 index 0000000000..15455f4359 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/brackets.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/email-check.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/email-check.svg new file mode 100644 index 0000000000..a85cff2e81 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/email-check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/email.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/email.svg new file mode 100644 index 0000000000..188a97ba7c --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/emailfield.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/emailfield.svg new file mode 100644 index 0000000000..ba90c9046a --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/emailfield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/facebook.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/facebook.svg new file mode 100644 index 0000000000..aea0f084c4 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/facebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/finger-up.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/finger-up.svg new file mode 100644 index 0000000000..778036291c --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/finger-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/key.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/key.svg new file mode 100644 index 0000000000..f6bc294224 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/labs-flask.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/labs-flask.svg new file mode 100644 index 0000000000..c2ed46b6dd --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/labs-flask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/language.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/language.svg new file mode 100644 index 0000000000..aafff55f38 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/layer.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/layer.svg new file mode 100644 index 0000000000..64f8f244c6 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/layer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/like.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/like.svg new file mode 100644 index 0000000000..b9ebfeb0e6 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/like.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/megaphone.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/megaphone.svg new file mode 100644 index 0000000000..5d58b48ff3 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/megaphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/modules-3.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/modules-3.svg new file mode 100644 index 0000000000..1dae91e54a --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/modules-3.svg @@ -0,0 +1 @@ +module-three \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/navigation.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/navigation.svg new file mode 100644 index 0000000000..257a7264cb --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/navigation.svg @@ -0,0 +1 @@ +navigation-menu-4 \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/palette.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/palette.svg new file mode 100644 index 0000000000..4b5b7bc285 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/palette.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/piggybank.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/piggybank.svg new file mode 100644 index 0000000000..0c22f4e1cb --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/piggybank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/portal.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/portal.svg new file mode 100644 index 0000000000..4638fb0ee8 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/portal.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/recepients.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/recepients.svg new file mode 100644 index 0000000000..75919b8af2 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/recepients.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/textfield.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/textfield.svg new file mode 100644 index 0000000000..08f3406801 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/textfield.svg @@ -0,0 +1 @@ +type-cursor \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/time-back.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/time-back.svg new file mode 100644 index 0000000000..d03a7bc033 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/time-back.svg @@ -0,0 +1 @@ +time-reverse \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/twitter-x.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/twitter-x.svg new file mode 100644 index 0000000000..53ca7b2089 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/twitter-x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/user-page.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/user-page.svg new file mode 100644 index 0000000000..bed33abd33 --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/user-page.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/assets/icons/world-clock.svg b/apps/admin-x-settings/src/admin-x-ds/assets/icons/world-clock.svg new file mode 100644 index 0000000000..5a5374e86f --- /dev/null +++ b/apps/admin-x-settings/src/admin-x-ds/assets/icons/world-clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/admin-x-settings/src/admin-x-ds/global/Button.tsx b/apps/admin-x-settings/src/admin-x-ds/global/Button.tsx index 76e8159253..dbf426f838 100644 --- a/apps/admin-x-settings/src/admin-x-ds/global/Button.tsx +++ b/apps/admin-x-settings/src/admin-x-ds/global/Button.tsx @@ -52,7 +52,7 @@ const Button: React.FC = ({ if (!unstyled) { className = clsx( - 'inline-flex items-center justify-center whitespace-nowrap rounded-sm text-sm transition', + 'inline-flex items-center justify-center whitespace-nowrap rounded text-sm transition', ((link && color !== 'clear' && color !== 'black') || (!link && color !== 'clear')) ? 'font-bold' : 'font-semibold', !link ? `${size === 'sm' ? ' h-7 px-3 ' : ' h-[34px] px-4 '}` : '', (link && linkWithPadding) && '-m-1 p-1', diff --git a/apps/admin-x-settings/src/admin-x-ds/global/Heading.tsx b/apps/admin-x-settings/src/admin-x-ds/global/Heading.tsx index 74209a925c..ff378d3742 100644 --- a/apps/admin-x-settings/src/admin-x-ds/global/Heading.tsx +++ b/apps/admin-x-settings/src/admin-x-ds/global/Heading.tsx @@ -38,8 +38,11 @@ type HeadingLabelProps = { level?: never, grey?: boolean } & HeadingBaseProps & React.LabelHTMLAttributes -export const Heading6Styles = 'text-2xs font-semibold uppercase tracking-wider'; -export const Heading6StylesGrey = 'text-2xs font-semibold uppercase tracking-wider text-grey-800 dark:text-grey-500'; +export const Heading6Styles = clsx('text-xs font-semibold tracking-normal'); +export const Heading6StylesGrey = clsx( + Heading6Styles, + 'text-grey-900 dark:text-grey-500' +); const Heading: React.FC = ({ level = 1, diff --git a/apps/admin-x-settings/src/admin-x-ds/global/Link.tsx b/apps/admin-x-settings/src/admin-x-ds/global/Link.tsx index cd740b0fc1..dc389789e5 100644 --- a/apps/admin-x-settings/src/admin-x-ds/global/Link.tsx +++ b/apps/admin-x-settings/src/admin-x-ds/global/Link.tsx @@ -19,9 +19,13 @@ const Link: React.FC = ({href, color, className, children, ...props}) color = 'green'; } - let styles = (color === 'black') ? `transition text-black hover:text-black-700 ${className}` : `text-${color} hover:text-${color}-400 ${className}`; + let styles = (color === 'black') ? `transition text-black hover:text-black-700` : `text-${color} hover:text-${color}-400`; + + if (className) { + styles = `${styles} ${className}`; + } return {children}; }; -export default Link; \ No newline at end of file +export default Link; diff --git a/apps/admin-x-settings/src/admin-x-ds/global/form/ColorPicker.tsx b/apps/admin-x-settings/src/admin-x-ds/global/form/ColorPicker.tsx index c1f1103504..f939c1ce9d 100644 --- a/apps/admin-x-settings/src/admin-x-ds/global/form/ColorPicker.tsx +++ b/apps/admin-x-settings/src/admin-x-ds/global/form/ColorPicker.tsx @@ -108,9 +108,9 @@ const ColorPicker: React.FC<{
-
- # - +
+ # + {eyedropper && !!window.EyeDropper && ( +
  • + {icon && } + {title} +
  • ); }; diff --git a/apps/admin-x-settings/src/admin-x-ds/settings/SettingNavSection.tsx b/apps/admin-x-settings/src/admin-x-ds/settings/SettingNavSection.tsx index f0902a2bd7..39c9195fb3 100644 --- a/apps/admin-x-settings/src/admin-x-ds/settings/SettingNavSection.tsx +++ b/apps/admin-x-settings/src/admin-x-ds/settings/SettingNavSection.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import SettingSectionHeader from './SettingSectionHeader'; import {useSearch} from '../../components/providers/ServiceProvider'; interface Props { @@ -17,9 +16,9 @@ const SettingNavSection: React.FC = ({title, keywords, children}) => { return ( <> - {title && } + {title &&

    {title}

    } {children && -
      +
        {children}
      } diff --git a/apps/admin-x-settings/src/admin-x-ds/settings/SettingSection.tsx b/apps/admin-x-settings/src/admin-x-ds/settings/SettingSection.tsx index ec0f0d9469..fce4585666 100644 --- a/apps/admin-x-settings/src/admin-x-ds/settings/SettingSection.tsx +++ b/apps/admin-x-settings/src/admin-x-ds/settings/SettingSection.tsx @@ -1,5 +1,6 @@ import React from 'react'; import SettingSectionHeader from './SettingSectionHeader'; +import clsx from 'clsx'; import {useSearch} from '../../components/providers/ServiceProvider'; interface Props { @@ -11,11 +12,16 @@ interface Props { const SettingSection: React.FC = ({title, keywords = [], children}) => { const {checkVisible} = useSearch(); + const containerClassNames = clsx( + 'mb-[16vh]', + checkVisible(keywords) ? '' : 'hidden' + ); + return ( -
      - {title && } +
      + {title && } {children && -
      +
      {children}
      } diff --git a/apps/admin-x-settings/src/admin-x-ds/settings/SettingSectionHeader.tsx b/apps/admin-x-settings/src/admin-x-ds/settings/SettingSectionHeader.tsx index 0d8dd05b2c..bc89701b99 100644 --- a/apps/admin-x-settings/src/admin-x-ds/settings/SettingSectionHeader.tsx +++ b/apps/admin-x-settings/src/admin-x-ds/settings/SettingSectionHeader.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import clsx from 'clsx'; interface Props { title: string; @@ -6,12 +7,13 @@ interface Props { } const SettingSectionHeader: React.FC = ({title, sticky = false}) => { - let styles = 'pb-[9px] mb-px text-2xs font-semibold uppercase tracking-wider text-grey-700 z-20 '; - if (sticky) { - styles += ' sticky top-0 -mt-4 pt-4 bg-white dark:bg-black'; - } + const classNames = clsx( + 'z-20 mb-px pb-10 text-4xl font-bold tracking-tighter', + (sticky ? 'sticky top-0 mt-[calc(-8vmin-4px)] bg-gradient-to-t from-transparent via-white via-20% to-white pt-[calc(8vmin-4px)] dark:bg-black' : 'mt-[-5px]') + ); + return ( -

      {title}

      +

      {title}

      ); }; diff --git a/apps/admin-x-settings/src/admin-x-ds/settings/SettingValue.tsx b/apps/admin-x-settings/src/admin-x-ds/settings/SettingValue.tsx index 4fec1b15bf..bf57bdff3d 100644 --- a/apps/admin-x-settings/src/admin-x-ds/settings/SettingValue.tsx +++ b/apps/admin-x-settings/src/admin-x-ds/settings/SettingValue.tsx @@ -17,7 +17,7 @@ const SettingValue: React.FC = ({heading, value, hint, hideEm return (
      - {heading && {heading}} + {heading && {heading}}
      {value}
      {hint &&

      {hint}

      }
      diff --git a/apps/admin-x-settings/src/components/Sidebar.tsx b/apps/admin-x-settings/src/components/Sidebar.tsx index 8bc965f5fe..084b1e5c81 100644 --- a/apps/admin-x-settings/src/components/Sidebar.tsx +++ b/apps/admin-x-settings/src/components/Sidebar.tsx @@ -1,9 +1,11 @@ import Button from '../admin-x-ds/global/Button'; +import GhostLogo from '../assets/images/orb-pink.png'; import Icon from '../admin-x-ds/global/Icon'; import React, {useEffect, useRef} from 'react'; import SettingNavItem from '../admin-x-ds/settings/SettingNavItem'; import SettingNavSection from '../admin-x-ds/settings/SettingNavSection'; import TextField from '../admin-x-ds/global/form/TextField'; +import clsx from 'clsx'; import useFeatureFlag from '../hooks/useFeatureFlag'; import useRouting from '../hooks/useRouting'; import {searchKeywords as advancedSearchKeywords} from './settings/advanced/AdvancedSettings'; @@ -22,7 +24,7 @@ const Sidebar: React.FC = () => { const searchInputRef = useRef(null); const {isAnyTextFieldFocused} = useFocusContext(); - // Focus in on search field when pressing CMD+K/CTRL+K + // Focus in on search field when pressing "/" useEffect(() => { const handleKeyPress = (e: KeyboardEvent) => { if (e.key === '/' && !isAnyTextFieldFocused) { @@ -48,9 +50,11 @@ const Sidebar: React.FC = () => { const {settings, config} = useGlobalData(); const [newslettersEnabled] = getSettingValues(settings, ['editor_default_email_recipients']) as [string]; - const handleSectionClick = (e: React.MouseEvent) => { - setFilter(''); - updateRoute(e.currentTarget.name); + const handleSectionClick = (e?: React.MouseEvent) => { + if (e) { + setFilter(''); + updateRoute(e.currentTarget.id); + } }; const hasTipsAndDonations = useFeatureFlag('tipsAndDonations'); @@ -64,65 +68,74 @@ const Sidebar: React.FC = () => { } }; + const navClasses = clsx( + 'no-scrollbar hidden pt-10 tablet:!visible tablet:!block tablet:h-[calc(100vh-8vmin-36px)] tablet:overflow-y-auto' + ); + return (
      -
      - - - {filter ?
      -
      - - - - - - - - - - +
      + + + + + + + + + + - - - + + + - - - - {hasTipsAndDonations && } - - {hasRecommendations && } - + + + + {hasTipsAndDonations && } + + {hasRecommendations && } + - + {newslettersEnabled !== 'disabled' && ( <> - - - {!config.mailgunIsConfigured && } + + + {!config.mailgunIsConfigured && } )} - - - - + + + + -
      ); diff --git a/apps/admin-x-settings/src/components/settings/advanced/integrations/AddIntegrationModal.tsx b/apps/admin-x-settings/src/components/settings/advanced/integrations/AddIntegrationModal.tsx index 1d08c035ad..94254fa31a 100644 --- a/apps/admin-x-settings/src/components/settings/advanced/integrations/AddIntegrationModal.tsx +++ b/apps/admin-x-settings/src/components/settings/advanced/integrations/AddIntegrationModal.tsx @@ -63,6 +63,7 @@ const AddIntegrationModal: React.FC = () => { marginTop={false} > /ghost/#/websockets.', + description: <>Test out Websockets functionality at /ghost/#/websockets., flag: 'websockets' },{ title: 'Stripe Automatic Tax', @@ -48,9 +48,13 @@ const features = [{ description: 'Enables publishers to collect one-time payments', flag: 'tipsAndDonations' },{ - title: 'Recommendations', - description: 'Enables publishers to recommend sites to their audience', - flag: 'recommendations' + title: 'List-Unsubscribe header', + description: 'Set the List-Unsubscribe header in emails', + flag: 'listUnsubscribeHeader' +},{ + title: 'Editor emoji picker', + description: <>Trigger an emoji picker when typing {':{search}'} in the editor, + flag: 'editorEmojiPicker' }]; const AlphaFeatures: React.FC = () => { diff --git a/apps/admin-x-settings/src/components/settings/email/newsletters/AddNewsletterModal.tsx b/apps/admin-x-settings/src/components/settings/email/newsletters/AddNewsletterModal.tsx index d3b6e8d3d2..65ffa51797 100644 --- a/apps/admin-x-settings/src/components/settings/email/newsletters/AddNewsletterModal.tsx +++ b/apps/admin-x-settings/src/components/settings/email/newsletters/AddNewsletterModal.tsx @@ -26,7 +26,7 @@ const AddNewsletterModal: React.FC = () => { }); const {mutateAsync: addNewsletter} = useAddNewsletter(); - const {formState, updateForm, handleSave, errors, validate, clearError} = useForm({ + const {formState, updateForm, handleSave, errors, clearError} = useForm({ initialState: { name: '', description: '', @@ -96,12 +96,12 @@ const AddNewsletterModal: React.FC = () => { marginTop > updateForm(state => ({...state, name: e.target.value}))} onKeyDown={() => clearError('name')} /> diff --git a/apps/admin-x-settings/src/components/settings/general/Facebook.tsx b/apps/admin-x-settings/src/components/settings/general/Facebook.tsx index dafa050b3f..1e751585c4 100644 --- a/apps/admin-x-settings/src/components/settings/general/Facebook.tsx +++ b/apps/admin-x-settings/src/components/settings/general/Facebook.tsx @@ -105,7 +105,6 @@ const Facebook: React.FC<{ keywords: string[] }> = ({keywords}) => {
      = ({keywords}) => { onChange={handleTitleChange} /> { return ( - + diff --git a/apps/admin-x-settings/src/components/settings/general/InviteUserModal.tsx b/apps/admin-x-settings/src/components/settings/general/InviteUserModal.tsx index 2fc64a4249..8ef43fafb2 100644 --- a/apps/admin-x-settings/src/components/settings/general/InviteUserModal.tsx +++ b/apps/admin-x-settings/src/components/settings/general/InviteUserModal.tsx @@ -189,7 +189,6 @@ const InviteUserModal = NiceModal.create(() => { Send an invitation for a new person to create a staff account on your site, and select a role that matches what you’d like them to be able to do.

      = ({keywords}) => { key: 'site-timezone', value:
      {publicationTimezoneData?.label || publicationTimezone} - +
      } ]} /> diff --git a/apps/admin-x-settings/src/components/settings/general/Twitter.tsx b/apps/admin-x-settings/src/components/settings/general/Twitter.tsx index aa94c725fe..807ba85ee6 100644 --- a/apps/admin-x-settings/src/components/settings/general/Twitter.tsx +++ b/apps/admin-x-settings/src/components/settings/general/Twitter.tsx @@ -102,7 +102,6 @@ const Twitter: React.FC<{ keywords: string[] }> = ({keywords}) => {
      = ({keywords}) => { onChange={handleTitleChange} /> = ({keywords}) => { return ( = ({keywords}) => {
      Shareable link — - +
      {donateUrl} diff --git a/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailModal.tsx b/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailModal.tsx index c36b8cb8fa..30640a871b 100644 --- a/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailModal.tsx +++ b/apps/admin-x-settings/src/components/settings/membership/tiers/TierDetailModal.tsx @@ -220,14 +220,15 @@ const TierDetailModalContent: React.FC<{tier?: Tier}> = ({tier}) => {
      Prices -
      +