diff --git a/docs/extensions/vanity.md b/docs/extensions/vanity.md index 9600224..a195005 100644 --- a/docs/extensions/vanity.md +++ b/docs/extensions/vanity.md @@ -1,3 +1,169 @@ # Vanity -This extension is currently in development. \ No newline at end of file +The Vanity extension allows users to customize their profile in a more in-depth manner. + +Here is an example object: +```json5 +{ + // ... + "type": "User", + // ... + "extensions": { + "org.lysand:vanity": { + "avatar_overlay": { + "image/png": { + "content": "https://cdn.example.com/ab5081cf-b11f-408f-92c2-7c246f290593/cat_ears.png", + "content_type": "image/png" + } + }, + "avatar_mask": { + "image/png": { + "content": "https://cdn.example.com/d8c42be1-d0f7-43ef-b4ab-5f614e1beba4/rounded_square.jpeg", + "content_type": "image/jpeg" + } + }, + "background": { + "image/png": { + "content": "https://cdn.example.com/6492ddcd-311e-4921-9567-41b497762b09/untitled-file-0019822.png", + "content_type": "image/png" + } + }, + "audio": { + "audio/mpeg": { + "content": "https://cdn.example.com/4da2f0d4-4728-4819-83e4-d614e4c5bebc/michael-jackson-thriller.mp3", + "content_type": "audio/mpeg" + } + }, + "pronouns": { + "en-us": [ + "he/him", + { + "subject": "they", + "object": "them", + "dependent_possessive": "their", + "independent_possessive": "theirs", + "reflexive": "themself" + }, + ] + }, + "birthday": "1998-04-12", + "location": "+40.6894-074.0447/", + "activitypub": "@erikuden@mastodon.de" + } + } +} +``` + +The extension name is `org.lysand:vanity`. All properties are optional. + +## Fields + +### Avatar Overlay + +| Name | Type | Required | +| :------------- | :------------ | :------- | +| avatar_overlay | ContentFormat | No | + +An overlay to be placed on top of the user's avatar. This can be used to add accessories, such as hats or glasses. Overlay should always be a transparent image. + +### Avatar Mask + +| Name | Type | Required | +| :---------- | :------------ | :------- | +| avatar_mask | ContentFormat | No | + +A mask to be applied to the user's avatar. This can be used to change the shape of the avatar, such as making it a circle or a rounded square. Mask should be a fully black (#000000) image with the shape of the mask being transparent. As such, a rounded square mask should have a fully black square with rounded corners. + +### Background + +| Name | Type | Required | +| :--------- | :------------ | :------- | +| background | ContentFormat | No | + +A background image to be displayed on the user's profile. This should be a full-width high-resolution image, preferably at least 1920x1080 pixels. + +Space-efficient formats such as WebP are recommended. + +### Audio + +| Name | Type | Required | +| :---- | :------------ | :------- | +| audio | ContentFormat | No | + +An audio file to be played on the user's profile. This can be used to add a theme song or a voice introduction. + +> [!WARNING] +> Audio files should be muted by default and should not autoplay. Users should have the option to play the audio file, or disable them entirely. +> +> Furthermore, audio file support in this extension should be toggleable per server, as it can be a potential vector for abuse. + +### Pronouns + +| Name | Type | Required | +| :------- | :----------------------------------- | :------- | +| pronouns | Array of ShortPronoun or LongPronoun | No | + +An array of pronouns the user uses. Pronouns can be represented as a string or an object. + +See [Types](#types) for a full description of the `ShortPronoun` and `LongPronoun` types. + +### Birthday + +| Name | Type | Required | +| :------- | :----- | :------- | +| birthday | String | No | + +The user's birthday. This should be in the format `YYYY-MM-DD` (ISO 8601). If the year is set to `0000`, clients should not display the year. + +Clients might choose to display the user's age as well when the year is present. + +### Location + +| Name | Type | Required | +| :------- | :----- | :------- | +| location | String | No | + +The user's location. This should be a string of GPS data as defined in [ISO 6709 Annex H](https://en.wikipedia.org/wiki/ISO_6709#String_expression_(Annex_H)), or alternatively a raw string such as "New York, NY". GPS data does not need to be precise, and can be as simple as `+46+002/` (France) or `+48.52+002.20/` (Paris, France). + +Clients might choose to display a map of the user's location. + +### ActivityPub + +| Name | Type | Required | +| :--------- | :----- | :------- | +| activitypub | String | No | + +The user's ActivityPub profile. This should be a string in the format `@username@domain`. + +Servers are expected to use standard WebFinger resolution to fetch the user's ActivityPub profile if needed. + +## Types + +```typescript +interface VanityExtension { + avatar_overlay?: ContentFormat; + avatar_mask?: ContentFormat; + background?: ContentFormat; + audio?: ContentFormat; + pronouns?: { + [language: string]: (ShortPronoun | LongPronoun)[]; + }; + birthday?: string; + location?: string; + activitypub?: string; +} +``` + +```typescript +type ShortPronoun = string; +``` + +```typescript +interface LongPronoun { + subject: string; + object: string; + dependent_possessive: string; + independent_possessive: string; + reflexive: string; +} +``` \ No newline at end of file