diff --git a/apps/frontend/src/components/ui/project-settings/disclosures/AiDisclosureCard.vue b/apps/frontend/src/components/ui/project-settings/disclosures/AiDisclosureCard.vue index e0280d303b..b1883fb6ce 100644 --- a/apps/frontend/src/components/ui/project-settings/disclosures/AiDisclosureCard.vue +++ b/apps/frontend/src/components/ui/project-settings/disclosures/AiDisclosureCard.vue @@ -25,7 +25,7 @@ const emit = defineEmits<{ const { formatMessage } = useVIntl() -const AI_USES: AiUsage[] = ['code', 'assets', 'text', 'functionality'] +const AI_USES: AiUsage[] = ['code', 'assets', 'text'] const messages = defineMessages({ title: { @@ -35,9 +35,8 @@ const messages = defineMessages({ description: { id: 'project.settings.disclosures.ai.description', defaultMessage: `You must enable this if this project contains a substantial amount of AI-generated code, any - assets that are substantially AI-generated, the project's functionality relies on the use of - generative AI, or if any element of your project's page such as description or publishing - relies on generative AI.`, + assets that are substantially AI-generated, or if any element of your project's page such as + description or publishing relies on generative AI.`, }, contentRules: { id: 'project.settings.disclosures.ai.content-rules', diff --git a/apps/frontend/src/components/ui/project-settings/disclosures/AiFunctionalityDisclosureCard.vue b/apps/frontend/src/components/ui/project-settings/disclosures/AiFunctionalityDisclosureCard.vue new file mode 100644 index 0000000000..0df3a680ee --- /dev/null +++ b/apps/frontend/src/components/ui/project-settings/disclosures/AiFunctionalityDisclosureCard.vue @@ -0,0 +1,68 @@ + + + diff --git a/apps/frontend/src/components/ui/project-settings/disclosures/form.ts b/apps/frontend/src/components/ui/project-settings/disclosures/form.ts index d6cedf831a..5e1ba8e419 100644 --- a/apps/frontend/src/components/ui/project-settings/disclosures/form.ts +++ b/apps/frontend/src/components/ui/project-settings/disclosures/form.ts @@ -22,7 +22,7 @@ function findDisclosure( return disclosures.find((disclosure): disclosure is DisclosureOf => disclosure.type === type) } -type NoteDisclosureType = 'advertisements' | 'epilepsy_triggers' | 'archived' +type NoteDisclosureType = 'ai_functionality' | 'advertisements' | 'epilepsy_triggers' | 'archived' function createNoteModel( disclosures: ProjectDisclosureData[], @@ -66,6 +66,7 @@ export function disclosuresToForm(disclosures: ProjectDisclosureData[]): Disclos uses: ai ? [...(ai.uses ?? [])] : [], note: ai?.note ?? '', }, + aiFunctionality: createNoteModel(disclosures, 'ai_functionality'), advertising: createNoteModel(disclosures, 'advertisements'), paidFeatures: { enabled: isActiveDisclosure(paidFeatures), @@ -110,6 +111,8 @@ export function formToDisclosure( uses: [...form.ai.uses], note: form.ai.note.trim() || null, } + case 'ai_functionality': + return { type: 'ai_functionality', note: form.aiFunctionality.note.trim() || null } case 'advertisements': return { type: 'advertisements', note: form.advertising.note.trim() || null } case 'paid_features': @@ -151,6 +154,9 @@ export function formToDisclosures(form: DisclosureFormState): ProjectDisclosure[ if (form.ai.enabled) { set.push(formToDisclosure(form, 'ai_content')) } + if (form.aiFunctionality.enabled) { + set.push(formToDisclosure(form, 'ai_functionality')) + } if (form.advertising.enabled) { set.push(formToDisclosure(form, 'advertisements')) } diff --git a/apps/frontend/src/components/ui/project-settings/disclosures/index.ts b/apps/frontend/src/components/ui/project-settings/disclosures/index.ts index 085bf22204..3c49f28e9a 100644 --- a/apps/frontend/src/components/ui/project-settings/disclosures/index.ts +++ b/apps/frontend/src/components/ui/project-settings/disclosures/index.ts @@ -1,5 +1,6 @@ export { default as AdvertisingDisclosureCard } from './AdvertisingDisclosureCard.vue' export { default as AiDisclosureCard } from './AiDisclosureCard.vue' +export { default as AiFunctionalityDisclosureCard } from './AiFunctionalityDisclosureCard.vue' export { default as ArchivedDisclosureCard } from './ArchivedDisclosureCard.vue' export { default as DerivativeDisclosureCard } from './DerivativeDisclosureCard.vue' export { default as DisclosureToggleCard } from './DisclosureToggleCard.vue' diff --git a/apps/frontend/src/components/ui/project-settings/disclosures/types.ts b/apps/frontend/src/components/ui/project-settings/disclosures/types.ts index 6983314a98..acf811d467 100644 --- a/apps/frontend/src/components/ui/project-settings/disclosures/types.ts +++ b/apps/frontend/src/components/ui/project-settings/disclosures/types.ts @@ -44,6 +44,7 @@ export type DerivativeDisclosure = { export type DisclosureFormState = { ai: AiDisclosure + aiFunctionality: NoteDisclosure advertising: NoteDisclosure paidFeatures: PaidFeaturesDisclosure telemetry: TelemetryDisclosure diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json index 38ef534d84..6cdc1f79de 100644 --- a/apps/frontend/src/locales/en-US/index.json +++ b/apps/frontend/src/locales/en-US/index.json @@ -3839,11 +3839,20 @@ "project.settings.disclosures.advertising.title": { "message": "Contains advertisements" }, + "project.settings.disclosures.ai-functionality.description": { + "message": "Placeholder description." + }, + "project.settings.disclosures.ai-functionality.note-placeholder": { + "message": "e.g. This project includes an in-game assistant powered by a generative AI API." + }, + "project.settings.disclosures.ai-functionality.title": { + "message": "Contains generative AI functionality" + }, "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 functionality 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." + "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, or if any element of your project's page such as\n\t\t\t\tdescription or publishing relies on generative AI." }, "project.settings.disclosures.ai.note-placeholder": { "message": "e.g. The Chinese and Arabic translations are AI-generated." diff --git a/apps/frontend/src/pages/[type]/[project]/settings/disclosures.vue b/apps/frontend/src/pages/[type]/[project]/settings/disclosures.vue index 0d79f28ca8..dd9bc55b39 100644 --- a/apps/frontend/src/pages/[type]/[project]/settings/disclosures.vue +++ b/apps/frontend/src/pages/[type]/[project]/settings/disclosures.vue @@ -22,6 +22,7 @@ import { computed, watch } from 'vue' import { AdvertisingDisclosureCard, AiDisclosureCard, + AiFunctionalityDisclosureCard, ArchivedDisclosureCard, DerivativeDisclosureCard, type DisclosureFormIssue, @@ -293,6 +294,14 @@ const { confirmLeaveModal } = usePageLeaveSafety(hasChanges) (status: DisclosureLockStatus) => setDisclosureLockStatus('ai_content', status) " /> + + + + + + + + + + + + + + + + diff --git a/packages/ui/src/components/project/ProjectSidebarDetails.vue b/packages/ui/src/components/project/ProjectSidebarDetails.vue index 8be4b125e9..99399cfb12 100644 --- a/packages/ui/src/components/project/ProjectSidebarDetails.vue +++ b/packages/ui/src/components/project/ProjectSidebarDetails.vue @@ -38,6 +38,17 @@ +
+