From bb2193b6f5786d4c29bb14ee1e3d85622fa5f7f4 Mon Sep 17 00:00:00 2001 From: "Calum H." Date: Tue, 4 Aug 2026 21:54:04 +0100 Subject: [PATCH] refactor: Button components (#6929) * feat: refactor button components * fix: qa * fix: storybook * a11y: pass * fix: build * fix: rename default ->md * fix: lint * docs: buttons.md * refactor part 1 * refactor part 2 * fix: undo refactor for fresh restart * refactor * Revert "refactor" This reverts commit 96d65902d75fa766aafef3a3ef03746b9aa4ab70. * refactor: part 1 * fix: qa * fix: qa * fix: qa * fix: qa * fix: qa * fix: qa * fix: qa * fix: qa * fix: remove text-contrast * fix: qa * fix: v-tooltip * fix: lint * fix: split broken * fix: passkey qa * fix: qa * fix: qa * fix: prepr * fix: splitbutton * improve button group seam --------- Signed-off-by: Calum H. Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com> --- apps/app-frontend/src/App.vue | 106 ++- .../src/components/ui/AccountsCard.vue | 49 +- .../src/components/ui/AddContentButton.vue | 45 +- .../src/components/ui/AppActionBar.vue | 44 +- .../src/components/ui/ErrorModal.vue | 37 +- .../src/components/ui/ExportModal.vue | 22 +- .../src/components/ui/Instance.vue | 123 +-- .../src/components/ui/InstanceIndicator.vue | 6 +- .../src/components/ui/JavaDetectionModal.vue | 45 +- .../src/components/ui/JavaSelector.vue | 109 ++- .../src/components/ui/ModpackVersionModal.vue | 22 +- .../src/components/ui/SurveyPopup.vue | 22 +- .../src/components/ui/URLConfirmModal.vue | 6 +- .../src/components/ui/WindowControls.vue | 48 +- .../components/ui/app-update-button/index.vue | 45 +- .../src/components/ui/friends/FriendsList.vue | 97 +- .../components/ui/friends/FriendsSection.vue | 56 +- .../install_flow/AddServerToInstanceModal.vue | 24 +- .../MinecraftAuthErrorModal.vue | 43 +- .../MinecraftRequiredModal.vue | 61 +- .../ui/modal/ConfirmDeleteInstanceModal.vue | 22 +- .../ui/modal/InstallToPlayModal.vue | 60 +- .../ui/modal/ModpackAlreadyInstalledModal.vue | 32 +- .../ui/modal/ModrinthAccountRequiredModal.vue | 58 +- .../ui/settings/account/PrivacySettings.vue | 12 +- .../settings/display/FeatureFlagSettings.vue | 17 +- .../instances/ResourceManagementSettings.vue | 29 +- .../SharedInstanceAlreadyInstalledModal.vue | 32 +- .../shared-instance-install-modal/index.vue | 62 +- .../shared-instance-install-summary.vue | 12 +- .../src/components/ui/skin/EditSkinModal.vue | 38 +- .../ui/skin/VirtualSkinSectionList.vue | 99 +- .../src/components/ui/world/InstanceItem.vue | 99 +- .../src/components/ui/world/WorldItem.vue | 345 +++---- .../ui/world/modal/AddServerModal.vue | 32 +- .../world/modal/ConfirmRemoveWorldModal.vue | 27 +- .../ui/world/modal/EditServerModal.vue | 22 +- .../modal/EditSingleplayerWorldModal.vue | 32 +- .../app-frontend/src/locales/en-US/index.json | 3 + apps/app-frontend/src/pages/Skins.vue | 88 +- apps/app-frontend/src/pages/User.vue | 86 +- .../admonitions/shared-instance-stale.vue | 40 +- .../shared-instance-unavailable.vue | 12 +- .../shared-instance-update-available.vue | 12 +- .../instance/components/page-header/index.vue | 171 ++-- ...rm-revoke-shared-instance-invite-modal.vue | 22 +- .../settings-modal/general-settings.vue | 81 +- .../settings-modal/java-settings.vue | 77 +- ...nstance-installation-settings-controls.vue | 57 +- .../settings-modal/sharing-settings.vue | 45 +- .../src/pages/instance/content/index.vue | 6 +- .../src/pages/instance/share/index.vue | 38 +- .../share/shared-instance-members-table.vue | 65 +- .../shared-instance-remove-member-modal.vue | 18 +- .../src/pages/instance/worlds/index.vue | 63 +- apps/app-frontend/src/pages/library/Index.vue | 22 +- .../src/pages/project/Gallery.vue | 70 +- apps/app-frontend/src/pages/project/Index.vue | 186 ++-- .../src/pages/project/Version.vue | 111 ++- .../src/pages/project/Versions.vue | 95 +- .../src/assets/styles/components.scss | 2 +- .../AnalyticsChartRenderLimitModal.vue | 18 +- .../analytics-table/index.vue | 42 +- .../components/analytics-dashboard/index.vue | 38 +- .../query-builder/QueryFilter.vue | 3 + .../query-builder/TimeframePicker.vue | 9 + .../query-builder/index.vue | 37 +- .../stat-cards/StatCards.vue | 18 +- apps/frontend/src/components/ui/Accordion.vue | 29 +- .../src/components/ui/AuthorizationCard.vue | 12 +- .../components/ui/ConfirmTransferOrgModal.vue | 22 +- .../ui/ConfirmTransferProjectModal.vue | 22 +- .../src/components/ui/ModrinthFooter.vue | 41 +- .../src/components/ui/NewsletterButton.vue | 22 +- .../src/components/ui/NotificationItem.vue | 183 ++-- .../components/ui/OrganizationPageHeader.vue | 40 +- .../ui/OrganizationProjectTransferModal.vue | 45 +- .../ui/ProjectCollectionSaveButton.vue | 102 +- .../CompatibleVersionCard.vue | 52 +- .../DownloadDependency.vue | 44 +- .../InstallWithModrinthApp.vue | 26 +- .../ui/ProjectDownloadModal/index.vue | 92 +- .../src/components/ui/ProjectMemberHeader.vue | 22 +- .../src/components/ui/ShareArticleButtons.vue | 103 +- .../ui/SharedInstanceInviteOpenInAppModal.vue | 34 +- .../ui/admin/AdminBillingChargeCard.vue | 34 +- .../components/ui/admin/AssignNoticeModal.vue | 47 +- .../components/ui/admin/BatchCreditModal.vue | 37 +- .../src/components/ui/admin/TransferModal.vue | 57 +- .../src/components/ui/auth/CreateAccount.vue | 22 +- .../components/ui/auth/PasskeySettings.vue | 131 ++- .../src/components/ui/auth/SignIn.vue | 108 ++- .../src/components/ui/auth/SignUp.vue | 123 ++- .../ui/banner/GeneratedStateErrorsBanner.vue | 27 +- .../components/ui/banner/PreviewBanner.vue | 14 +- .../src/components/ui/banner/RussiaBanner.vue | 38 +- .../components/ui/banner/StagingBanner.vue | 20 +- .../SubscriptionPaymentFailedBanner.vue | 12 +- .../ui/banner/TaxComplianceBanner.vue | 14 +- .../ui/banner/TaxIdMismatchBanner.vue | 18 +- .../ui/banner/VerifyEmailBanner.vue | 19 +- .../components/AddedDependencyRow.vue | 10 +- .../components/McVersionPicker.vue | 68 +- .../SuggestedDependency.vue | 10 +- .../components/VersionFileRow.vue | 63 +- .../stages/LoadersStage.vue | 6 +- .../stages/McVersionsStage.vue | 6 +- .../stages/MetadataStage.vue | 82 +- .../ui/create/CollectionCreateModal.vue | 22 +- .../components/ui/create/CreateLimitAlert.vue | 23 +- .../ui/create/OrganizationCreateModal.vue | 22 +- .../ui/create/ProjectCreateModal.vue | 28 +- .../ui/dashboard/CreatorTaxFormModal.vue | 43 +- .../ui/dashboard/CreatorWithdrawModal.vue | 65 +- .../ui/dashboard/RevenueInputField.vue | 10 +- .../ui/dashboard/RevenueTransaction.vue | 14 +- .../LegacyPaypalDetailsStage.vue | 56 +- .../withdraw-stages/MethodSelectionStage.vue | 39 +- .../withdraw-stages/TaxFormStage.vue | 10 +- .../ui/moderation/BatchScanProgressAlert.vue | 11 +- .../moderation/GlobalDetailLocalTraceCard.vue | 12 +- .../ui/moderation/GlobalDetailTracesList.vue | 42 +- .../ui/moderation/MaliciousSummaryModal.vue | 51 +- .../ui/moderation/ModerationProjectNags.vue | 35 +- .../ui/moderation/ModerationQueueCard.vue | 32 +- .../ui/moderation/ModerationReportCard.vue | 79 +- .../ui/moderation/ModerationTechRevCard.vue | 228 +++-- .../ui/moderation/ModpackScanModal.vue | 74 +- .../SharedInstanceReportContext.vue | 49 +- .../checklist/ModerationChecklist.vue | 358 +++---- .../checklist/ModpackPermissionsFlow.vue | 108 ++- .../ui/moderation/checklist/NodeRenderer.vue | 146 ++- .../moderation/settings/ModerationKeybind.vue | 17 +- .../src/components/ui/news/LatestNewsRow.vue | 12 +- .../ui/project-settings/CompatibilityCard.vue | 46 +- .../stages/UploadCustomModpack.vue | 29 +- .../servers/marketing/MedalPlanPromotion.vue | 18 +- .../servers/marketing/ServerPlanSelector.vue | 30 +- .../ui/thread/ConversationThread.vue | 583 ++++++------ .../components/ui/thread/ThreadMessage.vue | 36 +- .../src/components/ui/thread/ThreadView.vue | 66 +- apps/frontend/src/error.vue | 21 +- apps/frontend/src/layouts/default.vue | 895 ++++++++++-------- apps/frontend/src/pages/[type]/[project].vue | 354 +++---- .../src/pages/[type]/[project]/changelog.vue | 25 +- .../src/pages/[type]/[project]/gallery.vue | 260 ++--- .../[type]/[project]/settings/environment.vue | 18 +- .../[type]/[project]/settings/gallery.vue | 260 ++--- .../pages/[type]/[project]/settings/index.vue | 133 +-- .../[type]/[project]/settings/license.vue | 34 +- .../pages/[type]/[project]/settings/links.vue | 54 +- .../[type]/[project]/settings/members.vue | 190 ++-- .../[type]/[project]/settings/permissions.vue | 62 +- .../[type]/[project]/settings/server.vue | 28 +- .../[type]/[project]/settings/versions.vue | 388 ++++---- .../[type]/[project]/version/[version].vue | 502 +++++----- .../src/pages/[type]/[project]/versions.vue | 384 ++++---- apps/frontend/src/pages/admin/affiliates.vue | 12 +- .../src/pages/admin/analytics/events.vue | 90 +- .../src/pages/admin/billing/[user].vue | 100 +- apps/frontend/src/pages/admin/docs.vue | 35 +- apps/frontend/src/pages/admin/emails.vue | 34 +- .../src/pages/admin/servers/notices.vue | 62 +- .../src/pages/admin/servers/transfers.vue | 28 +- apps/frontend/src/pages/admin/user_email.vue | 12 +- apps/frontend/src/pages/app.vue | 35 +- apps/frontend/src/pages/auth/authorize.vue | 29 +- .../src/pages/auth/reset-password.vue | 28 +- apps/frontend/src/pages/auth/verify-email.vue | 75 +- .../src/pages/collection/[collection].vue | 142 +-- apps/frontend/src/pages/dashboard.vue | 12 +- .../src/pages/dashboard/affiliate-links.vue | 12 +- .../src/pages/dashboard/collections.vue | 17 +- apps/frontend/src/pages/dashboard/index.vue | 12 +- .../src/pages/dashboard/notifications.vue | 22 +- .../src/pages/dashboard/organizations.vue | 12 +- .../frontend/src/pages/dashboard/projects.vue | 179 ++-- .../src/pages/dashboard/revenue/transfers.vue | 21 +- apps/frontend/src/pages/hosting/index.vue | 45 +- apps/frontend/src/pages/index.vue | 36 +- .../pages/moderation/external-projects.vue | 54 +- .../pages/moderation/global-traces/[key].vue | 23 +- apps/frontend/src/pages/moderation/index.vue | 33 +- .../src/pages/moderation/reports/index.vue | 19 +- .../moderation/technical-review/[project].vue | 12 +- .../moderation/technical-review/index.vue | 15 +- .../src/pages/news/article/[slug].vue | 29 +- apps/frontend/src/pages/news/index.vue | 29 +- .../src/pages/organization/[organization].vue | 22 +- .../[organization]/settings/index.vue | 53 +- .../[organization]/settings/members.vue | 151 +-- .../[organization]/settings/projects.vue | 181 ++-- apps/frontend/src/pages/plus.vue | 44 +- apps/frontend/src/pages/report.vue | 61 +- apps/frontend/src/pages/settings/account.vue | 306 +++--- .../src/pages/settings/applications.vue | 182 ++-- .../src/pages/settings/billing/index.vue | 329 +++---- apps/frontend/src/pages/settings/flags.vue | 14 +- apps/frontend/src/pages/settings/index.vue | 28 +- apps/frontend/src/pages/settings/pats.vue | 124 +-- apps/frontend/src/pages/settings/sessions.vue | 10 +- apps/frontend/src/pages/share/[inviteId].vue | 12 +- packages/assets/styles/classes.scss | 2 +- packages/ui/.storybook/main.ts | 7 +- packages/ui/CLAUDE.md | 2 +- .../affiliate/AffiliateLinkCard.vue | 20 +- .../affiliate/AffiliateLinkCreateModal.vue | 21 +- .../ui/src/components/base/Admonition.vue | 26 +- .../ui/src/components/base/BaseTerminal.vue | 10 +- packages/ui/src/components/base/Button.vue | 142 --- .../ui/src/components/base/ButtonStyled.vue | 397 -------- packages/ui/src/components/base/Card.vue | 10 +- packages/ui/src/components/base/Chips.vue | 8 +- .../components/base/CollapsibleAdmonition.vue | 36 +- .../src/components/base/CollapsibleRegion.vue | 18 +- packages/ui/src/components/base/Combobox.vue | 45 +- .../ui/src/components/base/DatePicker.vue | 68 +- .../src/components/base/DropdownFilterBar.vue | 44 +- .../components/base/ErrorInformationCard.vue | 40 +- .../ui/src/components/base/FloatingPanel.vue | 27 +- .../ui/src/components/base/I18nDebugPanel.vue | 63 +- .../ui/src/components/base/IconSelect.vue | 19 +- .../ui/src/components/base/JoinedButtons.vue | 151 --- .../ui/src/components/base/ManySelect.vue | 49 +- .../ui/src/components/base/MarkdownEditor.vue | 126 ++- .../ui/src/components/base/MultiSelect.vue | 68 +- .../src/components/base/MultiStageModal.vue | 89 +- .../ui/src/components/base/OverflowMenu.vue | 149 --- .../ui/src/components/base/Pagination.vue | 67 +- .../ui/src/components/base/ServerNotice.vue | 20 +- .../components/base/StackedAdmonitions.vue | 55 +- .../components/base/TeleportOverflowMenu.vue | 522 ---------- .../src/components/base/TimeFramePicker.vue | 39 +- .../components/base/UnsavedChangesPopup.vue | 23 +- .../ui/src/components/base/buttons/Button.vue | 35 + .../components/base/buttons/ButtonFrame.vue | 165 ++++ .../components/base/buttons/ButtonGroup.vue | 85 ++ .../components/base/buttons/ButtonLink.vue | 67 ++ .../components/base/buttons/FileButton.vue | 85 ++ .../components/base/buttons/IconButton.vue | 58 ++ .../components/base/buttons/SplitButton.vue | 88 ++ .../base/buttons/TeleportOverflowMenu.vue | 469 +++++++++ .../base/buttons/TeleportPopoutMenu.vue | 149 +++ .../ui/src/components/base/buttons/index.ts | 23 + .../ui/src/components/base/buttons/types.ts | 105 ++ packages/ui/src/components/base/index.ts | 32 +- .../billing/AddPaymentMethodModal.vue | 24 +- .../billing/ModrinthServersPurchaseModal.vue | 85 +- .../components/billing/ResubscribeModal.vue | 23 +- .../billing/ServersGuestPlanModal.vue | 21 +- .../billing/ServersPurchase0Plan.vue | 89 +- .../billing/ServersPurchase3Review.vue | 13 +- packages/ui/src/components/chart/Chart.vue | 14 +- .../AddFilesToAttributionGroupModal.vue | 35 +- .../AddToExistingExternalProjectModal.vue | 77 +- .../AddToGlobalPermissionsDatabaseModal.vue | 46 +- .../external_files/AttributionEditor.vue | 66 +- .../ExternalProjectLookupCard.vue | 18 +- .../ExternalProjectPermissionsCard.vue | 230 ++--- .../components/CustomSetupStage.vue | 22 +- .../components/ImportInstanceStage.vue | 38 +- .../components/ModpackStage.vue | 45 +- .../components/modal/ConfirmLeaveModal.vue | 22 +- .../ui/src/components/modal/ConfirmModal.vue | 28 +- packages/ui/src/components/modal/NewModal.vue | 40 +- .../src/components/modal/OpenInAppModal.vue | 36 +- .../ui/src/components/modal/ShareModal.vue | 171 ++-- .../modal/UnknownFileWarningModal.vue | 21 +- .../src/components/nav/NotificationPanel.vue | 59 +- .../components/nav/PopupNotificationPanel.vue | 43 +- .../notifications/NotificationToast.vue | 106 ++- .../ui/src/components/page/NormalPage.vue | 6 + .../project/ProjectPageVersions.vue | 14 +- .../server/ServerModpackContentCard.vue | 17 +- .../environment/ProjectEnvironmentModal.vue | 34 +- .../components/search/SearchSidebarFilter.vue | 63 +- .../components/servers/InstallingBanner.vue | 25 +- .../ui/src/components/servers/SaveBanner.vue | 41 +- .../src/components/servers/ServerListing.vue | 84 +- .../src/components/servers/ServersPromo.vue | 24 +- .../components/servers/access/AccessTable.vue | 119 ++- .../servers/access/AuditLogTable.vue | 3 +- .../servers/access/GrantAccessModal.vue | 29 +- .../servers/access/RemoveAccessModal.vue | 35 +- .../servers/admonitions/BackupAdmonition.vue | 48 +- .../admonitions/FileOperationAdmonition.vue | 24 +- .../servers/admonitions/UploadAdmonition.vue | 16 +- .../servers/backups/BackupCreateModal.vue | 33 +- .../servers/backups/BackupDeleteModal.vue | 33 +- .../components/servers/backups/BackupItem.vue | 75 +- .../servers/backups/BackupRenameModal.vue | 45 +- .../servers/backups/BackupRestoreModal.vue | 35 +- .../edit-server-icon/EditServerIcon.vue | 16 +- .../marketing/MedalServerCountdown.vue | 9 +- .../servers/marketing/MedalServerListing.vue | 19 +- .../server-header/PanelServerActionButton.vue | 110 ++- .../server-list-empty/ServerListEmpty.vue | 22 +- .../sharing/invite-players-modal/index.vue | 48 +- ...nvite-players-modal-invite-link-editor.vue | 51 +- .../invite-players-modal-user-row.vue | 42 +- .../ui/src/components/user/UserPageHeader.vue | 58 +- .../version/VersionFilterControl.vue | 12 +- .../src/components/version/VersionSummary.vue | 44 +- .../SelectedProjectsFloatingBar.vue | 37 +- .../components/SelectedProjectsLeaveModal.vue | 32 +- .../src/layouts/shared/browse-tab/header.vue | 21 +- .../src/layouts/shared/browse-tab/layout.vue | 104 +- .../src/layouts/shared/browse-tab/sidebar.vue | 10 +- .../components/ConsoleActionButtons.vue | 78 +- .../ui/src/layouts/shared/console/layout.vue | 23 +- .../components/ContentCardItem.vue | 153 +-- .../components/ContentModpackCard.vue | 129 +-- .../components/ContentSelectionBar.vue | 89 +- .../modals/ConfirmBulkUpdateModal.vue | 32 +- .../modals/ConfirmDeletionModal.vue | 32 +- .../components/modals/ConfirmDisableModal.vue | 32 +- .../modals/ConfirmModpackUpdateModal.vue | 36 +- .../modals/ConfirmReinstallModal.vue | 22 +- .../components/modals/ConfirmRepairModal.vue | 22 +- .../components/modals/ConfirmUnlinkModal.vue | 32 +- .../modals/ContentDependencyWarningModal.vue | 32 +- .../components/modals/ContentInstallModal.vue | 118 ++- .../components/modals/InlineBackupCreator.vue | 40 +- .../components/modals/ModpackContentModal.vue | 30 +- .../modals/content-updater-modal/index.vue | 111 ++- .../src/layouts/shared/content-tab/layout.vue | 339 ++++--- .../content-tab/providers/content-manager.ts | 2 +- .../src/layouts/shared/content-tab/types.ts | 2 +- .../files-tab/components/FileContextMenu.vue | 89 +- .../files-tab/components/FileManagerError.vue | 22 +- .../files-tab/components/FileNavbar.vue | 239 ++--- .../files-tab/components/FileTableRow.vue | 98 +- .../components/editor/EditorFindReplace.vue | 116 ++- .../components/editor/FileImageViewer.vue | 26 +- .../components/modals/FileCreateItemModal.vue | 30 +- .../components/modals/FileDeleteItemModal.vue | 22 +- .../components/modals/FileMoveItemModal.vue | 22 +- .../components/modals/FileRenameItemModal.vue | 22 +- .../modals/FileUnsavedChangesModal.vue | 32 +- .../modals/FileUploadConflictModal.vue | 22 +- .../modals/FileUploadZipUrlModal.vue | 52 +- .../components/upload/FileUploadDropdown.vue | 8 +- .../src/layouts/shared/files-tab/layout.vue | 54 +- .../components/ContentDiffModal.vue | 75 +- .../components/IncompatibleContentModal.vue | 80 +- .../shared/installation-settings/layout.vue | 216 ++--- .../shared/server-settings/pages/advanced.vue | 194 ++-- .../server-settings/pages/installation.vue | 44 +- .../shared/server-settings/pages/network.vue | 123 +-- .../layouts/shared/user-profile/layout.vue | 109 +-- .../wrapped/AccountProfileSettings.vue | 64 +- .../layouts/wrapped/AccountSocialSettings.vue | 57 +- .../hosting/manage/[id]/access/access.vue | 28 +- .../hosting/manage/[id]/onboarding.vue | 34 +- .../wrapped/hosting/manage/backups.vue | 100 +- .../layouts/wrapped/hosting/manage/index.vue | 32 +- .../layouts/wrapped/hosting/manage/root.vue | 106 +-- packages/ui/src/stories/add-stories.md | 10 +- .../ui/src/stories/base/Admonition.stories.ts | 22 +- .../ui/src/stories/base/Button.stories.ts | 83 -- .../src/stories/base/ButtonStyled.stories.ts | 226 ----- .../ui/src/stories/base/EmptyState.stories.ts | 8 +- .../src/stories/base/JoinedButtons.stories.ts | 122 --- .../src/stories/base/OverflowMenu.stories.ts | 81 -- .../ui/src/stories/base/PageHeader.stories.ts | 154 ++- .../ui/src/stories/base/PopoutMenu.stories.ts | 94 -- .../base/StackedAdmonitions.stories.ts | 12 +- packages/ui/src/stories/base/Table.stories.ts | 150 ++- .../ui/src/stories/buttons/Button.stories.ts | 213 +++++ .../stories/buttons/ButtonGroup.stories.ts | 82 ++ .../src/stories/buttons/FileButton.stories.ts | 61 ++ .../buttons/TeleportOverflowMenu.stories.ts | 104 ++ .../buttons/TeleportPopoutMenu.stories.ts | 50 + .../instances/ContentCardTable.stories.ts | 48 +- .../ContentDependencyWarningModal.stories.ts | 20 +- .../instances/ContentUpdaterModal.stories.ts | 26 +- .../instances/ModpackContentModal.stories.ts | 50 +- .../modal/ConfirmLeaveModal.stories.ts | 20 +- .../ui/src/stories/modal/NewModal.stories.ts | 86 +- .../src/stories/modal/ShareModal.stories.ts | 14 +- .../src/stories/modal/TabbedModal.stories.ts | 50 +- .../modal/UnknownFileWarningModal.stories.ts | 14 +- .../modal/UpdateToPlayModal.stories.ts | 8 +- .../modal/UploadProgressModal.stories.ts | 14 +- .../stories/nav/NotificationPanel.stories.ts | 50 +- .../nav/PopupNotificationPanel.stories.ts | 48 +- .../project/ProjectPageVersions.stories.ts | 22 +- .../servers/CreationFlowModal.stories.ts | 20 +- .../servers/GrantAccessModal.stories.ts | 14 +- .../servers/RemoveAccessModal.stories.ts | 14 +- .../ServerPanelAdmonitionCopyDraft.stories.ts | 34 +- .../sharing/InvitePlayersModal.stories.ts | 8 +- .../ui/src/stories/skin/SkinButton.stories.ts | 20 +- packages/ui/src/utils/index.ts | 1 + .../ui/src/utils/use-anchored-teleport.ts | 162 ++++ standards/README.md | 2 +- standards/frontend/BUTTONS.md | 375 ++++++++ standards/frontend/MODALS.md | 10 +- 398 files changed, 13688 insertions(+), 13133 deletions(-) delete mode 100644 packages/ui/src/components/base/Button.vue delete mode 100644 packages/ui/src/components/base/ButtonStyled.vue delete mode 100644 packages/ui/src/components/base/JoinedButtons.vue delete mode 100644 packages/ui/src/components/base/OverflowMenu.vue delete mode 100644 packages/ui/src/components/base/TeleportOverflowMenu.vue create mode 100644 packages/ui/src/components/base/buttons/Button.vue create mode 100644 packages/ui/src/components/base/buttons/ButtonFrame.vue create mode 100644 packages/ui/src/components/base/buttons/ButtonGroup.vue create mode 100644 packages/ui/src/components/base/buttons/ButtonLink.vue create mode 100644 packages/ui/src/components/base/buttons/FileButton.vue create mode 100644 packages/ui/src/components/base/buttons/IconButton.vue create mode 100644 packages/ui/src/components/base/buttons/SplitButton.vue create mode 100644 packages/ui/src/components/base/buttons/TeleportOverflowMenu.vue create mode 100644 packages/ui/src/components/base/buttons/TeleportPopoutMenu.vue create mode 100644 packages/ui/src/components/base/buttons/index.ts create mode 100644 packages/ui/src/components/base/buttons/types.ts delete mode 100644 packages/ui/src/stories/base/Button.stories.ts delete mode 100644 packages/ui/src/stories/base/ButtonStyled.stories.ts delete mode 100644 packages/ui/src/stories/base/JoinedButtons.stories.ts delete mode 100644 packages/ui/src/stories/base/OverflowMenu.stories.ts delete mode 100644 packages/ui/src/stories/base/PopoutMenu.stories.ts create mode 100644 packages/ui/src/stories/buttons/Button.stories.ts create mode 100644 packages/ui/src/stories/buttons/ButtonGroup.stories.ts create mode 100644 packages/ui/src/stories/buttons/FileButton.stories.ts create mode 100644 packages/ui/src/stories/buttons/TeleportOverflowMenu.stories.ts create mode 100644 packages/ui/src/stories/buttons/TeleportPopoutMenu.stories.ts create mode 100644 packages/ui/src/utils/use-anchored-teleport.ts create mode 100644 standards/frontend/BUTTONS.md diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue index 3e766fcc8e..6ef972120b 100644 --- a/apps/app-frontend/src/App.vue +++ b/apps/app-frontend/src/App.vue @@ -29,24 +29,25 @@ import { import { Admonition, Avatar, - ButtonStyled, + ButtonLink, commonMessages, ContentInstallModal, ContentUpdaterModal, CreationFlowModal, defineMessages, I18nDebugPanel, + IconButton, IntlFormatted, LoadingBar, NewsArticleCard, NotificationPanel, - OverflowMenu, PopupNotificationPanel, provideModalBehavior, provideModrinthClient, provideNotificationManager, providePageContext, providePopupNotificationManager, + TeleportOverflowMenu, TextLogo, useDebugLogger, useFormatBytes, @@ -1592,22 +1593,29 @@ provideAppUpdateDownloadProgress(appUpdateDownload) > - - +
- - - - - - + + + + + +
- - - + +
@@ -1794,12 +1797,17 @@ provideAppUpdateDownloadProgress(appUpdateDownload) :key="`news-${index}`" :article="item" /> - - - - {{ formatMessage(messages.viewAllNews) }} - - + + + {{ formatMessage(messages.viewAllNews) }} +
diff --git a/apps/app-frontend/src/components/ui/AccountsCard.vue b/apps/app-frontend/src/components/ui/AccountsCard.vue index 9c0611ef63..766f234026 100644 --- a/apps/app-frontend/src/components/ui/AccountsCard.vue +++ b/apps/app-frontend/src/components/ui/AccountsCard.vue @@ -4,13 +4,11 @@ class="flex flex-col gap-3 bg-button-bg border border-solid border-surface-5 rounded-xl p-3 mt-2" > {{ formatMessage(messages.notSignedIn) }} - - - + - - - + + +
- - - +
@@ -95,8 +97,9 @@ import { import { Accordion, Avatar, - ButtonStyled, + Button, defineMessages, + IconButton, injectNotificationManager, useVIntl, } from '@modrinth/ui' diff --git a/apps/app-frontend/src/components/ui/AddContentButton.vue b/apps/app-frontend/src/components/ui/AddContentButton.vue index cdea116e87..65f6397a9e 100644 --- a/apps/app-frontend/src/components/ui/AddContentButton.vue +++ b/apps/app-frontend/src/components/ui/AddContentButton.vue @@ -1,6 +1,6 @@ diff --git a/apps/frontend/src/components/ui/NotificationItem.vue b/apps/frontend/src/components/ui/NotificationItem.vue index 1bbac8bf38..4f3cfa001b 100644 --- a/apps/frontend/src/components/ui/NotificationItem.vue +++ b/apps/frontend/src/components/ui/NotificationItem.vue @@ -46,18 +46,18 @@ class="flex flex-wrap items-center gap-3" :class="{ 'gap-2': compact }" > - - - - - - + +
+ + + +
+
+
+ - - - -
-
-
- - - - +
- - - - Open link - - - - - - - - + + + Open link + + +
@@ -390,10 +399,12 @@ import { } from '@modrinth/assets' import { Avatar, - ButtonStyled, + Button, + ButtonLink, Categories, CopyCode, DoubleIcon, + IconButton, injectModrinthClient, injectNotificationManager, ProjectStatusBadge, diff --git a/apps/frontend/src/components/ui/OrganizationPageHeader.vue b/apps/frontend/src/components/ui/OrganizationPageHeader.vue index c5f74542df..6063423a50 100644 --- a/apps/frontend/src/components/ui/OrganizationPageHeader.vue +++ b/apps/frontend/src/components/ui/OrganizationPageHeader.vue @@ -38,21 +38,19 @@ @@ -68,18 +66,17 @@ import { SettingsIcon, UsersIcon, } from '@modrinth/assets' +import { ButtonLink, TeleportOverflowMenu } from '@modrinth/ui' import { Avatar, - ButtonStyled, commonMessages, defineMessages, + type OverflowMenuOption, PageHeader, PageHeaderActions, PageHeaderBadgeItem, PageHeaderMetadata, PageHeaderMetadataNumberItem, - TeleportOverflowMenu, - type TeleportOverflowMenuItem, useFormatNumber, useVIntl, } from '@modrinth/ui' @@ -135,7 +132,7 @@ const emit = defineEmits<{ const { formatMessage } = useVIntl() const formatNumber = useFormatNumber() -const moreActions = computed(() => [ +const moreActions = computed(() => [ { id: 'manage-projects', label: formatMessage(messages.manageProjects), @@ -143,10 +140,7 @@ const moreActions = computed(() => [ action: () => emit('manageProjects'), shown: props.canManage, }, - { - divider: true, - shown: props.canManage, - }, + { type: 'divider', shown: props.canManage }, { id: 'copy-id', label: formatMessage(commonMessages.copyIdButton), diff --git a/apps/frontend/src/components/ui/OrganizationProjectTransferModal.vue b/apps/frontend/src/components/ui/OrganizationProjectTransferModal.vue index 6f66486fd0..46524dbff5 100644 --- a/apps/frontend/src/components/ui/OrganizationProjectTransferModal.vue +++ b/apps/frontend/src/components/ui/OrganizationProjectTransferModal.vue @@ -65,38 +65,37 @@
- - - +
- - - - diff --git a/packages/ui/src/components/base/ButtonStyled.vue b/packages/ui/src/components/base/ButtonStyled.vue deleted file mode 100644 index f546054c16..0000000000 --- a/packages/ui/src/components/base/ButtonStyled.vue +++ /dev/null @@ -1,397 +0,0 @@ - - - - - diff --git a/packages/ui/src/components/base/Card.vue b/packages/ui/src/components/base/Card.vue index f52f4533b0..c481f17eb0 100644 --- a/packages/ui/src/components/base/Card.vue +++ b/packages/ui/src/components/base/Card.vue @@ -2,7 +2,7 @@ import { DropdownIcon } from '@modrinth/assets' import { reactive } from 'vue' -import ButtonStyled from './ButtonStyled.vue' +import { IconButton } from '#ui/components/base/buttons' const props = defineProps({ collapsible: { @@ -33,11 +33,9 @@ function toggleCollapsed() {
- - - + + +
diff --git a/packages/ui/src/components/base/Chips.vue b/packages/ui/src/components/base/Chips.vue index e1359c469e..e7daddc930 100644 --- a/packages/ui/src/components/base/Chips.vue +++ b/packages/ui/src/components/base/Chips.vue @@ -15,7 +15,11 @@ }" @click="toggleItem(item)" > - +