added redirects to new docs

This commit is contained in:
2024-05-15 19:50:58 +02:00
parent 9c50ceb1fe
commit 3271920179
18 changed files with 6392 additions and 532 deletions

View File

@@ -1,63 +1,18 @@
import { defineConfig } from "astro/config";
import minify from "astro-min";
import metaTags from "astro-meta-tags";
import rehypeSlug from "rehype-slug";
import rehypeAutolinkHeadings from "rehype-autolink-headings";
import remarkDirective from "remark-directive";
import remarkCalloutDirectives from "@microflash/remark-callout-directives";
import remarkExternalLinks from "remark-external-links";
import rehypePrettyCode from "rehype-pretty-code";
import codeTheme from "./src/styles/moonlight-ii.json";
import mdx from "@astrojs/mdx";
import lighthouse from "astro-lighthouse";
import icon from "astro-icon";
import expressiveCode from "astro-expressive-code";
// https://astro.build/config
export default defineConfig({
integrations: [
minify(),
metaTags(),
expressiveCode({
themes: [codeTheme],
styleOverrides: {
frames: {
tooltipSuccessBackground: "#7ECA9C",
},
},
}),
mdx(),
lighthouse(),
icon(),
],
markdown: {
syntaxHighlight: false,
// Disable syntax built-in syntax hightlighting from astro
rehypePlugins: [
rehypeSlug,
[
rehypePrettyCode,
{
theme: codeTheme,
},
],
[
rehypeAutolinkHeadings,
{
behavior: "wrap",
},
],
],
remarkPlugins: [
remarkDirective,
remarkCalloutDirectives,
[
remarkExternalLinks,
{
target: "_blank",
},
],
],
},
});

View File

@@ -1,10 +1,8 @@
---
const routes = {
Home: "/",
Projects: "/projects",
Tutorials: "/tutorials",
Docs: "/docs",
Blog: "/blog",
Docs: "https://docs.vaporvee.com/",
};
import "../styles/navbar.scss";
---

View File

@@ -1,51 +0,0 @@
---
const { frontmatter } = Astro.props;
import Layout from "../layouts/Layout.astro";
import { Icon } from "astro-icon/components";
import DonationCallout from "../components/DonationCallout.astro";
import "../styles/sidebar.scss";
const title = frontmatter.title + " | Docs";
const unsortedDocs = await Astro.glob("../pages/docs/*/*.{md,mdx}");
const docs = unsortedDocs.sort((a) =>
a.url === "/docs/" + a.frontmatter.repo ? -1 : 1
);
---
<Layout
title={title}
description="This is my personal website with my projects, docs and other useful stuff."
>
<div class="content">
<h1 style="text-align: center;">{frontmatter.title}</h1>
<br />
<br />
<slot />
</div>
<div class="sidebar">
<div class="sidebar" style="display: unset;">
<a
class="repo-link"
href={"https://github.com/vaporvee/" + frontmatter.repo}
target="_blank"
><span style="font-size: 14px;">vaporvee /</span>{frontmatter.repo}</a
><br /><br />
{
docs.map((page) => {
const isActive =
Astro.url.pathname == page.url + "/" ||
(Astro.url.pathname.startsWith(page.url) &&
page.url !== "/docs/" + page.frontmatter.repo);
return (
<a href={page.url} class={isActive ? "active" : ""}>
<Icon name="mdi:file-outline" />
{page.frontmatter.title} <br />
</a>
);
})
}
<DonationCallout
text="These projects require a lot of time and effort. If you make money using this project, consider donating of whatever it's worth to you!"
/>
</div>
</div>
</Layout>

View File

@@ -0,0 +1,28 @@
---
interface Props {
href: string;
}
const { href } = Astro.props;
import "../styles/main.scss";
import "../styles/callout.scss";
import { ViewTransitions } from "astro:transitions";
---
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="darkreader-lock" />
<meta name="theme-color" content="#1c1427" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta http-equiv="refresh" content={"0; url=" + href} />
<title>Redirecting... | vaporvee's Website</title>
<ViewTransitions />
</head>
<body>
<a href={href}>Click if not redirecting</a>
</body>
</html>

View File

