From 3765a6ded803670fc7113ba469c30def9d4ca90d Mon Sep 17 00:00:00 2001
From: "Calum H."
Date: Mon, 3 Nov 2025 23:15:25 +0000
Subject: [PATCH] feat: creator revenue page overhaul (#4204)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat: start on tax compliance
* feat: avarala1099 composable
* fix: shouldShow should be managed on the page itself
* refactor: move show logic to revenue page
* feat: security practices rather than info
* feat: withdraw page lock
* fix: empty modal bug & lint issues
* feat: hide behind feature flag
* Use standard admonition components, make casing consistent
* modal title
* lint
* feat: withdrawal check
* feat: tax cap on withdrawals warning
* feat: start on revenue page overhaul
* feat: segment generation for bar
* feat: tooltips and links
* fix: tooltip border
* feat: finish initial layout, start on withdraw modal
* feat: start on withdrawal limit stage
* feat: shade support for primary colors
* feat: start on withdraw details stage
* fix: convert swatches to hex
* feat: payout method/region dropdown temporarily using multiselect
* feat: fix modal open issues and use teleport dropdowns
* feat: hide transactions section if there are no transactions
* refactor: NavStack surfaces
* feat: new dropdown component
* feat: remove teleport dropdown modal in favour of new combobox component
* fix: lint
* refactor: dashboard sidebar layout
* feat: cleanup
* fix: niche bugs
* fix: ComboBox styling
* feat: first part of qa
* feat: animate flash rather than tooltip
* fix: lint
* feat: qa border gradient
* fix: seg hover flashes
* feat: i18n
* feat: i18n and final QA
* fix: lint
* feat: QA
* fix: lint
* fix: merge conflicts
* fix: intl
* fix: blue hover
* fix: transfers page
* feat: surface variables & gradients
* feat: text vars
* fix: lint
* fix: intl
* feat: stages
* fix: lint
* feat: region selection
* feat: method selection btns
* fix: flex col on transactions
* feat: hook up method selection to ctx
* feat: muralpay kyc stage info
* wip: muralpay integration
* Basic Mural Pay API bindings
* Fix clippy
* use dotenvy in muralpay example
* Refactor payout creation code
* wip: muralpay payout requests
* Mural Pay payouts work
* Fix clippy
* feat: progress
* fix: broken tax form stage logic
* polish: tax form stage and method selection stage layout
* add mural pay fees API
* Work on payout fee API
* Fees API for more payment methods
* Fix CI
* polish: muralpay qa
* refactor: clean up combobox component
* polish: change from critical -> warning admonition in MuralpayDetailsStage
* Temporarily disable Venmo and PayPal methods from frontend
* polish: clean up transaction component & page
* polish: navbar qa, text color-contrast in chips type buttonstyled, mb on rev/index.vue page
* fix: incorrectly using available balance as tax form withdraw limit after tax forms submitted
* wip: counterparties
* Start on counterparties and payment methods API
* polish: combobox component
* polish: fix broken scroll logic using a composable & web:fix
* fix: lint
* polish: various QA fixes
* feat: hook up with backend (wip)
* feat: draft muralpay rails dynamic logic
* polish: modify rails to support backend changes
* Mural Pay multiple methods when fetching
* Don't send supported_countries to frontend
* Mural Pay multiple methods when fetching
* Don't send supported_countries to frontend
* feat: fees & methods endpoint hookup
* chore: remove duplicates fix
* polish: qa changes + figma match
* Add countries to muralpay fiat methods
* Compile fix
* Add exchange rate info to fees endpoint
* Add fees to premium Tremendous options
* polish: i18n and better document type dropdown -> id input labels
* feat: tremendous
* fix: lint & i18n
* feat: reintroduce tin mismatch logic to index.vue
* polish: qa
* fix: i18n
* feat: remove teleport dropdown menu - combobox should be used
* fix: lint
* fix: jsdoc
* feat: checkbox for reward program terms
* Add delivery email field to Tremendous payouts
* Add Tremendous product category to payout methods
* Add bank details API to muralpay
* Fix CI
* Fix CI
* polish: qa changes
* feat: i18n pass
* feat: deduplicate methods endpoint & fix i18n issues
* chore: deduplicate i18n strings into common-messages.ts
* fix: lint
* fix: i18n
* feat: estimates
* polish: more QA
* Remove prepaid visa, compute fees properly for Tremendous methods
* Add more details to Tremendous errors
* feat: withdraw endpoint impl & internals refactor
* Add more details to Tremendous errors
* feat: completion stage
* Add fees to Mural
* feat: transactions page match figma
* fix: i18n
* polish: QA changes
* polish: qa
* Payout history route and bank details
* polish: autofill and requirements checks
* fix: i18n + lint
* fix: fiat rail fees
* polish: move scroll fade stuff into NewModal rather than just CreatorWithdrawModal
* feat: simplify action btn logic & tax form error
* fix: tax -> Tax form
* Re-add legacy PayPal/Venmo options for US
* feat: mobile responsiveness fixes for modal
* fix: responsiveness issues
* feat: navstack responsiveness
* fix: responsiveness
* move the mural bank details route
* fix: generated state cleanup & bank details input
* fix: lint & i18n
* Add utoipa support to payout endpoints
* address some PR comments
* polish: qa
* add CORS to new utoipa routes
* feat: legacy paypal/venmo stage
* polish: reset amount on back qa
* revert: navstack mr changes
* polish: loading indicator on method selection stage
* fix: paypal modal doesnt reopen after auth
* fix: lint & i18n
* fix: paypal flow
* polish: qa changes
* fix: gitignore
* polish: qa fixes
* fix: payouts_available in payouts.rs
* fix: bug when limit is zero
* polish: qa changes
* fix: qa stuff & muralpay sub-division fix
* Immediately approve mural payouts
* Add currency support to Tremendous payouts
* Currency forex
* add forex to tremendous fee request
* polish: qa & currency support for paypal tremendous
* polish: fx qa
* feat: demo mode flag
* fix: i18n & padding issues
* polish: qa changes
* fix: ml
* Add Mural balance to bank balance info
* polish: show warning for paypal international USD withdrawals + more currencies
* Add more Tremendous currencies support
* fix: colors on balance bars
* fix: empty states
* fix: pl-8 mobile issue
* fix: hide see all
* Transaction payouts available use the correct date
* Address my own review comment
* Address PR comments
* Change Mural withdrawal limit to 3k
* fix: empty state + paypal warning
* maybe fix tremendous gift cards
* Change how Mural minimum withdrawals are calculated
* Tweak min/max withdrawal values
* fix: segment brightness
* fix: min & max for muralpay & legacy paypal
* Fix some icon issues
* more issues
* fix user menu
* fix: remove + network
---------
Signed-off-by: Calum H.
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
Co-authored-by: aecsocket
Co-authored-by: Alejandro González
---
.../instructions/i18n-convert.instructions.md | 1 +
.gitignore | 3 +
.../InstallationSettings.vue | 32 +-
.../ui/settings/AppearanceSettings.vue | 11 +-
.../ui/world/modal/ServerModalBody.vue | 17 +-
apps/frontend/nuxt.config.ts | 84 +-
apps/frontend/package.json | 3 +-
.../src/components/brand/TextLogo.vue | 5 +-
.../components/ui/EnvironmentIndicator.vue | 2 +-
apps/frontend/src/components/ui/NavStack.vue | 142 ++-
.../src/components/ui/NavStackItem.vue | 64 --
.../src/components/ui/NotificationItem.vue | 2 +-
.../src/components/ui/ProjectCard.vue | 2 +-
.../ui/dashboard/CreatorWithdrawModal.vue | 457 ++++++++
.../ui/dashboard/RevenueInputField.vue | 149 +++
.../ui/dashboard/RevenueTransaction.vue | 124 +++
.../ui/dashboard/WithdrawFeeBreakdown.vue | 119 +++
.../withdraw-stages/CompletionStage.vue | 301 ++++++
.../LegacyPaypalDetailsStage.vue | 351 ++++++
.../withdraw-stages/MethodSelectionStage.vue | 323 ++++++
.../withdraw-stages/MuralpayDetailsStage.vue | 516 +++++++++
.../withdraw-stages/MuralpayKycStage.vue | 362 +++++++
.../withdraw-stages/TaxFormStage.vue | 159 +++
.../TremendousDetailsStage.vue | 649 ++++++++++++
.../src/components/ui/search/Categories.vue | 2 +-
.../ui/servers/BackupSettingsModal.vue | 13 +-
.../ui/servers/ContentVersionEditModal.vue | 31 +-
.../PlatformChangeModpackVersionModal.vue | 14 +-
.../ui/servers/PlatformVersionSelectModal.vue | 22 +-
.../ui/servers/TeleportDropdownMenu.vue | 458 --------
apps/frontend/src/composables/country.ts | 34 +
apps/frontend/src/composables/featureFlags.ts | 1 +
apps/frontend/src/composables/generated.ts | 146 +++
apps/frontend/src/composables/tag.js | 64 --
apps/frontend/src/helpers/projects.js | 4 +-
apps/frontend/src/layouts/default.vue | 69 +-
apps/frontend/src/locales/en-US/index.json | 579 +++++++++-
apps/frontend/src/pages/[type]/[id].vue | 2 +-
.../src/pages/[type]/[id]/changelog.vue | 2 +-
.../src/pages/[type]/[id]/settings.vue | 173 ++-
.../src/pages/[type]/[id]/settings/index.vue | 2 +-
.../src/pages/[type]/[id]/settings/links.vue | 2 +-
.../src/pages/[type]/[id]/settings/tags.vue | 2 +-
.../[type]/[id]/version/[version]-new.vue | 2 +-
.../pages/[type]/[id]/version/[version].vue | 2 +-
.../src/pages/[type]/[id]/versions.vue | 2 +-
.../src/pages/admin/servers/nodes.vue | 37 +-
.../src/pages/admin/servers/notices.vue | 8 +-
apps/frontend/src/pages/auth/sign-in.vue | 24 +-
apps/frontend/src/pages/auth/sign-up.vue | 24 +-
apps/frontend/src/pages/collection/[id].vue | 2 +-
apps/frontend/src/pages/dashboard.vue | 70 +-
.../src/pages/dashboard/revenue/index.vue | 871 +++++++++++----
.../src/pages/dashboard/revenue/transfers.vue | 356 +++----
.../src/pages/dashboard/revenue/withdraw.vue | 630 -----------
apps/frontend/src/pages/legal.vue | 49 +-
apps/frontend/src/pages/organization/[id].vue | 84 +-
apps/frontend/src/pages/report.vue | 2 +-
.../src/pages/search/[searchProjectType].vue | 2 +-
.../manage/[id]/options/properties.vue | 10 +-
.../servers/manage/[id]/options/startup.vue | 14 +-
apps/frontend/src/pages/settings.vue | 141 +--
apps/frontend/src/pages/settings/index.vue | 2 +-
apps/frontend/src/pages/user/[id].vue | 17 +-
apps/frontend/src/plugins/shorthands.js | 2 +-
.../src/providers/creator-withdraw.ts | 917 ++++++++++++++++
apps/frontend/src/utils/finance-icons.ts | 34 +
apps/frontend/src/utils/muralpay-rails.ts | 998 ++++++++++++++++++
...8ec5437be07fab8c34a964f7864304681bb94.json | 28 -
.../external/{sso => color}/discord.svg | 0
.../assets/external/{sso => color}/github.svg | 0
.../assets/external/{sso => color}/gitlab.svg | 0
.../assets/external/{sso => color}/google.svg | 0
.../external/{sso => color}/microsoft.svg | 0
packages/assets/external/color/paypal.svg | 13 +
.../assets/external/{sso => color}/steam.svg | 0
packages/assets/external/color/usdc.svg | 10 +
packages/assets/external/color/venmo.svg | 8 +
packages/assets/external/paypal.svg | 6 +-
packages/assets/external/polygon.svg | 5 +
packages/assets/external/tumblr.svg | 6 +-
packages/assets/external/venmo.svg | 5 +
packages/assets/external/visa.svg | 5 +
packages/assets/generated-icons.ts | 18 +
packages/assets/icons/arrow-down.svg | 5 +
packages/assets/icons/arrow-left-right.svg | 1 +
packages/assets/icons/arrow-up-right.svg | 15 +
packages/assets/icons/arrow-up.svg | 15 +
packages/assets/icons/badge-dollar-sign.svg | 7 +
packages/assets/icons/gift.svg | 1 +
packages/assets/icons/hand-helping.svg | 6 +
packages/assets/icons/landmark.svg | 9 +
packages/assets/icons/loader-circle.svg | 1 +
packages/assets/index.ts | 36 +-
.../ui/src/components/base/Admonition.vue | 47 +-
.../ui/src/components/base/BulletDivider.vue | 5 +
.../ui/src/components/base/ButtonStyled.vue | 47 +-
packages/ui/src/components/base/Combobox.vue | 539 ++++++++++
.../components/base/TeleportDropdownMenu.vue | 441 --------
packages/ui/src/components/index.ts | 3 +-
packages/ui/src/components/modal/NewModal.vue | 71 +-
packages/ui/src/composables/debug-logger.ts | 28 +
packages/ui/src/composables/index.ts | 2 +
.../ui/src/composables/scroll-indicator.ts | 181 ++++
packages/ui/src/locales/en-US/index.json | 111 ++
packages/ui/src/utils/common-messages.ts | 161 +++
packages/utils/types.ts | 75 ++
pnpm-lock.yaml | 26 +-
108 files changed, 9071 insertions(+), 2664 deletions(-)
delete mode 100644 apps/frontend/src/components/ui/NavStackItem.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/CreatorWithdrawModal.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/RevenueInputField.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/RevenueTransaction.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/WithdrawFeeBreakdown.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/withdraw-stages/CompletionStage.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/withdraw-stages/LegacyPaypalDetailsStage.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/withdraw-stages/MethodSelectionStage.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/withdraw-stages/MuralpayDetailsStage.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/withdraw-stages/MuralpayKycStage.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/withdraw-stages/TaxFormStage.vue
create mode 100644 apps/frontend/src/components/ui/dashboard/withdraw-stages/TremendousDetailsStage.vue
delete mode 100644 apps/frontend/src/components/ui/servers/TeleportDropdownMenu.vue
create mode 100644 apps/frontend/src/composables/generated.ts
delete mode 100644 apps/frontend/src/composables/tag.js
delete mode 100644 apps/frontend/src/pages/dashboard/revenue/withdraw.vue
create mode 100644 apps/frontend/src/providers/creator-withdraw.ts
create mode 100644 apps/frontend/src/utils/finance-icons.ts
create mode 100644 apps/frontend/src/utils/muralpay-rails.ts
delete mode 100644 apps/labrinth/.sqlx/query-8f68ea8481d86687ef4ebd6311f8ec5437be07fab8c34a964f7864304681bb94.json
rename packages/assets/external/{sso => color}/discord.svg (100%)
rename packages/assets/external/{sso => color}/github.svg (100%)
rename packages/assets/external/{sso => color}/gitlab.svg (100%)
rename packages/assets/external/{sso => color}/google.svg (100%)
rename packages/assets/external/{sso => color}/microsoft.svg (100%)
create mode 100644 packages/assets/external/color/paypal.svg
rename packages/assets/external/{sso => color}/steam.svg (100%)
create mode 100644 packages/assets/external/color/usdc.svg
create mode 100644 packages/assets/external/color/venmo.svg
create mode 100644 packages/assets/external/polygon.svg
create mode 100644 packages/assets/external/venmo.svg
create mode 100644 packages/assets/external/visa.svg
create mode 100644 packages/assets/icons/arrow-down.svg
create mode 100644 packages/assets/icons/arrow-left-right.svg
create mode 100644 packages/assets/icons/arrow-up-right.svg
create mode 100644 packages/assets/icons/arrow-up.svg
create mode 100644 packages/assets/icons/badge-dollar-sign.svg
create mode 100644 packages/assets/icons/gift.svg
create mode 100644 packages/assets/icons/hand-helping.svg
create mode 100644 packages/assets/icons/landmark.svg
create mode 100644 packages/assets/icons/loader-circle.svg
create mode 100644 packages/ui/src/components/base/BulletDivider.vue
create mode 100644 packages/ui/src/components/base/Combobox.vue
delete mode 100644 packages/ui/src/components/base/TeleportDropdownMenu.vue
create mode 100644 packages/ui/src/composables/debug-logger.ts
create mode 100644 packages/ui/src/composables/scroll-indicator.ts
diff --git a/.github/instructions/i18n-convert.instructions.md b/.github/instructions/i18n-convert.instructions.md
index 44a98ce4..732e391e 100644
--- a/.github/instructions/i18n-convert.instructions.md
+++ b/.github/instructions/i18n-convert.instructions.md
@@ -9,6 +9,7 @@ Please follow these rules precisely:
1. Identify translatable strings
- Scan the for all user-visible strings (inner text, alt attributes, placeholders, button labels, etc.). Do not extract dynamic expressions (like {{ user.name }}) or HTML tags. Only extract static human-readable text.
+- There may be strings within the
diff --git a/apps/frontend/src/components/ui/NavStackItem.vue b/apps/frontend/src/components/ui/NavStackItem.vue
deleted file mode 100644
index aff9b434..00000000
--- a/apps/frontend/src/components/ui/NavStackItem.vue
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
- {{ label }}
- {{
- badge
- }}
-
-
-
-
- {{ label }}
- {{
- badge
- }}
-
- i forgor 💀
-
-
-
-
-
diff --git a/apps/frontend/src/components/ui/NotificationItem.vue b/apps/frontend/src/components/ui/NotificationItem.vue
index 662c98a7..35a8e5c0 100644
--- a/apps/frontend/src/components/ui/NotificationItem.vue
+++ b/apps/frontend/src/components/ui/NotificationItem.vue
@@ -376,7 +376,7 @@ const props = defineProps({
})
const flags = useFeatureFlags()
-const tags = useTags()
+const tags = useGeneratedState()
const type = computed(() =>
!props.notification.body || props.notification.body.type === 'legacy_markdown'
diff --git a/apps/frontend/src/components/ui/ProjectCard.vue b/apps/frontend/src/components/ui/ProjectCard.vue
index 6e429f56..a91868fc 100644
--- a/apps/frontend/src/components/ui/ProjectCard.vue
+++ b/apps/frontend/src/components/ui/ProjectCard.vue
@@ -212,7 +212,7 @@ export default {
},
},
setup() {
- const tags = useTags()
+ const tags = useGeneratedState()
const formatRelativeTime = useRelativeTime()
return { tags, formatRelativeTime }
diff --git a/apps/frontend/src/components/ui/dashboard/CreatorWithdrawModal.vue b/apps/frontend/src/components/ui/dashboard/CreatorWithdrawModal.vue
new file mode 100644
index 00000000..b9aeb740
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/CreatorWithdrawModal.vue
@@ -0,0 +1,457 @@
+
+
+
+
+
+ {{
+ formatMessage(messages.taxFormStage)
+ }}
+
+
+ {{
+ formatMessage(messages.methodSelectionStage)
+ }}
+
+ {{
+ formatMessage(messages.detailsLabel)
+ }}
+
+
+
+ {{ formatMessage(messages.methodSelectionStage) }}
+
+
+ {{
+ formatMessage(messages.detailsLabel)
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
Something went wrong
+
+
+
+
+
+ {{ formatMessage(messages.closeButton) }}
+
+
+
+
+ {{ formatMessage(messages.transactionsButton) }}
+
+
+
+
+
+
+
+ {{ leftButtonConfig.label }}
+
+
+
+
+
+ {{ rightButtonConfig.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/dashboard/RevenueInputField.vue b/apps/frontend/src/components/ui/dashboard/RevenueInputField.vue
new file mode 100644
index 00000000..6521bac4
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/RevenueInputField.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+ {{ formatMessage(commonMessages.maxButton) }}
+
+
+
+
+ {{ formatMoney(maxAmount) }} available.
+
+
+ Amount must be at least {{ formatMoney(minAmount) }}.
+
+
+
+
+ Amount cannot exceed {{ formatMoney(maxAmount) }}.
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/dashboard/RevenueTransaction.vue b/apps/frontend/src/components/ui/dashboard/RevenueTransaction.vue
new file mode 100644
index 00000000..83313f39
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/RevenueTransaction.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+ {{
+ isIncome
+ ? formatPayoutSource(transaction.payout_source)
+ : formatMethodName(transaction.method_type || transaction.method)
+ }}
+
+
+ {{ formatTransactionStatus(transaction.status) }}
+
+ {{ $dayjs(transaction.created).format('MMM DD YYYY') }}
+
+ Fee {{ formatMoney(transaction.fee) }}
+
+
+
+
+
{{ formatMoney(transaction.amount) }}
+
+
+
+
+
+
+
+ Cancel transaction
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/dashboard/WithdrawFeeBreakdown.vue b/apps/frontend/src/components/ui/dashboard/WithdrawFeeBreakdown.vue
new file mode 100644
index 00000000..ed58bfbe
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/WithdrawFeeBreakdown.vue
@@ -0,0 +1,119 @@
+
+
+
+
+ {{ formatMessage(messages.feeBreakdownAmount) }}
+ {{ formatMoney(amount || 0) }}
+
+
+ {{ formatMessage(messages.feeBreakdownFee) }}
+
+
+
+
+ -{{ formatMoney(fee || 0) }}
+
+
+
+
+ {{ formatMessage(messages.feeBreakdownNetAmount) }}
+
+ {{ formatMoney(netAmount) }}
+
+ ({{ formattedLocalCurrency }})
+
+
+
+
+
+ {{ formatMessage(messages.feeBreakdownExchangeRate) }}
+ 1 USD = {{ exchangeRate?.toFixed(4) }} {{ localCurrency }}
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/dashboard/withdraw-stages/CompletionStage.vue b/apps/frontend/src/components/ui/dashboard/withdraw-stages/CompletionStage.vue
new file mode 100644
index 00000000..32f0b6c1
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/withdraw-stages/CompletionStage.vue
@@ -0,0 +1,301 @@
+
+
+
+
+ {{ formatMessage(messages.title) }}
+
+
+
+
+
+
+ {{ formatMessage(messages.method) }}
+
+
+ {{ result?.methodType || 'N/A' }}
+
+
+
+
+ {{ formatMessage(messages.recipient) }}
+
+
+ {{ result?.recipientDisplay || 'N/A' }}
+
+
+
+
+ {{ destinationLabel }}
+
+
+ {{ destinationValue }}
+
+
+
+
+ {{ formatMessage(messages.date) }}
+
+
+ {{ formattedDate }}
+
+
+
+
+ {{ formatMessage(messages.amount) }}
+
+
+ {{ formatMoney(result?.amount || 0) }}
+
+
+
+
+ {{ formatMessage(messages.fee) }}
+
+
+ {{ formatMoney(result?.fee || 0) }}
+
+
+
+
+
+ {{ formatMessage(messages.netAmount) }}
+
+
+ {{ formatMoney(result?.netAmount || 0) }}
+
+ ({{ formattedLocalCurrency }})
+
+
+
+
+
+
+ {{ formatMessage(messages.exchangeRate) }}
+
+
+ 1 USD = {{ withdrawData.calculation.exchangeRate?.toFixed(4) }}
+ {{ localCurrency }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/dashboard/withdraw-stages/LegacyPaypalDetailsStage.vue b/apps/frontend/src/components/ui/dashboard/withdraw-stages/LegacyPaypalDetailsStage.vue
new file mode 100644
index 00000000..5f4d3838
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/withdraw-stages/LegacyPaypalDetailsStage.vue
@@ -0,0 +1,351 @@
+
+
+
+
+ {{ formatMessage(messages.paypalAccount) }} *
+
+
+
+
+
+
+
+ {{
+ formatMessage(messages.account)
+ }}
+
+
+
+ {{ paypalEmail }}
+
+
+
+
+
+ {{ formatMessage(messages.venmoHandle) }} *
+
+
+
+
+
+
+
+ {{
+ venmoSaveSuccess
+ ? formatMessage(messages.savedButton)
+ : formatMessage(messages.saveButton)
+ }}
+
+
+
+
+ {{ venmoSaveError }}
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.amount) }} *
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/dashboard/withdraw-stages/MethodSelectionStage.vue b/apps/frontend/src/components/ui/dashboard/withdraw-stages/MethodSelectionStage.vue
new file mode 100644
index 00000000..27a228cf
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/withdraw-stages/MethodSelectionStage.vue
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ formatMessage(messages.region)
+ }}
+
+
+
+
+
+
+ {{
+ formatMessage(messages.selectMethod)
+ }}
+
+
+
+
+
+
+
+
+
+ {{ typeof method.label === 'string' ? method.label : formatMessage(method.label) }}
+
+ {{
+ method.fee
+ }}
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/dashboard/withdraw-stages/MuralpayDetailsStage.vue b/apps/frontend/src/components/ui/dashboard/withdraw-stages/MuralpayDetailsStage.vue
new file mode 100644
index 00000000..9a32f8ef
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/withdraw-stages/MuralpayDetailsStage.vue
@@ -0,0 +1,516 @@
+
+
+
+ {{ formatMessage(selectedRail.warningMessage) }}
+
+
+
+
+
+ {{ formatMessage(messages.coin) }}
+
+
+
+
+ {{
+ selectedRail.currency
+ }}
+
+
+
+
+
+
+ {{ formatMessage(messages.accountOwner) }}
+
+
+
+
+
+ {{ accountOwnerName }}
+
+
+ {{ accountOwnerAddress }}
+
+
+
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.bankName) }}
+ *
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatMessage(field.label) }}
+ *
+
+
+
+
+
+
+
+
+
+
+ {{ formatMessage(field.helpText) }}
+
+
+
+
+
+
+
+
+ {{ dynamicDocumentNumberField.label }}
+ *
+
+
+
+
+
+
+
+
+
+
+ {{ formatMessage(messages.network) }}
+
+
+
+
+ {{
+ selectedRail.blockchain
+ }}
+
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.amount) }}
+ *
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/dashboard/withdraw-stages/MuralpayKycStage.vue b/apps/frontend/src/components/ui/dashboard/withdraw-stages/MuralpayKycStage.vue
new file mode 100644
index 00000000..01858885
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/withdraw-stages/MuralpayKycStage.vue
@@ -0,0 +1,362 @@
+
+
+
+
+
+ {{ formatMessage(messages.entityQuestion) }}
+ *
+
+
+
+
+ {{ formatMessage(messages.entityDescription) }}
+
+
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.businessName) }}
+ *
+
+
+
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.email) }}
+ *
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.dateOfBirth) }}
+ *
+
+
+
+
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.addressLine) }}
+ *
+
+
+
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.addressLine2) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.postalCode) }}
+ *
+
+
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.country) }}
+ *
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/dashboard/withdraw-stages/TaxFormStage.vue b/apps/frontend/src/components/ui/dashboard/withdraw-stages/TaxFormStage.vue
new file mode 100644
index 00000000..7b5846ce
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/withdraw-stages/TaxFormStage.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
{{ formatMessage(messages.withdrawLimit) }}
+
+ {{ formatMoney(usedLimit) }} /
+ {{ formatMoney(600) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ formatMessage(messages.taxFormRequiredBodyWithLimit, {
+ limit: formatMoney(remainingLimit),
+ })
+ }}
+
+
+
+
+
+
+
+ {{ formatMessage(messages.completeTaxForm) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/dashboard/withdraw-stages/TremendousDetailsStage.vue b/apps/frontend/src/components/ui/dashboard/withdraw-stages/TremendousDetailsStage.vue
new file mode 100644
index 00000000..f09adc8f
--- /dev/null
+++ b/apps/frontend/src/components/ui/dashboard/withdraw-stages/TremendousDetailsStage.vue
@@ -0,0 +1,649 @@
+
+
+
+
+
+ {{ formatMessage(messages.unverifiedEmailMessage) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatMessage(messages.paymentMethod) }}
+
+
+
+
+ {{
+ typeof selectedMethodDisplay.label === 'string'
+ ? selectedMethodDisplay.label
+ : formatMessage(selectedMethodDisplay.label)
+ }}
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.email) }} *
+
+
+
+
+
+
+
+ {{ categoryLabel }} *
+
+
+
+
+
+
{{ selectedRewardOption.label }}
+
+
+
+
+
+
{{ option.label }}
+
+
+
+
+
+ {{ formatMoney(effectiveMinAmount) }} min,
+ {{ formatMoney(selectedMethodDetails.interval?.standard?.max ?? effectiveMaxAmount) }}
+ max withdrawal amount.
+
+
+
+
+
+ {{ formatMessage(formFieldLabels.amount) }} *
+
+
+
+
+
+ No denominations available for your current balance
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/search/Categories.vue b/apps/frontend/src/components/ui/search/Categories.vue
index 814b1b7f..832de2a5 100644
--- a/apps/frontend/src/components/ui/search/Categories.vue
+++ b/apps/frontend/src/components/ui/search/Categories.vue
@@ -26,7 +26,7 @@ export default {
},
},
setup() {
- const tags = useTags()
+ const tags = useGeneratedState()
return { tags }
},
diff --git a/apps/frontend/src/components/ui/servers/BackupSettingsModal.vue b/apps/frontend/src/components/ui/servers/BackupSettingsModal.vue
index b3166d99..bbc6911e 100644
--- a/apps/frontend/src/components/ui/servers/BackupSettingsModal.vue
+++ b/apps/frontend/src/components/ui/servers/BackupSettingsModal.vue
@@ -27,13 +27,13 @@
-
@@ -869,7 +876,6 @@ import {
ArrowBigUpDashIcon,
BellIcon,
BlueskyIcon,
- BookmarkIcon,
BookTextIcon,
BoxIcon,
BracesIcon,
@@ -1224,6 +1230,22 @@ const messages = defineMessages({
id: 'layout.nav.analytics',
defaultMessage: 'Analytics',
},
+ activeReports: {
+ id: 'layout.nav.active-reports',
+ defaultMessage: 'Active reports',
+ },
+ myServers: {
+ id: 'layout.nav.my-servers',
+ defaultMessage: 'My servers',
+ },
+ openMenu: {
+ id: 'layout.mobile.open-menu',
+ defaultMessage: 'Open menu',
+ },
+ closeMenu: {
+ id: 'layout.mobile.close-menu',
+ defaultMessage: 'Close menu',
+ },
})
const footerMessages = defineMessages({
@@ -1236,6 +1258,10 @@ const footerMessages = defineMessages({
defaultMessage:
'NOT AN OFFICIAL MINECRAFT SERVICE. NOT APPROVED BY OR ASSOCIATED WITH MOJANG OR MICROSOFT.',
},
+ copyright: {
+ id: 'layout.footer.copyright',
+ defaultMessage: '© {year} Rinth, Inc.',
+ },
})
useHead({
@@ -1278,6 +1304,8 @@ useSeoMeta({
const developerModeCounter = ref(0)
+const currentYear = new Date().getFullYear()
+
const isMobileMenuOpen = ref(false)
const isBrowseMenuOpen = ref(false)
const navRoutes = computed(() => [
@@ -1320,14 +1348,6 @@ const userMenuOptions = computed(() => {
color: 'purple',
shown: !flags.value.hidePlusPromoInUserMenu && !isPermission(auth.value.user.badges, 1 << 0),
},
- {
- id: 'notifications',
- link: '/dashboard/notifications',
- },
- {
- id: 'saved',
- link: '/dashboard/collections',
- },
{
id: 'servers',
link: '/servers/manage',
@@ -1349,6 +1369,21 @@ const userMenuOptions = computed(() => {
{
divider: true,
},
+ {
+ id: 'notifications',
+ link: '/dashboard/notifications',
+ },
+ {
+ id: 'reports',
+ link: '/dashboard/reports',
+ },
+ {
+ id: 'saved',
+ link: '/dashboard/collections',
+ },
+ {
+ divider: true,
+ },
{
id: 'projects',
link: '/dashboard/projects',
@@ -1357,6 +1392,10 @@ const userMenuOptions = computed(() => {
id: 'organizations',
link: '/dashboard/organizations',
},
+ {
+ id: 'analytics',
+ link: '/dashboard/analytics',
+ },
{
id: 'affiliate-links',
link: '/dashboard/affiliate-links',
@@ -1366,10 +1405,6 @@ const userMenuOptions = computed(() => {
id: 'revenue',
link: '/dashboard/revenue',
},
- {
- id: 'analytics',
- link: '/dashboard/analytics',
- },
]
options = [
diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json
index 50eebb06..c3207c08 100644
--- a/apps/frontend/src/locales/en-US/index.json
+++ b/apps/frontend/src/locales/en-US/index.json
@@ -635,6 +635,291 @@
"dashboard.creator-tax-form-modal.us-citizen.question": {
"message": "Are you a US citizen?"
},
+ "dashboard.creator-withdraw-modal.complete-tax-form": {
+ "message": "Complete tax form"
+ },
+ "dashboard.creator-withdraw-modal.continue-with-limit": {
+ "message": "Continue with limit"
+ },
+ "dashboard.creator-withdraw-modal.details-label": {
+ "message": "Details"
+ },
+ "dashboard.creator-withdraw-modal.fee-breakdown-amount": {
+ "message": "Amount"
+ },
+ "dashboard.creator-withdraw-modal.fee-breakdown-exchange-rate": {
+ "message": "FX rate"
+ },
+ "dashboard.creator-withdraw-modal.fee-breakdown-fee": {
+ "message": "Fee"
+ },
+ "dashboard.creator-withdraw-modal.fee-breakdown-net-amount": {
+ "message": "Net amount"
+ },
+ "dashboard.creator-withdraw-modal.kyc.business-entity": {
+ "message": "Business entity"
+ },
+ "dashboard.creator-withdraw-modal.kyc.entity-description": {
+ "message": "A business entity refers to a registered organization such as a corporation, partnership, or LLC."
+ },
+ "dashboard.creator-withdraw-modal.kyc.entity-question": {
+ "message": "Are you a withdrawing as an individual or business?"
+ },
+ "dashboard.creator-withdraw-modal.kyc.private-individual": {
+ "message": "Private individual"
+ },
+ "dashboard.creator-withdraw-modal.method-selection.country-placeholder": {
+ "message": "Select your country"
+ },
+ "dashboard.creator-withdraw-modal.method-selection.country-search-placeholder": {
+ "message": "Search countries..."
+ },
+ "dashboard.creator-withdraw-modal.method-selection.error-text": {
+ "message": "Unable to fetch available payment methods. Please try again later."
+ },
+ "dashboard.creator-withdraw-modal.method-selection.error-title": {
+ "message": "Failed to load payment methods"
+ },
+ "dashboard.creator-withdraw-modal.method-selection.region": {
+ "message": "Region"
+ },
+ "dashboard.creator-withdraw-modal.method-selection.region-tooltip": {
+ "message": "Some payout methods are not available in certain regions."
+ },
+ "dashboard.creator-withdraw-modal.method-selection.select-method": {
+ "message": "Select withdraw method"
+ },
+ "dashboard.creator-withdraw-modal.method-selection.tax-limit-warning": {
+ "message": "Your withdraw limit is
{amount} ,
complete a tax form to withdraw more."
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.account-owner": {
+ "message": "Account owner"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.coin": {
+ "message": "Coin"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.crypto-warning-header": {
+ "message": "Confirm your wallet address"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.document-number-national-id": {
+ "message": "National ID Number"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.document-number-national-id-placeholder": {
+ "message": "Enter national ID number"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.document-number-passport": {
+ "message": "Passport Number"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.document-number-passport-placeholder": {
+ "message": "Enter passport number"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.document-number-resident-id": {
+ "message": "Resident ID Number"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.document-number-resident-id-placeholder": {
+ "message": "Enter resident ID number"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.document-number-ruc": {
+ "message": "RUC Number"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.document-number-ruc-placeholder": {
+ "message": "Enter RUC number"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.document-number-tax-id": {
+ "message": "Tax ID Number"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.document-number-tax-id-placeholder": {
+ "message": "Enter tax ID number"
+ },
+ "dashboard.creator-withdraw-modal.muralpay-details.network": {
+ "message": "Network"
+ },
+ "dashboard.creator-withdraw-modal.nearing-threshold": {
+ "message": "You're nearing the withdraw threshold. You can withdraw
{amountRemaining} now, but a tax form is required for more."
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.account": {
+ "message": "Account"
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.disconnect-account": {
+ "message": "Disconnect account"
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.payment-method": {
+ "message": "Payment method"
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.paypal-account": {
+ "message": "PayPal account"
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.paypal-auth-description": {
+ "message": "Connect your PayPal account to receive payments directly."
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.save-button": {
+ "message": "Save"
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.save-success": {
+ "message": "Venmo handle saved successfully!"
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.saved-button": {
+ "message": "Saved"
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.sign-in-with-paypal": {
+ "message": "Sign in with PayPal"
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.venmo-description": {
+ "message": "Enter your Venmo handle to receive payments."
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.venmo-handle": {
+ "message": "Venmo handle"
+ },
+ "dashboard.creator-withdraw-modal.paypal-details.venmo-handle-placeholder": {
+ "message": "@username"
+ },
+ "dashboard.creator-withdraw-modal.stage.completion": {
+ "message": "Complete"
+ },
+ "dashboard.creator-withdraw-modal.stage.method-selection": {
+ "message": "Method"
+ },
+ "dashboard.creator-withdraw-modal.stage.muralpay-details": {
+ "message": "Account Details"
+ },
+ "dashboard.creator-withdraw-modal.stage.muralpay-kyc": {
+ "message": "Verification"
+ },
+ "dashboard.creator-withdraw-modal.stage.tax-form": {
+ "message": "Tax form"
+ },
+ "dashboard.creator-withdraw-modal.stage.tremendous-details": {
+ "message": "Details"
+ },
+ "dashboard.creator-withdraw-modal.tax-form-required.body": {
+ "message": "To withdraw your full
{available} available balance please complete the form below. It is required for tax reporting and only needs to be done once."
+ },
+ "dashboard.creator-withdraw-modal.tax-form-required.body-with-limit": {
+ "message": "You must complete a W-9 or W-8 form for Modrinth's tax records so we remain compliant with tax regulations."
+ },
+ "dashboard.creator-withdraw-modal.tax-form-required.header": {
+ "message": "Tax form required"
+ },
+ "dashboard.creator-withdraw-modal.tremendous-details.payment-method": {
+ "message": "Payment method"
+ },
+ "dashboard.creator-withdraw-modal.tremendous-details.reward": {
+ "message": "Reward"
+ },
+ "dashboard.creator-withdraw-modal.tremendous-details.reward-placeholder": {
+ "message": "Select reward"
+ },
+ "dashboard.creator-withdraw-modal.tremendous-details.reward-plural": {
+ "message": "Rewards"
+ },
+ "dashboard.creator-withdraw-modal.tremendous-details.unverified-email-header": {
+ "message": "Unverified email"
+ },
+ "dashboard.creator-withdraw-modal.tremendous-details.unverified-email-message": {
+ "message": "The delivery email you have entered is not associated with your Modrinth account. Modrinth cannot recover rewards sent to an incorrect email address."
+ },
+ "dashboard.creator-withdraw-modal.tremendous-details.usd-paypal-warning-header": {
+ "message": "Lower fees available"
+ },
+ "dashboard.creator-withdraw-modal.tremendous-details.usd-paypal-warning-message": {
+ "message": "You selected USD for PayPal International.
Switch to direct PayPal for better fees (≈2% instead of ≈6%)."
+ },
+ "dashboard.creator-withdraw-modal.withdraw-button": {
+ "message": "Withdraw"
+ },
+ "dashboard.creator-withdraw-modal.withdraw-limit": {
+ "message": "Withdraw limit"
+ },
+ "dashboard.creator-withdraw-modal.withdraw-limit-used": {
+ "message": "You've used up your
{withdrawLimit} withdrawal limit. You must complete a tax form to withdraw more."
+ },
+ "dashboard.revenue.available-now": {
+ "message": "Available now"
+ },
+ "dashboard.revenue.balance": {
+ "message": "Balance"
+ },
+ "dashboard.revenue.estimated-tooltip.msg1": {
+ "message": "Estimated revenue may be subject to change until it is made available."
+ },
+ "dashboard.revenue.estimated-tooltip.msg2": {
+ "message": "Click to read about how Modrinth handles your revenue."
+ },
+ "dashboard.revenue.estimated-with-date": {
+ "message": "Estimated {date}"
+ },
+ "dashboard.revenue.processing": {
+ "message": "Processing"
+ },
+ "dashboard.revenue.processing.tooltip": {
+ "message": "Revenue stays in processing until the end of the month, then becomes available 60 days later."
+ },
+ "dashboard.revenue.tos": {
+ "message": "By uploading projects to Modrinth and withdrawing money from your account, you agree to our
Rewards Program Terms . Learn more about the
Reward Program ."
+ },
+ "dashboard.revenue.transactions.header": {
+ "message": "Transactions"
+ },
+ "dashboard.revenue.transactions.none": {
+ "message": "No transactions"
+ },
+ "dashboard.revenue.transactions.none.desc": {
+ "message": "Your payouts and withdrawals will appear here."
+ },
+ "dashboard.revenue.transactions.see-all": {
+ "message": "See all"
+ },
+ "dashboard.revenue.withdraw.blocked-tin-mismatch": {
+ "message": "Your withdrawals are temporarily locked because your TIN or SSN didn't match IRS records. Please contact support to reset and resubmit your tax form."
+ },
+ "dashboard.revenue.withdraw.card.description": {
+ "message": "Withdraw from your available balance to any payout method."
+ },
+ "dashboard.revenue.withdraw.card.title": {
+ "message": "Withdraw"
+ },
+ "dashboard.revenue.withdraw.header": {
+ "message": "Withdraw"
+ },
+ "dashboard.withdraw.completion.account": {
+ "message": "Account"
+ },
+ "dashboard.withdraw.completion.amount": {
+ "message": "Amount"
+ },
+ "dashboard.withdraw.completion.close-button": {
+ "message": "Close"
+ },
+ "dashboard.withdraw.completion.date": {
+ "message": "Date"
+ },
+ "dashboard.withdraw.completion.email-confirmation": {
+ "message": "You'll receive an email at
{email} with instructions to redeem your withdrawal."
+ },
+ "dashboard.withdraw.completion.exchange-rate": {
+ "message": "Exchange rate"
+ },
+ "dashboard.withdraw.completion.fee": {
+ "message": "Fee"
+ },
+ "dashboard.withdraw.completion.method": {
+ "message": "Method"
+ },
+ "dashboard.withdraw.completion.net-amount": {
+ "message": "Net amount"
+ },
+ "dashboard.withdraw.completion.recipient": {
+ "message": "Recipient"
+ },
+ "dashboard.withdraw.completion.title": {
+ "message": "Withdraw complete"
+ },
+ "dashboard.withdraw.completion.transactions-button": {
+ "message": "Transactions"
+ },
+ "dashboard.withdraw.completion.wallet": {
+ "message": "Wallet"
+ },
"error.collection.404.list_item.1": {
"message": "You may have mistyped the collection's URL."
},
@@ -986,6 +1271,9 @@
"layout.footer.about.status": {
"message": "Status"
},
+ "layout.footer.copyright": {
+ "message": "© {year} Rinth, Inc."
+ },
"layout.footer.legal": {
"message": "Legal"
},
@@ -1064,6 +1352,15 @@
"layout.meta.og-description": {
"message": "Discover and publish Minecraft content!"
},
+ "layout.mobile.close-menu": {
+ "message": "Close menu"
+ },
+ "layout.mobile.open-menu": {
+ "message": "Open menu"
+ },
+ "layout.nav.active-reports": {
+ "message": "Active reports"
+ },
"layout.nav.analytics": {
"message": "Analytics"
},
@@ -1091,6 +1388,9 @@
"layout.nav.modrinth-home-page": {
"message": "Modrinth home page"
},
+ "layout.nav.my-servers": {
+ "message": "My servers"
+ },
"layout.nav.organizations": {
"message": "Organizations"
},
@@ -1136,6 +1436,273 @@
"moderation.technical.search.placeholder": {
"message": "Search tech reviews..."
},
+ "muralpay.account-type.checking": {
+ "message": "Checking"
+ },
+ "muralpay.account-type.savings": {
+ "message": "Savings"
+ },
+ "muralpay.country.at": {
+ "message": "Austria"
+ },
+ "muralpay.country.be": {
+ "message": "Belgium"
+ },
+ "muralpay.country.cy": {
+ "message": "Cyprus"
+ },
+ "muralpay.country.de": {
+ "message": "Germany"
+ },
+ "muralpay.country.ee": {
+ "message": "Estonia"
+ },
+ "muralpay.country.es": {
+ "message": "Spain"
+ },
+ "muralpay.country.fi": {
+ "message": "Finland"
+ },
+ "muralpay.country.fr": {
+ "message": "France"
+ },
+ "muralpay.country.gr": {
+ "message": "Greece"
+ },
+ "muralpay.country.ie": {
+ "message": "Ireland"
+ },
+ "muralpay.country.it": {
+ "message": "Italy"
+ },
+ "muralpay.country.lt": {
+ "message": "Lithuania"
+ },
+ "muralpay.country.lu": {
+ "message": "Luxembourg"
+ },
+ "muralpay.country.lv": {
+ "message": "Latvia"
+ },
+ "muralpay.country.mt": {
+ "message": "Malta"
+ },
+ "muralpay.country.nl": {
+ "message": "Netherlands"
+ },
+ "muralpay.country.pt": {
+ "message": "Portugal"
+ },
+ "muralpay.country.sk": {
+ "message": "Slovakia"
+ },
+ "muralpay.document-type.national-id": {
+ "message": "National ID"
+ },
+ "muralpay.document-type.passport": {
+ "message": "Passport"
+ },
+ "muralpay.document-type.resident-id": {
+ "message": "Resident ID"
+ },
+ "muralpay.document-type.ruc": {
+ "message": "RUC"
+ },
+ "muralpay.document-type.tax-id": {
+ "message": "Tax ID"
+ },
+ "muralpay.field.account-number": {
+ "message": "Account Number"
+ },
+ "muralpay.field.account-number-cbu-cvu": {
+ "message": "Account Number (CBU/CVU)"
+ },
+ "muralpay.field.account-number-cci": {
+ "message": "Account Number (CCI)"
+ },
+ "muralpay.field.account-number-type": {
+ "message": "Account Number Type"
+ },
+ "muralpay.field.account-type": {
+ "message": "Account Type"
+ },
+ "muralpay.field.bank-account-number": {
+ "message": "Account Number"
+ },
+ "muralpay.field.branch-code": {
+ "message": "Branch Code"
+ },
+ "muralpay.field.clabe": {
+ "message": "CLABE"
+ },
+ "muralpay.field.country": {
+ "message": "Country"
+ },
+ "muralpay.field.cpf-cnpj": {
+ "message": "CPF/CNPJ"
+ },
+ "muralpay.field.cuit-cuil": {
+ "message": "CUIT/CUIL"
+ },
+ "muralpay.field.document-type": {
+ "message": "Document Type"
+ },
+ "muralpay.field.iban": {
+ "message": "IBAN"
+ },
+ "muralpay.field.phone-number": {
+ "message": "Phone Number"
+ },
+ "muralpay.field.pix-email": {
+ "message": "PIX Email"
+ },
+ "muralpay.field.pix-key-type": {
+ "message": "PIX Key Type"
+ },
+ "muralpay.field.pix-phone": {
+ "message": "PIX Phone"
+ },
+ "muralpay.field.routing-number": {
+ "message": "Routing Number"
+ },
+ "muralpay.field.swift-bic": {
+ "message": "SWIFT/BIC"
+ },
+ "muralpay.field.wallet-address": {
+ "message": "Wallet Address"
+ },
+ "muralpay.help.cbu-cvu": {
+ "message": "Clave Bancaria Uniforme or Clave Virtual Uniforme"
+ },
+ "muralpay.help.cci": {
+ "message": "Código de Cuenta Interbancaria"
+ },
+ "muralpay.help.clabe": {
+ "message": "Clave Bancaria Estandarizada (Mexican bank account number)"
+ },
+ "muralpay.help.cpf-cnpj": {
+ "message": "Brazilian tax identification number"
+ },
+ "muralpay.help.cuit-cuil": {
+ "message": "Argentine tax ID"
+ },
+ "muralpay.help.iban": {
+ "message": "International Bank Account Number"
+ },
+ "muralpay.help.swift-bic": {
+ "message": "Bank Identifier Code"
+ },
+ "muralpay.pix-type.bank-account": {
+ "message": "Bank Account"
+ },
+ "muralpay.pix-type.document": {
+ "message": "CPF/CNPJ"
+ },
+ "muralpay.pix-type.email": {
+ "message": "Email"
+ },
+ "muralpay.pix-type.phone": {
+ "message": "Phone Number"
+ },
+ "muralpay.placeholder.account-number": {
+ "message": "Enter account number"
+ },
+ "muralpay.placeholder.cbu-cvu": {
+ "message": "Enter CBU or CVU"
+ },
+ "muralpay.placeholder.cbu-cvu-type": {
+ "message": "CBU or CVU"
+ },
+ "muralpay.placeholder.cci": {
+ "message": "Enter 20-digit CCI"
+ },
+ "muralpay.placeholder.cuit-cuil": {
+ "message": "Enter CUIT or CUIL"
+ },
+ "muralpay.placeholder.enter-account-number": {
+ "message": "Enter account number"
+ },
+ "muralpay.placeholder.enter-branch-code": {
+ "message": "Enter branch code"
+ },
+ "muralpay.placeholder.enter-clabe": {
+ "message": "Enter 18-digit CLABE"
+ },
+ "muralpay.placeholder.enter-cpf-cnpj": {
+ "message": "Enter CPF or CNPJ"
+ },
+ "muralpay.placeholder.enter-iban": {
+ "message": "Enter IBAN"
+ },
+ "muralpay.placeholder.enter-pix-email": {
+ "message": "Enter PIX email"
+ },
+ "muralpay.placeholder.enter-routing-number": {
+ "message": "Enter 9-digit routing number"
+ },
+ "muralpay.placeholder.enter-swift-bic": {
+ "message": "Enter SWIFT/BIC code"
+ },
+ "muralpay.placeholder.iban-crc": {
+ "message": "Enter Costa Rican IBAN"
+ },
+ "muralpay.placeholder.phone-cop": {
+ "message": "+57..."
+ },
+ "muralpay.placeholder.pix-phone": {
+ "message": "+55..."
+ },
+ "muralpay.placeholder.wallet-address-eth": {
+ "message": "0x..."
+ },
+ "muralpay.rail.fiat-ars.name": {
+ "message": "Bank Transfer (ARS)"
+ },
+ "muralpay.rail.fiat-brl.name": {
+ "message": "PIX Transfer (BRL)"
+ },
+ "muralpay.rail.fiat-clp.name": {
+ "message": "Bank Transfer (CLP)"
+ },
+ "muralpay.rail.fiat-cop.name": {
+ "message": "Bank Transfer (COP)"
+ },
+ "muralpay.rail.fiat-crc.name": {
+ "message": "Bank Transfer (CRC)"
+ },
+ "muralpay.rail.fiat-eur.name": {
+ "message": "Bank Transfer (EUR)"
+ },
+ "muralpay.rail.fiat-mxn.name": {
+ "message": "Bank Transfer (MXN)"
+ },
+ "muralpay.rail.fiat-pen.name": {
+ "message": "Bank Transfer (PEN)"
+ },
+ "muralpay.rail.fiat-usd-peru.name": {
+ "message": "Bank Transfer (USD - Peru)"
+ },
+ "muralpay.rail.fiat-usd.name": {
+ "message": "Bank Transfer (USD)"
+ },
+ "muralpay.rail.fiat-zar.name": {
+ "message": "Bank Transfer (ZAR)"
+ },
+ "muralpay.rail.usdc-base.name": {
+ "message": "USDC (Base)"
+ },
+ "muralpay.rail.usdc-celo.name": {
+ "message": "USDC (Celo)"
+ },
+ "muralpay.rail.usdc-ethereum.name": {
+ "message": "USDC (Ethereum)"
+ },
+ "muralpay.rail.usdc-polygon.name": {
+ "message": "Crypto (USDC)"
+ },
+ "muralpay.warning.wallet-address": {
+ "message": "Double-check your wallet address. Funds sent to an incorrect address cannot be recovered."
+ },
"profile.bio.fallback.creator": {
"message": "A Modrinth creator."
},
@@ -1691,18 +2258,6 @@
"report.submit": {
"message": "Submit report"
},
- "revenue.transfers.total": {
- "message": "You have withdrawn {amount} in total."
- },
- "revenue.transfers.total.method": {
- "message": "You have withdrawn {amount} through {method}."
- },
- "revenue.transfers.total.year": {
- "message": "You have withdrawn {amount} in {year}."
- },
- "revenue.transfers.total.year_method": {
- "message": "You have withdrawn {amount} in {year} through {method}."
- },
"scopes.analytics.description": {
"message": "Access your analytics data"
},
diff --git a/apps/frontend/src/pages/[type]/[id].vue b/apps/frontend/src/pages/[type]/[id].vue
index ff480bfb..54b1c6b3 100644
--- a/apps/frontend/src/pages/[type]/[id].vue
+++ b/apps/frontend/src/pages/[type]/[id].vue
@@ -1032,7 +1032,7 @@ const { addNotification } = notifications
const auth = await useAuth()
const user = await useUser()
-const tags = useTags()
+const tags = useGeneratedState()
const flags = useFeatureFlags()
const cosmetics = useCosmetics()
diff --git a/apps/frontend/src/pages/[type]/[id]/changelog.vue b/apps/frontend/src/pages/[type]/[id]/changelog.vue
index ba4a9ad6..4dced874 100644
--- a/apps/frontend/src/pages/[type]/[id]/changelog.vue
+++ b/apps/frontend/src/pages/[type]/[id]/changelog.vue
@@ -112,7 +112,7 @@ useSeoMeta({
const router = useNativeRouter()
const route = useNativeRoute()
-const tags = useTags()
+const tags = useGeneratedState()
const currentPage = ref(Number(route.query.page ?? 1))
const filteredVersions = computed(() => {
diff --git a/apps/frontend/src/pages/[type]/[id]/settings.vue b/apps/frontend/src/pages/[type]/[id]/settings.vue
index 99c7c33a..948abe5c 100644
--- a/apps/frontend/src/pages/[type]/[id]/settings.vue
+++ b/apps/frontend/src/pages/[type]/[id]/settings.vue
@@ -14,9 +14,9 @@ import {
import { commonMessages, commonProjectSettingsMessages } from '@modrinth/ui'
import type { Project, ProjectV3Partial } from '@modrinth/utils'
import { useVIntl } from '@vintl/vintl'
+import { computed } from 'vue'
import NavStack from '~/components/ui/NavStack.vue'
-import NavStackItem from '~/components/ui/NavStackItem.vue'
const { formatMessage } = useVIntl()
@@ -38,106 +38,85 @@ const members = defineModel
('members')
const allMembers = defineModel('allMembers')
const dependencies = defineModel('dependencies')
const organization = defineModel('organization')
+
+const navItems = computed(() => {
+ const base = `${project.value.project_type}/${project.value.slug ? project.value.slug : project.value.id}`
+ const items = [
+ {
+ link: `/${base}/settings`,
+ label: formatMessage(commonProjectSettingsMessages.general),
+ icon: InfoIcon,
+ },
+ flags.value.newProjectGeneralSettings
+ ? {
+ link: `/${base}/settings/general`,
+ label: formatMessage(commonProjectSettingsMessages.general),
+ badge: formatMessage(commonMessages.newBadge),
+ icon: InfoIcon,
+ }
+ : null,
+ flags.value.newProjectEnvironmentSettings &&
+ projectV3.value.project_types.some((type: string) => ['mod', 'modpack'].includes(type))
+ ? {
+ link: `/${base}/settings/environment`,
+ label: formatMessage(commonProjectSettingsMessages.environment),
+ badge: formatMessage(commonMessages.newBadge),
+ icon: GlobeIcon,
+ }
+ : null,
+ {
+ link: `/${base}/settings/tags`,
+ label: formatMessage(commonProjectSettingsMessages.tags),
+ icon: TagsIcon,
+ },
+ {
+ link: `/${base}/settings/description`,
+ label: formatMessage(commonProjectSettingsMessages.description),
+ icon: AlignLeftIcon,
+ },
+ {
+ link: `/${base}/settings/license`,
+ label: formatMessage(commonProjectSettingsMessages.license),
+ icon: BookTextIcon,
+ },
+ {
+ link: `/${base}/settings/links`,
+ label: formatMessage(commonProjectSettingsMessages.links),
+ icon: LinkIcon,
+ },
+ {
+ link: `/${base}/settings/members`,
+ label: formatMessage(commonProjectSettingsMessages.members),
+ icon: UsersIcon,
+ },
+ { type: 'heading', label: formatMessage(commonProjectSettingsMessages.view) },
+ {
+ link: `/${base}/settings/analytics`,
+ label: formatMessage(commonProjectSettingsMessages.analytics),
+ icon: ChartIcon,
+ chevron: true,
+ },
+ { type: 'heading', label: formatMessage(commonProjectSettingsMessages.upload) },
+ {
+ link: `/${base}/gallery`,
+ label: formatMessage(commonProjectSettingsMessages.gallery),
+ icon: ImageIcon,
+ chevron: true,
+ },
+ {
+ link: `/${base}/versions`,
+ label: formatMessage(commonProjectSettingsMessages.versions),
+ icon: VersionIcon,
+ chevron: true,
+ },
+ ]
+ return items.filter(Boolean) as any[]
+})
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ formatMessage(commonProjectSettingsMessages.view) }}
-
-
-
- {{ formatMessage(commonProjectSettingsMessages.upload) }}
-
-
-
-
-
-
-
-
+
void
}
-const tags = useTags()
+const tags = useGeneratedState()
const props = withDefaults(defineProps(), {
allMembers: () => [],
diff --git a/apps/frontend/src/pages/[type]/[id]/version/[version]-new.vue b/apps/frontend/src/pages/[type]/[id]/version/[version]-new.vue
index d7bb6103..fe6b6d53 100644
--- a/apps/frontend/src/pages/[type]/[id]/version/[version]-new.vue
+++ b/apps/frontend/src/pages/[type]/[id]/version/[version]-new.vue
@@ -130,7 +130,7 @@ const version = computed(() => {
const route = useNativeRoute()
// const auth = await useAuth();
-// const tags = useTags();
+// const tags = useGeneratedState();
const versionsListLink = computed(() => {
if (router.options.history.state.back) {
diff --git a/apps/frontend/src/pages/[type]/[id]/version/[version].vue b/apps/frontend/src/pages/[type]/[id]/version/[version].vue
index dad61838..14557fa9 100644
--- a/apps/frontend/src/pages/[type]/[id]/version/[version].vue
+++ b/apps/frontend/src/pages/[type]/[id]/version/[version].vue
@@ -744,7 +744,7 @@ export default defineNuxtComponent({
const route = useNativeRoute()
const auth = await useAuth()
- const tags = useTags()
+ const tags = useGeneratedState()
const flags = useFeatureFlags()
const path = route.name.split('-')
diff --git a/apps/frontend/src/pages/[type]/[id]/versions.vue b/apps/frontend/src/pages/[type]/[id]/versions.vue
index 4e6f94e6..2eb25a06 100644
--- a/apps/frontend/src/pages/[type]/[id]/versions.vue
+++ b/apps/frontend/src/pages/[type]/[id]/versions.vue
@@ -226,7 +226,7 @@ const props = defineProps({
},
})
-const tags = useTags()
+const tags = useGeneratedState()
const flags = useFeatureFlags()
const auth = await useAuth()
diff --git a/apps/frontend/src/pages/admin/servers/nodes.vue b/apps/frontend/src/pages/admin/servers/nodes.vue
index a23a9293..162c3310 100644
--- a/apps/frontend/src/pages/admin/servers/nodes.vue
+++ b/apps/frontend/src/pages/admin/servers/nodes.vue
@@ -20,11 +20,10 @@
Type
Select target to credit.
-
@@ -42,7 +41,7 @@
/>
-
+
Node hostnames
@@ -77,12 +76,10 @@
Region
This will credit all active servers in the region.
-
@@ -147,10 +144,10 @@
import { CheckIcon, PlusIcon, XIcon } from '@modrinth/assets'
import {
ButtonStyled,
+ Combobox,
injectNotificationManager,
NewModal,
TagItem,
- TeleportDropdownMenu,
Toggle,
} from '@modrinth/ui'
import { DEFAULT_CREDIT_EMAIL_MESSAGE } from '@modrinth/utils/utils.ts'
@@ -168,17 +165,17 @@ const sendEmail = ref(true)
const message = ref('')
const modeOptions = [
- { id: 'nodes', name: 'Nodes' },
- { id: 'region', name: 'Region' },
+ { value: 'nodes', label: 'Nodes' },
+ { value: 'region', label: 'Region' },
]
-const mode = ref(modeOptions[0])
+const mode = ref
('nodes')
const nodeInput = ref('')
const selectedNodes = ref([])
-type RegionOpt = { key: string; display: string }
+type RegionOpt = { value: string; label: string }
const regions = ref([])
-const selectedRegion = ref(null)
+const selectedRegion = ref(null)
const nodeHostnames = ref([])
function openBatchModal() {
@@ -209,7 +206,7 @@ function removeNode(v: string) {
const applyDisabled = computed(() => {
if (days.value < 1) return true
- if (mode.value.id === 'nodes') return selectedNodes.value.length === 0
+ if (mode.value === 'nodes') return selectedNodes.value.length === 0
return !selectedRegion.value
})
@@ -218,11 +215,11 @@ async function ensureOverview() {
try {
const data = await useServersFetch('/nodes/overview', { version: 'internal' })
regions.value = (data.regions || []).map((r: any) => ({
- key: r.key,
- display: `${r.display_name} (${r.key})`,
+ value: r.key,
+ label: `${r.display_name} (${r.key})`,
}))
nodeHostnames.value = data.node_hostnames || []
- if (!selectedRegion.value && regions.value.length) selectedRegion.value = regions.value[0]
+ if (!selectedRegion.value && regions.value.length) selectedRegion.value = regions.value[0].value
} catch (err) {
addNotification({ title: 'Failed to load nodes overview', text: String(err), type: 'error' })
}
@@ -231,7 +228,7 @@ async function ensureOverview() {
async function apply() {
try {
const body =
- mode.value.id === 'nodes'
+ mode.value === 'nodes'
? {
nodes: selectedNodes.value.slice(),
days: Math.max(1, Math.floor(days.value)),
@@ -239,7 +236,7 @@ async function apply() {
message: message.value?.trim() || DEFAULT_CREDIT_EMAIL_MESSAGE,
}
: {
- region: selectedRegion.value!.key,
+ region: selectedRegion.value!,
days: Math.max(1, Math.floor(days.value)),
send_email: sendEmail.value,
message: message.value?.trim() || DEFAULT_CREDIT_EMAIL_MESSAGE,
diff --git a/apps/frontend/src/pages/admin/servers/notices.vue b/apps/frontend/src/pages/admin/servers/notices.vue
index b9bc34df..bc22a53d 100644
--- a/apps/frontend/src/pages/admin/servers/notices.vue
+++ b/apps/frontend/src/pages/admin/servers/notices.vue
@@ -11,12 +11,12 @@
Level
Determines how the notice should be styled.
-
@@ -264,13 +264,13 @@
import { EditIcon, PlusIcon, SaveIcon, SettingsIcon, TrashIcon, XIcon } from '@modrinth/assets'
import {
ButtonStyled,
+ Combobox,
commonMessages,
CopyCode,
injectNotificationManager,
NewModal,
ServerNotice,
TagItem,
- TeleportDropdownMenu,
Toggle,
useRelativeTime,
} from '@modrinth/ui'
diff --git a/apps/frontend/src/pages/auth/sign-in.vue b/apps/frontend/src/pages/auth/sign-in.vue
index 9e3b146c..a7e50926 100644
--- a/apps/frontend/src/pages/auth/sign-in.vue
+++ b/apps/frontend/src/pages/auth/sign-in.vue
@@ -33,27 +33,27 @@
@@ -130,15 +130,15 @@
+
+
+
+
diff --git a/apps/frontend/src/pages/dashboard/revenue/transfers.vue b/apps/frontend/src/pages/dashboard/revenue/transfers.vue
index 4e651b20..54ce5019 100644
--- a/apps/frontend/src/pages/dashboard/revenue/transfers.vue
+++ b/apps/frontend/src/pages/dashboard/revenue/transfers.vue
@@ -1,228 +1,204 @@
-
-
-
- Transfer history
- All of your withdrawals from your Modrinth balance will be listed here:
-
-
-
-
-
- {{
- selectedYear !== 'all'
- ? selectedMethod !== 'all'
- ? formatMessage(messages.transfersTotalYearMethod, {
- amount: $formatMoney(totalAmount),
- year: selectedYear,
- method: selectedMethod,
- })
- : formatMessage(messages.transfersTotalYear, {
- amount: $formatMoney(totalAmount),
- year: selectedYear,
- })
- : selectedMethod !== 'all'
- ? formatMessage(messages.transfersTotalMethod, {
- amount: $formatMoney(totalAmount),
- method: selectedMethod,
- })
- : formatMessage(messages.transfersTotal, {
- amount: $formatMoney(totalAmount),
- })
- }}
-
+
+
+
{{
+ formatMessage(messages.transactionsHeader)
+ }}
-
-
-
-
- {{ $dayjs(payout.created).format('MMMM D, YYYY [at] h:mm A') }}
-
-
-
- {{ $formatMoney(payout.amount) }}
- ⋅ Fee {{ $formatMoney(payout.fee) }}
-
-
-
-
-
-
-
-
-
-
-
- ⋅
- {{ formatWallet(payout.method) }} ({{ payout.method_address }})
-
-
-
-
-
- Cancel payment
-
+
+
+
+
+
+
+
+ {{
+ formatMessage(messages.noTransactions)
+ }}
+ {{
+ formatMessage(messages.noTransactionsDesc)
+ }}
+
-
+
diff --git a/apps/frontend/src/pages/dashboard/revenue/withdraw.vue b/apps/frontend/src/pages/dashboard/revenue/withdraw.vue
deleted file mode 100644
index 8f9b533b..00000000
--- a/apps/frontend/src/pages/dashboard/revenue/withdraw.vue
+++ /dev/null
@@ -1,630 +0,0 @@
-
-
-
-
-
- Withdraw
-
- Region
-
-
- Withdraw method
-
-
- Search
-
-
-
-
-
- Amount
-
- You are initiating a transfer of your revenue from Modrinth's Creator Monetization Program.
- How much of your
- {{ $formatMoney(userBalance.available) }} balance would you like to transfer
- transfer to {{ selectedMethod.name }}?
-
-
-
-
- This withdrawal will exceed $600 for the year. You will be prompted to complete a tax form
- before proceeding.
-
-
-
- You have withdrawn over $600 this year. To continue withdrawing, you must complete a tax form.
-
-
-
-
-
- I acknowledge that an estimated
- {{ formatMoney(fees) }} will be deducted from the amount I receive to cover
- {{ formatWallet(selectedMethod.type) }} processing fees.
-
-
-
- I confirm that I am initiating a transfer and I will receive further instructions on how
- to redeem this payment via email to:
- {{ withdrawAccount }}
-
-
- I confirm that I am initiating a transfer to the following
- {{ formatWallet(selectedMethod.type) }} account: {{ withdrawAccount }}
-
-
-
- I agree to the
- Rewards Program Terms
-
-
-
-
- {{ error }}
-
-
-
-
-
-
- Cancel
-
-
-
- Withdraw
-
-
-
-
-
-
-
-
diff --git a/apps/frontend/src/pages/legal.vue b/apps/frontend/src/pages/legal.vue
index 2308e2ab..14023de1 100644
--- a/apps/frontend/src/pages/legal.vue
+++ b/apps/frontend/src/pages/legal.vue
@@ -1,39 +1,21 @@
@@ -53,7 +35,6 @@ import {
} from '@modrinth/assets'
import NavStack from '~/components/ui/NavStack.vue'
-import NavStackItem from '~/components/ui/NavStackItem.vue'
const route = useNativeRoute()
diff --git a/apps/frontend/src/pages/organization/[id].vue b/apps/frontend/src/pages/organization/[id].vue
index f90e009d..53726f18 100644
--- a/apps/frontend/src/pages/organization/[id].vue
+++ b/apps/frontend/src/pages/organization/[id].vue
@@ -7,22 +7,13 @@