mirror of
https://github.com/versia-pub/docs.git
synced 2025-12-06 06:18:19 +01:00
Add Vanity extension
This commit is contained in:
parent
55fee3499c
commit
18e76da5b3
|
|
@ -1,3 +1,169 @@
|
||||||
# Vanity
|
# Vanity
|
||||||
|
|
||||||
This extension is currently in development.
|
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;
|
||||||
|
}
|
||||||
|
```
|
||||||
Loading…
Reference in a new issue