#πŸ‘Ύ-core-development

1 messages Β· Page 54 of 1

charred monolithBOT
austere talon
#

big commit

cunning canyon
#

uhh ven should i change it back to replace \\n during replace

#

wrong reply

#

this

austere talon
#

i didnt think of that

frail skyBOT
#
Bad Patches

WebContextMenus (had no effect):
ID: 567068
Match: /(?<=showApplicationCommandSuggestions;)if\(![A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\)/

Bad Starts

None

Discord Errors
font-weight: bold;
color: purple;
 [kb store] KeybindStore: Looking for callback action SOUNDBOARD_HOLD but it doesn't exist in this version. Skipping ```
#
Bad Patches

WebContextMenus (had no effect):
ID: 567068
Match: /(?<=showApplicationCommandSuggestions;)if\(![A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\)/

Bad Starts

None

Discord Errors
font-weight: bold;
color: purple;
 [kb store] KeybindStore: Looking for callback action SOUNDBOARD_HOLD but it doesn't exist in this version. Skipping ```
charred monolithBOT
austere talon
charred monolithBOT
charred monolithBOT
charred monolithBOT
quaint sapphire
#

also this UI is uhh

#

I don't know what to say

#

btw why is the infinite scroll branch requiring that you search for smth?
why can't I load the top emotes?

charred monolithBOT
charred monolithBOT
#

BetterDiscord plugin: https://github.com/RoguedBear/BetterDiscordPlugin-AutoIdleOnAFK

My request is to have the same plugin but with a little more customization if possible:

  • Choose what status to change from instead of "Online".
  • Choose what status to change to instead of "Idle".
  • Time duration should allow choosing a shorter one, unless that would cause rate limit issues. For example the plugin changes from Online to Idle after a minimum duration of 5, it would be great if it is po...
charred monolithBOT
cunning canyon
#

lol now we have 2 pr for split large message plugin

charred monolithBOT
somber ginkgo
umbral hedge
#

h

charred monolithBOT
umbral hedge
#

themes will never be merge

charred monolithBOT
limber skiff
umbral hedge
#

ty

ivory idol
#

hi, is it possible to add new plugins on vencord?

umbral hedge
wise rain
twilit abyss
twilit abyss
charred monolithBOT
charred monolithBOT
charred monolithBOT
stark flint
#

please

lime stone
#

pin the issue! maybe

stark flint
#

release an update that plays an obnoxiously loud sound effect with a popup saying streaming isn't ready for vc desktop yet whenever you click the button

lime stone
#

maybe with this slightly... fried shiggy

stark flint
charred monolithBOT
charred monolithBOT
umbral hedge
#

HOW

#

"no" is spanish fr

quaint sapphire
#

It is also in japanese

charred monolithBOT
#

im a complete noob, i run the command on my terminal like it said on the readme

then this happens

``Downloading Installer...
X11 detected

Now running VencordInstaller
Do you want to run as root? [Y|n]
This is necessary if Discord is in a root owned location like /usr/share or /opt

y
Running with sudo
[sudo] password for levih:
VencordInstaller was run with root privileges, actual user is levih
Looking up HOME of levih
Actual HOME is /home/levih
Using UserConfig
...

lime stone
#

this is annoying me too much lmao

austere talon
#

L

#

fix it :3

lime stone
#

:blame_ven:

austere talon
#

i didnt even change anything

#

it shouldnt be off center

lime stone
#

it wasn't before you commited

austere talon
#

but i didnt change anything about layout :c

lime stone
#

hmm, weird

#

did you change anything which made the hover area larger?

austere talon
#

nuh

lime stone
#

oh, it's because it's an <a> with and <img> in

#

maybe

austere talon
#

they have 6px marginRight

#

likely thats why

#

but thats added by u not me

#

use gap instead of margin to fix it

lime stone
#

hmm

#

i was using an older commit for a bit and the issue wasn't present

#

(because i didn't pull :p)

#

and gap doesn't work with inline it seems

austere talon
#

u need flex/inline-flex

lime stone
#

oh - but what about putting the margin on the button or link instead?

#

i think that would fix it

summer ocean
#

yo

austere talon
#

nooo ghost

azure jay
#

wha happened to dzshn

charred monolithBOT
charred monolithBOT
jagged cloak
#

som1 should add opening plugin settings to textreplace toolbox actions

#

hold on yeah

#

openiing plugin settings probably niche thing but i find myself doing that alot for certain plugins

#

okay that was easier than i thought

#

i just cant read

austere talon
#

whar

jagged cloak
#

was adding a toolbox action to open plugin settings

#
toolboxActions: {
    "Open Settings": () => {
        openModalLazy(async () => {
            return modalProps => {
                //@ts-ignore fuck you
                return <PluginModal {...modalProps} plugin={plugin} onRestartNeeded={() => null} />;
            };
        });
    },
},
``` works lol
#

balls gaming

#

okay it still saves we good

#

why is it let
lol the workflow is gonna cry again i removed the ts ignore

austere talon
#

use openModal instead of lazy

#

🚎

jagged cloak
#

oh

#

why not lazy

limber skiff
#

why do you have to ts ignore

jagged cloak
#

but tbh just make util function that opens plugin settings

limber skiff
#

what's the issue

jagged cloak
#

because whatever tf its trying to tell me here

limber skiff
#

oh

jagged cloak
#

it still works with or without tsignore i just wanted it to explode

#

and lint fails with itlmao

limber skiff
#

maybe try finding out how to get the plugin obj you need

jagged cloak
#

i already have it

#

it just doesnt like the way i got it

limber skiff
#

cast it lol

austere talon
#
openModalLazy(() => import("./lazyLoadedModal"))
jagged cloak
#

oh ok

#

me when If this was intentional, convert the expression to 'unknown' first.

#

explode typeeeescript

#

plugin={plugin as unknown as Plugin} is so ugly

frail skyBOT
#
Bad Patches

WebContextMenus (had no effect):
ID: 567068
Match: /(?<=showApplicationCommandSuggestions;)if\(![A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\)/

Bad Starts

None

Discord Errors
font-weight: bold;
color: purple;
 [kb store] KeybindStore: Looking for callback action SOUNDBOARD_HOLD but it doesn't exist in this version. Skipping ```
fleet depot
#

cuz that would be incredibly handy

frail skyBOT
#
Bad Patches

WebContextMenus (had no effect):
ID: 567068
Match: /(?<=showApplicationCommandSuggestions;)if\(![A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\)/

Bad Starts

None

Discord Errors
font-weight: bold;
color: purple;
 [kb store] KeybindStore: Looking for callback action SOUNDBOARD_HOLD but it doesn't exist in this version. Skipping ```
fleet depot
#

tyy

#

:)

austere talon
#

mmm

#

kinda not a fan

austere talon
#

cause if u add it for one plugin it's "why does it only exist for this plugin?"

jagged cloak
#

true

austere talon
#

you will add a setting allowing you to add any plugin

jagged cloak
#

whar

#

i just added it to textreplace because thats a plugin you would be opening the settings for frequently enough

#

but ig that applies to any plugin with more than just a toggle switch

#

in that case i will do that later since its more effort

#

trolley

blazing dome
fleet depot
#

So having quick access to it would be πŸ‘Œ

jagged cloak
#

or could change the wording so it doesnt feel weird

limber skiff
#

that was painful

lean elm
#

before i accidentally discard the changes again πŸ’€

grave mangoBOT
quaint sapphire
#

The fuck is \i?

#

@austere talon

#

does it mean that it is the same character as any other instance of \i or smth?

#

at least thats my understanding from context

#

like it would only match a=a.intention and not a=b.intention?

#

cause regex101 does not support it, unless im doing smth wrong?

austere talon
#

no

#

it's our own regex extension

#

it matches Javascript identifiers (names)

quaint sapphire
#

thats boring

grave mangoBOT
quaint sapphire
#

@austere talon opinion on using magic-regex for the patches?
it could allow people that are confused by regex to make patches

eg this

{
    predicate: () => settings.store.transformEmojis,
    match: /1!==(\i)\.length\|\|1!==\i\.length/,
    replace: (m, content) => `${m}||$self.shouldKeepEmojiLink(${content}[0])`
}

would become this

{
    predicate: () => settings.store.transformEmojis,
    match: createRegExp(
        exactly("1!==")
          .and(identifier.groupedAs("e"))
          .and(exactly(".length||1!=="))
          .and(identifier).and(exactly(".length")
        )
    ),
    replace: (m, content) => `${m}||$self.shouldKeepEmojiLink(${content}[0])`
}
austere talon
#

horrid

limber skiff
#

ewwwwwwwwww

#

regex too complex for that

austere talon
#

magic regex is way less readable than normal regex

quaint sapphire
#

the definition for identifier that I wrote

const identifier = exactly(oneOrMore(letter).or(anyOf("_", "$")))
#

(yes, you can't give ranges, you can only use letter for the A-Za-z)

quaint sapphire
#

although, the regex it generates is uhh....ugly to say the least

turbid hatch
#

this is one of the reasons why we should avoid using magic regex, we can handwrite it better

quaint sapphire
#

yeah I do agree, I just asked for opinion

#

since the number of programmers that know how to write regex is the minority and not the majority

#

(although in my opinion, magic regex is harder to write than normal regex, but my opinion also says that regex is easy, so I don't know if I should trust it)

golden gulch
#

regex is pretty easy, but the way it's written makes it look intimidating if you don't know the syntax

#

I've noticed a lot of people just don't bother learning it because of that

jagged cloak
#

yop

austere talon
#

true

#

but I don't think libraries like magic regex make it any better xd

golden gulch
#

yeah, they definitely don't help at all

nocturne haven
#

You would need your own language for this kind of stuff because I doubt there's things for regex code string patching that make it easier

austere talon
#

well we do have our own regex extensions

#

i thought about making our own regex "dialect" that allows newlines and comments and stuff

#

and maybe more shortcuts

#

but the problem with stuff like this is always ide support

nocturne haven
#

Yeah

austere talon
#

especially if u wanna have it inside typescript files

#

cause then u probably need to fork typescript

jagged cloak
#

how do u use desktop to dev

#

cause replacing build file so annoying

#

and custom llocation isnt ever work
i manually set Settings.vencordDir too even

austere talon
#

custom location loll

frail skyBOT
#
Bad Patches

WebContextMenus (had no effect):
ID: 567068
Match: /(?<=showApplicationCommandSuggestions;)if\(![A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\)/

Bad Starts

None

Discord Errors
font-weight: bold;
color: purple;
 [kb store] KeybindStore: Looking for callback action SOUNDBOARD_HOLD but it doesn't exist in this version. Skipping ```
#
Bad Patches

WebContextMenus (had no effect):
ID: 567068
Match: /(?<=showApplicationCommandSuggestions;)if\(![A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\)/

Bad Starts

None

Discord Errors
font-weight: bold;
color: purple;
 [kb store] KeybindStore: Looking for callback action SOUNDBOARD_HOLD but it doesn't exist in this version. Skipping ```
torpid raft
#

XML Schema, XPath, and JGsoft V2 regular expressions support four more shorthands that aren’t supported by any other regular expression flavors. \i matches any character that may be the first character of an XML name.

torpid raft
#

so, Vencord has its own implementation of \i that is different than what one might expect - that's important to document somewhere ...

cunning canyon
#

that said in patch helper tab

fleet depot
cunning canyon
#

ven will write new docs on website just dont know when

quaint sapphire
#

Never

austere talon
#

did discord break webhooks

jagged cloak
#

na probably your proxy

#

other server GitHub webhook fired an hr ago

austere talon
#

ye

charred monolithBOT
austere talon
#

ayy fixed

austere talon
#

and i recently moved it to cloudflare and forgot to update

#

so it was checking cloudflares ip lol

#

fixed

jagged cloak
#

oh silly

charred monolithBOT
lime stone
#

it deleted the messages :p

#

you know, the funny thing to do would be star spam this repo

charred monolithBOT
austere talon
#

and when using the bot it would still send u notifs

jagged cloak
#

Xd

charred monolithBOT
#

This looks awesome. Is there any further work that needs to be done on this and is there an ETA on when it will be merged?

Yes, there is. Currently, it uses ur entire system audio (including discord), which means viewers can hear themselves in your stream. Additionally, currently it's not possible to customise resolution & fps. And the ui also needs to be improved

ETA is whenever it's done :P No idea, whenever I find time & motivation to work on it

Are you guys planning t...

lean elm
charred monolithBOT
charred monolithBOT
charred monolithBOT
frail skyBOT
#
Bad Patches

WebContextMenus (had no effect):
ID: 567068
Match: /(?<=showApplicationCommandSuggestions;)if\(![A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\)/

Bad Starts

None

Discord Errors
font-weight: bold;
color: purple;
 Cannot access 'Jue' before initialization ReferenceError: Cannot access 'Jue' before initialization
    at Module.default (WebpackModule393552:2:50)
    at VencordWeb:12:719
    at VencordWeb:5:8650
    at [vencord.lazy.get] (VencordWeb:5:7013)
    at Tr.<computed> [as get] (VencordWeb:5:7424)
    at Object.handleProtoChange (VencordWeb:33:21354)
    at CONNECTION_OPEN (WebpackModule473419:2:5858)
    at https://discord.com/assets/c28629f10dab1fec3479.js:9327:766
    at https://discord.com/assets/c28629f10dab1fec3479.js:9317:818
    at n (https://discord.com/assets/c28629f10dab1fec3479.js:9327:743) ```
#
Bad Patches

ServerListAPI (had no effect):
ID: 118442
Match: /(Messages\.SERVERS,children:)(.+?default:return null\}\}\)\))/

WebContextMenus (had no effect):
ID: 567068
Match: /(?<=showApplicationCommandSuggestions;)if\(![A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\)/

Bad Starts

None

Discord Errors
font-weight: bold;
color: purple;
 Cannot access 'Jue' before initialization ReferenceError: Cannot access 'Jue' before initialization
    at Module.default (WebpackModule393552:2:50)
    at VencordWeb:12:719
    at VencordWeb:5:8650
    at [vencord.lazy.get] (VencordWeb:5:7013)
    at Tr.<computed> [as get] (VencordWeb:5:7424)
    at Object.handleProtoChange (VencordWeb:33:21354)
    at CONNECTION_OPEN (WebpackModule473419:2:5858)
    at https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9329:766
    at https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9319:818
    at n (https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9329:743)
%c[GatewaySocket] 
font-weight: bold;
color: purple;
 Cannot read properties of undefined (reading 'appearance') TypeError: Cannot read properties of undefined (reading 'appearance')
    at Object.handleProtoChange (VencordWeb:33:21232)
    at CONNECTION_OPEN (WebpackModule473419:2:5858)
    at https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9329:766
    at https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9319:818
    at n (https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9329:743)
    at t._dispatch (https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9330:83)
    at https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9329:429
    at i.log (https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9319:782)
    at t._dispatchWithLogging (https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9329:368)
    at t._dispatchWithDevtools (https://canary.discord.com/assets/de3a495da4e0451bb7b5.js:9328:797) ```
shadow sail
#

Mamsmsmsl

charred monolithBOT
verbal pumice
charred monolithBOT
stark helm
#

this chat has me wondering

#

wtf do github stars do?

jagged cloak
#

its basically just a favorite list

#

or list

quaint sapphire
#

Yep

#

They indicate the popularity of a repo

stark helm
#

makes sense

quaint sapphire
#

But unlike YouTube, you have a playlist of liked repos

#

Well, YouTube music does do that

#

And stars are one way of discovering repos

#

Users you follow automatically share their stars with you

#

Using it I just found ink

#

(not really, but you get the point)

charred monolithBOT
verbal pumice
austere talon
#

true

quaint sapphire
#

@verbal pumice making ur PR ready for review when?

verbal pumice
#

when i figure out how to finish it

austere talon
#

i love how theres two plugin tab prs and theyre both drafts

verbal pumice
#

2nd page of github prs is like 2nd page of google results

#

no one goes there

charred monolithBOT
charred monolithBOT
devout lagoon
lime stone
#

also i think google removed pages now

#

nvm

#

last time i checked it had infinite scrolling

#

maybe they reverted the change...

#

this is same account, same browser

#

this is so iconic though

#

you can't take it away :'(

#

Goooooooooogle

charred monolithBOT
#

Yes, there is. Currently, it uses ur entire system audio (including discord), which means viewers can hear themselves in your stream.

Are you guys planning to fix this or is there a roadblock in the way that prevents this from working?

"ETA is whenever it's done :P No idea, whenever I find time & motivation to work on it"

Fair enough, I wasn't trying to ask about an ETA but that's still a fair enough answer..

austere talon
lime stone
#

how

lime stone
#

Good news, we have all of your passwords now

#

cackle

charred monolithBOT
charred monolithBOT
charred monolithBOT
ebon sage
#

Is the webhook set to "all"?

#

I don't think anyone cares that a random person has starred the repo

lime stone
#

there's even a spam filter for stars

#

wait, maybe not

#

it's certainly turned on for stars though

#

as u can see :)

austere talon
jagged cloak
#

partygopher

charred monolithBOT
lime stone
#

wait, how come you can use translate without an api key??

lime stone
#

google?

#

is this legal?

#

πŸš“

austere talon
#

probably against tos

#

but who cares lmao

#

even telegram used this at some point lmfao

austere talon
#

ye

#

horror it downloads as text file

lime stone
#

isn't de for german

#

either that or desktop environment

devout lagoon
#

jk jk nyaboom

lime stone
devout lagoon
lime stone
#

it's for ded

#

what is your avatar??

#

ew

devout lagoon
#

teeth

charred monolithBOT
austere talon
#

why tho

#

doesnt make a diff xd

limber skiff
#

if you end up doing a single file for a billion stuff it turns into a mess

austere talon
#

thats why im not doing that :P

limber skiff
#

πŸ™

austere talon
#

i dont like exporting stuff from index

limber skiff
#

it's fine then

austere talon
#

because circular imports are nasty

limber skiff
#

oh is it used somewhere else too?

austere talon
#

wdym

limber skiff
#

well you dont need to export it

#

cuz you only use in index

austere talon
#

oh true

#

i will now use it in a different place

limber skiff
#

nOOOO

austere talon
#

in two other places to be precise

#

:3

limber skiff
#

grrr

austere talon
#

we love 4 billion dependencies

limber skiff
#

message message message

#

we will soon add MessageUpdaterAPI

austere talon
#

le poggies

limber skiff
#

bald

#

I want to dig even more to find out how to update messages

tame escarp
austere talon
#

already fixed, explode

limber skiff
#

you remembered me of powercord

#

the translator badge

austere talon
#

what do u think?

#

should i make "translated from [language]" a tooltip instead?

charred monolithBOT
limber skiff
#

nah

#

it's good like that

#

ven

#

can we have datamining channel

austere talon
#

make

#

this should be in german

#

ITS NOT

#

bad

#

das sollte auf deutsch sein

#

REAL

#

das ist fantastisch

#

okay it worksfully now

charred monolithBOT
limber skiff
#

burst reactions are so bad

#

like 5 per week is nothing

austere talon
#

if no just let me know tonguecat

limber skiff
#

I will

#

I just need to figure how

#

cuz I dont want to self host the datamining bot

#

do you mind waiting a bit for me to try to figure how to force update messages?

austere talon
#

for what

limber skiff
#

valid user

austere talon
#

uh

#

why

#

I made it work fine

limber skiff
#

okie we can change later if needed

austere talon
#

if anything the current solution is smoother probably

limber skiff
#

valid user seems clean

#

did you fully test it?

tight yacht
#

okay, but, like, how do I activate TextReplace

austere talon
#

u enable the plugin

tight yacht
#

I-I don't see the plugin in the plugin section....

charred monolithBOT
austere talon
#

discussions cant embed videos??

#

nvm got it

charred monolithBOT
charred monolithBOT
verbal pumice
#

aliucord jumpscare

charred monolithBOT
radiant reef
#

aww new plugins

charred monolithBOT
#
* Time duration should allow choosing a shorter one, unless that would cause rate limit issues. For example the plugin changes from Online to Idle after a minimum duration of 5, it would be great if it is possible to choose a shorter duration, unless again it would cause problems.

I opened an issue with the original plugin a year ago asking about this, and they left it at 5m to avoid spamming the Discord API.

quaint sapphire
#

@main trout uhh

#

give more context

#

do you have a screenshot?

austere talon
#

use react devtools to inspect the component

#

jump to location in code

#

understand how it works

quaint sapphire
#

i was afk

#

yeah the above

austere talon
#

replace their component with your own, possibly pass the original component so you can render it as child

quaint sapphire
#

or insert ur component within that component

#

you can do anything you want with patches

#

if you need help understanding patches I can hop on a vc to help you

#

heh, coding at school or just researching ahead of time?

charred monolithBOT
quaint sapphire
#
import { Devs } from "@utils/constants";
import definePlugin from "@utils/types";
import { Channel, Message } from "discord-types/general";

interface ActionBarProps {
    channel: Channel;
    unreadId: string;
    collapsedReason: {
        message: string;
        hasMarkdown: boolean;
    };
    messages: {
        type: string;
        content: {
            type: string;
            content: Message;
            groupId: string;
            isHighlight: boolean;
        }[];
        key: string;
        isHighlight: boolean;
    };
}

export default definePlugin({
    name: "BlockedShitWhatever",
    description: "todo!()",
    authors: [Devs.Arjix],

    patches: [{
        find: "forum-post-action-bar-",
        replacement: {
            match: /(\w\.type===.{2,5}\.MESSAGE_GROUP_BLOCKED.*?;return\(0,\w\.jsx\)\()(\w+),\{/,
            replace: (_, head, component) => `${head}$self.actionBarComponent,{originalComponent:${component},`
        }
    }],

    actionBarComponent(props: ActionBarProps & { originalComponent: React.FC<ActionBarProps>; }) {
        // you can do whatever you want
        return <props.originalComponent {...props} />;
    }
});

@main trout

#

made the patch for you

#

nothing should change visually since I re-use the original component, but you can do whatever you want with actionBarComponent and it will replace the blocked message section

#

(not just the bar)

#

all it does is replace

#

I didn't send a snippet but an entire plugin, so if you meant just making a new file and pasting that in, yes

#

i thought you were going to make the plugin?

#

I only made the patch you might have needed for ur plugin

devout lagoon
#

anyone remember a vide of screenshare coming past where they show off audio share while streaming desktop

lime stone
#

vendors

charred monolithBOT
austere talon
#

that's vencord desktop's screenshare lol

#

but it's not done

devout lagoon
#

i saw it like instantly after i woke up so i dont vividly remember

charred monolithBOT
#

This is also from the ImageUtilities plugin, for which I've seen a few threads/discussions already.

When you click on the "Save Image" or "Save Video" button, the plugin adds a sub-menu that expands the functionality.
There is a list of specific folders that you can select from in this submenu.
Each folder represents a designated location on your device where you can save and download the file.

Plugin in use:
![Example](https://github.com/Vendicated/Vencord/assets/69517127/239f62d1-b...

rose marsh
charred monolithBOT
limber skiff
#

@austere talon can we have perms to link an announcements channel

austere talon
#

just google

#

Javascript detect ctrl pressed

#

smth like that

limber skiff
#

I'm gonna link oceanic datamining channel here

austere talon
#

uh

#

shouldn't u have permissin to

#

try now

limber skiff
#

worked

austere talon
#

why do u need manage server to subscribe to a channel

#

it would make much more sense to just need manage channel

limber skiff
#

discord insane

austere talon
#

react

charred monolithBOT
grave mangoBOT
quaint sapphire
#

this is one way of doing it

#

actually

charred monolithBOT
quaint sapphire
#

that is dumb

#

I just realized

limber skiff
#

or import a css file

#

look at GameActivityToggle

#

or in your local copy

#

just look at its source code

#

note the css import at the index file

#

and the enabling/disabling of it in the start/stop method

#

yes

#

that's no custom stuff

#

that is modifying built in discord stuff

#

you shouldnt hardcode class names though

#
.isUnread-3Lojb-
          ^^^^^^

this is random

#

avoid making your css rules depend on it

#

[class*="isUnread"]

#

maybe that

#

that might select other stuff though

devout lagoon
#

having trouble finding it πŸ˜…

quaint sapphire
#

the hell

#

@main trout

#

why are you writing css for the built-in discord component for this?

quaint sapphire
#

the entire point of making the patch is replacing the component with your own

devout lagoon
quaint sapphire
#

its on another repo

stark flint
#

the screensharing is a PR

quaint sapphire
#

holy shit

#

4 digit

devout lagoon
#

ohhh ig i was on Ven's Vencord nyaboom

stark flint
quaint sapphire
#

technically I am also a 4 digit 😭

#

:monkepain:

stark flint
#

:^)

quaint sapphire
#

my life

stark flint
#

it's ok my graph's slowly turning back into that too

devout lagoon
#

pnpm build --watch
pnpm inject

#

no only the first time

#

and gotta redo it when discord updates (i think) and when you inject from a different source

charred monolithBOT
austere talon
#

you created an empty plugin file

charred monolithBOT
austere talon
#

enable no devtools warn plugin

#

is ur file named .ts or .tsx

#

you need .tsx

charred monolithBOT
jagged cloak
austere talon
#

HORROR

#

HOW ARE THERE SO MANY

jagged cloak
austere talon
#

was it a 404 or 429

jagged cloak
#

mixed

austere talon
#

429 bad

#

i will increase sleep

jagged cloak
#

yop

#

actually not mixed the 404s are stupid image proxy

jagged cloak
jagged cloak
#

they changed video url hmm

#

no more github raw ig

#

okay github

#

pisscord

charred monolithBOT
austere talon
#

SHOWCONNECTIONS

charred monolithBOT
austere talon
#

explode

charred monolithBOT
austere talon
#

okay just fetched like 30 users no 429

#

but god this is slow

charred monolithBOT
austere talon
#

guh rate limit again

#

well

#

it only happens if u do a ton

#

simply dont

charred monolithBOT
jagged cloak
#

now make it throw random error every update like the aliucord version

austere talon
#

lmfao

#

true

charred monolithBOT
austere talon
#

@lime stone

#

click here

#

then look for the desired property

#

its in rgb by default, if u shift click it you can change format

#

computed tab is really useful

#

in the the normal one it's painful to understand what's going on if there's like 20 rules applying to the element

devout lagoon
austere talon
#

use search

charred monolithBOT
austere talon
#

like this

#

what in the world are your classnames

lime stone
#

@austere talon i just saw the new readme, but i think it would be better like this :3

austere talon
#

LMAO

#

real and true

#

please open a pr to fix this terrible oversight

lime stone
#

how could you miss it

austere talon
#

tbh i do like being slightly more serious because we're not small anymore

#

I feel like having weird spam in the readme will make a lot of people think it's sus xd

lime stone
#

😭

austere talon
#

pretty sure the Join spam was almost initial commit

lime stone
#

please don't become... one of them

austere talon
#

aka baby vencord

lime stone
#

you've ruined it

#

i'm uncommiting all of my commits

austere talon
#

maybe experience with my show connections pr and see which one you like the most? @lime stone

#

seems easier than me showing u a bunch of options xd

#

experience?

#

I meant experiment

lime stone
#

ah

austere talon
lime stone
#

i was confused

austere talon
#

I don't care much about the design so if you have any sort of preference it's best u show how u want it

#

I just yoinked icons from discord and yeah

lime stone
#

i don't think i need to try it because i can see it in my head

#

yeah, freaky

jagged cloak
charred monolithBOT
lime stone
#

hi btw!

#

i recognise you

#

it's easy for you to recognise yourself

#

i recognise myself btw!

#

me too!!

austere talon
#

soon

austere talon
lime stone
#

aww i was going to make up a story

#

:(

#

well i recognise your avatar and name, idk if we interacted

#

oh cool

#

oh ye i kind of remember that

#

but idk how much before that

#

warning though, you might be exiled from moderation

#

hm, that'd be more likely to happen on quilt xD

austere talon
lime stone
#

oh, i mean for using client mods

#

hehe

frail skyBOT
#
Bad Patches

ServerListAPI (had no effect):
ID: 118442
Match: /(Messages\.SERVERS,children:)(.+?default:return null\}\}\)\))/

WebContextMenus (had no effect):
ID: 567068
Match: /(?<=showApplicationCommandSuggestions;)if\(![A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\)/

Bad Starts

None

Discord Errors
font-weight: bold;
color: purple;
 Cannot access 'hfe' before initialization ReferenceError: Cannot access 'hfe' before initialization
    at Module.default (WebpackModule70659:2:50)
    at VencordWeb:12:719
    at VencordWeb:5:8650
    at [vencord.lazy.get] (VencordWeb:5:7013)
    at Tr.<computed> [as get] (VencordWeb:5:7424)
    at Object.handleProtoChange (VencordWeb:33:21354)
    at CONNECTION_OPEN (WebpackModule473419:2:5858)
    at https://discord.com/assets/b7361d105f365bd5222b.js:9334:766
    at https://discord.com/assets/b7361d105f365bd5222b.js:9324:818
    at n (https://discord.com/assets/b7361d105f365bd5222b.js:9334:743)
%c[GatewaySocket] 
font-weight: bold;
color: purple;
 Cannot read properties of undefined (reading 'appearance') TypeError: Cannot read properties of undefined (reading 'appearance')
    at Object.handleProtoChange (VencordWeb:33:21232)
    at CONNECTION_OPEN (WebpackModule473419:2:5858)
    at https://discord.com/assets/b7361d105f365bd5222b.js:9334:766
    at https://discord.com/assets/b7361d105f365bd5222b.js:9324:818
    at n (https://discord.com/assets/b7361d105f365bd5222b.js:9334:743)
    at t._dispatch (https://discord.com/assets/b7361d105f365bd5222b.js:9335:83)
    at https://discord.com/assets/b7361d105f365bd5222b.js:9334:429
    at i.log (https://discord.com/assets/b7361d105f365bd5222b.js:9324:782)
    at t._dispatchWithLogging (https://discord.com/assets/b7361d105f365bd5222b.js:9334:368)
    at t._dispatchWithDevtools (https://discord.com/assets/b7361d105f365bd5222b.js:9333:797) ```
#
Bad Patches

ServerListAPI (had no effect):
ID: 118442
Match: /(Messages\.SERVERS,children:)(.+?default:return null\}\}\)\))/

WebContextMenus (had no effect):
ID: 567068
Match: /(?<=showApplicationCommandSuggestions;)if\(![A-Za-z_$][\w$]*\.[A-Za-z_$][\w$]*\)/

Bad Starts

None

Discord Errors
font-weight: bold;
color: purple;
 Cannot access 'ife' before initialization ReferenceError: Cannot access 'ife' before initialization
    at Module.default (WebpackModule450343:2:50)
    at VencordWeb:12:719
    at VencordWeb:5:8650
    at [vencord.lazy.get] (VencordWeb:5:7013)
    at Tr.<computed> [as get] (VencordWeb:5:7424)
    at Object.handleProtoChange (VencordWeb:33:21354)
    at CONNECTION_OPEN (WebpackModule473419:2:5858)
    at https://canary.discord.com/assets/5317436ce62eab80877e.js:9332:766
    at https://canary.discord.com/assets/5317436ce62eab80877e.js:9322:818
    at n (https://canary.discord.com/assets/5317436ce62eab80877e.js:9332:743)
%c[GatewaySocket] 
font-weight: bold;
color: purple;
 Cannot read properties of undefined (reading 'appearance') TypeError: Cannot read properties of undefined (reading 'appearance')
    at Object.handleProtoChange (VencordWeb:33:21232)
    at CONNECTION_OPEN (WebpackModule473419:2:5858)
    at https://canary.discord.com/assets/5317436ce62eab80877e.js:9332:766
    at https://canary.discord.com/assets/5317436ce62eab80877e.js:9322:818
    at n (https://canary.discord.com/assets/5317436ce62eab80877e.js:9332:743)
    at t._dispatch (https://canary.discord.com/assets/5317436ce62eab80877e.js:9333:83)
    at https://canary.discord.com/assets/5317436ce62eab80877e.js:9332:429
    at i.log (https://canary.discord.com/assets/5317436ce62eab80877e.js:9322:782)
    at t._dispatchWithLogging (https://canary.discord.com/assets/5317436ce62eab80877e.js:9332:368)
    at t._dispatchWithDevtools (https://canary.discord.com/assets/5317436ce62eab80877e.js:9331:797) ```
lime stone
#

maybe you should use more standard class names

#

well, not with random letter afterwards

#

why betterBlockedUsersClass-3l6Xi as opposed to betterBlockedUsersClass?

#

or vc-better-blocked-users

true gullBOT
#

then why are you putting random characters in there husk

#

do vc-pluginname-classname

#

that’s somewhat the standard format

#

the name of the class ioa

#

my face when Tailwind users do not know how to name classes in normal CSS

austere talon
#

i dont think this person uses tailwind

true gullBOT
austere talon
#

oh

grave mangoBOT
#

**index.tsx: **Line 77

<span className="vc-betterblockedusers-button" role="button" tabIndex={0}>Blocked Message</span>
#

**index.tsx: **Line 50

//         default: true
charred monolithBOT
charred monolithBOT
quaint sapphire
#

it is official

#

vencord is now a discord bot library in python

#

@austere talon

austere talon
#

match it

#

it's very situational how you do that so it's not that simple to answer

#

show what the patched code looks like

#

the output code that contains ur patch

#

search for actionBarComponent,{originalComponent in discords code and show that part

#

the part that contains ur patch

#

you probably just need to render originalComponent

#

look at its code then

#

and see what's going on there

charred monolithBOT
quaint sapphire
#

you already have the messages in the props, if I were you I'd re-use discord's message component

#

props.messages.content is an array of the messages

#

you just need to find discord's component for a message and render it

grave mangoBOT
grave mangoBOT
quaint sapphire
#

@main trout

#

my general advice is to just think of what you want to do
and look at other plugins that may do smth similar

jagged cloak
#

update on message notes, turns out using createBotMessage works just as well but somewhere it fails on "blablabla t.IsFirstMessageInForumPost is not a function"
not sure if this is a channel prop or message prop but shrimply adding it and setting it to false doesn't work so kinda been stuck for a while

austere talon
#

wha?

limber skiff
#

when does it fail

austere talon
#

not fully following blehhhhhh

limber skiff
#

after you call createBotMessage?

austere talon
#

what r u making

devout lagoon
#

he's trying to make a thing that does a thing when another thing happens, but when he tries to run the thing, it errors with "blablabla thing is not a function"

#

so yeah the thing isnt working

charred monolithBOT
quaint sapphire
#

instead of "can you show code?"

#

its as if you are always judging us

austere talon
#

i didnt understand what they were saying cause what's message notes supposed to be

#

asking for code instead of for what specifically is being made would feed into https://xyproblem.info/

quaint sapphire
#

you make it sound as if you would help find a solution

charred monolithBOT
austere talon
#

ci borked

quaint sapphire
#

I am not denying that

#

but ven never helps with the code part

austere talon
#

thats just not true?

#

i review every single pr, provide suggestions, help people find modules / the right code, etc

charred monolithBOT
quaint sapphire
#

your "help" is always going to the direction of "your approach is wrong, use another one"

#

even if that is not technically true all of the time

#

you ask questions, and most of the time you disappear when someone answers

#

dunno if you only do that with me, if it is personal, or thats just how you are

#

but 90% of the time I seek help, you basically shrug me off and tell me to just look for the answer myself

quaint sapphire
#

you only make questions and help the other person ask the "right" (in ur opinion) question

#

which will not accomplice what you want
you either have to patch the component itself rather than use it
or re-make it from scratch (by using the ChannelMessage component that I linked)

grave mangoBOT
#

**Status.tsx: **

import { FC } from "react";
import { useLanyard } from "react-use-lanyard";

const Status: FC = () => {
    const { loading, status } = useLanyard({
        userId: "694604709591384226",
        socket: true,
    });

    const getColor = () => {
        switch (status?.discord_status) {
            case "online":
                return {
                    status: "online",
                    color: "text-green-600",
                };
            case "idle":
                return {
                    status: "idle",
                    color: "text-yellow-700",
                };
            case "dnd":
                return {
                    status: "busy",
                    color: "text-red-700",
                };
            default:
                return {
                    status: "offline",
                    color: "text-grey-500",
... (35 lines left)
charred monolithBOT
limber skiff
#

I can barely understand what you want to approach

charred monolithBOT
quaint sapphire
limber skiff
#

no thundxr

quaint sapphire
#

or IThundxr

#

he wants to make the blocked section look pretty by replacing the bar and stuff

#

iirc he already made it look pretty in his PR

#

but the only missing thing is the messages not being rendered

#

since they are replaced by his component

limber skiff
#

oh

quaint sapphire
#

I am free to VC once again if you want help

charred monolithBOT
limber skiff
#

not related but

#

did an AI do this

austere talon
#

you honestly should learn basic react in a normal project before attempting to mod discord

quaint sapphire
#

other than the css variables (--) the linter will shout at you for using -ms-flex and stuff

austere talon
#

otherwise you're not gonna have a great time

quaint sapphire
#

use normal flex

quaint sapphire
austere talon
quaint sapphire
#

but eslint does shout for vendor specific css

austere talon
#

there are only very few non standard properties where you need to use -webkit prefix

#

lmao dont copy paste discord css

#

if u want their styles, use their components / classes

quaint sapphire
# limber skiff

I love it when people overwrite a style property multiple times in the same block

limber skiff
#

I mean, ven response did tell exactly what you needed to do

quaint sapphire
#
let a = 5;
a = 4;
a = 2;

// why is "a" 2 and not 5?
limber skiff
#

render the original component

#

what was the issue?

limber skiff
#

yes it did

quaint sapphire
#

either patch (not replace) the original component, or re-make it using what it uses

#

otherwise the plugin would achieve nothing

limber skiff
#

1 sec

quaint sapphire
#

why use the original component? what would be the point of replacing it then?

#

i hope you can realize this

limber skiff
#

as I said, 1 sec

#

oh well

#

how do I checkout the pr it's on the main branch

#

you should not make pull requests in the main branch

#

make a new one for it

quaint sapphire
#

rename the main branch of IThundxr

#

and rename urs back to main

limber skiff
#

cant cuz I'm using my fork lol

quaint sapphire
#
git branch -M mmain
git remote add IThundxr https://...
git fetch IThundxr
git switch main
git branch -M IThundxr
git switch mmain
git branch -M main
git switch IThundxr
#

pain, I know

#

(assuming you don't have the upstream main branch as well)

limber skiff
#

I got it already thanks

austere talon
limber skiff
#

is this what you want

austere talon
#

it's likely that it has some sort of state isExpanded

#

you could just change that to always be true and use css to hide the extra stuff then render it

limber skiff
#

ah

quaint sapphire
#

his advice is as helpful as "mess around to find out"

#

which works well for me, but to a new person that would be an overload of information to do that

#

react dev tools

#

and then jump to the sources tab using it

#

add a breakpoint

charred monolithBOT
quaint sapphire
#

cause it to re-render the element

#

reach the breakpoint

#

etc etc

austere talon
charred monolithBOT
limber skiff
limber skiff
#

whew

#

this is bad

#

message component is not exported

#

and there's 2 of them

#

one for thread starter message

#

one for normal

austere talon
#

we love discord

#

discord trying not to write separate components for every minor difference

limber skiff
#

yes

#

dont worry I gotchu u

austere talon
#

this is the blocked message component

#

if u hardcode this to true instead of y (y = isExpanded)

#

it will always show the collapsed content

#

then you can use css to hide this bit

#

the 1 blocked message header

limber skiff
#

ven used brain

#

I was going to get the component and render it myself tonguecat

#

nono

#

you need to patch it

austere talon
#

then u can hide this part of the component with css like i said

limber skiff
#

you also need to render the original component

austere talon
limber skiff
#

ugh

#

wrong button

austere talon
#

why do people want split large messages so badly

#

r u sending beemovie inside discord or what

stark flint
#

also why not just use upload as file

quaint sapphire
#

@main trout

export default definePlugin({
    name: "Better Blocked Messages",
    description: "this changes blocked messages to be cleaner and better \n\n\nThanks to ArjixWasTaken for the patches code",
    authors: [Devs.IThundxr],
    // settings,
    patches: [{
        find: "isBeforeGroup:",
        replacement: {
            match: /(function \w+\(\w\)\{var \w=\w\.expanded,\w=\w\.onClick,\w=\w\.count,\w=\w\.compact.{1,5}\.collapsedReason;return\(0,\w\.jsx\)\(\w+\.Z,{.*?childrenMessageContent:\(0,\w\.jsx\)\()\w+\.Z,/,
            replace: (_, head) => `${head}$self.actionBarComponent,`
        }
    }],

    actionBarComponent(props: { children: React.ReactNode[]; compact: boolean; }) {
        console.log("ayo??", props);

        return (
            <div>{props.children}</div>
        );
    },

    start() {
        enableStyle(style);
    },

    stop() {
        disableStyle(style);
    }
});

should bring you closer to what you want

limber skiff
#

@austere talon really just nitpicks

#

your plugin is very clean

#

I love it

quaint sapphire
#

it replaces the old one

#

well, that is technically correct

#

I only return props.children bc I don't have anything else to return tho

#

thats ur part of the task

#

actually you can shorten the patch to

patches: [{
        find: "isBeforeGroup:",
        replacement: {
            match: /(\.collapsedReason;return\(0,\w\.jsx\)\(\w+\.Z,{.*?childrenMessageContent:\(0,\w\.jsx\)\()\w+\.Z,/,
            replace: (_, head) => `${head}$self.actionBarComponent,`
        }
    }],
#

(I am talking about the regex)

woeful sable
#

for the plugin

#

could there be a setting added so we don't have to hold shift to delete a message

limber skiff
#

doesnt make much sense to be inside that plugin

#

the name has nothing related to it

woeful sable
#

I mean since its showing all buttons on a message why not?

#

making a serperate plugin would be a waste ig

woeful sable
#

what

radiant reef
#

eh

#

in case

woeful sable
#

true

limber skiff
woeful sable
#

then what they said

radiant reef
#

UPS

#

I accidentally deleted the message

#

πŸ₯Ή

charred monolithBOT
knotty sentinel
#

favorite tabs

#

middle click a channel to open in new tab

verbal pumice
charred monolithBOT
knotty sentinel
#

maybe folders like on google chrome tabs

#

but there's already guild folders

charred monolithBOT
woeful sable
#

Ayo Vencord creators! What's your idea of what to add to the "ChannelTabs" plugin from betterdiscord?

stark flint
#

there's a PR in the works i believe

woeful sable
#

oh god..

stark flint
#

?

charred monolithBOT
austere talon
#

dude I've been getting so many [Vendicated/Vencord] emails from github that my email service started marking them all as spam

quaint sapphire
#

why do you have it set up to send notifications there?

#

(says me whilst also doing the same)

austere talon
#

cause I like staying up to date

quaint sapphire
#

you dont use the mobile github app?

austere talon
#

I don't check github notifications

austere talon
quaint sapphire
#

its great for notifications

#

and finding new repos

austere talon
#

I use email & discord webhook for notifications

quaint sapphire
#

but not for viewing code ofc

jagged cloak
#

u will use gloom trolleyzoom

quaint sapphire
#

gloom not ready yet tho

jagged cloak
#

make it ready

austere talon
#

finish glooom @jagged cloak

jagged cloak
#

nopp tell zt

austere talon
#

lol

#

I don't use Gmail tho

austere talon
dull stratus
#

pleas help donwload

#

vencord

verbal pumice
#

support simply does not exist for this guy

stark flint
austere talon
#

we will make it like the aur "captcha"

#

to get access you need to run a snippet in the console and paste the output

#

a bot will give you access if its the correct thing

lime stone
#

make it a test for bots

#

so that only bots have access

#

there, perfect :3

swift fjord
charred monolithBOT
radiant reef
#

Bla bla bla bla

austere talon
#

Patch

quaint sapphire
#

I don't think that's it

#

wrong question

#

sighs

#

one sec

#

lemme pull your commits

royal bane
#

java js code

#

what word was discord

#

how do you ev

#

nevermind

quaint sapphire
#

is this ur "pretty" line?

#

why always expanded?

#
actionBarComponent(props: { children: React.ReactNode[]; compact: boolean; }) {
    if (!props) return null;

    // @ts-expect-error
    const onClick = props?.children?.props?.children?.find(c => c.props && c.props.role === "button" && c.props.onClick !== undefined)?.props?.onClick as () => void;

    return (
        <div>
            <div className="vc-betterblockedusers-main" id="---blocked-message-bar" role="separator">
                <span className="vc-betterblockedusers-divider">
                    <svg className="vc-betterblockedusers-svg" aria-hidden="true" role="img" width="8" height="13" viewBox="0 0 8 13">
                        <path className="vc-betterblockedusers-color" stroke="currentColor" fill="transparent" d="M8.16639 0.5H9C10.933 0.5 12.5 2.067 12.5 4V9C12.5 10.933 10.933 12.5 9 12.5H8.16639C7.23921 12.5 6.34992 12.1321 5.69373 11.4771L0.707739 6.5L5.69373 1.52292C6.34992 0.86789 7.23921 0.5 8.16639 0.5Z"></path>
                    </svg>
                    <span className="vc-betterblockedusers-button" role="button" tabIndex={0}>Blocked Message</span>
                </span>
            </div>
            <button onClick={onClick}>Show</button>
        </div>
    );
},
#

there you go

#

how did you think discord changed the isExpanded value?

#

ofc with a callback

#

all you had to do was find the callback

austere talon
quaint sapphire
#

wdym horrible? it uses discord's callback

austere talon
#

match the state within your patch or replace it entirely with your own check

quaint sapphire
#

a patch could expose the callback if you think that is better

#

but it is as horrible (in your opinion)

#

are you talking about the way I find the callback?

charred monolithBOT
quaint sapphire
#

fine

#

found a better way

#
export default definePlugin({
    name: "Better Blocked Messages",
    description: "this changes blocked messages to be cleaner and better \n\n\nThanks to ArjixWasTaken for the patches code",
    authors: [Devs.IThundxr],
    // settings,
    patches: [{
        find: "isBeforeGroup:",
        replacement: {
            match: /(\.collapsedReason;return\(0,\w\.jsx\)\(\w+\.Z,{.*?childrenMessageContent:\(0,\w\.jsx\)\()\w+\.Z,{/,
            replace: (_, head) => `${head}$self.actionBarComponent,{...arguments[0],`
        }
    }],

    actionBarComponent(props: {
        onClick: () => void;
        expanded: boolean;
        count: number;
        compact: boolean;
        collapsedReason: unknown;
    }) {
        if (!props) return null;
        const { onClick } = props;

        // const { showingAllowed } = settings.use(["showingAllowed"]);

        return (
            <div>
                <div className="vc-betterblockedusers-main" id="---blocked-message-bar" role="separator">
                    <span className="vc-betterblockedusers-divider">
                        <svg className="vc-betterblockedusers-svg" aria-hidden="true" role="img" width="8" height="13" viewBox="0 0 8 13">
                            <path className="vc-betterblockedusers-color" stroke="currentColor" fill="transparent" d="M8.16639 0.5H9C10.933 0.5 12.5 2.067 12.5 4V9C12.5 10.933 10.933 12.5 9 12.5H8.16639C7.23921 12.5 6.34992 12.1321 5.69373 11.4771L0.707739 6.5L5.69373 1.52292C6.34992 0.86789 7.23921 0.5 8.16639 0.5Z"></path>
                        </svg>
                        <span className="vc-betterblockedusers-button" role="button" tabIndex={0}>Blocked Message</span>
                    </span>
                </div>
                <button onClick={onClick}>Show</button>
            </div>
        );
    },

    start() {
        enableStyle(style);
    },

    stop() {
        disableStyle(style);
    }
});
#

@main trout

#

?

#

onClick={onClick} is the magic part

#

impossible

austere talon
#

it does work

#

if your onClick doesn't fire that means there is an element higher up the element tree that handles clicks

#

also turning random html elements into buttons is very bad for semantics

#

i would always try to use semantic elements

#

aka use an actual button for buttons

austere talon
#
<button className="myButton">Blocked Message</button>

<style>
  .myButton {
    /* unset EVERY css property, this is the magic that makes it not an ugly button */
    all: unset;
    /* restore the interactive cursor on hover */
    cursor: pointer;
  }

  /* adding a :focus style back is important so keyboard users can tell this element is focused, all: unset removes the default one */
  .myButton:focus {
    outline: 1px solid someColor;
  }
</style>
charred monolithBOT
quaint sapphire
#

z-index cannot move a child element outside of a parent element

#

It can only affect sibling elements