@@ -1,11 +1,5 @@
---
import Layout from "../layouts/Layout.astro";
import { Icon } from "astro-icon/components";
const unsortedDocs = await Astro.glob("./docs/*/index.{md,mdx}");
const docs = unsortedDocs.sort(
(a, b) => +new Date(b.frontmatter.date) - +new Date(a.frontmatter.date)
);
---
<Layout
@@ -14,10 +8,12 @@ const docs = unsortedDocs.sort(
>
<main>
<div class="center">
<h1 style="text-align: center;">ERROR 404</h1>
<br/>
<p style="font-size: 22px;">The page either never existed or was renamed.<br/>
Try something in the navbar above!</p>
<h1 style="text-align: center;">ERROR 404</h1>
<br />
<p style="font-size: 22px;">
The page either never existed or was renamed.<br />
Try something in the navbar above!
</p>
</div>
</main>
</main>
</Layout>

View File

@@ -1,42 +1,5 @@
---
import Layout from "../layouts/Layout.astro";
import { Icon } from "astro-icon/components";
const unsortedDocs = await Astro.glob("./docs/*/index.{md,mdx}");
const docs = unsortedDocs.sort(
(a, b) => +new Date(b.frontmatter.date) - +new Date(a.frontmatter.date)
);
import Redirect from "../layouts/Redirect.astro";
---
<Layout
title="Docs"
description="This is my personal website with my projects, docs and other useful stuff."
>
<main>
<div class="content">
<h1 style="text-align: center;">Docs</h1>
{
docs.map((doc) => (
<div
class="second-content"
>
<div style="text-align: left;" />
<a href={doc.url}>
<h2>
{doc.frontmatter.repo} <Icon name="mdi:arrow-forward-circle" />
</h2>
</a>
<p>{doc.frontmatter.subtitle}</p>
<h3 style="text-align: left;">Features:</h3>
<ul style="text-align: left;">
{doc.frontmatter.features.map((feature) => (
<li>{feature}</li>
))}
</ul>
<img class="doc_thumbnail" style={doc.frontmatter.has_thumbnail ? "" : "display:none;"} src={"/img/docs/thumbnails/" + doc.frontmatter.repo + ".webp"} />
</div>
))
}
</div>
</main>
</Layout>
<Redirect href="https://docs.vaporvee.com/" />

View File

@@ -0,0 +1,5 @@
---
import Redirect from "../../layouts/Redirect.astro";
---
<Redirect href="https://docs.vaporvee.com/discord-rpc-godot" />

View File

@@ -1,98 +0,0 @@
---
layout: ../../../layouts/DocsLayout.astro
repo: discord-rpc-godot
title: Activities
---
# Variables
Anything of course begins with `DiscordRPC.{:gdscript}` e.g. `DiscordRPC.app_id = #<your Application ID>{:gdscript}`
### Rich presence
| Name | Type | Description |
| --- | --- | --- |
| `app_id{:gdscript}` | `int{:gdscript}` | The Application ID you need to get to make anything in the plugin → https://discord.com/developers/applications |
| `details{:gdscript}` | `String{:gdscript}` | The first text line visible in the Activity (after the app name) |
| `state{:gdscript}` | `String{:gdscript}` | The second text line visible in the Activity |
| `large_image{:gdscript}` | `String{:gdscript}` | Key for the large image you set while uploading an image to the "Rich Presence" → "Art Assets" tab in your online Discord dev panel |
| `large_image_text{:gdscript}` | `String{:gdscript}` | Text wich shows when you hover over the large image |
| `small_image{:gdscript}` | `String{:gdscript}` | Key for the small image you set while uploading an image to the "Rich Presence" → "Art Assets" tab in your online Discord dev panel |
| `small_image_text{:gdscript}` | `String{:gdscript}` | Text wich shows when you hover over the small image |
| `start_timestamp{:gdscript}` | `int{:gdscript}` | The "02:46 elapsed" timestamp in the presence. Get the current time with Godot's `int(Time.get_unix_time_from_system()){:gdscript}` and Discord counts in seconds from it |
| `end_timestamp{:gdscript}` | `int{:gdscript}` | The "59:59 elapsed" timestamp in the presence. Get it with Godot's `int(Time.get_unix_time_from_system()){:gdscript}` and add seconds as int e.g. `+ 3600{:gdscript}` → + 1 Hour |
### Invite system
The values can be pretty anything since there is no lobby system in the SDK anymore. You should already have a custom lobby system wich can compute the secret and change the values. After an invite every value should be the same as the other player.
| Name | Type | Description |
| --- | --- | --- |
| `party_id{:gdscript}` | `String{:gdscript}` | Unique identifier for the party |
| `current_party_size{:gdscript}` | `int{:gdscript}` | The current playercount in the party |
| `max_party_size{:gdscript}` | `int{:gdscript}` | Maximum allowed playercount in the party |
| `match_secret{:gdscript}` | `String{:gdscript}` | Unique hash for the given match context |
| `join_secret{:gdscript}` | `String {:gdscript}` | Unique hash for chat invites and Ask to Join |
| `spectate_secret{:gdscript}` | `String{:gdscript}` | Unique hash for Spectate button |
| `is_public_party{:gdscript}` | `bool{:gdscript}` | Turn it to `true{:gdscript}` if you want people to join the party without asking. This needs to be enabled in the Discord user settings |
| `instanced{:gdscript}` | `bool{:gdscript}` | Whether this activity is an instanced context, like a match |
# Signals
### Invite system
### Activity join request
**Connect it with:**
```gdscript
DiscordRPC.connect("activity_join_request",_on_activity_join_request)
```
**Add it in your gdscript as function:**
```gdscript
func _on_activity_join_request(user_requesting):
```
The Signal fires when someone requests to join your Activity via an request join button in Discord.<br/>
**Given variable:** [`Dictionary user_requesting{:gdscript}`](/docs/discord-rpc-godot/users#get-current-user)
<br/>
<br/>
### Activity join
**Connect it with:**
```gdscript
DiscordRPC.connect("activity_join",_on_activity_join)
```
**Add it in your gdscript as function:**
```gdscript
func _on_activity_join(secret):
```
The Signal fires when someone joins your Activity via an invite or join button in Discord.<br/>
**Given variable:** `String secret{:gdscript}`<br/>
Send the secret to your custom system to generate the other party values and make them the same as the target user.
<br/>
<br/>
### Activity spectate
**Connect it with:**
```gdscript
DiscordRPC.connect("activity_spectate",_on_activity_spectate)
```
**Add it in your gdscript as function:**
```gdscript
func _on_activity_spectate(secret):
```
The Signal fires when someone spectates your Activity via an invite or spectate button in Discord.<br/>
**Given variable:** `String secret{:gdscript}` <br/>
Send the secret to your custom system to generate the other party values and make them the same as the target user.
# Methods
### Refresh
After setting any variables you have to reload the RPC with this method
```gdscript
DiscordRPC.refresh()
```
### Clear
Disables the Activity.
```gdscript
DiscordRPC.clear(reset_values)
```
**Taken variable:** `bool reset_values{:gdscript}` **Standard value:** `false{:gdscript}`<br/>
When turning `reset_values{:gdscript}` to `true{:gdscript}` it completely clears the whole activity with its `app_id{:gdscript}` and other values.
### Unclear
Reenables the before cleared Activity. Only works with `DiscordRPC.clear(reset_values = false){:gdscript}`(default).
```gdscript
DiscordRPC.unclear()
```

View File

@@ -1,49 +0,0 @@
---
layout: ../../../layouts/DocsLayout.astro
repo: discord-rpc-godot
title: Building
---
# How to build
1. Clone the project
2. Install [python](https://www.python.org/downloads/)
3. Install scons via pip with
```sh
pip install scons
```
and make sure to put scons on your PATH or replace "scons" with a scons run command<br/>
<br />
4. Run this command ```sh python setup.py ``` 5. and build the project with ```sh
python build.py ``` There is a prompt how it should start Godot (if `godot` is on
PATH) to test the addon fast directly.
<br />
**or** run
```sh
scons
```
and
```sh
scons target=template_release
```
<br />
6. Now the addon should be installed in the project folder of the repo and can be exported with
```sh
python release.py
```
# MacOS Support
:::assert{title="Info"}
MacOS is fully supported but its building process is not fully documented yet.
:::

View File

@@ -1,10 +0,0 @@
---
layout: ../../../layouts/DocsLayout.astro
repo: discord-rpc-godot
title: Debug
---
The ![](https://raw.githubusercontent.com/vaporvee/discord-rpc-godot/main/project/addons/discord-rpc-gd/Debug.svg)`DiscordRPCDebug{:gdscript}` Node shows the current status of the Plugin and its values.<br/>
You can also print the `current_user{:gdscript}` Dictionary or the whole friendslist Array on the console and manage invites with the Button and input LineEdits. You can also disable and enable the Activity with the button switch.
![debug_node](https://github.com/vaporvee/discord-rpc-godot/assets/80621863/d0048066-ef68-4900-8e38-4638d2236d16)

View File

@@ -1,20 +0,0 @@
---
layout: ../../../layouts/DocsLayout.astro
repo: discord-rpc-godot
title: Editor Presence
---
<img width="80%" src="https://raw.githubusercontent.com/vaporvee/discord-rpc-godot/main/project/assets/GodotEditorPresenceBanner.svg" />
<br/>
<br/>
***
**Enabling it:**
1. Enable the DiscordRPC addon (and restart the editor like in the quickstart guide)
2. Go to the **editor** settings
3. and enable `"DiscordRPC/EditorPresence/enabled"{:gdscript}`<br/>
Editor Presence also updates a bit slower on client side. Your friends will see what you are doing in the exact second even when its not updated for you directly.
***
(old image)
<img width="50%" src="https://github.com/vaporvee/discord-rpc-godot/assets/80621863/72b85ea7-24f1-4136-b788-92590c165a55" />

View File

@@ -1,86 +0,0 @@
---
layout: ../../../layouts/DocsLayout.astro
repo: discord-rpc-godot
has_thumbnail: true
title: Home
subtitle: Discord RPC Plugin for GDScript with an easy-to-use code pattern in Godot Engine 4, with optional Editor Rich Presence! (Compatible with Linux, Windows, & MacOS)
features: [
"Activities (Make people see what you are playing)",
"Invites",
"Steam and launch command registering",
"User information",
"Relationship Manager (Get friendlist and its updates)",
"Overlay management",
Editor Presence (optional)
]
---
:::deter{title="Important plugin explaination"}
**This is for the Discord Game SDK NOT the Embedded App SDK** <br/>
Any mention of "SDK" has nothing to do with making Discord voice channel activities. <br/>
Its only to display your game in a Discord user's profile with extra information and some other features.
:::
:::note{title="Discord Game SDK information"}
The GameSDK's Achievements, Applications, Voice, Images, Lobbies, Networking, Storage, and Store (purchases and discounts) features have been deprecated and will not be added. <br /> However the rest is and will still be supported by Discord.
:::
<br/>
:::assert{title="Keep in mind"}
To make anything work in the plugin make sure to run
```gdscript
func _process(_delta):
DiscordRPC.run_callbacks()
```
This happens normaly inside the Autoload wich should be automatically added by the plugin. <br />
Something that does **not get added automatically** is your `app_id{:gdscript}`. It is also mandatory to be able to use anything in the plugin.
```gdscript
DiscordRPC.app_id = #<your Application ID>
```
:::
# Quick start
| Recommended | Manual |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <ol type="1"><li>Open the AssetLib tab in your Godot Editor.</li><li>Search for "discord" and install all the files from this plugin <img width="30px" style="margin-top:-30px;" src="https://raw.githubusercontent.com/vaporvee/discord-rpc-godot/main/project/assets/Logo_V2_Clyde.png" /></li></ol> | <ol type="1"><li>[Download the addon](https://github.com/vaporvee/discord-rpc-godot/releases/latest/download/ADDON-discord-rpc-godot.zip/)</li><li>Put the `addons/` folder in the root of your Godot project</li></ol> |
3. Enable the addon in your Project Settings under "Plugins" and "DiscordRPC". <br /><sub>(Also adds DiscordRPCLoader autoload wich should be ignored. It needs to run in the background to comunicate with the Discord client)</sub>
4. Restart your project with the window that should now appear. <br /><img src="https://github.com/vaporvee/discord-rpc-godot/assets/80621863/620d90aa-6e76-4a80-980e-c8c57d8cfa58" width="200px" /><br />
5. Create an Application under https://discord.com/developers/applications and get the Application ID
6. While you're here, head to the "OAuth2" section of your application and add `http://127.0.0.1` as a redirect URI for your application.<br /><sub>(Discord says you should do that but it doesn't change anything)</sub>
7. (optional) Set images under "Rich Presence" and "Art Assets" and remember the keys
8. Create a gdscript wich gets run for example at startup wich looks something like the following
```gdscript
extends Node
func _ready():
DiscordRPC.app_id = 1099618430065324082 # Application ID
DiscordRPC.details = "A demo activity by vaporvee"
DiscordRPC.state = "Checkpoint 23/23"
DiscordRPC.large_image = "example_game" # Image key from "Art Assets"
DiscordRPC.large_image_text = "Try it now!"
DiscordRPC.small_image = "boss" # Image key from "Art Assets"
DiscordRPC.small_image_text = "Fighting the end boss! D:"
DiscordRPC.start_timestamp = int(Time.get_unix_time_from_system()) # "02:46 elapsed"
# DiscordRPC.end_timestamp = int(Time.get_unix_time_from_system()) + 3600 # +1 hour in unix time / "01:00:00 remaining"
DiscordRPC.refresh() # Always refresh after changing the values!
```
**Then it will look similar to this:**
<img width="400px" src="https://raw.githubusercontent.com/vaporvee/discord-rpc-godot/main/project/assets/ActivityPreview.svg" />
[**Try a built demo**](https://github.com/vaporvee/discord-rpc-godot/releases/latest/download/Demo-Export.zip)<br /><br />
# Troubleshooting
First of all try reinstalling the plugin and restart both your Godot Editor and your Discord client.
<details><summary><b>I have no errors in my Godot console from the plugin but my Activity doesn't show up in my Discord Client.</b></summary>Make sure a `DiscordRPC.run_callbacks()` function runs in a `_process(delta)` function. This should happen in the Autoload added by the plugin. If it still doesn't help, try the Demo above. If still nothing appears in your Discord profile card, you have to reset the depending settings in you Discord or reinstall it.</details>
<details><summary><b>I have a lot of `DiscordRPC not declared` errors spammed in my Godot Console and i can't use the plugin.</b></summary> Make sure the plugin is actually enabled. Then the plugin should work and after the second restart you shouldn't get any errors from the plugin. But if it still gives you the errors delete the file `/addons/discord-rpc-gd/bin/.gdignore` and restart the editor manually.</details>

View File

@@ -1,62 +0,0 @@
---
layout: ../../../layouts/DocsLayout.astro
repo: discord-rpc-godot
title: Relationship Manager
---
# Variables
### relationship
Type: `Dictionary{:gdscript}`
| Key | Type | Description |
| --- | --- | --- |
| `"type"{:gdscript}` | `String{:gdscript}` | <details><summary>The type of relationship the current user has with the given user. These are:</summary> `"None"` user has no intrinsic relationship<br/>`"Friend"` user is a friend<br/>`"Blocked"` user is blocked<br/>`"PendingIncoming"` user has a pending incoming friend request to connected user<br/>`"PendingOutgoing"` current user has a pending outgoing friend request to user<br/>`"Implicit"` user is not friends, but interacts with current user often (frequency + recency)<br/>`"NotAvailable"` relationship is unknown<br/></details> |
| `"user"{:gdscript}` | `Dictionary{:gdscript}` | [user](/docs/discord-rpc-godot/users#get-current-user) |
| `"presence"{:gdscript}` | `Dictionary{:gdscript}` | Will be described below. |
### presence
Type: `Dictionary{:gdscript}`
| Name | Type | Description |
| --- | --- | --- |
| `"status"{:gdscript}` | `String{:gdscript}` | <details><summary>The user status:</summary>`"Offline"`<br/>`"Online"`<br/>`"Idle"`<br/>`"DoNotDisturb"`<br/>`"NotAvailable"`<br/></details> |
| `"activity"{:gdscript}` | `Dictionary{:gdscript}` | All [activity](/docs/discord-rpc-godot/activities) values and the `"name"{:gdscript}` of the activity
# Signals
### Relationship init
**Connect it with:**
```gdscript
DiscordRPC.connect("relationships_init",_on_relationships_init)
```
**Add it in your gdscript as function:**
```gdscript
func _on_relationships_init():
```
The Signal fires when Discord is ready to offer relationship information.<br/>
### Updated relationship
**Connect it with:**
```gdscript
DiscordRPC.connect("updated_relationship",_on_updated_relationship)
```
**Add it in your gdscript as function:**
```gdscript
func _on_updated_relationship(relationship):
```
The Signal fires when a user in the Relationships list of the current user updated any user information.<br/>
For example activity details update, avatar update, username update, online, offline etc...<br/>
**Given variable:** `Dictionary relationship{:gdscript}`
# Methods
### Get relationship
Returns the relationship between the current user and the `user_id{:gdscript}`
```gdscript
DiscordRPC.get_relationship(user_id)
```
**Taken variable:** `int user_id{:gdscript}`<br/>
**Given variable:** `Dictionary relationship{:gdscript}`
### Get all relationships
Returns all relationships the current user has. Warning: this will be many! (if not I'm sorry xD)
```gdscript
DiscordRPC.get_all_relationships()
```
**Given variable:** `Dictionary relationship{:gdscript}`

View File

@@ -1,23 +0,0 @@
---
layout: ../../../layouts/DocsLayout.astro
repo: discord-rpc-godot
title: Users
---
# Methods
### Get current user
Fetch information about the currently to the Discord client connected user account.<br/>
Note: This doesn't return the proper values when the game is not fully connected to the Discord client. Give it its time!
```gdscript
DiscordRPC.get_current_user()
```
Returns `Dictionary current_user{:gdscript}`
| **Key** | Type | Description |
| --- | --- | --- |
| `"avatar"{:gdscript}` | `String{:gdscript}` | The avatar hash of the Discord user |
| `"is_bot"{:gdscript}` | `bool{:gdscript}` | If the user is a bot (when does this happen?) |
| `"discriminator"{:gdscript}` | `int{:gdscript}` | The "#1234" number after the name from a user |
| `"id"{:gdscript}` | `int{:gdscript}` | The user's unique ID |
| `"username"{:gdscript}` | `String{:gdscript}` | The Discord username (without discriminator) |
| `"avatar_url"{:gdscript}` | `String{:gdscript}` | <details><summary>The url of the user's avatar</summary>also returns the correct url for the [default avatar](https://cdn.discordapp.com/embed/avatars/5.png).<br/>When `avatar` is empty a url will be generated out of `discriminator % 5`. The user avatars are 512x512px and the default avatars 256x256px </details> |

View File

@@ -1,25 +0,0 @@
---
layout: ../../../layouts/DocsLayout.astro
repo: discord-rpc-godot
title: Utillity or other stuff
---
# Methods
## Run callbacks
```gdscript
func _process(_delta):
DiscordRPC.run_callbacks()
```
This runs normaly inside the Autoload `DiscordRPCLoader{:gdscript}` wich should be automatically added by the plugin. If not this needs to be added to use most features of the plugin. In older versions of the plguin known as `discord_sdk.run_callbacks(){:gdscript}`.
## Register game
### Register Steam
Registers your game's Steam app id for the protocol `steam://run-game-id/<id>` when you are shipping your game on steam. Used when Discord wants to launch your game or to push the Discord overlay to your game.
```gdscript
DiscordRPC.register_steam(1938123)
```
Requires a steamID `int{:gdscript}` value
### Register command
Registers your game's launch command. Used when Discord wants to launch your game or to push the Discord overlay to your game. Only really makes sense when the command works on the given OS
```gdscript
DiscordRPC.register_command("my-awesome-game://run --full-screen")
```
Requires a launch command `String{:gdscript}` value

View File

@@ -0,0 +1,5 @@
---
import Redirect from "../../layouts/Redirect.astro";
---
<Redirect href="https://docs.vaporvee.com/discord-rpc-godot" />

View File

@@ -56,15 +56,6 @@ main {
padding-inline: 2vw;
}
}
.doc_thumbnail{
position: relative;
bottom: 0;
left: 0;
margin: -2vh;
width: 150%;
padding-top: 2vh;
border-radius: 0 0 25px 25px;
}
td {
border-inline: 15px solid;
@@ -82,7 +73,7 @@ b, strong {
}
a {
color: $link;
&[target="_blank"]::after {
&[target="_blank"]::after{
display: inline-block;
width: 20px;
height: 20px;

6343
yarn.lock Normal file

File diff suppressed because it is too large Load Diff