Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: TryGhost/Ghost
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v5.89.6
Choose a base ref
...
head repository: TryGhost/Ghost
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v5.90.0
Choose a head ref

Commits on Aug 16, 2024

  1. 🐛 Fixed a bug causing new drafts to only save if the title is populat…

    …ed (#20769)
    
    ref
    https://linear.app/tryghost/issue/ONC-253/drafts-only-save-if-the-title-is-populated
    
    - A
    [commit](c8ba9e8)
    in `v5.89.1` introduced a bug that caused new drafts to only save if the
    post title was populated, causing potential data loss if a user is
    working on a new draft without setting the title.
    - This commit reverts the one that introduced this bug to prevent data
    loss.
    
    This reverts commit c8ba9e8.
    cmraible authored Aug 16, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    77b1891 View commit details
  2. Merged v5.89.3 into main

    github-actions[bot] committed Aug 16, 2024
    Copy the full SHA
    f4794a5 View commit details

Commits on Aug 19, 2024

  1. Fixed draft posts not autosaving without title (#20774)

    ref [ENG-661](https://linear.app/tryghost/issue/ENG-661/) ONC-253
    
    - Reverts the revert of
    93cbb94
    of the intial bug fix.
    - Updated hasDirtyAttributes logic to ensure the dirty state changes
    when typing a draft, despite not title.
    - Updated tests and added tests missing from the hasDirtyAttributes
    logic
    ronaldlangeveld authored Aug 19, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    aad438b View commit details
  2. Update dependency tailwindcss to v3.4.10

    renovate[bot] authored and daniellockyer committed Aug 19, 2024
    Copy the full SHA
    4462b20 View commit details
  3. Update dependency i18next to v23.14.0

    renovate[bot] committed Aug 19, 2024
    Copy the full SHA
    6a7b8bd View commit details
  4. Revert "Fixed draft posts not autosaving without title (#20774)" (#20776

    )
    
    This reverts commit aad438b.
    
    - reverts the commit so that we can merge it together with PLG-174
    ronaldlangeveld authored Aug 19, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    6ebcd10 View commit details
  5. Migrated the design system to Radix (#20244)

    minimaluminium authored Aug 19, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    2f76847 View commit details
  6. Publish flow Close button improvements (#20779)

    fixes
    https://linear.app/tryghost/issue/DES-682/close-button-improvements
    
    Small updates to the modal in the new Publish flow. Improved margins and
    opacity for legibility.
    dvdwinden authored Aug 19, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    f864bde View commit details
  7. Adds blur behind 'Share' modal (#20782)

    fixes https://linear.app/tryghost/issue/DES-683/add-blur-behind-modal
    
    Adds a blur behind the modal in the new Publish flow.
    dvdwinden authored Aug 19, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    1e3edc0 View commit details
  8. Fix browser tests for Radix migration (#20783)

    DES-696
    
    We upgraded the AdminX Design System to use Radix UI components. However
    browser tests fail for checkboxes at the moment which must be fixed for
    release.
    peterzimon authored Aug 19, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    d66a0e3 View commit details
  9. 🐛 Fixed autosave not triggering when in-editor excerpt is changed (#2…

    …0785)
    
    ref https://linear.app/tryghost/issue/PLG-174
    
    - added `blur` handler to excerpt field so it acts the same as the title field and triggers a save when it loses focus
    kevinansfield authored Aug 19, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    21aa1b4 View commit details
  10. Pin dependencies

    renovate[bot] authored and daniellockyer committed Aug 19, 2024
    Copy the full SHA
    26724d8 View commit details
  11. Updated Admin editor unit tests to use real model instances

    ref https://linear.app/tryghost/issue/PLG-176
    
    - we recently had to revert code because it caused unexpected problems despite the unit tests passing
    - the setup for the editor unit tests was very basic and did not represent the real world because it tested a simple EmberObject instance rather than an Ember Model instance meaning the tests weren't covering the real code paths
    - updated the unit test with a more realistic environment ready for re-working the reverted code+tests
    kevinansfield committed Aug 19, 2024
    Copy the full SHA
    64fbf3b View commit details
  12. 🐛 Fixed editor unsaved changes modal showing too often (#20787)

    ref [ENG-661](https://linear.app/tryghost/issue/ENG-661/) 
    ref [ONC-253](https://linear.app/tryghost/issue/ONC-253/)
    ref [PLG-174](https://linear.app/tryghost/issue/PLG-174/)
    
    - restored the original but reverted fix for unsaved changes modal from #20687
    - updated code to remove some incorrect early-falsy-return logic in `editorController.hasDirtyAttributes` that prevented save of unsaved changes on the underlying model (e.g. excerpt)
    - updated unit tests so they are testing real post model instances and therefore are testing what we expect them to test
    - added acceptance tests to ensure autosave is working for title and excerpt fields
    
    ---------
    
    Co-authored-by: Ronald Langeveld <hi@ronaldlangeveld.com>
    kevinansfield and ronaldlangeveld authored Aug 19, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    887f4d3 View commit details
  13. Fixed excerpt blur saving non-draft posts

    ref https://linear.app/tryghost/issue/PLG-174
    
    - forcing autosave on excerpt blur caused posts to revert to `draft` and save immediately even when they were published/scheduled
    - updated the save-on-excerpt-blur to only autosave drafts
    - added acceptance tests for title and excerpt change+blur on published posts
    kevinansfield committed Aug 19, 2024
    Copy the full SHA
    9dfbd3e View commit details
  14. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    9f4bc9c View commit details

Commits on Aug 20, 2024

  1. Merged v5.89.4 into main

    github-actions[bot] committed Aug 20, 2024
    Copy the full SHA
    0a2f2ad View commit details
  2. Added default background and font styles to cards (#20676)

    ref DES-609
    
    - On top of bookmark card, this update adds default background color and font to file, audio, and product cards
    - The main purpose of this is keeping embedded look across these cards consistencly regardless of the theme background color and default font
    - Themes can still override the styles
    minimaluminium authored Aug 20, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    cc545b5 View commit details
  3. Share button improvements on publish flow modal (#20791)

    ref DES-684
    
    - switched social links from buttons to regular links 
    - added post title to share links
    minimaluminium authored Aug 20, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    5cce46e View commit details
  4. Changed color of adminX prefix for yarn dev

    - red makes it look like an error, which is very misleading
    - I've changed this to a random purple I found
    - credits to @vershwal and @dvdwinden
    daniellockyer committed Aug 20, 2024
    Copy the full SHA
    0f3805e View commit details
  5. Updated tips & donations default suggested value

    closes https://linear.app/tryghost/issue/PLG-156
    
    - updated all default fixtures to use `500` ($5) as the default suggested donation value
    - added migration to update existing settings using the old default of `0` to `500`
      - this is fine to apply because the feature hasn't been released so there's no explicit `0` values in the wild
    - added an acceptance test for the adminx-settings tips & donations section
    kevinansfield committed Aug 20, 2024
    Copy the full SHA
    0b3f7d7 View commit details
  6. Updated donations browser tests for new default suggested value

    ref #20793
    
    - now that there's a non-zero suggested value amount Stripe's UI shows a button to change the amount rather than showing the amount input field immediately
    - added extra click to the tests and an expectation that the default value is set correctly
    kevinansfield committed Aug 20, 2024
    Copy the full SHA
    d3c2c7b View commit details
  7. Improved publish flow transition (#20794)

    ref DES-697
    
    - used client side navigation on the flow instead of hard refresh
    - reduced layout shift on the analytics screen
    - made the modal transition a bit smoother
    minimaluminium authored Aug 20, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    a8dc689 View commit details
  8. Replaced refresh button with a GhTaskButton (#20796)

    minimaluminium authored Aug 20, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    9b41307 View commit details
  9. Fixed missing stats on the analytics screen (#20797)

    minimaluminium authored Aug 20, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    6413a30 View commit details
  10. Merged v5.89.5 into main

    github-actions[bot] committed Aug 20, 2024
    Copy the full SHA
    5effca4 View commit details
  11. Added donation notification toggle to user settings

    closes https://linear.app/tryghost/issue/PLG-155
    
    - added checkbox when "stripe enabled" check is true
    kevinansfield committed Aug 20, 2024
    Copy the full SHA
    2712384 View commit details
  12. Fixed email integration tests (#20799)

    ref dac2561
    
    Among the mess of GH forks, it seems a few commits got lost patching up
    these tests.
    9larsons authored Aug 20, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    2f36d6a View commit details
  13. ✨ Updated email analytics job to prioritize open events (#20800)

    ref https://linear.app/tryghost/issue/ENG-1477
    - updated email analytics job to prioritize open events
    - put limits on non-open event fetching
    - updated job to now restart itself until processing is at a
    sufficiently low volume
    
    Previously the EmailAnalytics job would process all event data equally.
    When there's sufficient recipients (>20k), we could see delays in the
    open rate data in Admin because of all the delivered events being
    processed. Open events are far more important to users, so we've now
    prioritized processing those events before any others.
    
    Processing of events shouldn't be any faster or slower with this as this
    doesn't change throughput, just order.
    
    NOTE: Use the mailgun-mock-server in TryGhost/Toolbox for testing.
    9larsons authored Aug 20, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    4267ff9 View commit details
  14. Fixed value destructuring for null values (#20803)

    ref 4267ff9
    
    Found while testing other code. Appears to fail destructuring which
    prevents the job from running.
    9larsons authored Aug 20, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    8e1f552 View commit details
  15. Fixed handling of await (#20804)

    9larsons authored Aug 20, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    3c9b8d6 View commit details
  16. Added additional tests for email analytics (#20805)

    ref 4267ff9
    - unit tests didn't cover what events were passed along to be fetched,
    important now that it's split out
    9larsons authored Aug 20, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    54b0b87 View commit details

Commits on Aug 21, 2024

  1. 🐛 Fixed editor performance issues in Safari for posts with HTML or Ma…

    …rkdown cards (#20806)
    
    ref https://linear.app/tryghost/issue/ONC-261
    
    - Previous method of hiding the second Lexical instance using `width:
    0`, `height: 0`, and `overflow: hidden` caused CPU usage to spike,
    likely due to CodeMirror continuously processing the element.
    ronaldlangeveld authored Aug 21, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    3645fd8 View commit details
  2. Merged v5.89.6 into main

    github-actions[bot] committed Aug 21, 2024
    Copy the full SHA
    2627dd6 View commit details
  3. Fixed editor not loading in Admin acceptance tests

    closes https://linear.app/tryghost/issue/PLG-176
    
    The editor files were previously stubbed for testing because we didn't have a way to load the externally-hosted files. This made testing slow and difficult because the only way to test the Admin integration was via Ghost's e2e browser tests.
    
    - unstubbed the editor globals so `fetchKoenigLexical()` actually tries to import the external assets
    - updated `ember-cli-build` to copy the Koenig UMD file over to the assets directory in development/test builds
    - updated `environment.js` to set the required filename for the default asset import to successfully hit the test environment hosted files
    - updated lexical editor acceptance tests to demonstrate the editor loads successfully for new and existing posts
    kevinansfield committed Aug 21, 2024
    Copy the full SHA
    fc501ad View commit details
  4. Fixed Admin test failures when running in Safari

    no issue
    
    - Safari's `innerText` sometimes includes a trailing `\n` depending on the markup used so we need to use `.to.have.rendered.trimmed.text()`
    - reproducible when running tests via http://localhost:4200/tests (we don't yet run in Safari via our testem config)
    kevinansfield committed Aug 21, 2024
    Copy the full SHA
    b01d428 View commit details
  5. Hid tips and donation settings when Stripe is disabled

    closes https://linear.app/tryghost/issue/PLG-178
    
    - updated conditional to ensure we're ready for GA by showing when Stripe is enabled rather than only when the feature flag is enabled
    kevinansfield committed Aug 21, 2024
    Copy the full SHA
    f08e4d4 View commit details
  6. 🐛 Fixed frontend routing prioritizing collections over built in routes (

    #20765)
    
    ref
    https://linear.app/tryghost/issue/ONC-242/frontend-routing-prioritizes-collections-over-taxonomies
    
    - Under a fairly specific edge case with a collection route that conflicts with a default, built-in route ("taxonomy" — like tags, authors, etc), the frontend routing would prioritize the collection over the taxonomy.
    
    - For example, with the following in a custom `routes.yaml`:
    ```
    collections:
      /:
        permalink: /{primary_tag}/{slug}/
        template: index
    ```
    
    If a post exists with the same slug as its primary tag's slug, the frontend routing would redirect the `/tag/{slug}/` route to the post in the collection, rather than serving the tag itself.
    
    - This commit changes that, so if a collection's route conflicts with e.g. a `/tag/{slug}/` default route, Ghost will still return the built in route, rather than the collection.
    cmraible authored Aug 21, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    c0471f0 View commit details
  7. 🔒 Fixed admin forms defaulting to GET method (#20810)

    ref
    https://linear.app/tryghost/issue/ENG-1497/admin-signin-signup-and-setup-forms-default-to-get
    
    - If method is not specified, the form will default to GET, which is
    incorrect
    - This commit sets the method to POST and action to javascript:void(0)
    to prevent the form from submitting via GET if JavaScript is disabled or
    not fully loaded yet
    cmraible authored Aug 21, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    6d46dc2 View commit details

Commits on Aug 22, 2024

  1. Updated nql package (#20811)

    vershwal authored Aug 22, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    309cb37 View commit details
  2. Added i18n support to tips and donations on portal (#20812)

    ref PLG-159
    
    - wrapped strings inside the translate function in Portal
    - added new strings to i18n files
    ronaldlangeveld authored Aug 22, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    ad3751b View commit details
  3. Added one-time payments under "payments" for filtering (#20807)

    ref PLG-153
    
    - Scoped one-time payments (`donation_event`) under the "payments"
    category in the member activity feed filter.
    - Updated `toggleEventType` logic to ensure that toggling "payments"
    also toggles one-time payments when the `tipsAndDonations` feature is
    enabled.
    - Refactored event type handling into utility functions for easier
    testing.
    - Added unit tests for the new utility functions to ensure correct
    behaviour.
    - Added acceptance testing.
    ronaldlangeveld authored Aug 22, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    f2206fb View commit details
  4. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    f984fbd View commit details
  5. 🐛 Fixed fetching labels and offers in the editor (#20815)

    ref https://linear.app/tryghost/issue/ONC-263/
    - labels dropdown in sign up card was not successfully fetching labels
    - offers dropdown suffered the same fate
    
    When introducing the second editor instance, it appears we ran into some
    race conditions with the Ember tasks used to fetch the resources. The
    init instance was beating the other to the punch, and so the state was
    never successfully updated, as it is only fetched once on mounting the
    card.
    9larsons authored Aug 22, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    cd7c27d View commit details
  6. Publish modal updates (#20817)

    The new modal for the updated publishing flow has an entirely new
    layout, based on feedback previously received. In addition, this PR
    includes a few tweaks to the underlying logic.
    dvdwinden authored Aug 22, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    7c99282 View commit details
  7. 🐛 Fixed shift selection in the posts list (#20818)

    ref https://linear.app/tryghost/issue/ENG-1489/
    
    The changes to improve posts loading in admin broke the shift selection
    functionality. This restores that, as we need to be able to crawl across
    the (now) three models when present.
    9larsons authored Aug 22, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    827518c View commit details
  8. ✨ Improved email analytics jobs system (#20809)

    ref https://linear.app/tryghost/issue/ENG-952
    - added persistence to the job timestamps
    
    This set of changes reduces the potential for gaps in our email event
    processing by adding persistence to the job timestamps. This avoids
    expensive queries on the `email_recipients` table after every boot, and
    reduces reliance on fallbacks in periods of heavy processing or reboot.
    
    This is our first use of the jobs table to create a persistent line,
    instead of its initial use case of single-run jobs. We may expand this
    capability and move to use of the jobs model over knex.raw in order to
    make this a bit friendlier.
    
    Note: this works with sqlite but datetimes are stored as ints. It still
    works fine. knex/knex#5272
    9larsons authored Aug 22, 2024

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    0053939 View commit details
  9. Added integrity token API & middleware for magic link requests

    ref KTLO-1
    Back-end implementation of request integrity tokens. The purpose here
    is to prevent simple web bots from spamming the signup form.
    sam-lord committed Aug 22, 2024
    Copy the full SHA
    a48b4e5 View commit details
  10. Added support in Portal for integrity tokens on magic link API

    ref KTLO-1
    These tokens should prevent untargeted attacks, as the magic link
    endpoint needs a token that was generated by the server, similar to a
    CSRF token, but without needing any server-side state, or a cookie to
    be set for unauthenticated users.
    sam-lord committed Aug 22, 2024
    Copy the full SHA
    ef4f793 View commit details
  11. Added integrity token to signup-form package

    ref KTLO-1
    sam-lord committed Aug 22, 2024
    Copy the full SHA
    ebc8700 View commit details
Showing with 3,927 additions and 1,888 deletions.
  1. +2 −2 .github/scripts/dev.js
  2. +7 −0 .github/workflows/ci.yml
  3. +1 −1 apps/admin-x-demo/src/ListPage.tsx
  4. +11 −1 apps/admin-x-design-system/package.json
  5. +1 −1 apps/admin-x-design-system/src/assets/icons/hyperlink-circle.svg
  6. +12 −15 apps/admin-x-design-system/src/global/Avatar.tsx
  7. +6 −3 apps/admin-x-design-system/src/global/Button.tsx
  8. +2 −2 apps/admin-x-design-system/src/global/Menu.stories.tsx
  9. +1 −1 apps/admin-x-design-system/src/global/Menu.tsx
  10. +43 −0 apps/admin-x-design-system/src/global/Popover.stories.tsx
  11. +14 −70 apps/admin-x-design-system/src/global/Popover.tsx
  12. +6 −1 apps/admin-x-design-system/src/global/Separator.tsx
  13. +1 −1 apps/admin-x-design-system/src/global/SortMenu.tsx
  14. +12 −0 apps/admin-x-design-system/src/global/TabView.stories.tsx
  15. +37 −40 apps/admin-x-design-system/src/global/TabView.tsx
  16. +4 −4 apps/admin-x-design-system/src/global/Tooltip.stories.tsx
  17. +15 −11 apps/admin-x-design-system/src/global/Tooltip.tsx
  18. +11 −19 apps/admin-x-design-system/src/global/form/Checkbox.tsx
  19. +6 −15 apps/admin-x-design-system/src/global/form/Radio.tsx
  20. +24 −17 apps/admin-x-design-system/src/global/form/TextArea.tsx
  21. +22 −11 apps/admin-x-design-system/src/global/form/TextField.tsx
  22. +32 −22 apps/admin-x-design-system/src/global/form/Toggle.tsx
  23. +1 −1 apps/admin-x-design-system/src/global/modal/Modal.tsx
  24. +2 −1 apps/admin-x-design-system/src/settings/SettingValue.tsx
  25. +1 −0 apps/admin-x-framework/src/api/users.ts
  26. +5 −0 apps/admin-x-framework/src/test/responses/users.json
  27. +1 −1 apps/admin-x-settings/package.json
  28. +1 −1 apps/admin-x-settings/src/components/Sidebar.tsx
  29. +1 −1 apps/admin-x-settings/src/components/settings/advanced/HistoryModal.tsx
  30. +2 −2 apps/admin-x-settings/src/components/settings/general/UserDetailModal.tsx
  31. +14 −0 apps/admin-x-settings/src/components/settings/general/users/EmailNotifications.tsx
  32. +1 −1 apps/admin-x-settings/src/components/settings/growth/GrowthSettings.tsx
  33. +6 −5 apps/admin-x-settings/src/components/settings/growth/TipsAndDonations.tsx
  34. +2 −2 apps/admin-x-settings/src/components/settings/growth/offers/OffersIndex.tsx
  35. +1 −1 apps/admin-x-settings/src/components/settings/site/theme/AdvancedThemeSettings.tsx
  36. +6 −2 apps/admin-x-settings/test/acceptance/advanced/history.test.ts
  37. +1 −1 apps/admin-x-settings/test/acceptance/general/users/actions.test.ts
  38. +3 −3 apps/admin-x-settings/test/acceptance/general/users/invite.test.ts
  39. +70 −1 apps/admin-x-settings/test/acceptance/general/users/profile.test.ts
  40. +2 −2 apps/admin-x-settings/test/acceptance/general/users/roles.test.ts
  41. +40 −0 apps/admin-x-settings/test/acceptance/growth/tips-and-donations.test.ts
  42. +1 −1 apps/admin-x-settings/test/acceptance/site/announcementbar.test.ts
  43. +1 −1 apps/comments-ui/package.json
  44. +4 −2 apps/portal/src/actions.js
  45. +6 −1 apps/portal/src/components/common/InputField.js
  46. +1 −0 apps/portal/src/components/common/InputForm.js
  47. +14 −2 apps/portal/src/components/pages/SigninPage.js
  48. +14 −2 apps/portal/src/components/pages/SignupPage.js
  49. +4 −4 apps/portal/src/components/pages/SupportError.js
  50. +5 −3 apps/portal/src/components/pages/SupportPage.js
  51. +4 −4 apps/portal/src/components/pages/SupportSuccess.js
  52. +15 −6 apps/portal/src/data-attributes.js
  53. +44 −24 apps/portal/src/tests/SigninFlow.test.js
  54. +48 −27 apps/portal/src/tests/SignupFlow.test.js
  55. +25 −15 apps/portal/src/tests/data-attributes.test.js
  56. +16 −1 apps/portal/src/utils/api.js
  57. +1 −1 apps/signup-form/package.json
  58. +7 −0 apps/signup-form/src/Preview.stories.tsx
  59. +2 −1 apps/signup-form/src/components/pages/FormPage.tsx
  60. +19 −2 apps/signup-form/src/utils/api.tsx
  61. +4 −0 apps/signup-form/test/utils/e2e.ts
  62. +7 −2 ghost/admin/app/components/editor/modals/publish-flow/confirm.js
  63. +37 −4 ghost/admin/app/components/gh-task-button.hbs
  64. +1 −0 ghost/admin/app/components/gh-task-button.js
  65. +2 −2 ghost/admin/app/components/koenig-lexical-editor.js
  66. +3 −2 ghost/admin/app/components/members-activity/event-type-filter.hbs
  67. +5 −49 ghost/admin/app/components/members-activity/event-type-filter.js
  68. +136 −107 ghost/admin/app/components/modal-post-success.hbs
  69. +11 −19 ghost/admin/app/components/modal-post-success.js
  70. +28 −1 ghost/admin/app/components/posts-list/list.js
  71. +21 −23 ghost/admin/app/components/posts-list/selection-list.js
  72. +8 −5 ghost/admin/app/components/posts/analytics.hbs
  73. +3 −1 ghost/admin/app/components/posts/analytics.js
  74. +29 −29 ghost/admin/app/components/posts/post-activity-feed.hbs
  75. +6 −4 ghost/admin/app/styles/components/modals-new.css
  76. +107 −22 ghost/admin/app/styles/components/publishmenu.css
  77. +11 −2 ghost/admin/app/styles/layouts/content.css
  78. +1 −1 ghost/admin/app/templates/setup.hbs
  79. +1 −1 ghost/admin/app/templates/signin.hbs
  80. +1 −1 ghost/admin/app/templates/signup.hbs
  81. +57 −0 ghost/admin/app/utils/member-event-types.js
  82. +8 −1 ghost/admin/config/environment.js
  83. +6 −0 ghost/admin/ember-cli-build.js
  84. +1 −0 ghost/admin/mirage/factories/member-activity-event.js
  85. +1 −1 ghost/admin/mirage/fixtures/settings.js
  86. +2 −2 ghost/admin/package.json
  87. +1 −4 ghost/admin/public/assets/icons/link.svg
  88. +2 −2 ghost/admin/tests/acceptance/content-test.js
  89. +19 −4 ghost/admin/tests/acceptance/editor/lexical-test.js
  90. +8 −6 ghost/admin/tests/acceptance/editor/post-revisions-test.js
  91. +17 −17 ghost/admin/tests/acceptance/editor/publish-flow-test.js
  92. +59 −1 ghost/admin/tests/acceptance/members-activity-test.js
  93. +0 −6 ghost/admin/tests/test-helper.js
  94. +68 −0 ghost/admin/tests/unit/utils/member-event-types-test.js
  95. +1 −1 ghost/bookshelf-repository/package.json
  96. +1 −1 ghost/collections/package.json
  97. +8 −5 ghost/core/core/boot.js
  98. +7 −7 ghost/core/core/frontend/services/routing/RouterManager.js
  99. +3 −0 ghost/core/core/frontend/src/cards/css/audio.css
  100. +4 −1 ghost/core/core/frontend/src/cards/css/file.css
  101. +3 −3 ghost/core/core/frontend/src/cards/css/product.css
  102. +1 −1 ghost/core/core/frontend/src/cards/css/toggle.css
  103. +42 −0 ...er/data/migrations/versions/5.90/2024-08-20-09-40-24-update-default-donations-suggested-amount.js
  104. +1 −1 ghost/core/core/server/data/schema/default-settings/default-settings.json
  105. +14 −0 ghost/core/core/server/models/base/plugins/crud.js
  106. +5 −2 ghost/core/core/server/models/member-click-event.js
  107. +37 −8 ghost/core/core/server/services/email-analytics/EmailAnalyticsServiceWrapper.js
  108. +117 −21 ghost/core/core/server/services/email-analytics/lib/queries.js
  109. +62 −0 ghost/core/core/server/services/members/RequestIntegrityTokenProvider.js
  110. +42 −2 ghost/core/core/server/services/members/middleware.js
  111. +6 −0 ghost/core/core/server/services/members/service.js
  112. +3 −0 ghost/core/core/server/web/members/app.js
  113. +39 −27 ghost/core/core/shared/instrumentation.js
  114. +4 −7 ghost/core/package.json
  115. +96 −0 ghost/core/test/e2e-api/admin/__snapshots__/activity-feed.test.js.snap
  116. +15 −15 ghost/core/test/e2e-api/admin/__snapshots__/settings.test.js.snap
  117. +42 −0 ghost/core/test/e2e-api/admin/activity-feed.test.js
  118. +2 −2 ghost/core/test/e2e-browser/admin/tiers.spec.js
  119. +4 −0 ghost/core/test/e2e-browser/portal/donations.spec.js
  120. +33 −0 ghost/core/test/e2e-frontend/custom_routes.test.js
  121. +22 −22 ghost/core/test/integration/services/email-service/__snapshots__/batch-sending.test.js.snap
  122. +8 −8 ghost/core/test/integration/services/email-service/__snapshots__/cards.test.js.snap
  123. +4 −4 ghost/core/test/integration/services/email-service/batch-sending.test.js
  124. +16 −16 ghost/core/test/integration/services/email-service/email-event-storage.test.js
  125. +5 −5 ghost/core/test/integration/services/mailgun-email-suppression-list.test.js
  126. +1 −1 ghost/core/test/unit/server/data/schema/integrity.test.js
  127. +70 −0 ghost/core/test/unit/server/services/members/RequestIntegrityTokenProvider.test.js
  128. +23 −0 ghost/core/test/unit/shared/instrumentation.test.js
  129. +4 −0 ghost/core/test/utils/batch-email-utils.js
  130. +1 −1 ghost/core/test/utils/fixtures/default-settings-browser.json
  131. +1 −1 ghost/core/test/utils/fixtures/default-settings.json
  132. +10 −0 ghost/core/test/utils/fixtures/settings/edgecaseroutes.yaml
  133. +7 −0 ghost/core/test/utils/index.js
  134. +1 −1 ghost/custom-theme-settings-service/package.json
  135. +3 −2 ghost/email-analytics-provider-mailgun/lib/EmailAnalyticsProviderMailgun.js
  136. +23 −0 ghost/email-analytics-provider-mailgun/test/provider-mailgun.test.js
  137. +147 −44 ghost/email-analytics-service/lib/EmailAnalyticsService.js
  138. +688 −46 ghost/email-analytics-service/test/email-analytics-service.test.js
  139. +6 −1 ghost/i18n/locales/af/portal.json
  140. +6 −1 ghost/i18n/locales/bg/portal.json
  141. +6 −1 ghost/i18n/locales/bs/portal.json
  142. +6 −1 ghost/i18n/locales/ca/portal.json
  143. +5 −0 ghost/i18n/locales/context.json
  144. +6 −1 ghost/i18n/locales/cs/portal.json
  145. +6 −1 ghost/i18n/locales/da/portal.json
  146. +6 −1 ghost/i18n/locales/de/portal.json
  147. +6 −1 ghost/i18n/locales/en/portal.json
  148. +6 −1 ghost/i18n/locales/eo/portal.json
  149. +6 −1 ghost/i18n/locales/es/portal.json
  150. +13 −13 ghost/i18n/locales/fa/comments.json
  151. +18 −18 ghost/i18n/locales/fa/ghost.json
  152. +63 −58 ghost/i18n/locales/fa/portal.json
  153. +6 −1 ghost/i18n/locales/fi/portal.json
  154. +6 −1 ghost/i18n/locales/fr/portal.json
  155. +6 −1 ghost/i18n/locales/gd/portal.json
  156. +6 −1 ghost/i18n/locales/hr/portal.json
  157. +6 −1 ghost/i18n/locales/hu/portal.json
  158. +6 −1 ghost/i18n/locales/id/portal.json
  159. +6 −1 ghost/i18n/locales/is/portal.json
  160. +6 −1 ghost/i18n/locales/it/portal.json
  161. +6 −1 ghost/i18n/locales/ja/portal.json
  162. +6 −1 ghost/i18n/locales/ko/portal.json
  163. +6 −1 ghost/i18n/locales/lt/portal.json
  164. +6 −1 ghost/i18n/locales/mn/portal.json
  165. +6 −1 ghost/i18n/locales/ms/portal.json
  166. +6 −1 ghost/i18n/locales/nl/portal.json
  167. +6 −1 ghost/i18n/locales/nn/portal.json
  168. +6 −1 ghost/i18n/locales/no/portal.json
  169. +6 −1 ghost/i18n/locales/pl/portal.json
  170. +6 −1 ghost/i18n/locales/pt-BR/portal.json
  171. +6 −1 ghost/i18n/locales/pt/portal.json
  172. +6 −1 ghost/i18n/locales/ro/portal.json
  173. +6 −1 ghost/i18n/locales/ru/portal.json
  174. +6 −1 ghost/i18n/locales/si/portal.json
  175. +6 −1 ghost/i18n/locales/sk/portal.json
  176. +6 −1 ghost/i18n/locales/sl/portal.json
  177. +6 −1 ghost/i18n/locales/sq/portal.json
  178. +6 −1 ghost/i18n/locales/sr/portal.json
  179. +6 −1 ghost/i18n/locales/sv/portal.json
  180. +6 −1 ghost/i18n/locales/tr/portal.json
  181. +6 −1 ghost/i18n/locales/uk/portal.json
  182. +6 −1 ghost/i18n/locales/uz/portal.json
  183. +6 −1 ghost/i18n/locales/vi/portal.json
  184. +6 −1 ghost/i18n/locales/zh-Hant/portal.json
  185. +6 −1 ghost/i18n/locales/zh/portal.json
  186. +1 −1 ghost/i18n/package.json
  187. +1 −1 ghost/in-memory-repository/package.json
  188. +1 −1 ghost/link-tracking/package.json
  189. +10 −1 ghost/members-api/lib/controllers/RouterController.js
  190. +84 −16 ghost/members-api/lib/repositories/EventRepository.js
  191. +1 −1 ghost/members-api/package.json
  192. +47 −0 ghost/members-api/test/unit/lib/controllers/router.test.js
  193. +1 −1 ghost/posts-service/package.json
  194. +466 −801 yarn.lock
4 changes: 2 additions & 2 deletions .github/scripts/dev.js
Original file line number Diff line number Diff line change
@@ -72,13 +72,13 @@ const COMMANDS_ADMINX = [{
name: 'adminXDeps',
command: 'while [ 1 ]; do nx watch --projects=apps/admin-x-design-system,apps/admin-x-framework -- nx run \\$NX_PROJECT_NAME:build; done',
cwd: path.resolve(__dirname, '../..'),
prefixColor: '#C35831',
prefixColor: '#C72AF7',
env: {}
}, {
name: 'adminX',
command: `nx run-many --projects=${adminXApps} --parallel=${adminXApps.length} --targets=dev`,
cwd: path.resolve(__dirname, '../../apps/admin-x-settings', '../../apps/admin-x-activitypub'),
prefixColor: '#C35831',
prefixColor: '#C72AF7',
env: {}
}];

7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -843,6 +843,13 @@ jobs:
run: |
ghost update -f -d $V4_DIR --archive $(pwd)/ghost/core/ghost.tgz
- name: Save Ghost CLI Debug Logs
if: failure()
uses: actions/upload-artifact@v3
with:
name: ghost-cli-debug-logs
path: /home/runner/.ghost/logs/

- name: Clean Install
run: |
DIR=$(mktemp -d)
2 changes: 1 addition & 1 deletion apps/admin-x-demo/src/ListPage.tsx
Original file line number Diff line number Diff line change
@@ -27,7 +27,7 @@ const ListPage = () => {
label: 'Open Rate'
}
]}
position="left"
position="start"
onDirectionChange={() => {}}
onSortChange={() => {}}
/>,
12 changes: 11 additions & 1 deletion apps/admin-x-design-system/package.json
Original file line number Diff line number Diff line change
@@ -31,6 +31,7 @@
"@storybook/addon-essentials": "7.6.20",
"@storybook/addon-interactions": "7.6.20",
"@storybook/addon-links": "7.6.20",
"@radix-ui/react-tooltip": "1.1.2",
"@storybook/addon-styling": "1.3.7",
"@storybook/blocks": "7.6.20",
"@storybook/react": "7.6.20",
@@ -60,6 +61,15 @@
"@dnd-kit/core": "6.1.0",
"@dnd-kit/sortable": "7.0.2",
"@ebay/nice-modal-react": "1.2.13",
"@radix-ui/react-avatar": "1.1.0",
"@radix-ui/react-checkbox": "1.1.1",
"@radix-ui/react-form": "0.0.3",
"@radix-ui/react-popover": "1.1.1",
"@radix-ui/react-radio-group": "1.2.0",
"@radix-ui/react-separator": "1.1.0",
"@radix-ui/react-switch": "1.1.0",
"@radix-ui/react-tabs": "1.1.0",
"@radix-ui/react-tooltip": "1.1.2",
"@sentry/react": "7.119.0",
"@tailwindcss/forms": "0.5.7",
"@tailwindcss/line-clamp": "0.4.4",
@@ -71,7 +81,7 @@
"react-colorful": "5.6.1",
"react-hot-toast": "2.4.1",
"react-select": "5.8.0",
"tailwindcss": "3.4.7"
"tailwindcss": "3.4.10"
},
"peerDependencies": {
"react": "^18.2.0",
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 12 additions & 15 deletions apps/admin-x-design-system/src/global/Avatar.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React from 'react';
import {ReactComponent as UserIcon} from '../assets/icons/single-user-fill.svg';
import * as AvatarPrimitive from '@radix-ui/react-avatar';

type AvatarSize = 'sm' | 'md' | 'lg' | 'xl' | '2xl';

@@ -44,21 +45,17 @@ const Avatar: React.FC<AvatarProps> = ({image, label, labelColor, bgColor, size,
break;
}

if (image) {
return (
<img alt="" className={`inline-flex shrink-0 items-center justify-center rounded-full object-cover font-semibold ${avatarSize} ${className && className}`} src={image}/>
);
} else if (label) {
return (
<div className={`${labelColor && `text-${labelColor}`} inline-flex items-center justify-center rounded-full p-2 font-semibold ${avatarSize} ${className && className}`} style={bgColor ? {backgroundColor: bgColor} : {}}>{label}</div>
);
} else {
return (
<div className={`inline-flex items-center justify-center overflow-hidden rounded-full bg-grey-100 p-1 font-semibold ${avatarSize} ${className && className}`}>
<UserIcon className={`${fallbackPosition} h-full w-full text-grey-300`} />
</div>
);
}
return (
<AvatarPrimitive.Root className={`relative inline-flex select-none items-center justify-center overflow-hidden rounded-full align-middle ${avatarSize}`}>
{image ?
<AvatarPrimitive.Image className={`absolute z-20 h-full w-full object-cover ${className && className}`} src={image} /> :
<span className={`${labelColor && `text-${labelColor}`} relative z-10 inline-flex h-full w-full items-center justify-center p-2 font-semibold ${className && className}`} style={bgColor ? {backgroundColor: bgColor} : {}}>{label}</span>
}
<AvatarPrimitive.Fallback asChild>
<UserIcon className={`${fallbackPosition} absolute z-0 h-full w-full text-grey-300`} />
</AvatarPrimitive.Fallback>
</AvatarPrimitive.Root>
);
};

export default Avatar;
9 changes: 6 additions & 3 deletions apps/admin-x-design-system/src/global/Button.tsx
Original file line number Diff line number Diff line change
@@ -30,7 +30,7 @@ export interface ButtonProps extends Omit<HTMLProps<HTMLButtonElement>, 'label'
testId?: string;
}

const Button: React.FC<ButtonProps> = ({
const Button: React.FC<ButtonProps> = React.forwardRef(({
testId,
size = 'md',
label = '',
@@ -51,7 +51,7 @@ const Button: React.FC<ButtonProps> = ({
outlineOnMobile = false,
onClick,
...props
}) => {
}, ref) => {
if (!color) {
color = 'clear';
}
@@ -155,9 +155,12 @@ const Button: React.FC<ButtonProps> = ({
disabled: disabled,
type: 'button',
onClick: onClick,
ref: ref,
...props}, buttonChildren);

return buttonElement;
};
});

Button.displayName = 'Button';

export default Button;
4 changes: 2 additions & 2 deletions apps/admin-x-design-system/src/global/Menu.stories.tsx
Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ export const Default: Story = {
args: {
trigger: <Button color='black' label="Click"></Button>,
items: items,
position: 'left'
position: 'start'
},
decorators: [
ThisStory => (
@@ -37,7 +37,7 @@ export const Right: Story = {
args: {
trigger: <Button color='black' label="Click"></Button>,
items: items,
position: 'right'
position: 'end'
},
decorators: [
ThisStory => (
2 changes: 1 addition & 1 deletion apps/admin-x-design-system/src/global/Menu.tsx
Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@ const Menu: React.FC<MenuProps> = ({
trigger,
triggerButtonProps,
items,
position = 'left'
position = 'start'
}) => {
if (!trigger) {
trigger = <Button icon='ellipsis' label='Menu' hideLabel {...triggerButtonProps} />;
43 changes: 43 additions & 0 deletions apps/admin-x-design-system/src/global/Popover.stories.tsx
Original file line number Diff line number Diff line change
@@ -32,3 +32,46 @@ export const Default: Story = {
)
}
};

export const CenterAlign: Story = {
args: {
position: 'center',
trigger: (
<Button color='grey' label='Open popover' />
),
children: (
<div className='p-5 text-sm' style={{maxWidth: '320px'}}>
This is a popover. You can put anything in it. The styling of the content defines how it will look at the end.
</div>
)
}
};

export const RightAlign: Story = {
args: {
position: 'end',
trigger: (
<Button color='grey' label='Open popover' />
),
children: (
<div className='p-5 text-sm' style={{maxWidth: '320px'}}>
This is a popover. You can put anything in it. The styling of the content defines how it will look at the end.
</div>
)
}
};

export const DismissOnClick: Story = {
args: {
position: 'start',
trigger: (
<Button color='grey' label='Open popover' />
),
children: (
<div className='p-5 text-sm' style={{maxWidth: '320px'}}>
Click here to close the popover.
</div>
),
closeOnItemClick: true
}
};
84 changes: 14 additions & 70 deletions apps/admin-x-design-system/src/global/Popover.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import clsx from 'clsx';
import React, {useRef, useState} from 'react';
import {createPortal} from 'react-dom';
import React, {useState} from 'react';
import * as PopoverPrimitive from '@radix-ui/react-popover';

export type PopoverPosition = 'left' | 'right';
export type PopoverPosition = 'center' | 'end' | 'start' | undefined;

export interface PopoverProps {
trigger: React.ReactNode;
@@ -11,86 +10,31 @@ export interface PopoverProps {
closeOnItemClick?: boolean;
}

const getOffsetPosition = (element: HTMLDivElement | null) => {
// innerZoomElementWrapper fixes weird behaviour in Storybook - the preview container
// uses transform which changes how position:fixed works and means getBoundingClientRect
// won't return the right position
return element?.closest('.innerZoomElementWrapper')?.getBoundingClientRect() || {x: 0, y: 0};
};

const Popover: React.FC<PopoverProps> = ({
trigger,
children,
position = 'left',
position = 'start',
closeOnItemClick
}) => {
const [open, setOpen] = useState(false);
const [positionX, setPositionX] = useState(0);
const [positionY, setPositionY] = useState(0);
const triggerRef = useRef<HTMLDivElement | null>(null);

const handleTriggerClick = () => {
if (!open && triggerRef.current) {
const parentRect = getOffsetPosition(triggerRef.current);
const {x, y, width, height} = triggerRef.current.getBoundingClientRect();
const relativeX = x - parentRect.x;
const relativeY = y - parentRect.y;

const finalX = (position === 'left') ? relativeX : window.innerWidth - (relativeX + width);
setOpen(true);
setPositionX(finalX);
setPositionY(relativeY + height);
} else {
setOpen(false);
}
};

const style: React.CSSProperties = {
top: `${positionY}px`
};

if (position === 'left') {
style.left = `${positionX}px`;
} else {
style.right = `${positionX}px`;
}

const handleBackdropClick = (e: React.MouseEvent<HTMLDivElement>) => {
if (e.target === e.currentTarget) {
setOpen(false);
}
};

const handleContentClick = () => {
if (closeOnItemClick) {
setOpen(false);
}
};

let className = '';

className = clsx(
'fixed z-50 mt-2 origin-top-right rounded bg-white shadow-md ring-1 ring-[rgba(0,0,0,0.01)] focus:outline-none dark:bg-grey-900 dark:text-white',
className
);

const backdropClasses = clsx(
'fixed inset-0 z-40',
open ? 'block' : 'hidden'
);

return (
<>
<div ref={triggerRef} onClick={handleTriggerClick}>
{trigger}
</div>
{open && createPortal(<div className='fixed z-[9999] inline-block' onClick={handleContentClick}>
<div className={backdropClasses} data-testid="popover-overlay" onClick={handleBackdropClick}></div>
<div className={className} data-testid='popover-content' style={style}>
{children}
</div>
</div>, triggerRef.current?.closest('.admin-x-base') || document.body)}
</>
<PopoverPrimitive.Root open={open} onOpenChange={setOpen}>
<PopoverPrimitive.Anchor asChild>
<PopoverPrimitive.Trigger asChild>
{trigger}
</PopoverPrimitive.Trigger>
</PopoverPrimitive.Anchor>
<PopoverPrimitive.Content align={position} className="z-50 mt-2 origin-top-right rounded bg-white shadow-md ring-1 ring-[rgba(0,0,0,0.01)] focus:outline-none dark:bg-grey-900 dark:text-white" data-testid='popover-content' side="bottom" onClick={handleContentClick}>
{children}
</PopoverPrimitive.Content>
</PopoverPrimitive.Root>
);
};

7 changes: 6 additions & 1 deletion apps/admin-x-design-system/src/global/Separator.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React from 'react';
import * as SeparatorPrimitive from '@radix-ui/react-separator';

export interface SeparatorProps {
className?: string;
@@ -8,7 +9,11 @@ const Separator: React.FC<SeparatorProps> = ({className}) => {
if (!className) {
className = 'border-grey-200 dark:border-grey-800';
}
return <hr className={className} />;
return (
<SeparatorPrimitive.Root asChild decorative>
<hr className={className} />
</SeparatorPrimitive.Root>
);
};

export default Separator;
2 changes: 1 addition & 1 deletion apps/admin-x-design-system/src/global/SortMenu.tsx
Original file line number Diff line number Diff line change
@@ -29,7 +29,7 @@ const SortMenu: React.FC<SortMenuProps> = ({
onDirectionChange,
trigger,
triggerButtonProps,
position = 'left'
position = 'start'
}) => {
const [localItems, setLocalItems] = useState<SortItem[]>(items);
const [localDirection, setLocalDirection] = useState<SortDirection>(direction || 'desc');
12 changes: 12 additions & 0 deletions apps/admin-x-design-system/src/global/TabView.stories.tsx
Original file line number Diff line number Diff line change
@@ -29,6 +29,12 @@ const tabs = [
{id: 'tab-6', title: 'Backstreet boys', contents: <div className='py-5'>Contents three</div>}
];

const tabsWithIcons = [
{id: 'tab-1', title: 'Some items', icon: 'at-sign', contents: <div className='py-5'>Contents one</div>},
{id: 'tab-2', title: 'Lots of items', icon: 'hamburger', contents: <div className='py-5'>Contents two</div>},
{id: 'tab-3', title: 'No items', icon: 'laptop', contents: <div className='py-5'>Contents three</div>}
];

const tabsWithCounters = [
{id: 'tab-1', title: 'Some items', counter: 4, contents: <div className='py-5'>Contents one</div>},
{id: 'tab-2', title: 'Lots of items', counter: 12, contents: <div className='py-5'>Contents two</div>},
@@ -49,6 +55,12 @@ export const NoBorder: Story = {
}
};

export const WithIcon: Story = {
args: {
tabs: tabsWithIcons
}
};

export const WithCounter: Story = {
args: {
tabs: tabsWithCounters
Loading