From 77e86127dbb7a570820ad546f7f69ec316f47ccd Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Sat, 1 Aug 2026 19:11:18 -0700 Subject: [PATCH] more disclosure settings structuring --- apps/frontend/src/locales/en-US/index.json | 96 +++++ .../src/pages/[type]/[project]/settings.vue | 2 +- .../[type]/[project]/settings/disclosures.vue | 406 +++++++++++++++++- apps/frontend/src/pages/legal/rules.vue | 2 +- packages/assets/generated-icons.ts | 2 + packages/assets/icons/list-plus.svg | 19 + .../ui/src/components/base/ToggleCard.vue | 2 +- 7 files changed, 504 insertions(+), 25 deletions(-) create mode 100644 packages/assets/icons/list-plus.svg diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json index ee5b43fa7e..16b2b68df6 100644 --- a/apps/frontend/src/locales/en-US/index.json +++ b/apps/frontend/src/locales/en-US/index.json @@ -3761,6 +3761,102 @@ "project.settings.back-to-project-page": { "message": "Back to project page" }, + "project.settings.disclosures.add-another": { + "message": "Add another" + }, + "project.settings.disclosures.advertising.description.1": { + "message": "You must enable this if your project contains advertisements, sponsorships, or promotions of other works." + }, + "project.settings.disclosures.advertising.description.2": { + "message": "If the promotion has no direct monetary value and it is for something that the average person would consider relevant and unobtrusive (such as a link to your Modrinth profile in the corner of the settings page for your own mod), we would not consider that an advertisement." + }, + "project.settings.disclosures.advertising.note-description": { + "message": "Please explain how your project utilizes advertising so that users can know what to expect." + }, + "project.settings.disclosures.advertising.note-placeholder": { + "message": "e.g. \"Adds the Modrinth SMP server to your server list automatically.\"" + }, + "project.settings.disclosures.advertising.title": { + "message": "Contains advertisements" + }, + "project.settings.disclosures.ai.content-rules": { + "message": "Please refer to Section 6 of Modrinth's Content Rules for more information." + }, + "project.settings.disclosures.ai.description": { + "message": "You must enable this if this project contains a substantial amount of AI-generated code, any\n\t\t\t\tassets that are substantially AI-generated, the project's design relies on the use of\n\t\t\t\tgenerative AI, or if any element of your project's page such as description or publishing\n\t\t\t\trelies on generative AI." + }, + "project.settings.disclosures.ai.note-description": { + "message": "You may optionally provide a note to explain how you use generative AI in this project." + }, + "project.settings.disclosures.ai.note-placeholder": { + "message": "e.g. The Chinese and Arabic translations are AI-generated." + }, + "project.settings.disclosures.ai.title": { + "message": "Contains AI-generated content" + }, + "project.settings.disclosures.ai.types-assets": { + "message": "Assets" + }, + "project.settings.disclosures.ai.types-code": { + "message": "Code" + }, + "project.settings.disclosures.ai.types-description": { + "message": "Select what this project uses generative AI for." + }, + "project.settings.disclosures.ai.types-text": { + "message": "Text" + }, + "project.settings.disclosures.content-disclosures": { + "message": "Content disclosures" + }, + "project.settings.disclosures.description": { + "message": "You must add any applicable content disclosures to your project in compliance with Modrinth's Content Rules." + }, + "project.settings.disclosures.paid-features.description": { + "message": "You must enable this if your project contains features that can be obtained by spending real-world money." + }, + "project.settings.disclosures.paid-features.feature-placeholder": { + "message": "e.g. “Cosmetics available as Patreon reward.”" + }, + "project.settings.disclosures.paid-features.features-description": { + "message": "What kinds of paid features does it add?" + }, + "project.settings.disclosures.paid-features.title": { + "message": "Contains paid features" + }, + "project.settings.disclosures.telemetry.add-data-type": { + "message": "Add type of data" + }, + "project.settings.disclosures.telemetry.add-privacy-policy": { + "message": "Add privacy policy" + }, + "project.settings.disclosures.telemetry.consent-always-active": { + "message": "Always active" + }, + "project.settings.disclosures.telemetry.consent-description": { + "message": "What is the consent model of your telemetry?" + }, + "project.settings.disclosures.telemetry.consent-opt-in": { + "message": "Opt-in" + }, + "project.settings.disclosures.telemetry.consent-opt-out": { + "message": "Opt-out" + }, + "project.settings.disclosures.telemetry.data-description": { + "message": "You can either add a privacy policy, or a list of types of data that are collected. Remember to mention if it is anonymous or contains personally identifiable information (PII)." + }, + "project.settings.disclosures.telemetry.data-label": { + "message": "What data is being collected?" + }, + "project.settings.disclosures.telemetry.data-placeholder": { + "message": "e.g. “Anonymous launch analytics to track Minecraft version and mod loader usage.”" + }, + "project.settings.disclosures.telemetry.description": { + "message": "You must enable this if your project sends usage data back to yourself or a third party." + }, + "project.settings.disclosures.telemetry.title": { + "message": "Contains telemetry" + }, "project.settings.editing-project": { "message": "Editing {projectType} project" }, diff --git a/apps/frontend/src/pages/[type]/[project]/settings.vue b/apps/frontend/src/pages/[type]/[project]/settings.vue index 6ca359fe62..19f469effd 100644 --- a/apps/frontend/src/pages/[type]/[project]/settings.vue +++ b/apps/frontend/src/pages/[type]/[project]/settings.vue @@ -179,7 +179,7 @@ const moderatorSeeUserUi = computed({ @toggle-collapsed="() => (collapsedChecklist = !collapsedChecklist)" @set-processing="setProcessing" /> -
+
diff --git a/apps/frontend/src/pages/[type]/[project]/settings/disclosures.vue b/apps/frontend/src/pages/[type]/[project]/settings/disclosures.vue index eb2a3c402b..f34ccd4c0a 100644 --- a/apps/frontend/src/pages/[type]/[project]/settings/disclosures.vue +++ b/apps/frontend/src/pages/[type]/[project]/settings/disclosures.vue @@ -1,30 +1,392 @@ diff --git a/apps/frontend/src/pages/legal/rules.vue b/apps/frontend/src/pages/legal/rules.vue index 052d70f0a9..9d2baba70e 100644 --- a/apps/frontend/src/pages/legal/rules.vue +++ b/apps/frontend/src/pages/legal/rules.vue @@ -239,7 +239,7 @@ useSeoMeta({ } .markdown-body a { - @apply font-semibold text-brand no-underline hover:text-brand hover:underline; + @apply !font-semibold !text-brand !no-underline hover:!text-brand hover:!underline; } .markdown-body p { diff --git a/packages/assets/generated-icons.ts b/packages/assets/generated-icons.ts index 033b1e7559..85dfd308a5 100644 --- a/packages/assets/generated-icons.ts +++ b/packages/assets/generated-icons.ts @@ -176,6 +176,7 @@ import _ListBulletedIcon from './icons/list-bulleted.svg?component' import _ListEndIcon from './icons/list-end.svg?component' import _ListFilterIcon from './icons/list-filter.svg?component' import _ListOrderedIcon from './icons/list-ordered.svg?component' +import _ListPlusIcon from './icons/list-plus.svg?component' import _LoaderIcon from './icons/loader.svg?component' import _LoaderCircleIcon from './icons/loader-circle.svg?component' import _LockIcon from './icons/lock.svg?component' @@ -612,6 +613,7 @@ export const ListBulletedIcon = _ListBulletedIcon export const ListEndIcon = _ListEndIcon export const ListFilterIcon = _ListFilterIcon export const ListOrderedIcon = _ListOrderedIcon +export const ListPlusIcon = _ListPlusIcon export const LoaderIcon = _LoaderIcon export const LoaderCircleIcon = _LoaderCircleIcon export const LockIcon = _LockIcon diff --git a/packages/assets/icons/list-plus.svg b/packages/assets/icons/list-plus.svg new file mode 100644 index 0000000000..9b8bc82e71 --- /dev/null +++ b/packages/assets/icons/list-plus.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/packages/ui/src/components/base/ToggleCard.vue b/packages/ui/src/components/base/ToggleCard.vue index d0b647a3e1..0b60f9ba0c 100644 --- a/packages/ui/src/components/base/ToggleCard.vue +++ b/packages/ui/src/components/base/ToggleCard.vue @@ -2,7 +2,7 @@ import { SmartClickable, Toggle } from '@modrinth/ui' import { computed, useId } from 'vue' -const value = defineModel('value', { required: true }) +const value = defineModel({ required: true }) const baseId = useId() const toggleId = computed(() => `toggle-card-toggle-${baseId}`)