@use 'sass:string';
@use 'sass:list';
@use 'sass:map';
@use 'sass:meta';

////////////////////
/// VERY IMPORTANT INFO FOR SEARCHING OR ADDING CLASS NAMES
/// Remove the preceding dot before the class name!
/// The function below adds that before CSS generation and thus is not needed
/// Also if you've forked the original project, please commit to it upstream
////////////////////

/// Get a class from the Classes Map. Code stolen entirely from Zerthox.
/// Changes to Zerthox's code:
/// Class list lacks proceeding dot to allow for quick html element copy class list.
/// Aliasing. You can start a string with "alias " and fill the rest out as if it was #{c(STRING HERE)}.
/// Lists. You can uses lists for multiple classes to preform the same function. You can use [bracketed lists] for :where() and non-bracketed for :is().
/// Minor SCSS syntax changes.
/// Dirty trace. Add a ! to the start of a class to get the used location(s).
/// Checks for sub-maps and throws error if that's true.
/// Checks for a hash at front and spits out an ID rather than a class.
///
/// NOTE: Deprecated listings have @ at the start and cannot be combined with the dirty trace.
/// It is strongly advised to use a different class, usually in a comment beside the class.
/// Certain aliases may also be deprecated in the future.
@function class($query, $alias: false) {
  $class: $classes;
  @each $el in $query {
    $class: map.get($class, '#{$el}');
    @if not $class {
      @if $alias {
        @error "Unknown alias \"#{$el}\" in category: #{$query}. Please fix the classes list.";
      } @else {
        @error "Unknown class or ID \"#{$el}\" in category: #{$query}. Was the classes file not saved?";
      }
    }
  }
  @if meta.type-of($class) == map {
    @error "Map used as input: #{$query}. Please fix and try again.";
  }
  @if meta.type-of($class) == string {
    @return checkString($class, $alias);
  } @else if meta.type-of($class) == list {
    // stuff for list would go here
    $list: ':';
    @if list.is-bracketed($class) {
      $list: $list + 'where(';
    } @else {
      $list: $list + 'is(';
    }
    @each $item in $class {
      $list: $list + checkString($item, $alias) + ',';
    }
    $list: string.slice($list, 1, -2) + ')'; // remove comma at end and add closing bracket
    @return $list;
  }
}

@function checkString($class, $alias: false) {
  // debug locator string thingy
  @if string.slice($class, 1, 1) == '!' or string.slice($class, 1, 1) == '@' {
    @if string.slice($class, 1, 1) == '!' {
      @warn "[DEBUG] The class, \"#{$class}\", was used.";
    } @else if string.slice($class, 1, 1) == '@' {
      @warn "[DEPRECATED] The specific selector used for \"#{$class}\" is deprecated and may be removed in the future.";
    }
    $class: string.slice($class, 2, -1);
  }
  @if string.slice($class, 1, 1) == '.' {
    @error "Dot at start of string within list. Please fix and try again.";
  }
  @if string.slice($class, 1, 6) == 'alias ' {
    // force error on already tested aliases to prevent loops
    @if $alias == true {
      @error "Issue caused by \"#{$class}\". Do not point aliases to other aliases as to prevent loops. Please fix this and try again.";
    }
    $aliasList: (); // create fake list to be thrown into function again
    $aliasQuery: string.slice($class, 7, -1); // remove `alias ` from query
    $spaceIndex: string.index($aliasQuery, $substring: ' '); // finds first space
    @while $spaceIndex != null {
      $item: string.slice($aliasQuery, 1, $spaceIndex - 1);
      $aliasQuery: string.slice($aliasQuery, $spaceIndex + 1, -1);
      $aliasList: list.append($aliasList, $item, space);
      $spaceIndex: string.index($aliasQuery, $substring: ' '); // if not found this declared null
    }
    $aliasList: list.append($aliasList, $aliasQuery, space); // adds last item after @while
    @return #{class($aliasList, $alias: true)}; // thrown back into the class list as the new query
  }
  @if string.slice($class, 1, 1) == '#' {
    @return $class;
  } @else {
    @return '.' + $class;
  }
}

///extreme lazy shorthand with capital just in case
@function c($query, $alias: false) {
  @return class($query, $alias);
}
@function C($query, $alias: false) {
  @return class($query, $alias);
}

/// dump literally every class for debug
// todo for this: make sure to escape \ as \\ on export
// todo for this: ensure aliases actually work; just don't dump them into the list
@function debug_dump_all_classes_yes_i_am_sure() {
  $fullClassList: '';
  $l: $classes;
  @each $item in $l {
    // nth($item,1); // category name
    // type-of(nth($item,2)); // whole map
    @each $subitem in list.nth($item, 2) {
      // $subitem should always be a list, don't question it.
      $fullClassList: $fullClassList + debug_dump_all_classes_in_list('', list.nth($subitem, 2));
    }
  }
  // @debug $fullClassList;
  @return $fullClassList;
}
@function debug_dump_all_classes_in_list($strOfClasses, $listToDump) {
  $classesFromList: '';
  @each $class in $listToDump {
    // @debug type-of($class) "|" $class;
    @if meta.type-of($class) == string {
      $checkString: debug_checkString($class);
      @if $checkString != '' {
        $classesFromList: $classesFromList + $checkString + '\A';
      }
    } @else if meta.type-of($class) == list {
      // @debug "it's a list.";
      // skip first item since that'll be for the list identifier
      $classesFromList: $classesFromList + debug_dump_all_classes_in_list($classesFromList, list.nth($class, 2));
    }
  }
  @return $classesFromList;
}
@function debug_checkString($class) {
  @if string.slice($class, 1, 1) == '!' or string.slice($class, 1, 1) == '@' {
    @if string.slice($class, 1, 1) == '@' {
      @warn "[DEPRECATED] The specific selector used for \"#{$class}\" is deprecated and may be removed in the future.";
    }
    $class: string.slice($class, 2, -1); // remove `!` or `@`
  }
  @if string.slice($class, 1, 1) == '.' {
    @return ''; // despite this actually intending to throw an error, it's better to skip them outright.
  }
  @if string.slice($class, 1, 6) == 'alias ' {
    @return ''; // ignore all aliases
  }
  @if string.slice($class, 1, 1) == '#' {
    @return $class;
  } @else {
    @return '.' + $class;
  }
}
@function debug_dump_all_aliases_yes_i_am_sure() {
  $fullClassList: '';
  $l: $classes;
  @each $item in $l {
    // nth($item,1); // category name
    // type-of(nth($item,2)); // whole map
    @each $subitem in list.nth($item, 2) {
      // $subitem should always be a list, don't question it.
      $fullClassList: $fullClassList + debug_dump_all_aliases_in_list('', list.nth($subitem, 2));
    }
  }
  // @debug $fullClassList;
  @return $fullClassList;
}
@function debug_dump_all_aliases_in_list($strOfClasses, $listToDump) {
  $classesFromList: '';
  @each $class in $listToDump {
    // @debug type-of($class) "|" $class;
    @if meta.type-of($class) == string {
      $checkString: debug_checkString_alias($class);
      @if $checkString != '' {
        $classesFromList: $classesFromList + $checkString + '\A';
      }
    } @else if meta.type-of($class) == list {
      // @debug "it's a list.";
      // skip first item since that'll be for the list identifier
      $classesFromList: $classesFromList + debug_dump_all_aliases_in_list($classesFromList, list.nth($class, 2));
    }
  }
  @return $classesFromList;
}
@function debug_checkString_alias($class, $alias: false) {
  @if meta.type-of($class) == list {
    $allClasses: $classes;
    @each $item in $class {
      $allClasses: map.get($allClasses, '#{$item}');
      @if not $allClasses {
        @if $alias {
          @error "Unknown alias \"#{$item}\" in category: #{$class}. Please fix the classes list.";
        } @else {
          @error "Unknown class or ID \"#{$item}\" in category: #{$class}. Was the classes file not saved?";
        }
      }
    }
    $class: $allClasses;
  }
  @if meta.type-of($class) == string {
    @if string.slice($class, 1, 1) == '!' {
      $class: string.slice($class, 2, -1); // remove `!`
    }
    @if string.slice($class, 1, 1) == '.' {
      @return ''; // despite this actually intending to throw an error, it's better to skip them outright.
    }
    @if string.slice($class, 1, 6) == 'alias ' {
      // force error on already tested aliases to prevent loops
      @if $alias == true {
        @error "Issue caused by \"#{$class}\". Do not point aliases to other aliases as to prevent loops. Please fix this and try again.";
      }
      $aliasList: (); // create fake list to be thrown into function again
      $aliasQuery: string.slice($class, 7, -1); // remove `alias ` from query
      $spaceIndex: string.index($aliasQuery, $substring: ' '); // finds first space
      @while $spaceIndex != null {
        $item: string.slice($aliasQuery, 1, $spaceIndex - 1);
        $aliasQuery: string.slice($aliasQuery, $spaceIndex + 1, -1);
        $aliasList: list.append($aliasList, $item, space);
        $spaceIndex: string.index($aliasQuery, $substring: ' '); // if not found this declared null
      }
      $aliasList: list.append($aliasList, $aliasQuery, space); // adds last item after @while
      // @debug $aliasList;
      @return #{debug_checkString_alias($aliasList, $alias: true)}; // thrown back into the class list as the new query
    }
  }
  @if $alias == true {
    @if string.slice($class, 1, 1) == '#' {
      @return $class;
    } @else {
      @return '.' + $class;
    }
  } @else {
    @return ''; // return empty for non-aliases.
  }
}

////////////////
// IT SHOULD BE WORTH NOTING:
// EACH CATEGORY NAME IS ARBITRARY AND AS SUCH MULTIPLE CLASSES ARE SHARED BETWEEN AREAS.
// WHEN CONVERTING YOUR OWN THEME TO THIS LIST, WHAT CATEGORY EACH CLASS FALLS UNDER MAY BE UNUSUAL, THIS INDICATES A SHARED CLASS BETWEEN AREAS.
// CURRENT CATEGORY NAME IS MORE OR LESS WHAT AREA OF PYRITE WAS THEMED AT THE TIME.
// IF AN ELEMENT HAS MULTIPLE CLASSES, TRY ALL OF THEM AS ONLY ONE WAS LIKELY USED WHEN THEMING.
// EACH LINE OF DISCORD'S BASE CSS SEEMS TO BE RELATED TO ONE PART OF THE SITE, EACH LONE NUMBER IS A REFERENCE TO THAT LINE AND IS BASED ON THE CSS FILE LINKED NEARBY.
// BROAD CLASSES SUCH AS THOSE THAT APPLY IN MULTIPLE UNRELATED AREAS (ie directionRow_*) ARE NOT CURRENTLY LISTED HERE AND IF THEY ARE THE LABEL IS WORSE THAN USELESS.
// THIS LIST IS NOT AND NEVER WILL BE 100% COMPLETE AS CLASSES CHANGE CONSTANTLY, THINGS GET ADDED OR REMOVED AND DISCORD IS AN ABSOLUTE PAIN TO DEAL WITH.
////////////////

$classes: (
  'main': (
    // This top one is for things without any spammy suffixes or more important things.
    'appMount': 'appMount__51fd7',
    'appContainer': 'app_a3002d',
    // on the same line as appContainer
    'appAsidePanelWrapper': 'appAsidePanelWrapper_a3002d',
    'mobileAppAsidePanelWrapper': 'mobileAppAsidePanelWrapper_a3002d',
    'notAppAsidePanel': 'notAppAsidePanel_a3002d',
    'mobileApp': 'mobileApp_a3002d',
    'allowsScrolling': 'allowsScrolling_bd26cc',

    'appInner': 'app__160d8',
    // this one shakes
    'layers': 'layers__160d8',

    // all on same line
    'animating': 'animating__960e4',
    'baseLayer': 'baseLayer__960e4',
    'bg': 'bg__960e4',
    'appLayer': 'layer__960e4',
    'appLayers': 'layers__960e4',

    'backdrop': 'backdrop__78332',
    'backdropWithLayer': 'withLayer__78332',

    // Themes
    'themeLight': 'theme-light',
    'themeDark': 'theme-dark',
    'themeDarker': 'theme-darker',
    // visual refresh has option for darker. class is added to html.theme-dark
    'themeMidnight': 'theme-midnight',
    // visual refresh has option for midnight. class is added to html.theme-dark
    'themeBrand': 'theme-brand',
    // no idea where this is used; does not appear using secret color theme
    'customTheme': 'custom-theme-background',
    'themeColorPicker': 'client-theme-color-picker',

    // Settings > Appearance > select any "color theme".
    // Images
    'imagesLight': 'images-light',
    'imagesDark': 'images-dark',

    'mouseMode': 'mouse-mode',
    'keyboardMode': 'keyboard-mode',
    'focused': 'app-focused',
    'layerContainer': 'layerContainer_da8173',
    'container': 'container_c48ade',
    'content': 'content_c48ade',
    'layer': 'layer_da8173',
    'mediaEngineVideo': 'media-engine-video',
    // class found within JS
    'base': 'base_c48ade',
    'baseContent': 'content_c48ade',
    // same line as base
    'page': 'page_c48ade',
    'pictureInPicture': 'pictureInPicture__6341f',
    'pictureInPictureWindow': 'pictureInPictureWindow__6341f',
    'anchorLink': 'anchor_edefb8',
    'anchorLinkUnderlineOnHover': 'anchorUnderlineOnHover_edefb8',
    'desaturate': 'desaturate_c7819f',

    'wanderingCubes': 'wanderingCubes__46696',
    'wanderingCubesItem': 'item__46696',
    'spinner': 'spinner__46696',
    'spinnerCircle': 'spinningCircle__46696',
    'spinnerCircleInner': 'spinningCircleInner__46696',
    'spinnerCirclePath': 'path__46696',
    'spinnerCirclePath3': 'path3__46696',
    'spinnerPulsingEllipsisPopout': 'spinner_e90879',
    'spinnerPulsingEllipsis': 'pulsingEllipsis__46696',

    // has a filter relating to the saturation factor variable
    'loader': 'loader_c48ade',

    // probably used elsewhere but 100% used for loading "Browse Channels" for the first time during a session.
    'focusRing': 'focus-rings-ring',

    // tab around to see this, other extra classes may appear in other areas.
    // Visual Refresh stuff
    'visualRefresh': 'visual-refresh',

    // no idea what these classes are about
    'backgroundOpacity': (
        'low': 'background-opacity-low',
        'medium': 'background-opacity-medium',
        'high': 'background-opacity-high',
      ),

    // for things like font scaling and a11y.
    'options': (
        // appearance > chat font scaling slider
        'fontSize': (
            '12': 'font-size-12',
            '14': 'font-size-14',
            '15': 'font-size-15',
            '16': 'font-size-16',
            // default option
            '18': 'font-size-18',
            '20': 'font-size-20',
            '24': 'font-size-24',
          ),

        // appearance > space between message group slider
        'messageSpacing': (
            '0': 'group-spacing-0',
            // default for compact
            '4': 'group-spacing-4',
            '8': 'group-spacing-8',
            '16': 'group-spacing-16',
            // default for cosy
            '24': 'group-spacing-24',
          ),

        // a11y
        'desaturateUserColors': 'desaturate-user-colors',
        // A11y > "Apply to custom colour choices" for saturation slider
        'decorateLinks': 'decorate-links',
        // A11y > "Always underline links"
        'fullMotion': 'full-motion',
        // A11y > "enable reduced motion" unticked
        'reduceMotion': 'reduce-motion',
        // A11y > "enable reduced motion" ticked
      ),
  ),

  'experiments': (
    'fastFollowsRefresh': (
      'refreshGuildBg': 'refresh-fast-follow-guild-bg',
    ),
  ),

  'input': (
    'wrapper': 'wrapper__3412a',

    'container': 'container__0f084',
    'input': 'input__0f084',
    'focused': 'focused__0f084',
  ),
  'checkbox': (
    // checkboxes
    'wrapper': 'checkboxWrapper__09aca',
    'wrapperDisabled': 'checkboxWrapperDisabled__09aca',
    'checkbox': 'checkbox__09aca',
    'checked': 'checked__09aca',

    // input stuffs
    'input': 'input__09aca',
    'inputDefault': 'inputDefault__09aca',
    'inputDisabled': 'inputDisabled__09aca',
    'inputReadonly': 'inputReadonly__09aca',

    // shapes
    'round': 'round__09aca',
    'box': 'box__09aca',
    'smallBox': 'smallBox__09aca',

    // labels
    'label': 'label__09aca',
    'labelClickable': 'labelClickable__09aca',
    'labelDisabled': 'labelDisabled__09aca',
    'labelForward': 'labelForward__09aca',
    'labelReversed': 'labelReversed__09aca',

    'row': 'row__09aca',
    'alignTop': 'alignTop__09aca',
    'alignCenter': 'alignCenter__09aca',
  ),

  'switch': (
    'container': 'container__3f21e',
    'slider': 'slider__3f21e',
    'checked': 'checked__3f21e',
    'disabled': 'disabled__3f21e',
    'input': 'input__3f21e',
  ),

  'radio': (
    'item': 'item__1bda4',
    'itemDisabled': 'disabled__1bda4',
    'bar': 'radioBar__1bda4',
    'barInfo': 'info__1bda4',
    'iconForeground': 'radioIconForeground__1bda4',
    'indicatorChecked': 'radioIndicatorChecked__1bda4',
    'refreshIconFill': 'refreshIconFill__1bda4',
    'refreshIconStroke': 'refreshIconStroke__1bda4',
    'refreshIcon': 'refreshIcon__1bda4',
  ),

  'slider': (
    'slider': 'slider_a562c8',
    'mini': 'mini_a562c8',
    'bar': 'bar_a562c8',
    'barFill': 'barFill_a562c8',
    'grabber': 'grabber_a562c8',
    'disabled': 'disabled_a562c8',
    'track': 'track_a562c8',
    'mark': 'mark_a562c8',
    'markAbove': 'markAbove_a562c8',
    'markBelow': 'markBelow_a562c8',
    'markValue': 'markValue_a562c8',
    'markDash': 'markDash_a562c8',
    'markDashSimple': 'markDashSimple_a562c8',
    'defaultValue': 'defaultValue_a562c8',
  ),

  'pagination': (  
    // page control buttons
    // found in search and shop (browse)  
    'pageControlContainer': 'pageControlContainer_c15210',
    'pageControl': 'pageControl_c15210',
    'pageButton': 'pageButton_c15210',
    'activeButton': 'activeButton_c15210',
    'endButton': 'endButton_c15210',
  ),

  'text': (
    // These are within the same group but not with the rest. not sure where to put these
    'textNormalDefaultColor': 'defaultColor__4bd52',
    'lineClamp1': 'lineClamp1__4bd52',
    'lineClamp2Plus': 'lineClamp2Plus__4bd52',
    'selectableText': 'selectable__4bd52',
    'tabularNumbers': 'tabularNumbers__4bd52',

    'headerPrimaryDefaultColor': 'defaultColor__5345c',

    // named similarly to class above, also no idea where to put this
    // Due to the sheer amount of repeated usage of the format below...
    // I strongly advise against using these classes.
    // Yes, there really are 10 different classes in the complete css class scrape as of 2024-09-19.
    // I would've put a generator function of sorts in but find+replace tool wouldn't have found that
    'code': 'code_f9d828' 'code_a8af02' 'code__4ed1a' 'code_a39fe9' 'code_aabef9' 'code_c23051' 'code_cf4812' 'code_b717a1' 'code_df8943' 'code_ec1c2d',
    'fontScaling': 'fontScaling_f9d828' 'fontScaling_a8af02' 'fontScaling__4ed1a' 'fontScaling_a39fe9' 'fontScaling_aabef9' 'fontScaling_c23051' 'fontScaling_cf4812' 'fontScaling_b717a1' 'fontScaling_df8943' 'fontScaling_ec1c2d',
    'eyebrow': 'eyebrow_f9d828' 'eyebrow_a8af02' 'eyebrow__4ed1a' 'eyebrow_a39fe9' 'eyebrow_aabef9' 'eyebrow_c23051' 'eyebrow_cf4812' 'eyebrow_b717a1' 'eyebrow__2b1f5' 'eyebrow_a7acae',
    'display': (
      'sm': 'display-sm_f9d828' 'display-sm_a8af02' 'display-sm__4ed1a' 'display-sm_a39fe9' 'display-sm_aabef9' 'display-sm_c23051' 'display-sm_cf4812' 'display-sm_b717a1' 'display-sm_df8943' 'display-sm_ec1c2d',
      'md': 'display-md_f9d828' 'display-md_a8af02' 'display-md__4ed1a' 'display-md_a39fe9' 'display-md_aabef9' 'display-md_c23051' 'display-md_cf4812' 'display-md_b717a1' 'display-md_df8943' 'display-md_ec1c2d',
      'lg': 'display-lg_f9d828' 'display-lg_a8af02' 'display-lg__4ed1a' 'display-lg_a39fe9' 'display-lg_aabef9' 'display-lg_c23051' 'display-lg_cf4812' 'display-lg_b717a1' 'display-lg_df8943' 'display-lg_ec1c2d',
    ),
    'heading': (
      'sm': (
        'normal': 'heading-sm\/normal_cf4812',
        'medium': 'heading-sm\/medium_cf4812',
        'semibold': 'heading-sm\/semibold_cf4812',
        'bold': 'heading-sm\/bold_cf4812',
        'extrabold': 'heading-sm\/extrabold_cf4812',
      ),
      'md': (
        'normal': 'heading-md\/normal_cf4812',
        'medium': 'heading-md\/medium_cf4812',
        'semibold': 'heading-md\/semibold_cf4812',
        'bold': 'heading-md\/bold_cf4812',
        'extrabold': 'heading-md\/extrabold_cf4812',
      ),
      'lg': (
        'normal': 'heading-lg\/normal_cf4812',
        'medium': 'heading-lg\/medium_cf4812',
        'semibold': 'heading-lg\/semibold_cf4812',
        'bold': 'heading-lg\/bold_cf4812',
        'extrabold': 'heading-lg\/extrabold_cf4812',
      ),
      'xl': (
        'normal': 'heading-xl\/normal_cf4812',
        'medium': 'heading-xl\/medium_cf4812',
        'semibold': 'heading-xl\/semibold_cf4812',
        'bold': 'heading-xl\/bold_cf4812',
        'extrabold': 'heading-xl\/extrabold_cf4812',
      ),
      'xxl': (
        'normal': 'heading-xxl\/normal_cf4812',
        'medium': 'heading-xxl\/medium_cf4812',
        'semibold': 'heading-xxl\/semibold_cf4812',
        'bold': 'heading-xxl\/bold_cf4812',
        'extrabold': 'heading-xxl\/extrabold_cf4812',
      ),
      'deprecated12': (
        'normal': 'heading-deprecated-12\/normal_f9d828' 'heading-deprecated-12\/normal_a8af02' 'heading-deprecated-12\/normal__4ed1a' 'heading-deprecated-12\/normal_a39fe9' 'heading-deprecated-12\/normal_aabef9' 'heading-deprecated-12\/normal_c23051' 'heading-deprecated-12\/normal_cf4812' 'heading-deprecated-12\/normal_b717a1' 'heading-deprecated-12\/normal_df8943' 'heading-deprecated-12\/normal_ec1c2d',
        'medium': 'heading-deprecated-12\/medium_f9d828' 'heading-deprecated-12\/medium_a8af02' 'heading-deprecated-12\/medium__4ed1a' 'heading-deprecated-12\/medium_a39fe9' 'heading-deprecated-12\/medium_aabef9' 'heading-deprecated-12\/medium_c23051' 'heading-deprecated-12\/medium_cf4812' 'heading-deprecated-12\/medium_b717a1' 'heading-deprecated-12\/medium_df8943' 'heading-deprecated-12\/medium_ec1c2d',
        'semibold': 'heading-deprecated-12\/semibold_f9d828' 'heading-deprecated-12\/semibold_a8af02' 'heading-deprecated-12\/semibold__4ed1a' 'heading-deprecated-12\/semibold_a39fe9' 'heading-deprecated-12\/semibold_aabef9' 'heading-deprecated-12\/semibold_c23051' 'heading-deprecated-12\/semibold_cf4812' 'heading-deprecated-12\/semibold_b717a1' 'heading-deprecated-12\/semibold_df8943' 'heading-deprecated-12\/semibold_ec1c2d',
        'bold': 'heading-deprecated-12\/bold_f9d828' 'heading-deprecated-12\/bold_a8af02' 'heading-deprecated-12\/bold__4ed1a' 'heading-deprecated-12\/bold_a39fe9' 'heading-deprecated-12\/bold_aabef9' 'heading-deprecated-12\/bold_c23051' 'heading-deprecated-12\/bold_cf4812' 'heading-deprecated-12\/bold_b717a1' 'heading-deprecated-12\/bold_df8943' 'heading-deprecated-12\/bold_ec1c2d',
        'extrabold': 'heading-deprecated-12\/extrabold_f9d828' 'heading-deprecated-12\/extrabold_a8af02' 'heading-deprecated-12\/extrabold__4ed1a' 'heading-deprecated-12\/extrabold_a39fe9' 'heading-deprecated-12\/extrabold_aabef9' 'heading-deprecated-12\/extrabold_c23051' 'heading-deprecated-12\/extrabold_cf4812' 'heading-deprecated-12\/extrabold_b717a1' 'heading-deprecated-12\/extrabold_df8943' 'heading-deprecated-12\/extrabold_ec1c2d',
      ),
    ),
    'redesign': (
      'heading18': (
        'bold': 'redesign\/heading-18\/bold_f9d828' 'redesign\/heading-18\/bold_a8af02' 'redesign\/heading-18\/bold__4ed1a' 'redesign\/heading-18\/bold_a39fe9' 'redesign\/heading-18\/bold_aabef9' 'redesign\/heading-18\/bold_c23051' 'redesign\/heading-18\/bold_cf4812' 'redesign\/heading-18\/bold_b717a1' 'redesign\/heading-18\/bold_df8943' 'redesign\/heading-18\/bold_ec1c2d',
      ),
      'messagePreview': (
        'normal': 'redesign\/message-preview\/normal_f9d828' 'redesign\/message-preview\/normal_a8af02' 'redesign\/message-preview\/normal__4ed1a' 'redesign\/message-preview\/normal_a39fe9' 'redesign\/message-preview\/normal_aabef9' 'redesign\/message-preview\/normal_c23051' 'redesign\/message-preview\/normal_cf4812' 'redesign\/message-preview\/normal_b717a1' 'redesign\/message-preview\/normal_df8943' 'redesign\/message-preview\/normal_ec1c2d',
        'medium': 'redesign\/message-preview\/medium_f9d828' 'redesign\/message-preview\/medium_a8af02' 'redesign\/message-preview\/medium__4ed1a' 'redesign\/message-preview\/medium_a39fe9' 'redesign\/message-preview\/medium_aabef9' 'redesign\/message-preview\/medium_c23051' 'redesign\/message-preview\/medium_cf4812' 'redesign\/message-preview\/medium_b717a1' 'redesign\/message-preview\/medium_df8943' 'redesign\/message-preview\/medium_ec1c2d',
        'semibold': 'redesign\/message-preview\/semibold_f9d828' 'redesign\/message-preview\/semibold_a8af02' 'redesign\/message-preview\/semibold__4ed1a' 'redesign\/message-preview\/semibold_a39fe9' 'redesign\/message-preview\/semibold_aabef9' 'redesign\/message-preview\/semibold_c23051' 'redesign\/message-preview\/semibold_cf4812' 'redesign\/message-preview\/semibold_b717a1' 'redesign\/message-preview\/semibold_df8943' 'redesign\/message-preview\/semibold_ec1c2d',
        'bold': 'redesign\/message-preview\/bold_f9d828' 'redesign\/message-preview\/bold_a8af02' 'redesign\/message-preview\/bold__4ed1a' 'redesign\/message-preview\/bold_a39fe9' 'redesign\/message-preview\/bold_aabef9' 'redesign\/message-preview\/bold_c23051' 'redesign\/message-preview\/bold_cf4812' 'redesign\/message-preview\/bold_b717a1' 'redesign\/message-preview\/bold_df8943' 'redesign\/message-preview\/bold_ec1c2d',
      ),
      'channelTitle': (
        'normal': 'redesign\/channel-title\/normal_f9d828' 'redesign\/channel-title\/normal_a8af02' 'redesign\/channel-title\/normal__4ed1a' 'redesign\/channel-title\/normal_a39fe9' 'redesign\/channel-title\/normal_aabef9' 'redesign\/channel-title\/normal_c23051' 'redesign\/channel-title\/normal_cf4812' 'redesign\/channel-title\/normal_b717a1' 'redesign\/channel-title\/normal_df8943' 'redesign\/channel-title\/normal_ec1c2d',
        'medium': 'redesign\/channel-title\/medium_f9d828' 'redesign\/channel-title\/medium_a8af02' 'redesign\/channel-title\/medium__4ed1a' 'redesign\/channel-title\/medium_a39fe9' 'redesign\/channel-title\/medium_aabef9' 'redesign\/channel-title\/medium_c23051' 'redesign\/channel-title\/medium_cf4812' 'redesign\/channel-title\/medium_b717a1' 'redesign\/channel-title\/medium_df8943' 'redesign\/channel-title\/medium_ec1c2d',
        'semibold': 'redesign\/channel-title\/semibold_f9d828' 'redesign\/channel-title\/semibold_a8af02' 'redesign\/channel-title\/semibold__4ed1a' 'redesign\/channel-title\/semibold_a39fe9' 'redesign\/channel-title\/semibold_aabef9' 'redesign\/channel-title\/semibold_c23051' 'redesign\/channel-title\/semibold_cf4812' 'redesign\/channel-title\/semibold_b717a1' 'redesign\/channel-title\/semibold_df8943' 'redesign\/channel-title\/semibold_ec1c2d',
        'bold': 'redesign\/channel-title\/bold_f9d828' 'redesign\/channel-title\/bold_a8af02' 'redesign\/channel-title\/bold__4ed1a' 'redesign\/channel-title\/bold_a39fe9' 'redesign\/channel-title\/bold_aabef9' 'redesign\/channel-title\/bold_c23051' 'redesign\/channel-title\/bold_cf4812' 'redesign\/channel-title\/bold_b717a1' 'redesign\/channel-title\/bold_df8943' 'redesign\/channel-title\/bold_ec1c2d',
      ),
    ),
    'text': (
      'xxs': (
        'normal': 'text-xxs\/normal_cf4812',
        'medium': 'text-xxs\/medium_cf4812',
        'semibold': 'text-xxs\/semibold_cf4812',
        'bold':'text-xxs\/bold_cf4812',
      ),
      'xs': (
        'normal': 'text-xs\/normal_cf4812',
        'medium': 'text-xs\/medium_cf4812',
        'semibold': 'text-xs\/semibold_cf4812',
        'bold':'text-xs\/bold_cf4812',
      ),
      'sm': (
        'normal': 'text-sm\/normal_cf4812',
        'medium': 'text-sm\/medium_cf4812',
        'semibold': 'text-sm\/semibold_cf4812',
        'bold': 'text-sm\/bold_cf4812',
      ),
      'md': (
        'normal': 'text-md\/normal_cf4812',
        'medium': 'text-md\/medium_cf4812',
        'semibold': 'text-md\/semibold_cf4812',
        'bold': 'text-md\/bold_cf4812',
      ),
      'lg': (
        'normal': 'text-lg\/normal_cf4812',
        'medium': 'text-lg\/medium_cf4812',
        'semibold': 'text-lg\/semibold_cf4812',
        'bold': 'text-lg\/bold_cf4812',
      ),
    ),
  ),
  'tab': (
    // Found in multiple locations but best seen in friends list. Each location has other classes attached to the elements. Listed locations may be used in other areas too
    'header': 'header_aa8da2',
    // used in sidebar of settings areas
    'headerText': 'headerText_aa8da2',
    // "USER SETTINGS", "PAYMENT SETTINGS" etc
    'separator': 'separator_aa8da2',

    // see header
    // "Types"
    'topPill': 'topPill_aa8da2',
    // used in friends list header, inbox dropdown
    'top': 'top_aa8da2',
    // used in profile popout, roles list (edit)
    'side': 'side_aa8da2',

    // used in channel search, settings sidebar
    // Items themselves
    'item': 'item_aa8da2',
    // an individual tab
    'brand': 'brand_aa8da2',
    // user settings > profile at top, server/channel settings > roles > (click edit for any) at top
    'themed': 'themed_aa8da2',

    // friends list header, channel search, inbox dropdown, profile popout, settings sidebar
    'selected': 'selected_aa8da2',
    'disabled': 'disabled_aa8da2',
  ),
  'flowerStar': (
    // used in a few places around the app. best seen next to the name of a server with boosts or in community servers.
    'container': 'flowerStarContainer__3e3b0',
    'flowerStar': 'flowerStar__3e3b0',
    'childContainer': 'childContainer__3e3b0',
    'redesignIconChildContainer': 'redesignIconChildContainer__3e3b0',
  ),
  'badges': (
    'base': 'base__2b1f5',
    'number': 'numberBadge__2b1f5',
    'text': 'textBadge__2b1f5',
  ),
  'login': (
    'wrapper': 'wrapper_d4fa29',
    'characterBackground': 'characterBackground_eb4069',
    // seemingly a parent class for the whole thing
    'artwork': 'artwork_eb4069',
    'loggingIn': 'loggingIn_bdd070',
    'logo': 'logo_eb4069',
    'splashBackground': 'splashBackground__742a4',

    'authBox': 'authBox__921c5',
    // paired up with a dark mode and the next class
    'authBoxExpanded': 'authBoxExpanded__921c5',
    // ...even with a thin screen this pops up
    // appears when adding acc while logged in
    'mainLoginContainer': 'mainLoginContainer__1d5fc',
    'header': 'header__1d5fc',
    'title': 'title__921c5',
    'qrCodeOverlay': 'qrCodeOverlay_e16417',
    
    'accountsList': 'list__920b8',
    
    'addAccountNav': 'navRow__86e92',
    // appears when adding acc while logged in
  ),
  'os': (
    'win': 'platform-win',
    'mac': 'platform-osx',
    'linux': 'platform-linux',
    'web': 'platform-web',

    'overlay': 'platform-overlay',
    // it's in there! -- only css change is with a scroller somewhere having more padding on top.
  ),
  // Generic classes for avatars/profile pictures
  'avatar': (
      'wrapper': 'wrapper__44b0c',
      'mask': 'mask__44b0c',
      // usually paired with svg
      'svg': 'svg__44b0c',
      // usually paired with mask; uses svg for tag
      // svg tag may have several children: <mask> <foreignObject> <svg> <rect>
      // <mask>
      // two children, <circle> <rect>
      // <foreignObject>
      // one child
      'stack': 'avatarStack__44b0c',
      // <div> ; child <img>
      'avatar': 'avatar__44b0c',
      // <img> ; has ::before
      // <svg>
      'cursorDefault': 'cursorDefault__44b0c',
      // on <svg> tag. child <mask> with similar stuff again
      // <rect>
      'pointerEvents': 'pointerEvents__44b0c',

      // on <rect> usually relates to status
      'speaking': 'avatarSpeaking__44b0c',
      // appears in the sidebar server panel when you're speaking
      'decoration': 'avatarDecoration__44b0c',

      // appears under wrapper for people with avatar decorations
      // unsure where both of these classes are
      'pointer': 'pointer__44b0c',
      'status': 'status_c51b4e',
    ),

  'button': (
    'button': 'button__201d5',
    'contents': 'contents__201d5',
    // DO NOT FORGET TO UPDATE MIXINS FILE IF UPDATING THIS CLASS
    'lookFilled': 'lookFilled__201d5',
    'lookOutlined': 'lookOutlined__201d5',
    'lookLink': 'lookLink__201d5',
    'lookBlank': 'lookBlank__201d5',
    // no combos with colors
    'icon': 'buttonIcon__6e3f1',
    // found at top of channel you can edit, before first message. not in the same line as the others
    'spinner': 'spinner__201d5',
    'spinnerItem': 'spinnerItem__201d5',
    // i don't know where this is in comparison to everything else. it's likely on the same element as path-lhsLSV
    'submitting': 'submitting__201d5',
    'disabledWrapper': 'disabledButtonWrapper__201d5',
    'disabledOverlay': 'disabledButtonOverlay__201d5',

    // shiny buttons are on a different line to the others
    'shinyButton': 'shinyButton__6a443',
    'shineDefault': 'shineDefault__6a443',
    'shineContainer': 'shineContainer__6a443',
    'buttonShine': 'buttonShine__6a443',
    'shine': 'shine__6a443',
    'onlyShineOnHover': 'onlyShineOnHover__6a443',
    'shineSmall': 'shineSmall__6a443',
    'shinePaused': 'shinePaused__6a443',
    'shineInnerDefault': 'shineInnerDefault__6a443',
    'shineInnerSmall': 'shineInnerSmall__6a443',

    // sizes
    'sizeTiny': 'sizeTiny__201d5',
    'sizeSmall': 'sizeSmall__201d5',
    'sizeMedium': 'sizeMedium__201d5',
    'sizeLarge': 'sizeLarge__201d5',
    // min/max sizes aren't fixed in size
    'sizeMin': 'sizeMin__201d5',
    'sizeMax': 'sizeMax__201d5',
    // other size related classes
    'grow': 'grow__201d5',
    'sizeIcon': 'sizeIcon__201d5',
    'fullWidth': 'fullWidth__201d5',

    // colors / hovers / borders
    'colorBrand': 'colorBrand__201d5',
    'colorBrandInverted': 'colorBrandInverted__201d5',
    'colorGreen': 'colorGreen__201d5',
    'colorLink': 'colorLink__201d5',
    'colorPrimary': 'colorPrimary__201d5',
    'colorRed': 'colorRed__201d5',
    'colorTransparent': 'colorTransparent__201d5',
    'colorWhite': 'colorWhite__201d5',

    // new button classes
    // brand, white and inverted are using old classes
    'new': (
      'button': 'button_a22cb0',
      'hasText': 'hasText_a22cb0',

      'small': 'sm_a22cb0',
      'medium': 'md_a22cb0',
      'fullWidth': 'fullWidth_a22cb0',

      'primary': 'primary_a22cb0',
      'secondary': 'secondary_a22cb0',
      'criticalPrimary': 'critical-primary_a22cb0',
      'criticalSecondary': 'critical-secondary_a22cb0',
      'active': 'active_a22cb0',
      'overlayPrimary': 'overlay-primary_a22cb0',
      'overlaySecondary': 'overlay-secondary_a22cb0',
    )
  ),
  'call': (
    // There's a bit of overlap with "stage". feel free to jump down to there.
    // gradients use stage. more video stuff would be under stage too.
    'wrapper': 'wrapper_cb9592',
    'noChat': 'noChat_cb9592',
    'minimum': 'minimum_cb9592',
    'normal': 'normal_cb9592',
    // used when videos are enabled
    'container': 'callContainer_cb9592',
    'root': 'root_bfe55a',
    'idle': 'idle_bfe55a',
    // applied when screen sharing and not hovered, hides controls (and children of)
    'gradientBackground': 'gradientBackground__11664',
    'gradientSphere': 'sphere__11664',
    'pulseGradient': 'pulseGradient__11664',
    // both above are seen in empty vc
    'voiceCallWrapper': 'voiceCallWrapper_a21736',
    // paired with rootChild
    'transition': 'transition_c8dbe9',
    'participant': 'participant_c8dbe9',
    'spriteWrapper': 'spriteWrapper_c8dbe9',
    // this to crossWhite seem to relate to the little animation when leaving a call
    'sprite': 'sprite_c8dbe9',
    'avatarWrapper': 'wrapper_f910d0',
    'avatarClickable': 'clickable_f910d0',
    'callAvatarMask': 'callAvatarMask_f910d0',
    'voiceAvatar': 'voiceAvatar_f910d0',
    'avatarBorder': 'border_f910d0',
    'avatarSpeaking': 'speaking_f910d0',

    'videoControls': 'videoControls_bfe55a',
    'controlSection': 'controlSection_bfe55a',
    // both top and bottom are paired with this depending on location
    'topControls': 'topControls_bfe55a',
    // contains header and region selector
    'headerWrapper': 'headerWrapper_cb9592',

    'quickSelect': 'quickSelect_ebaca5',
    // for region
    'quickSelectLabel': 'quickSelectLabel_ebaca5',
    'quickSelectClick': 'quickSelectClick_ebaca5',
    'quickSelectValue': 'quickSelectValue_ebaca5',
    'quickSelectArrow': 'quickSelectArrow_ebaca5',
    'quickSelectPopout': 'quickSelectPopout_ebaca5',
    'quickSelectPopoutScroll': 'quickSelectPopoutScroll_ebaca5',
    'quickSelectScroller': 'quickSelectScroller_ebaca5',
    'quickSelectPopoutOption': 'quickSelectPopoutOption_ebaca5',

    'bottomControls': 'bottomControls_bfe55a',
    'eventPromptsContainer': 'eventPromptsContainer__1405b',
    'buttonsWrapper': 'wrapper__1405b',
    'buttonSection': 'buttonSection__1405b',
    'buttonSectionExperiment': 'experimentButtonSection__1405b',
    'fauxDisabled': 'fauxDisabled__666fa',
    // used when camera isn't plugged in
    'contextMenuContainer': 'contextMenuContainer_f1ceac',
    // contains the little drop arrow, display none'd when discord is tiny thin see unmasked
    'contextMenuNub': 'contextMenuNub_f1ceac',
    // said drop down arrow
    'contextMenuCaret': 'contextMenuCaret_f1ceac',
    // the ^ symbol
    'caretTransition': 'transition__5fbe9',
    'centerButton': 'centerButton_f1ceac',
    'centerButtonIcon': 'centerIcon_f1ceac',
    'caretOpen': 'open_f1ceac',
    // paired with contextMenuCaret to rotate
    'caretDirectionDown': 'directionDown__5fbe9',

    'colorable': 'colorable_f1ceac',
    'primaryDark': 'primaryDark_f1ceac',
    'white': 'white_f1ceac',
    'red': 'red_f1ceac',
    'green': 'green_f1ceac',
    'disconnect': 'disconnect_f1ceac',

    'videoRow': 'row_d6271c',
    'videoTile': 'tile_d6271c',
    'noVerticalMargin': 'noVerticalMargin_d6271c',
    // paired with videoTile, can't describe usage
    'noHorizontalMargin': 'noHorizontalMargin_d6271c',
    // paired with videoTile, used on last tile of row
    'tileSizer': 'tileSizer_d6271c',
    'videoWrapper': 'wrapper__2f4f7',
    'tile': 'tile_eaee1d',
    // god these names are shit
    'tileChildFlex': 'tile__2f4f7',
    // contains flex properties
    'tileChildIdle': 'idle__2f4f7',
    'tileChildBackground': 'tile__90dc5',
    // despite being on the same element as the flex, contains background color
    'tileChild': 'tileChild__2f4f7',
    // haha fuck you not actually on the same class as the four above
    'tileContent': 'content__2f4f7',
    'tileBackground': 'background_fb62e2',
    // has inline style background applied to it
    'tileAvatarWrapper': 'avatarWrapper_fb62e2',
    'tileIndicators': 'indicators__2f4f7',
    'streamQualityIndicator': 'streamQualityIndicator__30845',
    'liveIndicator': 'liveIndicator__2f4f7',
    'liveIndicatorChild': 'liveIndicator__30845',
    'liveLarge': 'liveLarge_a7acae',
    'liveShapeRound': 'liveShapeRound_a7acae',
    'tileOverlay': 'overlay_ba4b17',
    'tileOverlayTitle': 'overlayTitle__2f4f7',
    'tileOverlayTitleText': 'overlayTitleText__2f4f7',
    'tileStatusContainer': 'statusContainer__2f4f7',
    'tileStatus': 'status__2f4f7',
    'tileVideo': 'video__48b20',
    'tileVideoContain': 'videoContain__48b20',
    'tileVideoPreview': 'previewWrapper__48b20',
    'videoEnded': 'tile__90dc5',
    'leftTrayIcon': 'leftTrayIcon_cb9592',
    'rightTrayIcon': 'rightTrayIcon_cb9592',

    'status': 'status_f910d0',
    'videoBorder': 'border__2f4f7',
    'videoSpeaking': 'speaking__2f4f7',
    'streamBackground': 'root_e605a1',
    'liveQualityIndicator': 'liveQualityIndicator__30845',
    'lowQualityWarningIcon': 'warningIcon__14990',
    'watchStreamButton': 'cta_a3a802',
    'inviteButton': 'buttonColor__7b3e8',

    'resizeHandle': 'resizeHandle__4b144',
    'channelChatWrapper': 'channelChatWrapper_cb9592',

    // invisible class to the right side of the call. 0 width.
    'chatButtonContainer': 'buttonContainer_ffab0d',
  ),
  'stage': (
    // heavily relates to call
    'container': 'container__722ff',
    // sibling to uploadArea, child of chat
    'callContainer': 'callContainer__722ff',
    // child
    'sidebarVisible': 'sidebarVisible__722ff',
    // same, relates to raised hand
    // child being call root, children of scroller, call videoControls, some other classes without suffixes
    'scroller': 'scroller__56ccd',
    // child
    // children being div no class, headerContainer, rowContainer, divider, roleContainer, participants, spacer
    'headerContainer': 'container__05cdc',
    'rowContainer': 'rowContainer__8a920',
    // child of everywhere content
    'spaceBetweenTiles': 'spaceBetweenTiles_fa73d7',
    // child, children of tileOuter (see call)
    'tile': 'tile_fdc206',

    // child of call tileInner, not to be confused with every other fucking tile class
    // videoControls, children being gradientContainer+gradientBottom, controlSection[top, bottom]
    'gradientContainer': 'gradientContainer_bfe55a',
    // child
    'gradientBottom': 'gradientBottom_bfe55a',
    'gradientTop': 'gradientTop_bfe55a',
    // controlSection (either top or bottom)
    'controlsParticipants': 'participants__9c309',
    // used as header
    'raisedHandButtonContainer': 'raisedHandButtonContainer_cb3dd1',
    // used again as child of self??
    'raisedHandIcon': 'raisedHandIcon__15cd2',
    // paired with above when above is child of self
    // within bottom, 3 children all same classes and inline except middle is `flex: 1 1 auto;`, rest are `flex: 0 1 50%;`
    // from left to right...
    'iconButton': 'iconButton__7b3e8',
    // has a min-width media display none, button color has max width one
    'iconButtonLineReset': 'lineHeightReset_f1ceac',
    // child, also used for participants button
    // "leftTrayIcon": "",
    'controlIcon': 'controlIcon_f1ceac',
    // child but not used on leave call button
    // middle child
    'containerColumn': 'containerColumn_fcb27c',
    // two children - event prompts and buttonRow
    'eventPrompts': 'eventPrompts_fcb27c',
    'openStageContainer': 'container__6b38f',
    'openStagePulse': 'pulse__6b38f',
    'openStageIcon': 'icon__6b38f',
    // inline background color green
    'openStageTextContainer': 'textContainer__6b38f',
    'openStageCaret': 'caret__6b38f',
    'eventPromptsSeparator': 'separator_fcb27c',
    'buttonRow': 'container_fcb27c',
    'avControls': 'avControls_fcb27c',
    // mic, parent to contextMenuContainer + unmaksed
    'leaveStageButton': 'primaryButtonColor_fcb27c',
    'buttonWithTextInnerContainer': 'buttonWithTextInnerContainer_fcb27c',
    'buttonWithTextIcon': 'buttonWithTextIcon_fcb27c',
    'buttonSpacing': 'buttonSpacing_fcb27c',
    // right
    'rightTrayIcon': 'rightTrayIcon__722ff',

    'participants': 'participants__9c309',
    // children usually are tileContainer and tileBaseContainer
    'tileBaseContainer': 'tileBaseContainer__71eb2',
    'tileContainer': 'tileContainer__71eb2',
    'avatarContainer': 'avatarContainer__71eb2',
    'avatar': 'avatar__71eb2',
    'textContainer': 'textContainer__71eb2',
    'text': 'text__71eb2',

    // what a useful class name i hope you can memorize this list.
    'spacer': 'spacer__56ccd',

    // child to callContainer, sibling to sidebarVisible only if this is open
    'requestToSpeakContainer': 'container__664ff',
    'rtsHeaderContainer': 'headerContainer__664ff',
    'rtsHeaderTitle': 'headerTitle_f7ece4',
    'rtsHeaderClose': 'headerClose_f7ece4',

    'rtsContentContainer': 'contentContainer__664ff',
    'rtsDividerDefault': 'dividerDefault__0d850',
    // see comment below this!!!
    'rtsAllowFromEveryoneContainer': 'container__0d850',
    // control__0d850 disabled__0d850 labelRow__0d850 note__0d850 title__0d850 titleDefault__6c390 titleMini_ddd437
    'rtsToggle': 'toggle__664ff',
    // paired with ^
    'rtsLabelRow': 'labelRow__0d850',
    'rtsDivider': 'divider_ae36e5',

    'rtsListTitle': 'listTitle__664ff',
    'rtsEmptyStateContainer': 'emptyStateContainer__664ff',
    'rtsEmptyImage': 'container__05cdc',
    // children of this aren't listed here.
    'rtsEmptyStateTitle': 'emptyStateTitle__664ff',
    'rtsEmptyStateBody': 'emptyStateBody__664ff',
    'rtsParticipantsRowContainer': 'participantRowContainer__664ff',
    'rtsParticipantMemberContainer': 'participantMemberContainer__664ff',
    'rtsParticipantAvatar': 'participantAvatar__664ff',
    'rtsParticipantTextContainer': 'participantTextContainer__664ff',
    'rtsParticipantName': 'participantName__664ff',

    // sidebar stuff
    'channelNoticeTextBlock': 'textBlock_e2d7b8',
    // children and siblings not listed
    'audienceContainer': 'audienceContainer__55bab',
    'audienceContainerCollapsed': 'audienceContainerCollapsed__55bab',
    'audienceVoiceIconContainer': 'audienceIconContainer__55bab',
    'audienceIcon': 'audienceIcon__55bab',

    // no clue, legacy shit or whatever
    'participantsButton': 'participantsButton__211d1',
    'rtsButtonContainer': 'buttonContainer__664ff',
    'active': 'active_f1ceac',
  ),

  'chat': (
    'cozy': 'cozy_c19a55',
    'compact': 'compact_c19a55',
    'chat': 'chat_f75fb0',
    'chatSidebarOpen': 'chatSidebarOpen_d880dc',
    'threadSidebarOpen': 'threadSidebarOpen_f75fb0',
    'threadSidebarFloating': 'threadSidebarFloating_f75fb0',
    'subtitleContainer': 'subtitleContainer_f75fb0',
    // parent to #{c(header header)}
    'noChat': 'noChat_f75fb0',
    'chatContent': 'content_f75fb0',
    'messagesWrapper': 'messagesWrapper__36d07',
    'chatScroller': 'scroller__36d07',
    'chatScrollerInner': 'scrollerInner__36d07',
    'scrollerSpacer': 'scrollerSpacer__36d07',
    // placed at bottom of message list
    'chatGradientBase': 'chatGradientBase__36d07',
    // typing... bar
    'chatScrollerNSFW': 'scroller__28a87',
    'chatGatedContent': 'gatedContent__7184c',
    'chatGatedImage': 'image__7184c',
    'chatGatedTitle': 'title__7184c',
    'chatGatedDescription': 'description__7184c',
    'chatGatedSeparator': 'separator_def860',
    // no idea how to actually get it :)
    'chatGatedAction': 'action__7184c',
    // buttons
    'chatContentInner': 'chatContent_f75fb0',
    'chatLoadingWrapper': 'wrapper_d852db',
    'messageLoadingWrapper': 'wrapper_fc8177',
    'noChannel': 'noChannel__01d5c',
    // in a server without any channels or loading in

    

    'chatHeaderBar': 'chatHeaderBar_dc83f5',
    // This channel is not on your channel list.
   
    'messageDivider': 'divider__5126c',
    'backgroundFlash': 'backgroundFlash__5126c',
    'messageListItem': 'messageListItem__5126c',
    'messageGroupStart': 'groupStart__5126c',
    'cozyMessage': 'cozyMessage__5126c',
    'message': 'message__5126c',
    'messageWrapper': 'wrapper_c19a55',
    'markup': 'markup__75297',
    'markupInlineFormat': 'inlineFormat__75297',    
    'codeInline': 'inline',
    'codeActions': 'codeActions__75297',
    'replying': 'replying__5126c',
    'hasThread': 'hasThread_c19a55',
    'mentioned': 'mentioned__5126c',
    'mentionWrapper': 'wrapper_f61d60',
    'messageSelected': 'selected__5126c',
    'buttons': 'buttons__5126c',
    'buttonsWrapper': 'wrapper_f7ecac',
    'button': 'button_f7ecac',
    'buttonSelected': 'selected_f7ecac',

    'divider': (
      'divider': 'divider__908e2',
      'hasContent': 'hasContent__908e2',
      'content': 'content__908e2',
      'isUnread': 'isUnread__908e2',
      'unreadPill': 'unreadPill__908e2',
      'unreadPillCap': 'unreadPillCap__908e2',
      'unreadPillCapStroke': 'unreadPillCapStroke__908e2',
    ),

    'bar': (
      'newMessages': 'newMessagesBar__0f481',
      'jumpToPresent': 'jumpToPresentBar__0f481',
      'messagesError': 'messagesErrorBar__0f481',
    ),

    // also applies to blocked
    'followWrapper': 'wrapper__44df5',
    'followImage': 'image__44df5',
    'followAnimation': 'animation__44df5',
    'followText': 'text__44df5',
    'followTitle': 'title__44df5',
    'followButton': 'button__44df5',
    'followButtonContainer': 'buttonContainer__44df5',
    'followCountdown': 'countdown__44df5',

    'blockedSystemMessage': 'blockedSystemMessage__7a70a',
    'systemMessageContent': 'content__235ca',

    'chatHeader': 'container__00de6',
    'chatHeaderH1': 'header__00de6',
    // h1
    'chatHeaderDesc': 'description__00de6',
    'chatHeaderButtons': 'channelSettingButtons__1ee8c',
    'chatHeaderButton': 'button__6e3f1',
    'emptyChannelIcon': 'emptyChannelIcon__00de6',
    'chatHeaderMembers': 'members__1ee8c',

    'replied': (
      'message': 'repliedMessage_c19a55',
      'textPreview': 'repliedTextPreview_c19a55',
      'textContent': 'repliedTextContent_c19a55',
      'badge': 'replyBadge_c19a55',
      'spine': 'repliedMessageClickableSpine_c19a55',
      'contentHovered': 'repliedMessageContentHovered_c19a55',
      'spineHovered': 'repliedMessageClickableSpineHovered_c19a55',
      'textPlaceholder': 'repliedTextPlaceholder_c19a55',

      'app': (
        // bot commands
        'spine': 'messageSpine_c19a55',
        'executedCommand': 'executedCommand_c19a55',
        'launcherCommandName': 'appLauncherOnboardingCommandName_c19a55',
        'commandName': 'commandName_c19a55',
      ),
    ),

    'allowedAvatars': 'avatars__1ee8c',
    'allowedRole': 'role__1ee8c',
    // element kind button
    'allowedRoleInner': 'role_fa0dd2',
    'allowedRoleInner2': 'role_b4b2c3',
    // paired with above
    'allowedRoleColor': 'roleColor_b4b2c3',

    'messageContents': 'contents_c19a55',
    'messageAttachmentsContainer': 'container_b7e1cb',
    'nonMediaAttachmentsContainer': 'nonVisualMediaItemContainer_f4758a',
    'nonMediaAttachmentItem': 'nonVisualMediaItem_f4758a',
    'chatAvatar': 'avatar_c19a55',
    'chatIconContainer': 'iconContainer__235ca',
    // usually used for pinned message, welcome message and kicked from gc stuff
    'chatHeaderUsername': 'header_c19a55',
    'chatHeaderText': 'headerText_c19a55',
    'chatEdited': 'edited_c19a55',
    'chatUsername': 'username_c19a55',
    'chatHeaderClickable': 'clickable_c19a55',
    'chatUsernameTimedOut': 'communicationDisabled_c19a55',
    'zalgoBlocker': 'zalgo_c19a55',
    'timestamp': 'timestamp_c19a55',
    'timestampInline': 'timestampInline_c19a55',
    'messageContent': 'messageContent_c19a55',

    // in same line as chat_$suffix
    'cursorPointer': 'cursorPointer_f75fb0',
    'parentChannelName': 'parentChannelName_f75fb0',
    'guildBreadcrumbContainer': 'guildBreadcrumbContainer_f75fb0',
    'guildBreadcrumbIcon': 'guildBreadcrumbIcon_f75fb0',

    'spoiler': (
      'content': 'spoilerContent__54ab5',
      'hidden': 'hidden__54ab5',
      'container': 'spoilerContainer__54ab5',
      'innerContainer': 'spoilerInnerContainer__54ab5',
      'warning': 'spoilerWarning__54ab5',
      'warningEmbed': 'embed__54ab5',
      'explicitContentWarning': 'explicitContentWarning__54ab5',
      'markdownContent': 'spoilerMarkdownContent__54ab5',
      'obscuredTextContent': 'obscuredTextContent__54ab5',
      'obscuredTextContentInner': 'obscuredTextContentInner__54ab5',
    ),

    'chatWelcomeContainer': 'container__235ca',

    'botTag': 'botTagRegular__82f07',
    'botTagOp': 'botTagOP__82f07',

    'imageAccessory': 'imageAccessory_af017a',
    'gifTag': 'gifTag_f60819',

    'gifFavoriteButton': 'gifFavoriteButton__43deb',
    'gifFavoriteSelected': 'selected__43deb',
    'gifFavoriteShowPulse': 'showPulse__43deb',
    'gifFavoriteIcon': 'icon__43deb',

    'quoteContainer': 'blockquoteContainer__75297',
    'quoteDivider': 'blockquoteDivider__75297',

    'containerExpanded': 'containerExpanded__7ff28',
    // send wave sticker large
    'compactContainer': 'containerCompact__7ff28',
    // houses below
    'compactButton': 'compactButton__7ff28',
    // send wave sticker
    'welcomeCTA': 'welcomeCTA_f5d1e2',

    'ephemeral': 'ephemeral__5126c',
    'ephemeralAccessories': 'ephemeralAccessories_b7ab2c',
    'ephemeralMessage': 'ephemeralMessage__124d2',
    'ephemeralIcon': 'icon__124d2',

    'automodMessage': 'automodMessage__5126c',
    'automodBlockedNoticeContainer': 'blockedNoticeContainer_b7ab2c',
    'automodShield': 'shieldIcon_b7ab2c',

    'layerWrapper': 'chatLayerWrapper__01ae2',

    'operations': 'operations_bab751',
    // editing bottom text

    'reactions': (
      'reactions': 'reactions__23977',
      'reactionBtn': 'reactionBtn__23977',
      'active': 'active__23977',
      'visible': 'visible__23977',
      'forceShow': 'forceShow__23977',
      'icon': 'icon__23977',
      'hideEmoji': 'hideEmoji__23977',
      'reaction': 'reaction__23977',
      'me': 'reactionMe__23977',
      'readOnly': 'reactionReadOnly__23977',
      'inner': 'reactionInner__23977',
      'count': 'reactionCount__23977',
      'remaining': 'remainingReactions__23977',
      'tooltip': (
        'tooltip': 'reactionTooltip_b49891',
        'emoji': 'reactionTooltipEmoji_b49891',
        'text': 'reactionTooltipText_b49891',
        'inner': 'reactionTooltipInner_b49891',
        'button': 'reactionEmojiDetailsClickable_d5cd2d',
      ),
      'burst': (
        'glow': 'burstGlow__23977',
        'inner': 'burstReactionTooltipInner_b49891',
        'message': 'burstReactionTooltipMessage_b49891',
        'prompt': 'burstReactionTooltipPrompt_b49891',
        'nitroIcon': 'burstReactionTooltipNitroIcon_b49891',
        'upsellCta': 'burstReactionTooltipUpsellCta_b49891',
      ),
    ),

    'publish': (
      // post in announcements channel
      'container': 'bumpBox_cacd02',
      'icon': 'icon_cacd02',
      'tagline': 'tagline_cacd02',
      'closeIcon': 'closeIcon_cacd02',
      'hidePermanently': 'hidePermanently_cacd02',
    ),
  ),
  'pages': (
    // tags (used in forums and home)
    'tags': (
        'pill': 'pill_a2c9e8',
        'clickable': 'clickable_a2c9e8',
        'selected': 'selected_a2c9e8',
        'disabled': 'disabled_a2c9e8',
        'emoji': 'emoji__1c948',
        'small': 'small_a2c9e8',
        'close': 'close_a2c9e8',
        'tooltipPill': 'tooltipPill_a2c9e8',
      ),
  ),

  'forums': (
    // Named so because aria-label for the chat bubble icon is "Forum" in English
    'loadingContainer': 'loader_f75fb0',
    'container': 'container_f369db',
    'headerRow': 'headerRow_f369db',
    'header': 'header_f369db',
    // applies to combined search/new post card
    'headerWithMatchingPosts': 'headerWithMatchingPosts_f369db',
    'matchingPostsRow': 'matchingPostsRow_f369db',

    'empty': 'container__93db4',
    'emptyIcon': 'icon__93db4',
    'emptyCTA': 'cta__93db4',

    'example': (
      // empty forum see examples
      'container': 'container_ee8e87',
      'tag': 'tag_ee8e87',
      'post': 'post_ee8e87',
      'previewContainer': 'previewContainer_ee8e87',
      'preview': 'preview_ee8e87',
      'previewPostIcon': 'forumPostIcon_ee8e87',
      'bottomSeparator': 'bottomSeparator_ee8e87',
      'chatInput': 'chatInput_ee8e87'
    ),

    'postTitle': 'forumPostTitle_f75fb0',

    'mainCard': 'mainCard_f369db',
    'cardCollapsed': 'collapsed_d9be46',
    // css rule also applies to .collapsed(this) .title(below) input
    'formContainer': 'formContainer_d9be46',
    'form': 'form_d9be46',
    'titleContainer': 'titleContainer_d9be46',
    'textArea': 'channelTextArea_d9be46',
    'textAreaInner': 'channelTextAreaInner_d9be46',

    'title': 'title_d9be46',
    'searchIcon': 'searchIcon_d9be46',
    'closeIcon': 'closeIcon_d9be46',
    'tagsContainer': 'tagsContainer_d9be46',
    'moreTagsButton': 'tagsButton_d9be46',
    'moreTagsButtonInner': 'tagsButtonInner_d9be46',
    'submitButton': 'submitButton_d9be46',

    'newPostsPopout': 'newPostsButton_f369db',

    // tags on their own can apply outside the container
    'tags': (
        'dropdown': 'sortDropdown_f369db',
        'dropdownInner': 'sortDropdownInner_f369db',
        'dropdownText': 'sortDropdownText_f369db',

        'dropdownPopoutContainer': 'container_f8b2d2',
        // on own line. click "Sort & View"
        'dropdownPopoutContainerClearText': 'clearText_f8b2d2',

        // same line as ^
        'divider': 'divider_f369db',

        'list': 'tagList_f369db',
        'listInner': 'tagListInner_f369db',

        'tag': 'tag_f369db',
        // hover color uses .pill.clickable:not(.disabled) for background. they're in pages
        'tagsButton': 'tagsButton_f369db',
        // usually the "all" button; clicking it brings up a popout
        'tagsButtonInner': 'tagsButtonInner_f369db',

        'popout': (
          'container': 'container__5808f',
          'header': 'header__5808f',
          'headerLeft': 'headerLeft__5808f',
          'headerText': 'headerText__5808f',
          // inline color
          'count': 'countContainer__5808f',
          'countText': 'countText__5808f',

          'row': 'row__5808f',

          'tagContainer': 'tagContainer__5808f',
          'tag': 'tag__5808f',

          'separator': 'separator__5808f',
          'clear': 'clear__5808f',
        ),
      ),

    // click the little book icon, category could also be called rules
    'guidelines': (
        'container': 'container_ca49a1',
        'headerContainer': 'headerContainer_ca49a1',
        'header': 'guidelinesHeader_ca49a1',
        'headerCloseButton': 'clickable_ca49a1',

        'descriptionContainer': 'descriptionContainer_ca49a1',
        'guidelines': 'guidelines_ca49a1',
        'showMore': 'showMore_ca49a1',
        'gradient': 'gradient_ca49a1',
        'showMoreLinkContainer': 'linkContainer_ca49a1',
        // clicking this opens a modal
        'showMoreLink': 'showMoreLink_ca49a1',
        // inline color
        'showMoreText': 'showMoreText_ca49a1',
        'showMoreIcon': 'showMoreIcon_ca49a1',

        'modal': (
          'container': 'container__444a0',
          'header': 'header__444a0',
          'content': 'content__444a0',
          'rulesIcon': 'rulesIcon__444a0',
        ),
      ),

    // it's loading in
    'loading': (
        // applied regardless of grid or list
        'card': 'loadingCard_f369db',
        // below are different opacities, the number is the percentage opacity. 100 = opacity: 1;
        'opacity33': 'loadingCard-0_f369db',
        'opacity66': 'loadingCard-1_f369db',
        'opacity100': 'loadingCard-2_f369db'
      ),

    // grid posts
    'grid': (
        'grid': 'grid_f369db',
        // these all could be 559438
        'card': 'container__9a337',
        'isOpen': 'isOpen__9a337',
        'dots': 'dots__9a337',

        'focusTarget': 'focusTarget__9a337',
        'spoilerTagContainer': 'obscuredTagContainer__9a337',
        'spoilerTag': 'obscuredTag__9a337',
        'thumbnailOverride': 'thumbnailOverride__9a337',
        'imageCover': 'imageCover__9a337',
        'spoiler': 'obscured__9a337',
        'bullet': 'bullet__9a337',
        'typing': 'typing__9a337',
        'typingUsers': 'typingUsers__9a337',
        'mediaIconsRow': 'mediaIconsRow__9a337',
        'mediaIcon': 'mediaIcon__9a337',
        'moreImagesPill': 'moreImagesPill__9a337',
        'moreImagesPillIcon': 'moreImagesPillIcon__9a337',
        'moreImagesPillText': 'moreImagesPillText__9a337',
        'mosaicMediaContainer': 'mosaicMediaContainer__9a337',
        'mediaContainer': 'mediaContainer__9a337',
        'bodyMedia': 'bodyMedia__9a337',
        'bodyMediaFrame': 'bodyMediaFrame__9a337',
        'postBody': 'postBody__9a337',
        'tagsRow': 'tagsRow__9a337',
        'author': 'author_d3eee8',
        'header': 'header__9a337',
        'footer': 'footer__9a337',
        'title': 'title__9a337',
        'forumPostControls': 'forumPostControls__9a337',
        'controlsGroup': 'controlsGroup__9a337',
        'contentPreview': 'contentPreview__9a337',
        'content': 'content__9a337',
        'textContentFooter': 'textContentFooter__9a337',
        'noTags': 'noTags__9a337',
        'authorRow': 'authorRow__9a337',
        'rowGroup': 'rowGroup__9a337',
        'postCreationTimestamp': 'postCreationTimestamp__9a337',
        'messageCountContainer': 'messageCountContainer__9a337',
        'newBadge': 'newBadge__9a337',
        // background-color: var(--brand-260);
        'textContentUnread': 'textContentUnread__9a337',
        'textContentRead': 'textContentRead__9a337',
        'tag': 'tagPill__9a337',
      ),

    // list posts (though a few classes do show up under grid)
    'list': (
        'list': 'list_f369db',
        'card': 'container_faa96b',
        'isOpen': 'isOpen_faa96b',
        'dots': 'dots_faa96b',
        'focusTarget': 'focusTarget_faa96b',
        'left': 'left_faa96b',
        'body': 'body_faa96b',
        'messageFocusBlock': 'messageFocusBlock_faa96b',
        'message': 'message_faa96b',
        'messageContent': 'messageContent_faa96b',
        'bodyMedia': 'bodyMedia_faa96b',
        'spoilerTag': 'obscuredTag_faa96b',
        'thumbnailContainer': 'thumbnailContainer_faa96b',
        'thumbnailOverride': 'thumbnailOverride_faa96b',
        'spoiler': 'obscured_faa96b',
        'header': 'header_faa96b',
        'footer': 'footer_faa96b',
        'bullet': 'bullet_faa96b',
        'headerText': 'headerText_faa96b',
        'postTitleText': 'postTitleText_faa96b',
        'newBadgeWrapper': 'newBadgeWrapper_faa96b',
        'newBadge': 'newBadge_faa96b',
        'inTagsRow': 'inTagsRow_faa96b',
        'typing': 'typing_faa96b',
        'typingUsers': 'typingUsers_faa96b',
        'messageCountBox': 'messageCountBox_faa96b',
        'messageCountIcon': 'messageCountIcon_faa96b',
        'messageCountText': 'messageCountText_faa96b',
        'hasRead': 'hasRead_faa96b',
        'newMessageCount': 'newMessageCount_faa96b',
        'updateReactionButton': 'updateReactionButton_faa96b',
        'timestampTooltip': 'timestampTooltip_faa96b',
        'blockedMessage': 'blockedMessage_faa96b',
        'withNewBadgeOverflow': 'withNewBadgeOverflow_faa96b',
      ),

    'cardtags': 'tags__08166',
    'pinIcon': 'pinIcon__08166',

    'reaction': (
      'reactions': 'reactions_f8896c',
      'reactionBtn': 'reactionBtn_f8896c',
      'icon': 'icon_f8896c',
      'active': 'active_f8896c',
      'visible': 'visible_f8896c',
      'forceShow': 'forceShow_f8896c',
      'forceShowLook': 'forceShowLook_f61c73',
      'hideEmoji': 'hideEmoji_f8896c',

      'reaction': 'reaction_f8896c',
      'shakeReaction': 'shakeReaction_f8896c',
      'readOnly': 'reactionReadOnly_f8896c',
      'count': 'reactionCount_f8896c',
      'me': 'reactionMe_f8896c',
      'inner': 'reactionInner_f8896c',
      'remainingReactions': 'remainingReactions_f8896c',

      'premiumIcon': 'premiumIcon_f8896c',
      'sparkles': 'sparkles_f8896c',
    ),

    // when posting, it's the attached file(s) thing
    'upload': (
        'container': 'container__94439',

        // when empty
        'uploadInput': 'uploadInput__94439',
        'fileInput': 'fileInput__94439',
        'uploadIcon': 'uploadIcon__94439',

        // when file attached, hovered over file
        'popoutContainer': 'popoutContainer__94439',
        'popout': 'popout__94439',
        'uploads': 'uploads__94439',
        'badge': 'badge__94439',

        // html time:
        // no attach: container>uploadInput
        // non-image: container>{.icon[.type].imageContainer.imageSmall>tags}+badge
        // image: container>{.imageContainer.imageSmall>spoilerContainer>spoilerInnerContainer>spoilerWrapper>.image.imageSmall+tags}+badge
        // when hovered, replace +badge with +popoutContainer. container class still acts as if it were hovered
        // hover over is limit for uploads, popout clears after no longer hovering
        // attached file stuff
        'filenameContainer': 'filenameContainer__41ea0',
        'filename': 'filename__41ea0',
        'mediaContainer': 'mediaContainer__41ea0',
        'media': 'media__41ea0',
        'tags': 'tags__41ea0',
        'altTag': 'altTag__41ea0',
        'spoilerContainer': 'spoilerContainer__41ea0',
        'spoilerWrapper': 'spoilerWrapper__41ea0',
        'spoiler': 'spoiler__41ea0',
        'attachmentItemSmall': 'attachmentItemSmall__41ea0',
        'imageSmall': 'imageSmall__41ea0',
        'actionBarIcon': 'actionBarIcon__41ea0',
        'action': 'action__41ea0',

        'files': (
          'icon': 'icon__41ea0',
          'acrobat': 'acrobat__41ea0',
          'ae': 'ae__41ea0',
          'ai': 'ai__41ea0',
          'archive': 'archive__41ea0',
          'audio': 'audio__41ea0',
          'code': 'code__41ea0',
          'document': 'document__41ea0',
          'photoshop': 'photoshop__41ea0',
          'ps': 'ps__41ea0',
          'sketch': 'sketch__41ea0',
          'spreadsheet': 'spreadsheet__41ea0',
          'unknown': 'unknown__41ea0',
          'video': 'video__41ea0',
          'webcode': 'webcode__41ea0',
        ),
      ),

    // post has been opened, this is the chat
    'chat': (
        'scrollerContent': 'scrollerContent__36d07',
        'divider': 'divider_ee23ac',
        // follows topBar as a sibling
        // post header containing title, icon, tags, etc
        'header': (
            'container': 'container__7e6bb',
            'iconWrapper': 'iconWrapper__7e6bb',
            'icon': 'icon__7e6bb',
            'header': 'header__7e6bb',
          ),
        // Contains Follow, Share and if possible, a reaction
        'bar': (
            'container': 'container__34c2c',
            'header': 'header__34c2c',
            'button': 'button__34c2c',
            'buttonInner': 'buttonInner__34c2c',
            'reactButtons': 'reactButtons__34c2c',
            'addReactButton': 'addReactButton__34c2c',
            'reactions': 'reactions__34c2c',
            'buttons': 'buttons__34c2c',
            'active': 'active__34c2c',
          ),
      ),
  ),
  'thread': (
    'jump': 'jump__5126c',
    'resizeHandle': 'resizeHandle__01ae2',
    'chatTarget': 'chatTarget__01ae2',
    // background of sorts
    'container': 'container__01ae2',
    'floating': 'floating__01ae2',
    'notFloating': 'notFloating__01ae2',
    'chat': 'chat_f02135',
    'iconWrapper': 'iconWrapper__54b20',
    'icon': 'icon__54b20',
    'header': 'chatHeaderBar_a5700d',
    // usually contains "this thread is/was archived.../locked"
    'subtitle': 'subtitle__54b20',

    // usually contains "started by..."
    // these are for when creating a thread
    'newThreadContainer': 'container_fb64c9',
    'newChat': 'chat_fb64c9',
    'newTextAreaError': 'channelTextAreaInnerError_fb64c9',
    'newThreadTextArea': 'channelTextArea_fb64c9',
    'newThreadTextAreaInner': 'channelTextAreaInner_fb64c9',

    // active threads in server
    'activethreadsContainer': 'container_a8217b',
    'activethreadsHeader': 'header_a8217b',
  ),

  'serverGuide': (
    'background': 'background__7449f',
    'title': 'title__7449f',
    'titleInner': 'headerBarInner__7449f',
    'container': 'homeContainer__7449f',

    'header': 'header__553a5',
    'headerArtWrapper': 'headerArtWrapper__553a5',
    'headerArt': 'headerArt__553a5',
    'headerArtPlaceholder': 'headerArtPlaceholder__553a5',
    'guildIcon': 'headerIcon__553a5',
    'guildName': 'headerName__553a5',

    'mainContent': 'mainContent__7449f',
    'content': 'container_d13feb',
    'rowCard': 'row_d13feb',
    'rowContent': 'content_d13feb',
    'rowTitle': 'title_d13feb',
    'rowMessage': ' messageContent_d13feb',
    'rowMedia': 'media_d13feb',

    'sidebar': 'sidebar__7449f',
    'profileContainer': 'container_dca174',
    'profileBanner': 'banner_dca174',
    'profileAvatarContainer': 'avatarContainer_dca174',
    'profileAvatarWrapper': 'avatarWrapper_dca174',
  ),

  // browse channels/channels and roles
  'channelsPage': (
      // header stuff
      'header': (
          'header': 'header__0b563',
          // has background, overwritten from different rule
          'innerHeader': 'innerHeader__0b563',
          'returnButton': 'returnButton__0b563',
          'returnButtonText': 'returnButtonText__0b563',
          'returnIcon': 'returnIcon__0b563',
          // page container
          'tabBar': 'tabBar__0b563',
          'tabBarItem': 'tabBarItem__0b563',
          'newBadge': 'newBadge__0b563',
        ),

      'container': 'container__0b563',

      'browse': (
        'notice': (
          'container': 'container_bc0d35',
          'adminUpsell': 'adminUpsell_bc0d35',
          'content': 'nuxContent_bc0d35',
          'closeButton': 'closeButton_bc0d35',
          'image': 'image_bc0d35',
          'heading': 'heading_bc0d35',
          'tip': 'tip_bc0d35',
          'checkItOut': 'checkItOut_bc0d35',
        ),

        'pageBody': 'pageBody__41ed7',
        'pageHeader': 'header__41ed7',
        'search': 'search__41ed7',
        'createButton': 'createButton__41ed7',
        'createButtonInner': 'createButtonInner__41ed7',
        'createIcon': 'createIcon__41ed7',
        'browser': 'browser__41ed7',
        'scrollerInner': 'scrollerInner_e4503a',

        'categoryRow': 'categoryRow_e4503a',
        'uncategorized': 'uncategorized_e4503a',
        // when combined with categoryRow class, removes top padding
        'categoryText': 'categoryText_e4503a',
        'selectAll': 'selectAll_e4503a',
        'selectAllCheckbox': 'selectAllCheckbox_e4503a',

        'channelRow': 'channelRow_e4503a',
        // background, also one with :hover:not(disabled class)
        'channelDisabled': 'disabled_e4503a',
        'firstChannel': 'firstChannel_e4503a',
        // both this and next class apply border radius to the channel row ..
        'lastChannel': 'lastChannel_e4503a',
        // .. with the first being top left/right and last being bottom left/right
        'channelInfo': 'channelInfo_e4503a',
        'channelName': 'channelName_e4503a',
        'channelText': 'channelText_e4503a',
        'channelSubtitles': 'channelSubtitles_e4503a',
        'channelSubtitle': 'channelSubtitle_e4503a',
        'subtitleSeparator': 'subtitleSeparator_e4503a',
        'channelTopic': 'topic_e4503a',
        'channelActions': 'channelActions_e4503a',
        'viewChannelButton': 'viewChannelButton_e4503a',
        'checkboxInner': 'checkboxInner_e4503a',
        'channelSeparator': 'separator_e4503a',
        // horizontal line, background
      ),

      // customize page
      'customise': (
          'scroller': 'scroller__5d7c9',
          // background with dark/light
          'pageBody': 'pageBody__5d7c9',
          'prompt': 'prompt__5d7c9',
          // background primary
          'promptTitle': 'promptTitle__5d7c9',
          'required': 'required__5d7c9',
          // background accent
          'error': 'error__5d7c9',
          'promptOptions': 'promptOptions__5d7c9',
          'optionWrapper': 'optionButtonWrapper__270d7',
          'optionSelected': 'selected__270d7',
          'optionButton': 'optionButton__270d7',
          // with option background
          'pressed': 'pressed__270d7',
          'checkIcon': 'checkIcon__270d7',
          // background brand experiment
          'memberCount': 'memberCount__270d7',
          // background brand experiment
          'buttonEmoji': 'buttonEmoji__270d7',
          'buttonText': 'buttonText__270d7',
          'helpText': 'helpText__5d7c9',
          'profile': 'profile__5d7c9',
          'profileCard': 'profileCard__5d7c9',
          // background primary
          'separator': 'separator__5d7c9',
          // background modifier accent
          'username': 'username__5d7c9',
          'bio': 'bio__5d7c9',
          'title': 'title__5d7c9',
          'roles': 'roles__5d7c9',
          'role': 'role__5d7c9',
          // background sec alt
          'roleDot': 'roleDot__5d7c9',
          'emptyPage': 'emptyPage__5d7c9',
          'emptyContainer': 'emptyContainer__5d7c9',
          'emptyIcon': 'emptyIcon__5d7c9',
          'emptyHeader': 'emptyHeader__5d7c9',
        ),
    ),

  // document.URL in console contains /member-safety
  'membersPage': (
    'page': 'page_c791b2',
    'header': 'header_c791b2',
    'scroller': 'scroller_d20375',
    'container': 'container_c791b2',

    'tableContainer': 'mainTableContainer__09a38',

    // contains the sortable, searchable list of members. classes may cross over with members page in server settings.
    // for some reason it's in the same line as a bunch of text shit. despite that some of the elements aren't using those classes???
    'loaderBar': 'loaderBar__09a38',
    'loaderContainer': 'loaderContainer__09a38',
    'horizatonalScroller': 'horizatonalScroller__09a38',
    // dunno why there's a typo in the class name
    // similar to class above except different set of text stuff. also not using these classes.
    // Same set
    'button': 'sortButton__98d1c',
    'searchBar': 'searchBar__98d1c',
    'searchHeader': 'searchHeader__98d1c',
    'searchHeaderContainer': 'searchHeaderContainer__98d1c',
    'searchInput': 'searchInput__98d1c',
    'tableOptions': 'tableOptions__98d1c',

    'table': 'table_b4ec0b',
    'newMemberNotice': 'newMembersNotice_acdcc0',

    'otherRoles': 'otherRoles__71c22',
    // so many text classes... different group again.
    'actionButton': 'button__71c22',

    // same line as class above
    'noResultsContainer': 'noResultsContainer__9c6d0',
    // on own line for some reason. The children of it are as follows:
    // div[class] > svg > (wumpus image)
    // div.text-md-normal "No members match these search results.",,
  ),

  'serverBoosts': (
    'container': 'container__89463',
    'contentContainer': 'contentContainer__89463',
    'parentCard': 'parentContainer__5573a',
    'sidebarContainer': 'sidebarContainer__89463',

    'card': 'container__5573a',
    'cardActive': 'active__5573a',
    'cardWarning': 'warning__5573a',

    'sidebarCard': 'container__6c253',
  ),

  'chatForm': (
    'form': 'form_f75fb0',
    'formWithLoadedChatInput': 'formWithLoadedChatInput_f75fb0',
    // the two below were both applied on a disabled chat and an enabled one. second one has the background. still unsure about it.
    'channelBottomBarArea': 'channelBottomBarArea_f75fb0',
    'channelTextArea': 'channelTextArea__74017',
    // base being applied to *every* form
    'channelTextAreaMainChat': 'channelTextArea_f75fb0',
    // used at bottom of text channels
    'channelTextAreaDisabled': 'channelTextAreaDisabled__74017',
    // you can't type into this channel
    'channelTextAreaInline': 'inlineContainer__74017',
    // in user profiles
    'channelTextAreaEdit': 'channelTextArea__5126c',
    // editing
    'themedBackground': 'themedBackground__74017',
    // has background
    'stackedBars': 'stackedBars__74017',
    // also has background
    'stackedAttachedBar': 'stackedAttachedBar_bdf0de',
    'innerDisabled': 'innerDisabled__74017',
    // paired with inner
    'scrollableContainer': 'scrollableContainer__74017',
    'inner': 'inner__74017',
    'sansAttachButton': 'sansAttachButton__74017',
    // buttons bar
    'accessoryBar': 'accessoryBar__74017',
    'accessoryBarLeft': 'accessoryBarLeft__74017',
    'accessoryBarRight': 'accessoryBarRight__74017',
    // always on the main bar for some reason
    'uploadInput': 'uploadInput__0923f',
    'attachWrapper': 'attachWrapper__0923f',
    'attachButton': 'attachButton__0923f',
    'attachButton2': 'attachButton__74017',
    // multiple classes same name same element fun fun
    'attachButtonInner': 'attachButtonInner__0923f',
    'attachButtonPlus': 'attachButtonPlus__0923f',
    'textArea': 'textArea__74017',
    'textAreaDisabled': 'textAreaDisabled__74017',
    'textAreaSlate': 'textAreaSlate__74017',
    'placeholder': 'placeholder__1b31f',
    // phantom text usually saying "Message $channel/$user"
    'buttons': 'buttons__74017',
    'buttonContainer': 'buttonContainer__74017',
    'buttonInner': 'button__24af7',
    'buttonWrapper': 'buttonWrapper__24af7',

    'emojiButton': 'emojiButton__04eed',

    'toolbar': 'toolbar_bba883',

    'hasMore': 'hasMore_cf58b5',
    'attachedBars': 'attachedBars_bdf0de',
    'clipContainer': 'clipContainer__841c8',
    'replyContainer': 'container__841c8',
    'replyBar': 'replyBar__841c8',
    'replyActions': 'actions__841c8',
    'mentionButton': 'mentionButton__841c8',
    'replyName': 'name__841c8',
    'threadSuggestionBar': 'threadSuggestionBar__841c8',

    'fakeLink': 'fakeLink_ada32f',

    'beforeInlineCode': 'before_inlineCode_ada32f',
    'inlineCode': 'inlineCode_ada32f',
    'afterInlineCode': 'after_inlineCode_ada32f',
    'codeLine': 'codeLine_ada32f',
    'codeBlockText': 'codeBlockText_ada32f',

    'attachmentArea': 'channelAttachmentArea_b77158',
    'upload': 'upload_aa605f',
    'uploadContainer': 'uploadContainer_aa605f',
    'uploadActionBarIcon': 'actionBarIcon_a7e304',

    'typingBase': 'base_b88801',
    'typing': 'typing_b88801',
    'typingText': 'text_b88801',
    'typingDots': 'dots__5ad89',
    'typingDotsThemed': 'themed__5ad89',

    // usersettings > accessibility > chat input > show send message button
    'sendButtonContainer': 'buttonContainer_aa63ab',
    'sendButton': 'button_aa63ab',
    'sendButtonInner': 'innerButton_aa63ab',
    'sendButtonChild': 'buttonChild_aa63ab',
    'sendButtonActiveChild': 'activeButtonChild_aa63ab',
    'sendButtonDisabled': 'disabled_aa63ab',
    'sendButtonIcon': 'sendIcon_aa63ab',

    'appsButton': 'button_e6e74f',
  ),

  'discover': (
    'sidebar': (
      'container': 'container__551b0',
      'header': 'header__551b0',
      'nav': 'nav__551b0',
      'item': 'navItem__551b0',
      'itemSelected': 'selected__551b0',
      'itemIcon': 'navItemIcon__551b0',
    ),

    'container': 'container_a592e1',

    'header': 'headerBar__8a7fc',
    'headerOverlay': 'overlay__8a7fc',
    'headerBackdrop': 'backdrop__8a7fc',

    // search page header
    'headerRelative': 'relative__8a7fc',
    'headerIconButton': 'iconButton__8a7fc',

    'search': 'search__1ac1c',
    'searchBar': 'searchBar__1ac1c',
    'scroller': 'scroller__23746',
    'bannerContainer': 'container_e9ef78',
    'bannerContent': 'content_e9ef78',
    'card': 'card__84e3e',
    'cardClickable': 'clickable__84e3e',

    'apps': (
      'card': 'card_f215b9',
      'cardHeader': 'header_f215b9',
      'cardAvatar': 'avatar_f215b9',
      'cardDetails': 'appDetails_f215b9',
      'footerContainer': 'container__19cf2',
      'searchNoResult': 'container__5682d',
    ),

    'servers': (
      'card': 'card__4cb8a',
      'cardHeader': 'header__4cb8a',
      'cardIcon': 'icon__4cb8a',
      'cardIconMask': 'iconMask__4cb8a',
      'cardAvatar': 'avatar_e90879',
      'cardDetails': 'guildDetails__4cb8a',
      'cardTitle': 'title__4cb8a',
      'cardMemberDetails': 'memberDetails__4cb8a',
      'onlineDot': 'presenceCountDot__4cb8a',
      'countDot': 'memberCountDot__4cb8a',
      'searchContainer': 'container_cbd375',
      'searchNoResult': 'container__74f3e',
    ),

    'quests': (
      'tileContainer': 'container_cec934',
      'tile': 'questTile__60f82',
      'tileContent': 'container__956c6',
      'tileDescription': 'rewardDescriptionContainer__956c6',
      'tileQuestName': 'questName__956c6',

      // video quest modal
      'video': (
        'root': 'modalRoot_de2fa0',
        'background': 'modalBg_de2fa0',
        'body': 'modalBody_de2fa0',
        'content': 'modalContent_de2fa0',
        'header': 'contentHeader_de2fa0',
        'footer': 'contentFooter_de2fa0',
      ),
    ),
  ),
  'embeds': (
    'codeblock': 'markup__75297 code',
    'codeblockInline': 'markup__75297 code.inline',
    'embedIframe': 'embedIframe__623de',

    'embedFull': 'embedFull__623de',
    'embedGrid': 'grid__623de',
    // always there?
    'embedGridContainer': 'gridContainer__623de',
    'embedSuppressButton': 'embedSuppressButton__623de',
    'embedVideo': 'embedVideo__623de',
    
    'attachment': (
      'wrapper': 'fileWrapper__0ccae',
      'file': 'file__0ccae',
      'icon': 'icon__0ccae',
      'inner': 'fileInner__0ccae',
      'nameLink': 'fileNameLink__0ccae',

      'upload': (        
        'progress': 'progress__5a6ab',
        'progressBar': 'progressBar__5a6ab',
      ),
    ),

    'textContainer': (
      'container': 'container__4d95d',
      'textContainer': 'textContainer__4d95d',
      'codeView': 'codeView__4d95d',
      'footer': 'footer__4d95d',
      'toggleExpand': 'toggleExpandSection__4d95d',
      'openFullPreview': 'openFullPreviewSection__4d95d',
      'attachmentName': 'attachmentName__4d95d',
      'attachmentSize': 'formattedSize__4d95d',
      'downloadButton': 'downloadButton__4d95d',
      'codeIcon': 'codeIcon__4d95d',
      'languageSelectorPopout': 'languageSelector__4d95d',
      'modalTextContainer': 'modalTextContainer__4d95d',
    ),

    'invite': (
      'wrapper': 'wrapper_d5f3cd',
      'destinationExpired': 'inviteDestinationExpired_d5f3cd',
      'serverIcon': 'guildIcon_d5f3cd',
      'serverIconImage': 'guildIconImage_d5f3cd',
      'serverIconExpired': 'guildIconExpired_d5f3cd',
      'resolvingBackground': 'resolvingBackground_d5f3cd',
      'splash': 'inviteSplash_d5f3cd',
      'splashImage': 'inviteSplashImage_d5f3cd',
      'splashImageLoaded': 'inviteSplashImageLoaded_d5f3cd',
      'guildInfo': 'guildInfo_d5f3cd',
      'guildName': 'guildName_d5f3cd',
      'guildDetail': 'guildDetail_d5f3cd',
      // expired invite
      'status': 'status_d5f3cd',
      'statusOnline': 'statusOnline_d5f3cd',
      'statusOffline': 'statusOffline_d5f3cd',
      'button': 'button_d5f3cd',

      // guild invite embed
      'guildInviteContainer' :'guildInviteContainer__083ae',
      'guildInviteFooter': 'footerContent__083ae',
    ),

    'gift': (
      'codeContainer': 'giftCodeContainer_b7e1cb',
      'tile': 'tile__72090',
      'tileHorizontal': 'tileHorizontal__72090',
      'embedHorizontal': 'embedHorizontal_a8b53f',
      'embedVertical': 'embedVertical_a8b53f',
      'media': 'media__72090',
      'mediaHorizontal': 'mediaHorizontal__72090',
      'invalidPoop': 'invalidPoop__857bf',
      'invalidPoopHorizontal': 'invalidPoopHorizontal__857bf',
      'description': 'description__72090',
      'title': 'title__72090',
      'tagline': 'tagline__72090',
      'actions': 'actions__72090',
    ),

    'gameInvite': (
      'gameInviteContainer': 'container__6f250',
      // class might be wrong.
      'invite': 'invite__4d3fa',
      'coverImageWrapper': 'coverImageWrapper__4d3fa',
      'coverImage': 'coverImage__4d3fa',
      'coverImageNotActionable': 'coverImageNotActionable__4d3fa',
      'coverImageActionable': 'coverImageActionable__4d3fa',
      'coverImageBlurred': 'blurred__4d3fa',
      'header': 'header__4d3fa',
      'details': 'details__4d3fa',
      'state': 'state__4d3fa',
      'partyStatus': 'partyStatus__4d3fa',
      'name': 'name__4d3fa',
      'fullHeight': 'fullHeight__4d3fa',
      'artwork': 'artwork__4d3fa',
    ),

    'threadSpine': 'spine__9271d',
    'threadContainer': 'container__9271d',
    'threadCTA': 'cta__9271d',

    'voiceMessage': (
      // all on same line
      'container': 'container_a8e786',
      'playing': 'playing_a8e786',
      'rippleContainer': 'rippleContainer_a8e786',
      'ripple': 'ripple_a8e786',
      // overlay when message is playing
      'playButtonContainer': 'playButtonContainer_a8e786',
      'playIcon': 'playIcon_a8e786',
      'oldPlayIconSpacing': 'oldPlayIconSpacing_a8e786',
      'waveform': 'waveform_a8e786',
      'duration': 'duration_a8e786',
      'reducedMotion': 'reducedMotion_a8e786',
      'volumeButton': 'volumeButton_a8e786',
      'volumeSlider': 'volumeSlider_a8e786',
      'volumeButtonIcon': 'volumeButtonIcon_a8e786',
      'audioElement': 'audioElement_a8e786',
    ),

    'media': (
      'audioWrapper': 'wrapperAudio_cf09d8',
      'audioMetadata': 'audioMetadata_cf09d8',
      'metadataContent': 'metadataContent_cf09d8',
      'audioControls': 'audioControls_cf09d8',      
      'videoWrapper': 'wrapper_cf09d8',
      'videoControls': 'videoControls_cf09d8',
      'controlIcon': 'controlIcon_cf09d8',
      'metadataDownload': 'metadataDownload_cf09d8',
      'metadataIcon': 'metadataIcon_cf09d8',
      'metadataSize': 'metadataSize_cf09d8',
      'durationWrapper': 'durationTimeWrapper_cf09d8',
      'durationDisplay': 'durationTimeDisplay_cf09d8',
      'durationSeparator': 'durationTimeSeparator_cf09d8',
    ),

    'hoverButton': (
      // download audio/video and edit image button
      'group': 'hoverButtonGroup__06ab4',
      'button': 'hoverButton__06ab4',
      'selected': 'selected__06ab4',
      'downloadIcon': 'downloadHoverButtonIcon__6c706',
    ),

    'poll': (
      'pollContainer': 'pollContainer_b7e1cb',
      // shared class with next group's "container"
      // all in another group
      'container': 'container__0be77',
      'bottomBar': 'bottomBar__0be77',
      // contains detailsText and usually secondary action
      'buttonPresentation': 'buttonPresentation__0be77',
      // bg-c card-secondary-bg
      'detailsText': 'detailsText__0be77',
      'detailsTextButton': 'detailsTextButton__0be77',
      // button lookBlank colorBrand grow; clicking shows who voted. check modals > pollVotes
      'header': 'header__0be77',
      'interactive': 'interactive__0be77',
      'prompt': 'prompt__0be77',
      'question': 'question__0be77',
      // child to header, also contains default color (header primary), font scaling, text md medium and default color (text normal; overwritten)
      'secondaryAction': 'secondaryAction__0be77',
      'secondaryButtonPresentation': 'secondaryButtonPresentation__0be77',
      'tertiaryAction': 'tertiaryAction__0be77',

      // answers seem to be in their own group for some reason
      'answer': 'answer__4c520',
      'answerInner': 'answerInner__4c520',
      'answerSelectionIcon': 'answerSelectionIcon__4c520',
      'answersContainer': 'answersContainer__4c520',
      // see comments below.
      // WHILE NOT YET VOTED: you can determine which poll type is which by adding
      // [role=group] for "pick one"
      // [role=group] for "pick multiple"
      // ONCE VOTED: I do not know how to determine which is which other than "has multiple children with votedStyles_a1443c"
      // ONCE ENDED: same thing as above but the equiv of :where(votedStyles_a1443c,victorStyles_a1443c)
      'currentlyVoting': 'currentlyVoting__4c520',
      'emoji': 'emoji__4c520',
      // optional emoji that gets placed before label
      'label': 'label__4c520',
      'selected': 'selected__4c520',      
      'voteCount': 'voteCount__4c520',
      'voteCountButton': 'voteCountButton__4c520',
      'votePercentageBar': 'votePercentageBar__4c520',
      // a span with style width: $percentage%. has background color -- THIS IS USED ON ANSWERS WITHOUT VOTES [style:"width: 0%;"]
      'votesData': 'votesData__4c520',

      'radioBackground': 'radioBackground_f4f0eb',
      'radioForeground': 'radioForeground_f4f0eb',
      // one choice
      'checkbox': 'checkbox_f4f0eb',
      'checkboxSelected': 'checkboxSelected_f4f0eb',
      // multiple choices

      // how answers are themed seems to be in some classes
      'normalStylesDefault': 'normalStylesDefault_a1443c',
      'normalStylesImageOnlyAnswers': 'normalStylesImageOnlyAnswers_a1443c',
      'victorStyles': 'victorStyles_a1443c',
      'votedStyles': 'votedStyles_a1443c',

      // poll finished small embed
      'finished': (
        'container': 'container_f69538',
        'embed': 'embed_f69538',
        'containerWithImage': 'containerWithImage_f69538',
        'imageContainer': 'imageContainer_f69538',
        'description': 'description_f69538',
        'victorAnswer': 'victorAnswer_f69538',
        'victorAnswerText': 'victorAnswerText_f69538',
        'victorIcon': 'victorAnswer_f69538',
        'button': 'button_f69538',
      ),
    ),

    'automod': (
      'card': 'embedCard__44492',
      'footerContainer': 'footerContainer__44492',
      'action': 'footerAction__44492',
      'actionIcon': 'footerIcon__44492',
      'dot': 'dot__44492',
    ),
  ),
  // heavily related to embeds
  'media': (
      'barInteraction': 'mediaBarInteraction_b26b79',
      'barInteractionDragging': 'mediaBarInteractionDragging_b26b79',
      // hover required for grabber
      'barWrapper': 'mediaBarWrapper_b26b79',
      // needs before + after
      'barBuffer': 'buffer_b26b79',
      // needs before + after, secondary color
      'barPreview': 'mediaBarPreview_b26b79',
      // needs before + after
      'barProgress': 'mediaBarProgress_b26b79',
      // needs before + after, primary color
      'barGrabber': 'mediaBarGrabber_b26b79',
      // primary color
      'barVolume': 'mediaBarInteractionVolume_b26b79',
      'bubble': 'bubble_b26b79',
    ),
  'error': (
    'page': 'errorPage_a57b28',
    'wrapper': 'wrapper__61a6b',
    'flexWrapper': 'flexWrapper__61a6b',
    'image': 'image__61a6b',
    'text': 'text__61a6b',
    'title': 'title__61a6b',
    'note': 'note__61a6b',
    'buttons': 'buttons_a57b28',
  ),
  'friends': (
    'container': 'container__133bf',
    'tabBody': 'tabBody__133bf',
    'inviteToolbar': 'inviteToolbar__133bf',
    'peopleColumn': 'peopleColumn__133bf',
    'peopleList': 'peopleList__5ec2f',
    'peopleListTitle': 'title__1472a',
    'peopleListItem': 'peopleListItem_cc6179',
    'peopleListItemActive': 'active_cc6179',
    'peopleListItemText': 'text__0a06e',
    'peopleListItemDiscordTag': 'discordTag__0a06e',
    'peopleListUsername': 'username__0a06e',
    'peopleListDiscriminator': 'discriminator__0a06e',
    'peopleListBotTag': 'botTag__0a06e',
    'actionButton': 'actionButton_f8fa06',
    'actionButtonAccept': 'actionAccept_f8fa06',
    'actionButtonDeny': 'actionDeny_f8fa06',
    'highlight': 'highlight_f8fa06',

    'blockedIgnoredSettingsNotice': 'blockedIgnoredSettingsNotice__6811a',

    'searchbar': 'searchBar__5ec2f',

    'addFriendHeader': 'header__94b08',
    'addFriendTitle': 'title__94b08',
    // h2
    'addFriendEmptyState': 'emptyState__94b08',
    // below the grid which was hit with a display none
    'addFriendInputWrapper': 'addFriendInputWrapper__72ba7',
    'addFriendInput': 'input__72ba7',

    'empty': 'friendsEmpty_c7ea19',
    'emptyImage': 'image__33d12',
    'emptyTitle': 'title__33d12',
    'emptyText': 'text__33d12',

    'nowPlayingColumn': 'nowPlayingColumn__133bf',
    'nowPlayingContainer': 'container__7d20c',
    'nowPlayingScroller': 'scroller__7d20c',
    'nowPlayingHeader': 'header__7d20c',
    'consentCard': 'card__2eab1',
    'emptyCard': 'emptyCard__7e549',
    'itemCard': 'itemCard__7e549',
    'itemCardWrapper': 'wrapper__00943',
    // on same element as itemCard
    'itemCardBody': 'body__00943',
    'itemCardBodyInset': 'inset_bf1984',
    // on same as body, has background?
    'itemCardBodySection': 'section__00943',
    'itemCardActivitySection': 'activitySection__00943',
    'itemCardSeparator': 'separator__00943',
    'itemCardActive': 'active_bf1984',
    'itemCardInteractive': 'interactive_bf1984',
    'itemCardOuter': 'outer_bf1984',
    'voiceSectionIconWrapper': 'voiceSectionIconWrapper__00943',
    'partyMemberOverflow': 'partyMemberOverflow_e45a82',
    'live': 'live_a7acae',
    // "LIVE" icon of sorts in voice channel
    'multipleIconWrapper': 'multipleIconWrapper__00943',
    // guess
    'multipleIcon': 'multipleIcon__00943',
    'activeNowAvatar': 'headerAvatar__00943',

    'explorePublicHeader': 'header_a14595',
    'explorePublicTitle': 'title_a14595',
    'explorePublicGrid': 'grid_a14595',
    'explorePublicContainer': 'container_a14595',
    'explorePublicIcon': 'icon_a14595',
    'explorePublicText': 'text_a14595',
    'explorePublicArrow': 'arrow_a14595',
  ),
  // home nitro
  'nitro': (
      'store': 'applicationStore_f07d62',
      'wrapper': 'homeWrapper__0920e',
      'mainPageScroller': 'mainPageScroller_ca1a02',
      'allPerksScroller': 'allPerksScroller_ca1a02',
      'allPerksScrollerOpen': 'open_ca1a02',

      'card': 'card_b5493b',
      'cardDescription': 'cardDescription_b5493b',

      'seePerksButton': 'seeAllPerksButton_ca1a02',

      'gift': 'giftNitro_ca1a02',
      'giftContainer': 'container_da4aee',
      'giftTextContainer': 'textContainer_da4aee',
      'giftButton': 'giftCardButton_da4aee',
      // only appears without nitro
      'footerInnerWrapper': 'innerWrapper_c511e4',
      // all perks page
      'backButton': 'backButton_b9abc5',
      'arrows': 'leftArrow__3cf14' 'rightArrow__3cf14',
      'arrowInactive': 'inactiveArrow__3cf14',
      'arrowIcon': 'arrowIcon__3cf14',
      'progressBar': 'cardProgressBar__3cf14',
      'progressDot': 'dot__3cf14',
      'progressDotSelected': 'selectedDot__3cf14',
    ),

  'shop': (
    'shop': 'shop__6db1d',
    'scroll': 'shopScroll__1feb0',
    'header': 'headerBar__80679',

    // featured
    'featuredScroll': 'shopScroll__08415',
    'featured': 'shop__08415',

    // browse
    'pageWrapper': 'pageWrapper__1feb0',
    'page': 'page__1feb0',
    'divider': 'divider__1feb0',
    'filter': 'filterBar__1feb0',

    // loading
    'loadingCardSkeleton': 'skeleton__72fa0',
    'loadingBanner': 'bannerBody__72fa0',
    'loadingCardBody': 'cardBody__72fa0',
    'loadingCardContent': 'cardAvatar__72fa0' 'cardTitle__72fa0' 'cardDescription__72fa0' 'cardSummary__72fa0',
    'loadingFeaturedSkeleton': 'skeleton__08415',
    'loadingFeaturedBody': 'skeletonBody__08415',

    // cards
    'card': 'shopCard_c3d04b',
    'cardNitro': 'shopCard_b37971',
    'cardDarkBackground': 'darkCardBackground_c3d04b',
    'cardDarkBackgroundNitro': 'darkCardBackground_b37971',
    'cardText': 'cardText_c3d04b',
    'cardTextLight': 'lightCardBackground_c3d04b',
    'cardTextDark': 'darkCardBackground_c3d04b',

    // filter
    'filterBar': 'filterBar__11877',
    'filterSection': 'filterSection__11877',
    'filterTitle__11877': 'filterTitle',
    'filterColorRow': 'colorSwatchRow__11877',
    'filterColor': 'circle__11877',
    'filterColorToggled': 'circleToggled__11877',
    'filterThemeRow': 'themeRow__11877',
    'filterTheme': 'theme__11877',
    'filterThemeToggled': 'themeToggled__11877',

    // preview
    'previewModal': 'modalContent_c50f62',
    'previewInfo': 'collectibleInfoContainer_c50f62',
    'chatPreview': 'chatPreview_c50f62',
    'mockInput': 'mockInput_c50f62',

    // orb
    'orbCard': 'baseCardOutline__1ab14',
  ),

  'boost': (
    'scroller': 'scroller__6fd0e',
    'headerWave': 'headerWave__1dfae',
    'bodyWave': 'bodyWave__1dfae',
    'topPerksCard': 'topPerksCard__3add8',
    'card': 'card__4d7bb',
    'faq': 'wrapper__5b98e',
    'footerPopout': 'innerWrapper_b4589b',
  ),

  // kinda bad name. in desktop visual refresh, appears at the top as the first child under #{c(main base)}.
  'title': (
      'bar': 'bar_c38106',

      // these appear for opening settings or ca full screen modal, does not appear for web/vesktop
      // this bar appears under #app-mount and the preceding sibling to #{c(main appAsidePanelWrapper)}.
      'systemBar': 'systemBar_c38106',
      // z-index 99999; display none; justify-content flex-end
      'fixed': 'fixed_c38106',
      // position fixed
      'show': 'show_c38106',

      // display flex (used to overwrite systemBar)
      // appears in middle, contains the active server icon or another icon along with the name of the channel
      'title': (
          'container': 'title_c38106',
          // parent class
          'title': 'title__85643',
          // parent to an SVG icon (friends list, dms) or the server icon along with the name
          // In the different areas:
          // DMs, Friends list, Nitro and Shop all contain the same as above with the amount of paths changing. DMs = 1 path, Friends+Shop = 2 path, Nitro = 3 path.
          // title >
          //			svg:not([class]) > path[class][fill="var(--interactive-normal)"]
          //			<div #{c(text textNormalDefaultColor)} #{c(text lineClamp1)} (then one of the text-sm/medium classes) >text</div>
          //
          // Server:
          // title > div .serverIcon (here) [style$="background-image: url(...)"] + div
          'serverIcon': 'guildIcon__85643',

          // other classes
          'icon': 'icon__85643',
          // does not get applied to svgs, unsure on usage.
        ),
      // appears on left, probably contains mac os close/min/fullscreen buttons; cannot test as not on mac
      'leading': (
          'container': 'leading_c38106',
        ),
      // appears on right, contains inbox, help link and windows min/max/close buttons
      'trailing': (
          'container': 'trailing_c38106',
          'recentsIcon': 'recentsIcon_c99c29',
          // inbox icon
          // for the help link, target #{c(topBar trailing container)}>a[href="https://support.discord.com"]
          'button': 'button__85643',

          // child icons. css has a rule for .visualRefresh .button svg {} -- despite that svg having a class lol
          // windows buttons have different classes compared to before. see os > windows for the old classes.
          'winButtons': 'winButtons_c38106',
          'winButtonsWithDivider': 'winButtonsWithDivider_c38106',
          // has ::before, does not appear in bar under #app-mount
          'winButton': 'winButton_c38106',
          'winButtonMinMax': 'winButtonMinMax_c38106',
          // to target either one, use :first-child or :nth-child(2) for min / max
          'winButtonClose': 'winButtonClose_c38106',
        ),

      // extra classes that idk what they do
      'shortBar': 'shortBar_c38106',
    ),
  'header': (
    'header': 'container__9293f',
    'headerTitle': 'title_f75fb0',
    // used with above, not always though
    'themed': 'themed__9293f',
    'transparent': 'transparent__9293f',
    'children': 'children__9293f',
    'divider': 'divider__9293f',
    'iconWrapper': 'iconWrapper__9293f',
    'updateDownloadingCloud': 'cloud__49676',
    'updateDownloadingIcon': 'downloadArrow__49676',
    'updateIconForeground': 'updateIconForeground__49676',
    'icon': 'icon__9293f',
    'iconClickable': 'clickable__9293f',
    'title': 'title__9293f',
    'spacer': 'spacer__488b1',
    // no nick nor channel desc, has zero width
    'dot': 'dot__9293f',
    // space between channel name and description
    'akaBadge': 'akaBadge__488b1',
    'input': 'input__4f074',
    'toolbar': 'toolbar__9293f',
    'iconSelected': 'selected__9293f',
    'search': 'search__49676',
    // contains margin
    'searchInner': 'search__97492',
    // gets open applied to it
    'searchOpen': 'open__97492',
    'searchBar': 'searchBar__97492',
    'searchFilter': 'searchFilter_bd8186',
    'searchAnswer': 'searchAnswer_bd8186',
    'iconBadge': 'iconBadge__9293f',
    'topic': 'topic__6ec1a',
    'topicExpandable': 'expandable__6ec1a',
    'avatars': 'avatars__488b1',
    'avatar': 'avatar_f75fb0',
    // on same line as chat-$suffix
    'tabBar': 'tabBar__133bf',
    'addFriend': 'addFriend__133bf',
    'tabBarItem': 'item__133bf',
    'followButton': 'followButton_f75fb0',
  ),
  'hljs': (
    // The usage of the hljs-[type] variables varies depending on language and will probably be best
    // to use the docs of https://highlightjs.org/ to find what langs use what class and in what way
    // Using SCSS as an example
    // comment is used for the // and /* */  comments
    // selector-class and selector-id are used for .class and #id respectively
    // selector-tag are used for any html tags (think "div", "span", "p", etc)
    // selector-pseudo is used for things like :not() and ::before
    // attribute is used for any valid css rule within the curly brackets {} (examples being "background" or "display")
    // keyword is used for anything using @ - this would be @media, @mixin, @include, @import etc
    // This class list DOES NOT include languages. You can find a list of languages in the codelangs file.
    // Any comments within HLJS relate to the color between that comment and the next one
    'hljs': 'hljs',
    // var interactive muted
    'comment': 'hljs-comment',
    'quote': 'hljs-quote',
    // #859900 , olive
    'addition': 'hljs-addition',
    'keyword': 'hljs-keyword',
    'selectorTag': 'hljs-selector-tag',
    // #2aa198 , teal
    'doctag': 'hljs-doctag',
    'literal': 'hljs-literal',
    'meta': 'hljs-meta',
    'metaString': 'hljs-meta-string',
    'number': 'hljs-number',
    'regexp': 'hljs-regexp',
    'string': 'hljs-string',
    // #268bd2 , blue
    'name': 'hljs-name',
    'section': 'hljs-section',
    'selectorClass': 'hljs-selector-class',
    'selectorId': 'hljs-selector-id',
    'title': 'hljs-title',
    // #b58900 , yellow-brown
    'attr': 'hljs-attr',
    'attribute': 'hljs-attribute',
    'class': 'hljs-class',
    'templateVariable': 'hljs-template-variable',
    'type': 'hljs-type',
    'variable': 'hljs-variable',
    // #cb4b16 , slightly darker orange / "tawny"
    'bullet': 'hljs-bullet',
    'link': 'hljs-link',
    'selectorAttr': 'hljs-selector-attr',
    'selectorPseudo': 'hljs-selector-pseudo',
    'subst': 'hljs-subst',
    'symbol': 'hljs-symbol',
    // #dc322f , persian red
    'built_in': 'hljs-built_in',
    'deletion': 'hljs-deletion',
    // formula uses a background of #073642, kinda grey-dark-blue
    'formula': 'hljs-formula',
    // no more colors apply after this
    'emphasis': 'hljs-emphasis',
    'strong': 'hljs-strong',
    'markdown': 'markdown_d285a6',
    'blockquote': 'blockquote_d285a6',
    'codeInline': 'codeInline_d285a6',
    'paragraph': 'paragraph_d285a6',
  ),
  // Obviously best seen in Settings > App Settings > Keybinds. Can also be brought up by pressing CTRL+/
  'keybinds': (
      'combo': 'combo_fcddc1',
      'key': 'key_fcddc1',
      'bindArrow': 'bindArrow_fcddc1',
      // unless "down", has extra class for direction
      'up': 'up_fcddc1',
      'left': 'left_fcddc1',
      'right': 'right_fcddc1',

      'searchPopout': 'keybindShortcutSearchPopout_fcddc1',
      'shortcuts': 'keyboardShortcuts_fcddc1',

      // no idea about these
      'dim': 'dim_fcddc1',
    ),
  'loading': (
    'container': 'container_a2f514',
    'ready': 'ready_a2f514',
    'content': 'content_a2f514',
    'problems': (
      'problems': 'problems_a2f514',
      'slideIn': 'slideIn_a2f514',
      'text': 'problemsText_a2f514',
      'links': 'links_a2f514',
      'statusLink': 'statusLink_a2f514',
      'twitterLink': 'twitterLink_a2f514',
      'linkIcon': 'icon_a2f514',
    ),
    'contentBase': 'contentBase_a2f514',
    'text': 'text_a2f514',
    'title': 'title_a2f514',
    'tipTitle': 'tipTitle_a2f514',
    'tip': 'tip_a2f514',
    'keybind': 'keybind_a2f514',
    'body': 'body_a2f514',

    // on same element as contentBase
    'firefoxFixScrollFlex': 'firefoxFixScrollFlex_c7e9c6',
    'fixClipping': 'fixClipping_efbae7',
  ),
  'memberList': (
    'container': 'container_c8ffbb',
    'wrap': 'membersWrap_c8ffbb',
    'hiddenMembers': 'hiddenMembers_c8ffbb',
    'members': 'members_c8ffbb',
    'group': 'membersGroup_c8ffbb',

    'activityHeader': 'header__095fe',
    'activityContainer': 'container__0f2e8',
    'activityContainerSelected': 'selected__0f2e8',
    'activityPopoutWrapper': 'popoutContentWrapper_af3b89',
    'activityPopoutInteractionsHeader': 'interactionsContainerHeader_af3b89',
    'activityPopoutInteractions': 'interactionsContainer_af3b89',
    'activityPopoutShareToChannelButton': 'shareToChannelButton_af3b89',

    'member': 'member__5d473',
    'memberBackground': 'member_c8ffbb',
    'memberClickable': 'clickable__91a9d',
    'memberContainer': 'container__91a9d',
    'selected': 'selected__91a9d',
    'childContainer': 'childContainer__91a9d',
    'nameplated': 'nameplated__91a9d',
    // members with nameplates
    'layout': 'layout__91a9d',
    'memberInner': 'memberInner__5d473',
    'muted': 'muted__91a9d',
    'avatar': 'avatar__91a9d',
    'contentName': 'content__91a9d',
    'ownerIcon': 'ownerIcon__5d473',
    'name': 'name__91a9d',
    'nameContainer': 'nameContainer__703b9',
    'usernameInner': 'username__703b9',
    'offline': 'offline__5d473',
    'placeholderMemberGroups': 'memberGroupsPlaceholder_c8ffbb',
    'placeholderAvatar': 'placeholderAvatar__27cc6',
    'placeholderUsername': 'placeholderUsername__27cc6',
    'placeholderUsernameMultiple': 'mulitplePlaceholderUsername__27cc6',

    // activity status
    'activityIcon': 'icon_c9d15c',
    // shows up when a user is playing a game or listening to music -- SHARED IN OTHER PLACES IN APP
    'activityQuestsIcon': 'questsIcon_c9d15c',
    // presumably this is used with quests. -- SHARED IN OTHER PLACES IN APP
    'activityEmoji': 'emoji_c9d15c',
    'activityText': 'truncated_c9d15c',

    // click on user with quest badge
    'quest': (
      'container': 'container__4413f',
      'button': 'ctaButton__4413f',
    ),
  ),
  // this area doesn't show up if you don't have any pending requests.
  // it can be accessed by going to https://discord.com/message-requests
  // (default repo) the main file is under pyrite/source/theme/friends
  'messageRequests': (
    'container': 'container_f391e3',
    'list': 'list_f391e3',
    'sectionTitle': 'sectionTitle_f391e3',
    'selected': 'selected_f391e3',
    'siblingSelected': 'siblingSelected_f391e3',
    'messageRequestCoachmark': 'messageRequestCoachmark_f391e3',
    'titleDivider': 'titleDivider_f391e3',
    'clearAllButton': 'clearAllButton_f391e3',

    'item': 'messageRequestItem_abb9ad',
    'active': 'active_abb9ad',

    'emptyStateContainer': 'emptyStateContainer__65428',
    // not sure if this is used elsewhere.
  ),
  // shared classes. used as aliases from elsewhere.
  'nameTag': (
    'nameTag': 'nameTag__05e81',
    'username': 'username__05e81',
    'bot': 'bot__05e81',
  ),
  'notice': (
    'base': 'notice__6e2b9',
    'button': 'button__6e2b9',
    'closeButton': 'closeButton__6e2b9',
    // "X" on right
    'colorWarning': 'colorWarning__6e2b9',
    // shown when nitro is about to end when you don't have a payment option. on same line as other notice stuff
    'colorDanger': 'colorDanger__6e2b9',
    // mic muted
    'colorStreamerMode': 'colorStreamerMode__6e2b9',
    // obviously when streamer mode is enabled.
    'colorDefault': 'colorDefault__6e2b9',
    // Web only for "PLEASE DOWNLOAD THE DESKTOP APP" background color. Also used for suggesting to add a mobile number for 2FA.
    'colorNeutral': 'colorNeutral__6e2b9',
    // idfk
    'colorPremium': 'colorPremium__6e2b9',
    // nitro banner of some kind? probably tied with the tier# ones
    'colorPremiumTier0': 'colorPremiumTier0__6e2b9',
    // see above
    'colorPremiumTier1': 'colorPremiumTier1__6e2b9',
    // see above
    'colorPremiumTier2': 'colorPremiumTier2__6e2b9',
    // see above
    'colorInfo': 'colorInfo__6e2b9',
    // idfk
    'colorSpotify': 'colorSpotify__6e2b9',
    // i don't use Spotify so can't check :)
    'colorPlayStation': 'colorPlayStation__6e2b9',
    // same as Spotify
    'colorBrand': 'colorBrand__6e2b9',
    // view server as role
    'colorCustom': 'colorCustom__6e2b9',
    // idfk
    // The contents of these notices are in English because yes.
    'completeSteps': 'notice__30f28',
    // contents: "You must complete a few more steps before you can start talking in this server."
    'previewServerNotice': 'notice_c5cd6a',
  ),
  // These appear to be shared between profile popout and server settings. likely used elsewhere too.
  // DOES NOT APPLY TO TOP OF CHAT CHANNEL AREA.
  'role': (
    'root': 'root__48c1c',
    'role': 'role_dfa8b6',
    'removeButton': 'roleRemoveButton_dfa8b6',
    'removeIcon': 'roleRemoveIcon_dfa8b6',
    'circle': 'roleCircle__4f569',
    'flowerStar': 'roleFlowerStar__48c1c',
    'verifiedIcon': 'roleVerifiedIcon__48c1c',
    'name': 'roleName__48c1c',
    'nameOverflow': 'roleNameOverflow__48c1c',
    'actionButton': 'actionButton__48c1c',
    'addButton': 'addButton__48c1c',
    'addButtonIcon': 'addButtonIcon__48c1c',
    'icon': 'roleIcon__48c1c',
    'expandButton': 'expandButton_fccfdf',
    'collapseButton': 'collapseButton_fccfdf',

    // Show role colours next to names
    'svg': 'svg__4f569',
    'background': 'background__4f569',
    'dot': 'dot__4f569',
    'dotBorderColor': 'dotBorderColor__4f569',
    'dotBorderBase': 'dotBorderBase__4f569',

    // add roles
    'add': (
      'popout': 'container__3dde2',
      'list': 'list__97e86',
      'item': 'item__97e86',
    ),
  ),
  'scroller': (
    // There's two because pain.
    'base': 'scrollerBase__99f8c' 'scrollerBase_d125d2',
    'thin': 'thin__99f8c' 'thin_d125d2',
    // channel sidebar
    'auto': 'auto__99f8c' 'auto_d125d2',
    // "default"
    'none': 'none__99f8c' 'none_d125d2',
    // server list
    'fade': 'fade__99f8c' 'fade_d125d2',
    // channel sidebar (show on hover)
    'scrolling': 'scrolling__99f8c' 'scrolling_d125d2',
    'disableScrollAnchor': 'disableScrollAnchor_eed6a8' 'disableScrollAnchor_d125d2',
    'content': 'content__99f8c' 'content_d125d2',
    // USED EVERYWHERE AS A CHILD CLASS TO BASE.
    'managedReactiveScroller': 'managedReactiveScroller_eed6a8' 'managedReactiveScroller_d125d2',
    'pointerCover': 'pointerCover_eed6a8' 'pointerCover_d125d2',
    // disables inputs by the looks of it. seems to be a child of content on SOME scrollers
    'customTheme': 'customTheme__99f8c' 'customTheme_d125d2',
    // idk where this is used
  ),
  'search': (
    'wrap': 'searchResultsWrap_a9e706',
    'header': 'searchHeader_f3b986',
    'results': 'totalResults_f3b986',
    'headerTabList': 'searchHeaderTabList_f3b986',
    'scroller': 'scroller_a9e706',
    'channelNameText': 'channelNameText_c68065',
    'resultsGroup': 'searchResultGroup_c68065',
    'resultContainer': 'container__02a39',
    'result': 'searchResult__02a39',
    'message': 'message__02a39',
    'blocked': 'resultsBlocked_c68065',
    'jumpButtonContainer': 'buttonsContainer__02a39',
    'jumpButton': 'button__02a39',
    'navContainer': 'container__3f123',
    'errorImage': 'errorImage_a9e706',
    'errorMessage': 'errorMessage_a9e706',
    // paired with emptyResultsText
    'OOOOHHHHHHHHBANANA': 'alt_a9e706',
    // used for banana image, don't mind the name
    'emptyResultsWrap': 'emptyResultsWrap_a9e706',
    'emptyResultsContent': 'emptyResultsContent_a9e706',
    'noResultsImage': 'noResultsImage_a9e706',
    'emptyResultsText': 'emptyResultsText_a9e706',
    'noResults': 'noResults_a9e706',
  ),

  'searchbar': (
    'container': 'container_a45028',
    // For actual search bar; formally (incorrectly) used for entire container
    'medium': 'medium_a45028',
    'inner': 'inner_a45028',
    // appears to be used for both a wrapper and <input>
    'iconLayout': 'iconLayout_a45028',
    'iconContainer': 'iconContainer_a45028',
    'iconVisible': 'visible_a45028',
    'iconClear': 'clear_a45028',

    'settings': (
      // needs .visual-refresh
      // used in settings search, create dms
      // most others seem to be using _a45028 instead
      'container': 'container_fea832',
      'disabled': 'disabled_fea832',
      // Best seen in non-nitro stickers
      'inner': 'inner_fea832',
      'input': 'input_fea832',
      // text, usually. often has a `value=` when typing
      'tag': 'tag_fea832',
      // add/create dms' username
      'close': 'close_fea832',
      // add/create dms' username's cross

      'iconLayout': 'iconLayout_fea832',
      'iconContainer': 'iconContainer_fea832',
      'icon': 'icon_fea832',
      'iconVisible': 'visible_fea832',
      'iconClear': 'clear_fea832',

      'small': 'small_fea832',
      'medium': 'medium_fea832',
      'large': 'large_fea832',

    )
  ),

  'guildList': (    
    'focusStroke': 'focusStroke_cc5dd2',
    
    'guilds': 'guilds_c48ade',
    'wrapper': 'wrapper_ef3116',
    'hidden': 'hidden_ef3116',
    // unsure about usage but exists on same line as wrapper above
    'tree': 'tree_ef3116',
    'scroller': 'scroller_ef3116',
    'homeContainer': 'tutorialContainer__1f388',
    'listItemWrapper': 'listItemWrapper_dfb2f8',
    // seems to be only on home, add new and discovery
    'listItem': 'listItem__650eb',
    'listItemTooltip': 'listItemTooltip__90d72',
    // tooltip obviously, used when hovering over anything in server list
    'listItemTooltipFolder': 'listItemTooltip_dfb2f8',
    // for folders, home, add server, discover
    'serverSeparator': 'guildSeparator__252b6',
    'placeholderMask': 'placeholderMask__87847',
    'placeholderInner': 'dragInner__87847',
    'pillHome': 'pill__1f388',
    // pill for home
    'pill': 'pill_e5445c',
    'pillDiscover': 'pill__5bc7e',
    'pillWrapper': 'wrapper__58105',
    'pillItem': 'item__58105',
    'blobContainer': 'blobContainer_e5445c',
    // seems to be inverse of listItemWrapper, except not folders
    'serverWrapper': 'wrapper_cc5dd2',
    // wrapper for everything, really.
    'serverWrapperSVG': 'svg_cc5dd2',
    // holds defs, mask and foreignObject
    'serverWrapperSimple': 'wrapperSimple_cc5dd2',
    'iconWrapper': 'wrapper__6e9f8',
    'homeWrapper': 'childWrapper__6e9f8',
    'acronym': 'acronym__6e9f8',
    // servers without icons
    'acronymFolder': 'acronym_f34534',
    // above but within a folder
    'guildIcon': 'icon__6e9f8',
    'selected': 'selected__6e9f8',
    'bottomButtonContainer': 'tutorialContainer__650eb',
    'bottomButton': 'circleIconButton__5bc7e',
    'bottomButtonSelected': 'selected__5bc7e',
    'bottomButtonDisabled': 'disabled__5bc7e',
    'bottomButtonIcon': 'circleIcon__5bc7e',
    'lowerBadge': 'lowerBadge_cc5dd2',
    'upperBadge': 'upperBadge_cc5dd2',
    'iconBadge': 'iconBadge__2b1f5',
    'iconBadgeIcon': 'icon__2b1f5',
    'participating': 'isCurrentUserConnected__650eb',
    // also used in header for some reason?
    'folderParentWrapper': 'wrapper__48112',
    'folderParentWrapperCollapsed': 'collapsed',
    // class found in JS
    'folderParentWrapperExpanded': 'expanded',
    // class found in JS
    'folder': 'folder__48112',
    'folderCollapsed': 'collapsed__48112',
    'folderHover': 'hover__48112',
    'closedFolderIconWrapper': 'closedFolderIconWrapper__48112',
    'folderGuildIcon': 'guildIcon__48112',
    // tiny server icons
    'folderNoIcon': 'noIcon_f11207',
    // shared in settings/boosts?
    'expandedFolderBackground': 'expandedFolderBackground__48112',
    'folderIconWrapper': 'folderIconWrapper__48112',
    'expandedFolderIconWrapper': 'expandedFolderIconWrapper__48112',
    'serversInFolderStack': 'stack_dbd263',
    // servers in folder
    'dragOver': 'dragOver_d144f8',
    'dragCenterTarget': 'centerTarget_d144f8',
    // green thing when merging
    'dragTarget': 'target_d144f8',

    // green thing when dragging
    // more drag classes - unsure about usage other than drag stuff because cant freeze in time
    'dragWrapper': 'wrapper_d144f8',
    'dragCenterTargetTooltip': 'centerTargetTooltip_d144f8',
    'dragAutoPointerEvents': 'autoPointerEvents_d144f8',
    'dragFolderEndWrapper': 'folderEndWrapper_d144f8',
    'dragWrapperOver': 'wrapperOver_d144f8',
    'dragFolderTarget': 'folderTarget_d144f8',

    'mention': (
      'top': 'unreadMentionsIndicatorTop_ef3116',
      'bottom': 'unreadMentionsIndicatorBottom_ef3116',

      'bar': 'bar__3b95d',
      'hidden': 'hidden__3b95d',
      'active': 'active__3b95d',
      'unread': 'unreadMentionsBar_ef3116',
      'mention': 'mention__3b95d',
      'text': 'text__3b95d',
    ),

    // removed from visual-refresh
    'footer': 'footer__214dc',
  ),
  'sidebar': (
    'sidebar': 'sidebar_c48ade',
    'hasNotice': 'hasNotice_c48ade',
    'list': 'sidebarList_c48ade',
    // appears in redesign as parent to #{c(sidebar private channels)} and #{c(sidebar server container)}.
    'listRounded': 'sidebarListRounded_c48ade',
    // appears in redesign, adds border top left radius
    'resizeHandle': 'sidebarResizeHandle_c48ade',

    // appears in redesign
    // Private Messages, Direct Messages.
    'private': (
        'channels': 'privateChannels__35e86',
        'searchBar': 'searchBar__35e86',
        'searchBarComponent': 'searchBarComponent__35e86',
        // placeholder text "find or start a converstation"
        'scroller': 'scroller__99e7c',
        'headerContainer': 'privateChannelsHeaderContainer__99e7c',
        // Similar to category for servers
        'tall': 'tall__99e7c',
        'headerText': 'headerText__99e7c',
        'startActivityIcon': 'plusIcon__675e5',
        // with play again - might need to start an activity prior
        'inviteButtonIcon': 'privateChannelRecipientsInviteButtonIcon__99e7c',
        // new dm plus icon
        'channel': 'channel__972a0',
        // used for groups, individuals, friends+nitro+shop
        'fullWidth': 'fullWidth__972a0',
        // appears with channel in css
        'dm': 'dm__972a0',
        // appears with channel in css, used for individuals and groups
        'channelContainer': 'container_e45859',
        // appears on same element as channel; seems to be unique.
        'interactive': 'interactive__972a0',
        // private only interactive; does not have color+background attached to it, use other interactive for that.
        'selected': 'interactiveSelected__972a0',
        // selected channel, applied on interactive
        'linkButton': 'linkButton__972a0',

        // used for friends+nitro+shop. applied on interactive.
        'link': 'link__972a0',
        // appears for groups, individuals, friends+nitro+shop
        'avatarWithText': 'avatarWithText__972a0',
        // paired with layout below for friends+nitro+shop
        'layout': 'layout__20a53',
        'highlighted': 'highlighted__20a53',
        // unread, makes channel name white; applied on layout
        'avatar': 'avatar__20a53',
        // applies to groups, individuals, friends+nitro+shop
        // children of "avatar" include the generic avatar wrapper class or the class below.
        'linkButtonIcon': 'linkButtonIcon__972a0',

        // used for friends+nitro+shop
        'content': 'content__20a53',
        // holds the name, activity and status
        'nameAndDecorators': 'nameAndDecorators__20a53',
        'name': 'name__20a53',

        // username/group name. appears for friends+nitro+shop
        'subtextLayout': 'subText__20a53',
        // paired with "layout" class-wise. shows when user is playing game or has custom status, always shows with group.
        'subtext': 'subtext__972a0',
        // child to subtextLayout

        // shows for user when they're doing something, use subtext:not(activity) to only target group
        'emoji': 'emoji_c9d15c',
        'activityText': 'activityStatusText__972a0',
        // two elements have this, used for regular and paired with textRuler with aria-hidden=true

        'closeButton': 'closeButton__972a0',
        // click to close dm or leave group chat

        'loadingEmpty': 'empty__99e7c',
        // you'll quickly see it when you reload on the friends list
        // These have color and background attached to them. Use these instead of channelInteractive.
        'interactiveBG': 'interactive_bf202d',
        // has :hover+:focus-within and :active
        'mutedBG': 'muted_bf202d',
        // takes priority over interactive
        'selectedBG': 'selected_bf202d',

        // takes priority over muted
        'channelBadgeIcon': 'badgeIconPrivateMessages__80f39',
        // can't remember where this is
        'badgeIconSettingsMenu': 'badgeIconSettingsMenu__80f39',
        // dunno where this is; paired with above class in css
      ),

    // Stuff found in servers
    'server': (
        'container': 'container__2637a',
        // Header button containing server name, arrow and other stuff. These do not disappear from HTML tree when scrolling channel list
        'header': (
            'container': 'container_f37cb1',
            'clickable': 'clickable_f37cb1',
            'selected': 'selected_f37cb1',
            // click it!
            'hasBanner': 'hasBanner_f37cb1',
            'bannerVisible': 'bannerVisible_f37cb1',

            'header': 'header_f37cb1',

            // child to above
            'headerContent': 'headerContent_f37cb1',
            'primaryInfo': 'primaryInfo_f37cb1',

            'guildIconV2Container': 'guildIconV2Container__85d16',
            // holds a flower star thing
            'guildBadge': 'guildBadge__85d16',

            // paired with flowerStar container
            'communityInfoVisible': 'communityInfoVisible_f37cb1',

            // unsure if used?
            'headerButton': 'headerButton_f37cb1',

            'headerChildren': 'headerChildren_f37cb1',

            // hold the dropdown arrow
            'button': 'button__353c4',
            // might be used elsewhere?
            'buttonOpen': 'open__353c4',
            // click the header!
            'buttonWithHighlight': 'withHighlight__353c4',
            // i don't know where this is used!
            'dropdownButton': 'dropdownButton__2637a',

            'bannerContainer': 'animatedContainer_f37cb1',
            // uses inline styling to animate
            'bannerImage': 'bannerImage_f37cb1',
            // wrapper, uses inline to animate
            'bannerImg': 'bannerImg_f37cb1',
            // <img>
          ),
        'name': 'name_f37cb1',

        // it's in the header but here feels better
        // "NEW UNREADS" with arrow
        // Certain servers will have an older style of bar without the arrow. That style is under "old" in this category.
        'unreadBar': (
            'positionedContainer': 'positionedContainer__629e4',
            // always exists on top and bottom
            'container': 'container__7aaec',
            // has top and bottom classes attached to this element
            'containerPadding': 'containerPadding__7aaec',
            'bar': 'bar__7aaec',
            'mentionsBar': 'mentionsBar__7aaec',
            // ping!
            'unreadIcon': 'unreadIcon__7aaec',
            // arrow
            'text': 'barText__7aaec',

            'top': 'top__7aaec',
            'bottom': 'bottom__7aaec',

            // no idea where these are used
            'empty': 'emptyBar__7aaec',
            'voiceChannelUsers': 'voiceChannelsUsers__7aaec',

            // Old style that lacks an arrow. Shares classes with serverList.
            // Placed under "positionedContainer" above.
            'old': (
              'container': 'container__3b95d',
              'unreadParent': 'unread__629e4',
              // "parent" as it's the parent of the below "unread" class
              'top': 'unreadTop__629e4',
              'bottom': 'unreadBottom__629e4',

              'bar': 'bar__3b95d',
              'hidden': 'hidden__3b95d',
              'active': 'active__3b95d',
              // it appears ig?
              'unread': 'unread__3b95d',
              'mention': 'mention__3b95d',
              // ping!
              'text': 'text__3b95d',
              'icon': 'icon_edf32f',
              // few servers has it idk why
              // no idea honestly
            ),
          ),
        'scroller': 'scroller__629e4',

        'divider': 'sectionDivider__629e4',

        // placed above channel list if "Events", "Browse Channels", "Members", "Channels & Roles" etc exist
        // Shared classes with Category and Channel
        'overflow': 'overflow__82b15',
        // child for name
        'dragBefore': 'containerDragBefore__29444',
        // used when dragging a channel/category to a place BEFORE it was originally
        'dragAfter': 'containerDragAfter__29444',

        // same as dragBefore but after
        // The collapsable thing that will hide channels. Not every server has these.
        'category': (
            // Used for channel categories (like "Text Channels"
            'container': 'containerDefault__29444',

            // main container that
            // classes in group below can all appear on the same element
            'iconVisibility': 'iconVisibility__29444',
            'wrapper': 'wrapper__29444',
            'wrapperCommon': 'wrapperCommon__29444',
            'clickable': 'clickable__29444',
            'collapsed': 'collapsed__29444',
            'muted': 'muted__29444',

            'mainContent': 'mainContent__29444',
            'collapseIcon': 'icon__29444',

            // hide/unhide toggle
            'name': 'name__29444',

            // shares container__13cf1 and text__13cf1 with memberList
            'children': 'children__29444',
            // extra icons
            'addButton': 'addButton__29444',
            // add channel to category
            'forceVisible': 'forceVisible__29444',
            // without it, addButton is display none
            'addButtonIcon': 'addButtonIcon__29444',

            // unknown, appears with same suffix
            'containerUserOver': 'containerUserOver_a08117',
            'disableClick': 'disableClick_a08117',
            'dismissWrapper': 'dismissWrapper__29444',
            'dismissButton': 'dismissButton__29444',
            'dismiss': 'dismiss__29444',
            'voiceChannelsButton': 'voiceChannelsButton__29444',
            'voiceChannelsButtonRefresh': 'refreshVoiceChannelsButton__29444',
            'voiceChannelsButtonInnerRefresh': 'refreshVoiceChannelsButtonInner__29444',
            'voiceChannelsToggleIcon': 'voiceChannelsToggleIcon__29444',
          ),
        // Text channels, threads, forums, voice channels, etc.
        'channels': (
            // Used for individual channels (like #general)
            'newChannelBadge': 'newChannel__599fa',
            // browse channels new channel badge
            'dragBefore': 'containerDragBefore_c69b6d',
            // drag either channel or category header
            'dragAfter': 'containerDragAfter_c69b6d',

            // no idea how to get this one, probably something similar
            // These can all be found on the same element, <ul> > <li>
            'container': 'containerDefault_c69b6d',
            // default class on channel
            'disabled': 'disabled_c69b6d',
            // usually spotted when dragging categories or on voice channels when dragging text channels
            'userOver': 'containerUserOver_c69b6d',

            // a user in voice is hovered over channel
            // These can all be found on the same element, <div> child to above group
            'wrapper': 'wrapper__2ea32',
            'iconVisibility': 'iconVisibility_c69b6d',
            // why are there so many classes
            'selectedChannel': 'selectedChannel_c69b6d',
            // select a channel
            'typeDefault': 'typeDefault__2ea32',
            // regular text channels, forums,
            'typeThread': 'typeThread__2ea32',
            // in-channel thread or forum thread;
            'typeVoice': 'typeVoice__2ea32',
            // voice + stage channels
            // These "mode" classes change the text and icon color.
            'muted': 'modeMuted__2ea32',
            // mute a channel
            'selected': 'modeSelected__2ea32',
            // select a channel
            'unread': 'modeUnreadImportant__2ea32',
            // get pinged
            'connected': 'modeConnected__2ea32',
            // join a voice call
            'modeLocked': 'modeLocked__2ea32',

            // Inaccessible voice channel (or locked channel using something like show hidden channels on Vencord)
            'unreadPill': 'unread__2ea32',
            // blob on side to indicate a new message
            'unreadPillImportant': 'unreadImportant__2ea32',

            // this is always there
            'link': 'link__2ea32',

            // <a href=""> element
            'linkTop': 'linkTop__2ea32',
            // holds channel name, icons, etc.
            'linkBottom': 'linkBottom__2ea32',

            // stage description, voice status; can have "withGuildIcon" class
            'iconContainer': 'iconContainer__2ea32',
            'icon': 'icon__2ea32',

            'name': 'name__2ea32',

            'children': 'children__2ea32',

            // holds extra icons. settings, invite, open chat, voice limits
            // UNRELATED TO THE ICON ON LEFT. THESE ARE FOR THE EXTRA ICONS. "Edit Channel", "Create Invite", etc.
            'iconItem': 'iconItem_c69b6d',
            'iconBase': 'iconBase_c69b6d',
            'iconChannelInfo': 'iconNoChannelInfo_c69b6d',

            // appears on "Edit Channel", "Create Invite"
            'actionIcon': 'actionIcon_c69b6d',

            'channelInfo': 'channelInfo_c69b6d',
            // limited slot voice channels - ( $connected / $max )
            'voiceLimitWrapper': 'wrapper__260e1',
            'voiceLimitUsers': 'users__260e1',
            'voiceLimitVideo': 'video__260e1',
            // applied to users when someone has webcam on
            'voiceLimitVideoIcon': 'videoIcon__260e1',
            'voiceLimitTotal': 'total__260e1',

            'subtitle': 'subtitle__2ea32',
            // container for channel status. stage has "overflow" as child, voice has "statusText" as child.
            'statusText': 'statusText__5cda9',
            // voice only
            'pencilIcon': 'pencilIcon__5cda9',

            // threads
            'threadsContainer': 'container__5b40b',
            'threadsSpineBorder': 'spineBorder__5b40b',
            'threadsSpine': 'spine__5b40b',

            // voice only
            // unknown, appears with same suffix
            'unreadBlobWithHangStatus': 'unreadWithHangStatus_d8bfb3',
            // no idea what this class is but it's with unreadBlob
            'withGuildIcon': 'withGuildIcon__2ea32',

            // appears on same element as linkBottom (from css)
            // other classes related to "Voice Limit" stuff, no idea on usage
            'voiceLimitPopoutHeaderContainer': 'popoutHeaderContainer__260e1',
            'voiceLimitExtraLong': 'extraLong__260e1',

            // appears on same element as voiceLimitUsers and voiceLimitTotal
            // specific stuff for voice channels, excluding "voice limit" thing.
            // mainly for when you're in voice.
            'voice': (
                // these do something? they seem kinda generic weirdly enough.
                'listGeneric': 'list_c3cd7d',
                // listGeneric because it *SEEMS* generic
                'collapsed': 'collapsed_c3cd7d',
                'withGuildIcon': 'withGuildIcon_c3cd7d',
                'disableInteraction': 'disableInteraction_a478e5',

                'list': 'list__07f91',
                'listDefault': 'listDefault__07f91',
                'listCollapse': 'listCollapse__07f91',

                'userDraggable': 'draggable__55bab',

                // for users that are draggable
                'user': 'voiceUser__07f91',
                'overlap': 'overlap__07f91',
                // for collapsed/hide names
                'clickable': 'clickable__07f91',
                'selected': 'selected__07f91',
                // click a user
                'userSmall': 'userSmall__07f91',

                'userContent': 'content__07f91',

                'avatarSpeaking': 'avatarSpeaking__07f91',
                'userAvatar': 'userAvatar__55bab',
                // appears to be related to stage audience stuff
                'avatar': 'avatar__07f91',
                'avatarSmall': 'avatarSmall__07f91',

                'container': 'container__91e7c',
                // contains usernameContainer + chipletParent
                'usernameContainer': 'usernameContainer__91e7c',
                'usernameFont': 'usernameFont__07f91',
                'username': 'username__07f91',
                'usernameSpeaking': 'usernameSpeaking__07f91',
                'chipletParent': 'chipletParent__91e7c',
                'chipletContainer': 'chipletContainer__91e7c',

                'icons': 'icons__07f91',
                'iconsGroup': 'iconGroup__07f91',
                'iconSpacing': 'iconSpacing__07f91',
                'icon': 'icon__07f91',
                'iconServer': 'iconServer__07f91',
                // server muted
                'liveIconSpacing': 'liveIconSpacing__07f91',

                'avatarContainer': 'avatarContainer__07f91',

                // other stuff, no idea how to get these
                'flipped': 'flipped__07f91',
                'userLarge': 'userLarge__07f91',
                'avatarLarge': 'avatarLarge__07f91',
                'clanTagBadgeContainer': 'clanTagBadgeContainer_d80634',
                'clanTagBadge': 'clanTagBadge_d80634',
                'iconTooltipContainer': 'iconTooltipContainer_d80634',
                'iconTooltip': 'iconTooltip_d80634',
                'iconPriortySpeaker': 'iconPriortySpeaker__07f91',
                // discord typo lol
                'strikethrough': 'strikethrough__07f91',
                'hangStatusIcon': 'hangStatusIcon__07f91',
                'selfHangStatus': 'selfHangStatus_d80634',
                'clanTag': 'clanTag__07f91',
                'isOverlay': 'isOverlay__07f91',
                'liveIcon': 'liveIcon_d80634',
                'iconPriortySpeakerSpeaking': 'iconPriortySpeakerSpeaking__07f91',
                // discord typo lol
                'disabled': 'disabled__07f91',
                'guestSuffix': 'guestSuffix__07f91'
              ),
          ),

        // Weird "other" stuff that kinda doesn't fit with "Category" and "Channel".
        // "Events", "Browse Channels", "Members", "Channels & Roles" etc above start of channel list
        // The overall container can likely be targeted as #{c(sidebar server scroller)}>ul>:is(li,div):not([class],[style]) {}
        // Weirdly enough "Members" is that lone <div> which wraps around <li>
        'extras': (
            'focusTarget': 'focusTarget__89030',
            'basicChannelRowLink': 'basicChannelRowLink__2ea32',
            'content': 'content__65844',
          ),
      ),

    // Panels include your avatar, username, mic, headphones and settings icons
    // as well as voice related stuff
    'panel': (
      'panels': 'panels_c48ade',

      // Non-voice stuff
      'container': 'container__37e49',
      'avatarWrapper': 'avatarWrapper__37e49',
      // contains avatar, username, nickname and status
      'avatar': 'avatar__37e49',
      'nameTag': 'nameTag__37e49',
      'canCopy': 'canCopy__37e49',
      'titleContainer': 'panelTitleContainer__37e49',
      // holds nickname
      'username': 'title_b6c092',
      // username, also used when in activity and streaming
      'subtextContainer': 'panelSubtextContainer__37e49',
      // holds username and status
      'statusSubtext': 'subtext__339d0',
      // holds username and status
      'statusHoverRoll': 'hoverRoll__0263c',
      'statusForceHover': 'forceHover__0263c',
      'statusHovered': 'hovered__0263c',
      // holds username
      'statusDefault': 'default__0263c',
      // holds status when not invisible, otherwise "invisible"
      'customStatus': 'customStatus__37e49',
      // when not invisible
      'customStatusEmoji': 'emoji__37e49',

      // when you've got an emoji in status
      // Voice stuff
      'voice': (
          'wrapper': 'wrapper_e131a9',
          'container': 'container_e131a9',
          // has border bottom
          'connection': 'connection_e131a9',
          // contains the name of the channel you're connected to, noise suppression and disconnect buttons
          'inner': 'inner_e131a9',
          // contains name of channel you're connected to
          // Within "inner".
          'rtcConnection': (
            'statusWrapper': 'rtcConnectionStatusWrapper__06d62',
            // contains the "Voice Connected" thing and an icon
            'status': 'rtcConnectionStatus__06d62',

            // within labelWrapper
            'label': 'rtcConnectionStatusLabel__06d62',
            'connected': 'rtcConnectionStatusConnected__06d62',
            'connecting': 'rtcConnectionStatusConnecting__06d62',
            'error': 'rtcConnectionStatusError__06d62',

            // likely how good the connection is; these apply color to pingForeground
            'fine': 'rtcConnectionQualityFine__06d62',
            // color: var(--text-positive);
            'average': 'rtcConnectionQualityAverage__06d62',
            // pingForeground:not(:last-child) color: var(--text-warning);
            'bad': 'rtcConnectionQualityBad__06d62',
            // pingForeground:first-child color: var(--status-danger);
          ),
          'ping': 'ping__06d62',
          // also within the "inner" element, this is an svg
          'labelWrapper': 'labelWrapper__06d62',
          // also within the "inner" element, contains a button. contents of button are a hover roll thing.
          // sibling to rtcConnection status is <a class href="">. this contains the channel name.
          'channel': 'channel_e131a9',

          // This contains the "noise suppression" and "disconnect" buttons.
          'voiceButtonsContainer': 'voiceButtonsContainer_e131a9',

          // There's a row of buttons in this panel. These are not to be confused with the "noise suppression" and "disconnect" buttons.
          'actionButtons': (
            'experiment': 'experimentButton_e131a9',
            'actionButtons': 'actionButtons_e131a9',
            'button': 'button_e131a9',
            'color': 'buttonColor_e131a9',
            'active': 'buttonActive_e131a9',
            'fauxDisabled': 'fauxDisabled_e131a9',
            'disabled': 'disabled_e131a9',
            'contents': 'buttonContents_e131a9',
            // shared with #{c(button contents)}
            'icon': 'buttonIcon_e131a9',

            // shared with lottieIcon
            // Determining which button is which:
            // These will go from parent "buttons" class to where the first svg is. The `button` element contains aria-label with the relevant string for the language.
            //
            // No Camera Connected - actionButtons > button.color.fauxDisabled[aria-expanded=false][iconcolor=currentColor] > contents > icon > svg
            // Enable Camera - actionButtons > button.color[aria-expanded=false][iconcolor=currentColor] > contents > icon > svg
            // Disable Camera - actionButtons > button.color.active[aria-expanded=true][iconcolor=currentColor] > contents > icon > svg
            // Share Screen - actionButtons > button.color > contents > icon > svg
            // Stop Sharing Screen - actionButtons > button.color.active > contents > icon > svg
            // Start Activity - actionButtons > button.color > contents > icon > svg
            // Stop Activity - actionButtons > button.color.active > contents > icon > svg
            // Open Soundboard - actionButtons > <div> > button.color[aria-expanded=false] > contents > icon > svg
            // Opened Soundboard - actionButtons > <div> > button.color.active[aria-expanded=true] > contents > icon > svg
              // Disabled Soundboard (deafened) - actionButtons > <div> > <span>.button.color.#{c(button disabledButtonWrapper)} > button.color.disabled > contents > icon > svg,,
          ),

        'noiseCancellation': (
          'popout': 'noiseCancellationPopout_e131a9',
          // click the noise suppression button
          'tooltip': 'noiseCancellationTooltip_e131a9',
          // hover over the noise suppression button
          'krispLogo': 'krispLogo_e131a9',
          // in NC popout; parent is clickable to https://api.krisp.ai/v2/resource/link/discord
          'krispLink': 'krispLink_e131a9',
          // in NC popout; clickable to a support article from discord
          'micTestButton': 'micTestButton_e131a9',
        ),

        // other classes that idk too much about
        'hotspot': 'hotspot_e131a9',
        'customStatusContainer': 'customStatusContainer_e131a9',
        'voiceUsers': 'voiceUsers_e131a9',
        'withText': 'withText_e131a9',
        // relates to buttons
        'voicePanelIntroductionWrapper': 'voicePanelIntroductionWrapper_e131a9',
        'voicePanelIntroductionHeader': 'voicePanelIntroductionHeader_e131a9',
        'voicePanelIntroductionText': 'voicePanelIntroductionText_e131a9',
        'voicePanelIntroductionButton': 'voicePanelIntroductionButton_e131a9',
        'viewAsRolesWarning': 'viewAsRolesWarning_e131a9',
        'viewAsRolesWarningText': 'viewAsRolesWarningText_e131a9',
        // appears as child of viewAsRolesWarning
        'viewAsRolesWarningButton': 'viewAsRolesWarningButton_e131a9',
        // appears as child of viewAsRolesWarning
      ),

      // Appears when streaming something or when you're in an activity
      'activity': (
        'panel': 'panel__5dec7',
        // has background with theme dark/light
        'activityPanel': 'activityPanel_c48ade',
        // has border bottom
        'body': 'body__5dec7',
        'gameWrapper': 'gameWrapper__5dec7',
        // when streaming these show up
        'streamingWrapper': 'wrapper_a629d4',
        // child svg__2338f
        'streamingIcon': 'icon_a629d4',
        // inline style for background color
        'streamingBadge': 'badge_a629d4',
        // old camera representation
        // when in activity these show up
        'gameIcon': 'gameIcon__5dec7',
        'activityName': 'activityName__5dec7',
        // also uses statusSubtext for elapsed time
        'info': 'info__5dec7',

        'actions': 'actions__4cd01',
        'panelButtonContainer': 'panelButtonContainer__4cd01',
        // buttons use #{c(sidebar server panel buttons button)}.
        // other classes that i don't know where they're used
        'dropsBadgeWrapper': 'dropsBadgeWrapper__5dec7',
        // likely relates to quest stuff
        'dropsBadge': 'dropsBadge__5dec7',
        'liveIndicator': 'liveIndicator__5dec7',
        // appears as child of gameWrapper
        'sparkleContainer': 'sparkleContainer__5dec7',
        'sparkles': 'sparkles__5dec7',
        'infoWithDrops': 'infoWithDrops__5dec7',
        'channel': 'channel__5dec7',
        'perksDemoContainer': 'perksDemoContainer__5dec7',
        'perksDemoText': 'perksDemoText__5dec7',
      ),

      // Buttons such as "mute", "deafen" and "settings".
      'buttons': (
        'buttons': 'buttons__37e49',
        'micButtonParent': 'micButtonParent__37e49',
        // why is this separate ffs
        'button': 'button__67645',
        // the actual button
        'enabled': 'enabled__67645',
        // you can interact with it
        'disabled': 'disabled__67645',

        // you cannot interact with it
        'redIcon': 'redIcon__37e49',
        // used when server deafened, applied to #{c(button contents)}
        'lottieIcon': 'lottieIcon__5eb9b',

        // Determining which button is which:
        // These will go from parent "buttons" class to where the first svg is. The `button` element contains aria-label with the relevant string for the language.
        //
        // Regular Buttons
        // Unmuted - buttons > micButtonParent > button[aria-checked=false] > buttonContents > lottieIcon[style^="--__lottieIconColor: currentColor;"] > svg
        // Muted - buttons > micButtonParent > button[aria-checked=true] > buttonContents > lottieIcon[style^="--__lottieIconColor: var(--status-danger);"] > svg
        // Server Muted (or cannot speak in stage) - buttons > micButtonParent > button[aria-checked=true] > buttonContents > svg
        // Undeafened - buttons > button[aria-checked=false] > buttonContents > lottieIcon[style^="--__lottieIconColor: currentColor;"] > svg
        // Deafened - buttons > button[aria-checked=true] > buttonContents > lottieIcon[style^="--__lottieIconColor: var(--status-danger);"] > svg
        // Server Deafened - buttons > button[aria-checked=true] > buttonContents.redIcon > svg
        // Settings - buttons > button > buttonContents > lottieIcon > svg
        //
        // Voice Buttons
        // Noise Suppression (always) - voiceButtonsContainer > button > buttonContents > lottieIcon > svg
        // Mute Music (stage) - voiceButtonsContainer > button > buttonContents > svg
        // Unmute Music (stage) - voiceButtonsContainer > button > buttonContents > svg
        // Disconnect (call) / Disconnect Quietly (stage) - voiceButtonsContainer > button > buttonContents > lottieIcon > svg
        // Stop Streaming - panelButtonContainer > button > buttonContents > svg
        //
          // There is no "stop watching" button in the panel.,,
      ),

      'quest': (          
        'wrapper': 'wrapper__0d616',
        'contentWrapper': 'contentWrapper__0d616',
        'contentWrapperAccepted': 'contentWrapperAccepted__0d616',
        'contentWrapperExpanded': 'contentWrapperExpanded__0d616',
        'contentInteractable': 'contentInteractable__636a2',
        'postEnrollmentBackground': 'postEnrollmentBackground__636a2',
        'postEnrollmentCollapsed': 'postEnrollmentBackgroundCollapsed__636a2',
        'postEnrollmentExpanded': 'postEnrollmentBackgroundExpanded__636a2',
        'questPanelAcceptedExpandedContent': 'questAcceptedContent__636a2',
        'headerText': 'headerText__636a2',
        'submenuIcon': 'submenuIcon__636a2',
        // 3 dots
      ),
    ),

    // can't remember where these are. suffix seems like they belong in sidebar>server>header
    'communityInfo': 'communityInfo_f37cb1',
    'communityInfoPill': 'communityInfoPill_f37cb1',
    'communityInfoIcon': 'communityIcon_f37cb1',

    'boostContainer': 'container_eff079',
    'boostTextArea': 'textArea_eff079',
    'boostGoalTextContainer': 'goalTextContainer_eff079',
    'boostGoalText': 'goalText_eff079',
    'boostProgressFraction': 'progressFraction_eff079',
    'boostBar': 'bar_eff079',
    'boostProgressBar': 'progressBar_eff079',
    // boost background
    'boostProgressBarContainer': 'progressBarContainer_eff079',

    'loadingAnimationContainer': 'container__3b43f',
    // container has animation tag on it
    'loadingCategory': 'category__3b43f',
    'loadingChannel': 'channel__3b43f',
    'loadingChannelIcon': 'channelIcon__3b43f',
    'loadingChannelName': 'channelName__3b43f',

    // below are for things that get added to the top of the sidebar, above the channel list.
    'upsellContainer': 'container__6e9be',
    // always exists, usually empty.
    // shit name - used for Quickswitch, Boost this server (inc friends, community and "box picture"), Student Hubs...
    // it's not just about nitro here
    'upsellNotice': (
        // better name: "bannerUpsellNotice"
        // On a server with less than 7 boosts (not boost level 2): "Want this server to feel unique? Unlock custom server banenrs with # more boosts."
        'notice': 'channelNotice__4c43d',
        'close': 'close__4c43d',
        'closeIcon': 'closeIcon__4c43d',
        'title': 'title__4c43d',
        'message': 'message__4c43d',
        'btn': 'btn__4c43d',
        'imageContainer': 'imageContainer__4c43d',
        'image': 'image__4c43d',
      ),
    'eventNotice': (
      'notice': 'channelNotice_e2d7b8',
      'textBlock': 'textBlock_e2d7b8',
      'liveNowText': 'liveNowText_e2d7b8',
      'eventName': 'eventName_e2d7b8',
      'channelName': 'channelName_e2d7b8',
      'dotDivider': 'dotDivider_e2d7b8',
      'liveIndicator': 'liveIndicator_e2d7b8',
      'stageIcon': 'stageIcon_e2d7b8',
      'userNames': 'userNames_e2d7b8',
      'joinButton': 'joinButton_e2d7b8',
      'closeIcon': 'closeIcon_e2d7b8',
    ),
  ),
  'tooltips': (
    'tooltip': 'tooltip__382e7',
    'disablePointerEvents': 'tooltipDisablePointerEvents__382e7',
    'content': 'tooltipContent__382e7',
    'contentAllowOverflow': 'tooltipContentAllowOverflow__382e7',
    'top': 'tooltipTop__382e7',
    'right': 'tooltipRight__382e7',
    'bottom': 'tooltipBottom__382e7',
    'left': 'tooltipLeft__382e7',
    'center': 'tooltipCenter__382e7',
    'pointer': 'tooltipPointer__382e7',

    'primary': 'tooltipPrimary__382e7',
    'black': 'tooltipBlack__382e7',
    'grey': 'tooltipGrey__382e7',
    'brand': 'tooltipBrand__382e7',
    'red': 'tooltipRed__382e7',
    'green': 'tooltipGreen__382e7',
    'yellow': 'tooltipYellow__382e7',

    // different css lines
    'stageListenerPill': 'stageListenerPill_b1f768',
  ),

  // Profiles are for anything involving an Avatar, Username, #0000 number and optionally customization.
  // Anything not within a sub-category are used across the other sub-categories.
  // Assuming an un-altered fork/repo, you can see more info within ../pyrite/source/theme/profile/_index.scss
  'profile': (
      // Generic-ish classes
      // default colours are now provided with inline styling.
      'badgeList': 'container__8061a',
      // seems to be used on all of them
      'showOutOfBoundaryComponents': 'showOutOfBoundaryComponents_c69a7b',

      // profile backgrounds
      'customTheme': 'custom-user-profile-theme',
      'userPopout': 'user-profile-popout',
      'userModal': 'user-profile-modal' 'user-profile-modal-v2',
      // bots still on v1 profile
      'userSidebar': 'user-profile-sidebar',
      'overlay': 'overlay_c0bea0',
      'outer': 'outer_c0bea0',
      'inner': 'inner_c0bea0',

      'status': (
        'container': 'container_ab8609',
        'outer': 'outer_ab8609',
        'inner': 'inner_ab8609',

        // hover over own status
        'tooltip': 'tooltip__4e35b',
        'tooltipContent': 'tooltipContent__4e35b',
        'caretIcon': 'caretIcon__4e35b',
        'caretFill': 'caretFill__4e35b',
      ),

      // Banners are in their own line. The SVG Wrapper is in its own line.
      'banner': (
        'banner': 'banner__68edb',
        'gifTag': 'gifTag__68edb',
        'mask': 'mask__68edb',
      ),

      // shared between modal+panel+popout+status+settings>profile
      // container also holds badges, notes button
      'username': (
        'container': 'container__63ed3',
        'clickableUsername': 'clickableUsername__63ed3',
        'nickname': 'nickname__63ed3',
        'userTagUsername': 'userTagUsername__63ed3',
        'biteSize': 'biteSize__63ed3',
        'panel': 'panel__63ed3',
        'fullSize': 'fullSize__63ed3',
        'nicknameIcons': 'nicknameIcons__63ed3',
        'usernameRow': 'usernameRow__63ed3',     
        'usernameContainer': 'container__63ed3',
        'tags': 'tags__63ed3',
        'userTag': 'userTag__63ed3',
        'pronounsTooltip': 'pronounsTooltip__63ed3',
        'pronouns': 'pronouns__63ed3',
        'userTagDiscriminator': 'userTagDiscriminator__63ed3',
        'dotSpacer': 'dotSpacer__63ed3',     
      ),

      // shared between modal+panel+popout (not self)+status
      // contains:
      // "friends" (click to show tooltip to remove)
      // "more" (click to show tooltip to block, report profile and copy user id)
      // "edit profile"
      'firendsMoreEditProfileButtons': (
          'wrapper': 'wrapper_da5890',
          'biteSize': 'biteSize_da5890',
          'fullSize': 'fullSize_da5890',
          'panel': 'panel_da5890',
        ),

      // (!) icon. shared between modal+panel+popout
      'missingConnection': 'container__23ba6',

      // theme the (!) icon with (this)>svg>path{fill}
      // there seems to be a line with things related to the avatars, hense this subcategory.
      // these mostly apply to popout from what i can tell
      'avatar': (
          'avatar': 'avatar__75742',
          'biteSize': 'biteSize__75742',
          'fullSize': 'fullSize__75742',
          'panel': 'panel__75742',
          'withReactReply': 'withReactReply__75742',
          'hoisted': 'hoisted__75742',
          'clickable': 'clickable__75742',
          'overlay': 'overlay__75742',
          'focusRing': 'focusRing__75742',
        ),

      'overlayScroller': 'scroller_fcb628',

      'button': (
        // edit profile button not included
        'themeColor': 'themeColor_fb7f94',
        'primary': 'primary_fb7f94',
        'secondary': 'secondary_fb7f94',
        'inner': 'buttonInner_fb7f94',
      ),

      // actually used on the modal!
      'memberSince': (
        'wrapper': 'memberSinceWrapper_c4eb81',
        'container': 'memberSince_c4eb81',
        'discordIcon': 'discordIcon_c4eb81',
        'divider': 'divider_c4eb81',
      ),

      'playing': (
        'container': 'toolbarContainer__39ec2',
        'clickableContainer': 'clickableContainer__39ec2',
        'card': 'card__39ec2',
        'header': 'header__39ec2',
        'headerText': 'headerText__39ec2',
        'body': 'body__39ec2',
        'content': 'content__39ec2',

        'imageClickable': 'clickable_ef9ae7',
        'imageContainer': 'imageContainer_ef9ae7',
        'contentimage': 'contentImage_ef9ae7',
      ),

      // The Spotify playback bar seems to be on its own line and could be used elsewhere, not just in profiles
      'playbackBar': (
        'bar': 'bar_c8b06d',
        'barInMultiLine': 'barInMultiLine_c8b06d',
        'barInner': 'barInner_c8b06d',
        'barInSingleLine': 'barInSingleLine_c8b06d',
        'singleLineContainer': 'singleLineContainer_c8b06d',

        'themed': 'themed_c8b06d',

        'text': 'text_c8b06d',
        'textLeft': 'textLeft_c8b06d',
        'textRight': 'textRight_c8b06d',
        'textLeftInSingleLine': 'textLeftInSingleLine_c8b06d',
      ),

      // Modal: right click on user in same spots and click "View Profile"
      'modal': (
        'root': 'root__9c3be',
        'bgImage': 'backgroundImage__9c3be', // nitro profiles only
        'profile': 'profile__9c3be',
        'profileHeader': 'profileHeader__9c3be',
        'profileBody': 'profileBody__9c3be',
        'profileButtons': 'profileButtons__9c3be',
        'profileRolesSection': 'profileRolesSection__9c3be',
        'profileNote': 'profileNote__9c3be',
        

        // cannot find these but they're in the same rule as connections
        'connections': (
            'accounts': 'connectedAccounts_e6abe8',
            'column': 'connectedAccountsColumn_e6abe8',
            'container': 'connectedAccountContainer_e6abe8',
            'containerWithMetadata': 'connectedAccountContainerWithMetadata_e6abe8',
            'account': 'connectedAccount_e6abe8',
            'children': 'connectedAccountChildren_e6abe8',
            'childrenNoIcon': 'connectedAccountChildrenNoIcon_e6abe8',
            'poweredBy': 'connectedAccountPoweredBy_e6abe8',
            'poweredByText': 'connectedAccountPoweredByText_e6abe8',
            'icon': 'connectedAccountIcon_e6abe8',
            'nameContainer': 'connectedAccountNameContainer_e6abe8',
            'name': 'connectedAccountName_e6abe8',
            'nameTextContainer': 'connectedAccountNameTextContainer_e6abe8',
            'nameText': 'connectedAccountNameText_e6abe8',
            'verifiedIcon': 'connectedAccountVerifiedIcon_e6abe8',
            'hideIcon': 'connectedAccountHideIcon_e6abe8',
            'openIcon': 'connectedAccountOpenIcon_e6abe8',
          ),

        'listScroller': 'listScroller__9d78f',
        'listRow': 'listRow__9d78f',
        'listAvatar': 'listAvatar__9d78f',
        'listRowContent': 'listRowContent__9d78f',
        'listName': 'listName__9d78f',
        'listDiscriminator': 'listDiscriminator__9d78f',
        'empty': 'empty__9d78f',
        'emptyIcon': 'emptyIcon__9d78f',
        'emptyIconFriends': 'emptyIconFriends__9d78f',
        'emptyIconGuilds': 'emptyIconGuilds__9d78f',
        'emptyIconStreamerMode': 'emptyIconStreamerMode__9d78f',
        'emptyText': 'emptyText__9d78f',

        'guildAvatar': 'guildAvatar_aafe31',
        'guildAvatarWithoutIcon': 'guildAvatarWithoutIcon_aafe31',
        'guildNick': 'guildNick_aafe31',
          
        'noteTextarea': 'textarea__9daae',
        ),

      // Go to the DMs of someone while your screen is larger than
      // 1132px wide and you've not disabled the panel via header
      'sidebar': (
        'body': 'body__486c9',
        'bodyOverlay': 'overlay__486c9',
        // used over "about me/member since" container

        // encompass both mutual servers and mutual friends
        'connectionsOverlay': 'overlay_d04d18',
        'connectionsList': 'list_d04d18',
        'connectionsDivider': 'divider_d04d18',
      ),

      // Popoout: click on user in chat or member list
      'popout': (
        'bitesize': (
          'header': 'header__5be3e',
          'body': 'body__5be3e',
          'footer': 'footer__5be3e',
        ),

        'desaturateUserColors': 'desaturateUserColors__41f68',
      ),
    ),

  'settings': (
    'standardSidebarView': 'standardSidebarView__23e6b',
    'sidebarRegion': 'sidebarRegion__23e6b',
    'sidebarRegionScroller': 'sidebarRegionScroller__23e6b',
    'sidebar': 'sidebar__23e6b',
    'sidebarSocialLinks': 'socialLinks__7df54',
    'sidebarInfo': 'info__2debe',

    'customScroller': 'customScroller__23e6b',

    'contentRegion': 'contentRegion__23e6b',
    'contentRegionScroller': 'contentRegionScroller__23e6b',
    'contentColumn': 'contentColumn__23e6b',
    'contentColumnDefault': 'contentColumnDefault__23e6b',
    'contentColumnWide': 'contentColumnWide__23e6b',
    
    'noticeRegion': 'noticeRegion__23e6b',
    'noticeContainer': 'container_fcf29c',

    'card': (
      // These are likely all over the app but are best found in settings.
      // Some things labelled "card_" aren't from here and are instead unique to that area.
      'card': 'card__73069',
      'primary': 'cardPrimary__73069',
      'outline': 'outline__73069',
      'editable': 'editable__73069',

      'brand': 'cardBrand__73069',
      'danger': 'cardDanger__73069',
      'success': 'cardSuccess__73069',
      'warning': 'cardWarning__73069',
    ),

    // registerd games, emoji
    'rowCard': 'card_b846e5',

    // shared classes. used in multiple places, mainly as a "remove this row" kind of thing
    'removeButton': (
      'button': 'button_e18686',
      'default': 'default_e18686',
      'filled': 'filled_e18686',
    ),

    // collapseable radio
    // within moderation category
    'collapseableRadio': (
      'container': 'container__6cd3a',
      'clickable': 'clickableContainer__6cd3a',
      'backgroundModifierContainer': 'backgroundModifierContainer__6cd3a',
      'disabled': 'disabled__6cd3a',
      'noAction': 'noAction__6cd3a',
      'selected': 'selected__6cd3a',
      'statusGreen': 'statusGreen__6cd3a',
      'statusYellow': 'statusYellow__6cd3a',
      'statusOrange': 'statusOrange__6cd3a',
      'statusRed': 'statusRed__6cd3a',

      'collapseable': 'collapseable__217b7',
      'collapseableToggled': 'toggled__217b7',
    ),

    // used in a few places, i'm not entirely sure what's different about it
    'premiumFeatureBorder': 'premiumFeatureBorder__65c15',
    'featureBorder': 'featureBorder__65c15',
    'featureBackground': 'background__65c15',

    'sectionTitle': 'sectionTitle__7bffb',
    'children': 'children__7bffb',
    'marginReset': 'marginReset_fd297e',
    'marginCenterHorz': 'marginCenterHorz_fd297e',
    'marginTop4': 'marginTop4_fd297e',
    'marginTop8': 'marginTop8_fd297e',
    'marginTop20': 'marginTop20_fd297e',
    'marginTop40': 'marginTop40_fd297e',
    'marginTop60': 'marginTop60_fd297e',
    'marginBottom4': 'marginBottom4_fd297e',
    'marginBottom8': 'marginBottom8_fd297e',
    'marginBottom20': 'marginBottom20_fd297e',
    'marginBottom40': 'marginBottom40_fd297e',
    'marginBottom60': 'marginBottom60_fd297e',
    'marginLeft8': 'marginLeft8_fd297e',
    'divider': 'divider__46c3b',
    'description': 'description_ddd181',
    'title': 'title_b717a1',

    'closeButtonContainer': 'container_c2b141',
    'closeButton': 'closeButton_c2b141',
    'closeButtonKeybind': 'keybind_c2b141',

    
    'colorPickerPopout': 'customColorPicker__459fb',
  ),

  'userSettings': (
    'sidebar': (
      'nitroTab': 'premiumTab__581ea',
      'nitroLabel': 'premiumLabel_e681d1',
      'nitroLabelSelected': 'selected_e681d1',
      'nitroBackground': 'background_e681d1',
      'nitroBackgroundSelected': 'selectedBackground_e681d1',
      'socialLink': 'link__7df54',
    ),

    'account': (
      'profileCard': 'accountProfileCard__1fed1',
      'avatar': 'avatar__1fed1',
      'badgeList': 'badgeList__1fed1',
      'fieldBackground': 'background__1fed1',
      'fieldList': 'fieldList__1fed1',
      'field': 'field__1fed1',
      'security': 'userSettingsSecurity__2666b',
      'disableAccountButton': 'disableButton_d286c5',

      'standing': (
        'container': 'container_d878e7',
        'avatarBackground': 'avatarBackground_eb2508',
        'line': 'line_d878e7',
        'marker': 'marker_d878e7',
        'markerEmpty': 'empty_d878e7',
      ),
    ),

    'profiles': (
      'uploadImageOption': 'option__54675',
      'bioTextAreaContainer': 'bioTextAreaContainer__6a919',
      'bioTextArea': 'bioTextArea__6a919',
      'profileContainer': 'container_ba7f98',

      'decoration': (
        'gridItem': 'decorationGridItem_dfa67d',
        'itemSelected': 'selected_dfa67d',
        'lockIconBadge': 'iconBadge_dfa67d',
        'preview': 'decorationPreview__51743',
        'previewSmall': 'smallDecorationPreviewsContainer__51743',
        'previewUpsell': 'shopPreviewContainer__51743',
        'previewUpsellBanner': 'shopPreviewBanner__51743',
      ),

      'effect': (
        'gridItem': 'effectGridItem_b4019a',
        'itemSelected': 'selected_b4019a',
        'lockIconBadge': 'lockBadge_b4019a',
        'description': 'effectDescriptionNoGradient__92e52',
        'descriptionUpsell': 'effectDescriptionBorderWithGradient__92e52',
        'descriptionContainer': 'effectDescriptionContainer__92e52',
      ),

      'premiumBackground': 'premiumBackground__65c15',
      'upsellContainer': 'upsellContainer__0b69f',
    ),

    'content': (
      'blockedCard': 'card__5cea9',
      'blockedHeader': 'header__5cea9',
      'blockedUserList': 'usersList__5cea9',
      'blockedRow': 'row__5cea9',
      'blockedLastRow': 'lastRow__5cea9',
    ),

    'family': (
      'containers': 'container__5dbf8' 'container__8cc9a' 'container__5b321',
      'box': 'box_f8c98c',
      'circle': 'circle__8cc9a',
      'iconContainer': 'iconContainer__0624f',
      'row': 'row__0624f',
    ),

    'authedApps': (
      'card': 'authedApp__50a54',
      'permission': 'permission__50a54',
      'permissionCheck': 'permissionCheckmark__50a54',
      
      // authed app redesign experiment
      'app': 'authedAppV2__50a54',
      'header': 'headerV2__50a54',
      'detailsContainer': 'appDetailsContainer__50a54',
      'detailsSection': 'appDetailsSection__50a54',
      'actionMenuButton': 'actionMenuButton_d84e0f',
    ),

    'devices': (
      'description': 'description__803f2',
      'sessions': 'sessions__803f2',
      'session': 'session__803f2',
      'sessionCurrent': 'currentSession__803f2',
      'sessionIcon': 'sessionIcon__803f2',
      'sessionInfo': 'sessionInfo__803f2',
      'sessionInfoRow': 'sessionInfoRow__803f2',
      'sessionsOther': 'otherSessions__803f2',
      'sessionMoreButton': 'sessionMoreButton__803f2',
      'sessionsLegacy': 'legacySession__803f2',
      'sessionsLogOutAllButton': 'logOutAllButton__803f2',
    ),

    'connections': (
      'connectContainer': 'connectContainer_c7f964',
      'connectHeader': 'connectHeader_c7f964',
      'connectionsContainer': 'connectionsContainer_c7f964',
      'accountButtonInner': 'accountButtonInner_c7f964',
      'accountWrapper': 'accountAddWrapper_c7f964',
      'accountWrapperInner': 'accountAddInner_c7f964',

      // click the rightward chevron ">"
      'modal': (
        'container': 'container__750de',
        'header': 'header__750de',
        'title': 'title__750de',
        'connectionsContainer': 'connectionsContainer__750de',
        'accountButton': 'accountBtn__750de',
        'accountButtonInner': 'accountBtnInner__750de',
      ),

      'connection': 'connection_c7f964',
      'connectionHeader': 'connectionHeader_c7f964',
      'connectionAccountLabel': 'connectionAccountLabel_c7f964',
      'connectionIcon': 'connectionIcon_c7f964',
      'connectionDelete': 'connectionDelete_c7f964',
      'connectionMetadataContainer': 'metadataContainer_c7f964',
    ),

    'nitro': (
      // no nitro
      'perkCard': 'perkCard_b62c4e',
      'footerWrapper': 'wrapper__70f7f',
      'footerWrapperInner': 'innerWrapperV1__70f7f',
      'footerWrapperBase': 'innerWrapperBase__70f7f',
      'footerSubButton': 'subButton__70f7f',
      'footerGiftButton': 'giftButton_b322b1',

      // with nitro
      'premiumtierCard': 'tierCard_a45ed3',
      'premiumtierInfo': 'tierInfo_a45ed3',
      'premiumtierTitle': 'tierTitle_a45ed3',

      'giftCard': 'giftCard_a45ed3',
      'giftImage': 'giftImage_a45ed3',
      'giftInfo': 'giftInfo_a45ed3',
      'giftText': 'giftText_a45ed3',
      'giftButton': 'giftCardButton_a45ed3',
      'giftButtonColor': 'giftCardButtonColor_a45ed3',
    ),

    'boost': (
      'headerWave': 'wave__8e08c',
      'guildContainer': 'guildContainer__5dba5',
      'appliedBoostContainer': 'appliedBoostContainer_ceb06a',
      'boostContainer': 'boostContainer_ceb06a',
      'boostContainerInner': 'boostInnerContainer_ceb06a',

      'recognitionCard': 'boosterRecognitionCard__744ff',
      'FAQ': 'faq__744ff',

      'transferSearch': 'selectSearch__39466',
      'transerSelectGuild': 'selectGuild__39466',
      'transerSelectGuildIcon': 'selectGuildIcon__39466',
      'transferButton': 'selectGuildPseudoCta__39466',
    ),

    'subscriptions': (
      'sectionDescription': 'sectionDescription_e335a7',
      'noItemsCardSubs': 'noItemsCard_e335a7',
      'noItemsIconSubs': 'noItemsIcon_e335a7',
      'nItemsCardCredits': 'noItemsCard__70151',
      'noItemsIconCredits': 'noItemsIcon__70151',
      'detailsBlock': 'detailsBlock_e335a7',
      'billingInformation': 'billingInformation_e335a7',
    ),

    'gift': (
      'promotionCard': 'promotionCard_d4883c',
      'codeRedemptionRedirect': 'codeRedemptionRedirect_a706ba',
    ),

    'billing': (
      'defaultIndicator': 'defaultIndicator__43963',
      'premiumIndicator': 'premiumIndicator__43963',
      'description': 'description__43963',
      'descriptionWrapper': 'descriptionWrapper__43963',
      'paymentPane': 'paymentPane__01014',
      'paginator': 'paginator__01014',
      'bottomDivider': 'bottomDivider__01014',
      'hoverablePayment': 'hoverablePayment_e9cb00',
      'payment': 'payment_e9cb00',
      'expandedInfo': 'expandedInfo_e9cb00',
      'codeRedemptionRedirect': 'codeRedemptionRedirect_a706ba',
    ),

    'appearance': (
      'preview': 'preview__3e443',

      'themesPresets': 'presets__67a11',
      'themesBasicSelectors': 'basicThemeSelectors_fbfab6',
      'themesSelectorContainer': 'themeSelectionContainer__36dee',
      'themesSelection': 'themeSelection__36dee',
      'themesDefault': 'defaultThemeSelection__36dee',
      'themesLight': 'lightIcon__36dee',
      'themesDark': 'darkIcon__36dee',
      'themesSyncIconWrapper': 'iconWrapper__36dee',
      'themesSelected': 'selected__36dee',

      'themesDisabled': 'disabled__36dee',
      // for those with no nitro
      'themesLightOverlay': 'lightOverlay__36dee',
      'themesDarkOverlay': 'darkOverlay__36dee',

      'themesFeatureBorder': 'featureBorder_fbfab6',
      'themesHeader': 'header__67a11',
      // "Colour", nitro icon, try etc
      'themesHeadings': 'headings__67a11',
      'themesTitle': 'title__67a11',
      'themesPremiumIcon': 'premiumIcon__67a11',
      'themesNitroWheel': 'nitroWheel_c5f0dc',
      // ON OWN LINE; ALSO APPEARS UNDER SERVER PROFILES
      'themesTryItOutButton': 'tryItOutButtons_fbfab6',

      'selectedCircle': 'selectionCircle__36dee',
      'checkmarkCircle': 'checkmarkCircle__36dee',
      'checkmark': 'checkmark__36dee',
    ),

    'accessability': (
      'preview': 'preview__5d148',
      'previewMessage': 'previewMessage__5d148',
    ),

    'voice': (
      'notchesContainer': 'container__06283',
      'notches': 'notches__06283',
      'notchesGray': 'gray__06283',
      'notchprogress': 'progress__06283',
      'sensitivityBar': 'sliderBar_ac7648',
      'sensitivitySpeaking': 'speaking_ac7648',

      'soundButton': 'soundButtonSettingContainer__84bad',

      'cameraWrapper': 'cameraWrapper_d41d5f',
      'backgroundOption': 'backgroundOption__53965',
      'backgroundOptionRing': 'backgroundOptionRing__53965',
      'backgroundOptionInner': 'backgroundOptionInner__53965',
    ),

    'keybinds': (
      'keybindContainer': 'container_f89b2c',
      'recorderContainer': 'recorderContainer__2636e',
      'keybindDisabled': 'containerDisabled__2636e',
      'keybindRecording': 'recording__2636e',
      'removeButton': 'removeKeybind__740f2',
      'default': 'defaultKeybind__740f2',
      'defaultgroup': 'defaultKeybindGroup__740f2',
      'groupDescription': 'defaultKeybindGroupDescription__740f2',
      'groupHeader': 'defaultKeybindGroupHeader__740f2',
      'groupWithDescription': 'defaultKeybindGroupWithDescription__740f2',
      'shortcutGroup': 'defaultKeybindShortcutGroup__740f2',
    ),

    'activityPrivacy': (
      'guildsWrapper': 'wrapper__7db08',
      'guildsHeader': 'headerContainer__7db08',
      'guildsControlsContainer': 'controlsContainer__7db08',
      'guildsControlsDropDown': 'container__3f413',
      'guildIcon': 'iconContainer__0ecc4',
    ),

    'games': (
      'notDetected': 'notDetected_cc46f0',
      'nowPlaying': 'nowPlaying_cc46f0',
      'gameName': 'gameName_cc46f0',
      'gameNameInput': 'gameNameInput_cc46f0',
      'gameLastPlayed': 'lastPlayed_cc46f0',
      'overlayStatusText': 'overlayStatusText_fd966d',
      'overlayToggleIcon': 'toggleIcon_cc46f0',
      'overlayToggleIconOn': 'toggleIconOn_cc46f0',
      'overlayToggleIconOff': 'toggleIconOff_cc46f0',
      'overlayToggleIconFill': 'fill_cc46f0',
      'game': 'game_cc46f0',
      'removeGame': 'removeGame_cc46f0',
      'addGamePopout': 'addGamePopout_cc46f0',
    ),

    'overlay': (
      'collapseable': 'collapseable__9d98d',
      'expandedContainer': 'expandedContainer__9d98d',
      'groupHeader': 'groupHeader__9d98d',
      'groupContent': 'groupContent__9d98d',
      'groupCollapsedContainer': 'groupCollapsedContainer__9d98d',
      'groupContainer': 'groupContainer__9d98d'
    ),
  ),

  'channelSettings': (
    'category': 'category__3ddc0',

    'overview': (
      'overview': 'channel-settings-overview',
    ),

    'permissions': (
      'card': 'settingCard__1a4ef',
      'cardActive': 'active__1a4ef',
      'cardContent': 'cardContent_f62fce',
      'cardFolder': 'cardFolder__1a4ef',
      'folderHeader': 'folderHeader__1a4ef',
      'adminWarning': 'adminWarning__1a4ef',
      // no idea what this is used for
      'folderMemberList': 'memberRow__1a4ef',

      'sideScroller': 'scroller__53543',
      'roleDropdownContainer': 'container_d5ae15',
      'roleDropdownHeader': 'header_d5ae15',
      'roleDropdownTag': 'sectionTag_d5ae15',
      'roleDropdownRow': 'row_d5ae15',
      'roleDropdownRowInner': 'rowInner_d5ae15',
      'roleDropdownSelected': 'selected_d5ae15',

      'permGroup': 'group__344e6',
      'permDisabled': 'disabled__344e6',
      'permItem': 'item__344e6',
      'permSelected': 'selected__344e6',
      'permDeny': 'deny__344e6',
      'permNoop': 'passthrough__344e6',
      'permAllow': 'allow__344e6',
    ),

    'invites': (
      'inviteRow': 'inviteSettingsInviteRow__1de14',
      'revokeInvite': 'revokeInvite__1de14',
    ),

    'integration': (
      'card': 'card_dc2e44',
      'iconWrapper': 'iconWrapper__4a3a5',

      'webhookCard': 'card_eafb9c',
      'webhookAvatarUploader': 'avatarUploaderInner_eafb9c',
    ),
  ),

  'guildSettings': (
    'profile': (
      'bannergrid': 'grid_ec9088',
      'bannerContainer': 'itemContainer_ec9088',
      'bannerSelected': 'itemSelected_ec9088',

      'traitsGrid': 'grid__4cbea',
      'traitContainer': 'traitContainer__4cbea',
      'traitEmoji': 'emojiWrapper__4cbea',
      'traitInput': 'traitInput__4cbea',
    ),

    'emoji': (
      'row': 'emojiRow_e7d73e',
      'aliasPlaceholder': 'emojiAliasPlaceholder_e7d73e',
      'aliasInput': 'emojiAliasInput_e7d73e',
      'input': 'emojiInput_e7d73e',
      'removeButton': 'emojiRemove_e7d73e',
    ),

    'stickers': (
      'grid': 'grid_d87d30',
      'placeholder': 'placeholderCard_d87d30',
      'wrapper': 'wrapper__83b1d',
      'content': 'content__83b1d',
      'sticker': 'sticker__83b1d',
      'actions': 'actions__83b1d',
      'action': 'action__83b1d',
    ),

    'members': (
      'header': 'header_fa2640',
      'bannerContainer': 'bannerContainer__71cd5',
      'maintableContainer': 'mainTableContainer_fa2640',
    ),

    'roles': (
      'container': 'contentColumnMinimal__23e6b',
      'defaultPermsContainer': 'container_d8f25b',
      'defaultPermsIcon': 'icon_d8f25b',
      'row': 'roleRow__5f97b',
      'rowDisableHover': 'roleRowDisableHover__5f97b',
      'circleButton': 'circleButton__5f97b',
      'editButton': 'editButton__5f97b',
      // below "role"s are shown by clicking edit
      'edit': (
        'sidebar': 'sidebar_e29cd7',
        'backContainer': 'titleContainer_e29cd7',
        'contentContainer': 'contentContainer__91dc3',
        'header': 'header_c6bf1b',
        'headerStickyElevated': 'stickyHeaderElevated_c6bf1b',
        'headerSticky': 'stickyHeader_c6bf1b',
        'iconPreviewContainer': 'previewContainer__05e8e',
      ),
      'preview': (
        // view server as role
        'notice': 'notice_c9e42f',
        'button': 'button_c9e42f',
        'backbutton': 'backButton_c9e42f',
        'dropdown': 'container__09ccc',  
      ),
    ),

    'access': (
      'joinOptions': 'joinOptions__959cb',
      'joinOptionContent': 'joinOptionContent__959cb',
      'joinOptionActive': 'active__959cb',
    ),

    'safety': (      
      'changelog': 'changelog_abe1fa',
      'checklist': 'safetyChecklist_eae0ef',

      // click on any option
      'itemWrapper': 'simpleItemWrapper__5dac8',
      'pill': 'valuePill__5dac8',
    ),

    'audit': (
      'log': 'auditLog__43dab',
      'header': 'header__43dab',
      'headerExpanded': 'headerExpanded__43dab',
      'divider': 'divider__43dab',
      'changeDetails': 'changeDetails__43dab',
    ),

    'bans': (
      'scrollerContainer': 'scrollerContainer_cdb2b0',
      'bannedUser': 'bannedUser_cdb2b0',
    ),

    'automod': (
      'badge': 'textBadge__0034b',
      'editCard': 'editCard_a25a68',
      'editCardToggled': 'toggled_a25a68',
      'ruleIconContainer': 'ruleIconContainer_c5e6a1',
      'ruleIcon': 'ruleIcon_c5e6a1',
      'pillContainer': 'actionContainer_bc4513',
      'pillIcon': 'actionIcon_bc4513',
      'pillText': 'actionTextHeader_bc4513',
      'stepIcon': 'stepCountIcon_b6c6eb',
      'stepperContainer': 'stepperContainer_ed9c90',
      'contentContainer': 'mentionLimitContainer_ed9c90' 'keywordListContainer__09e76' 'actionContainer__6446f',
      'keywordsTextArea': 'keywordsTextArea__6a631',
      'regexTextArea': 'textArea_c615b7',
    ),

    'community': (
      'enable': (
        'guildDetails': 'guildDetails_bebc5b',
        'featureCard': 'featureCard_bebc5b',
        'featureIcon': 'featureIcon_bebc5b',
      ),
      'overview': (
        'upsellContainer': 'upsellContainer__4cfe2',
        'upsellFooter': 'upsellFooter__4cfe2',
      ),
    ),

    'onboarding': (
      'testimonialContainer': 'testimonialHeroContainer__3e7e2',
      'testimonialQuotes': 'quotes__3e7e2',
      'testimonial': 'testimonial__3e7e2',
      'upsell': 'upsellPreview_d9161f',      
      'upsellList': 'previewListItem_d9161f',
      'upsellListSelected': 'selected_d9161f',
      'upsellCheckboxCircle': 'checkboxCircle_d9161f',
      'upsellCheckbox': 'checkbox_d9161f',

      // check it out
      'setup': (
        'educationPopout': 'educationUpsell__4a4f2',
        'educationPopoutArrow': 'educationUpsellArrow__4a4f2',
        'progressBarContainer': 'progressBarContainer__008b2',
        'progressBar': 'progressBar__008b2',
        'progressBarCurrent': 'progressBarCurrent__008b2',
        'footerContainer': 'container__4a4f2',

        'defaultChannels': (
          'row': 'channelRow__1ea09',
          'rowDisabled': 'disabled__1ea09',
          'rowSeparator': 'separator__1ea09',
          'listHeader': 'header__75906',
          'listHeaderContainer': 'container_e9b3cb',
          'listProgressBar': 'progressBar__58525',
          'listProgressIcon': 'icon_e9b3cb',
          'list': 'channelList__75906',
          'listIndicator': 'chattableIndicator__75906',
        ),

        'questions': (
          'addPrompt': 'addPrompt_e34850',
          'plusIcon': 'plusIcon_e34850',
          'container': 'container__5d756',
          'example': 'example__5d756',
        ),

        'serverGuide': (
          'actionExample': 'example_d2b0e4',
          'badExampleIcon': 'badExampleIcon_d2b0e4',
          'actionItem': 'actionItem_d2b0e4',
          'actionItemIcon': 'actionItemEmojiWrapper_d2b0e4',
          'actionAdd': 'addActionItem_d2b0e4',
        ),

        'review': (
          'header': 'reviewHeader_a9b452',
          'stepContainer': 'onboardingStepContainer__28e57',
          'iconContainer': 'iconContainer__28e57',
        ),
      ),

      'onboardingResourceChannel': 'resourceChannel_d2b0e4',
      
      'onboardingActionPreviewPill': 'pillContainer__9e06a',
      'onboardingActionPreviewPillSelected': 'pillItemSelected__9e06a',
      
      'onboardingRecommendedDefaultChannels': 'channelRow__514d8',
      'onboardingChannelPermissionsItems': 'selectableChannelRow_e6fa8e',
      'onboardingChannelPermissionsMenu': 'deprivateTableBody_e6fa8e',
      'onboardingRecommendedReadOnly': 'suggestedChannels_d2b0e4',
      'onboardingPickAnEmoji': 'container_cd2100',
    ),

    'subs': (
      'howItWorksContainer': 'howItWorksContainer_dd30dc',
      'howItWorksCard': 'howItWorksCard_dd30dc',
      'howItWorksImageContainer': 'howItWorksImageContainer_dd30dc',      
      'card': 'card_fc2e20',
      'earningsPreviewContainer': 'earningsPreviewContainer__02e4c',
      'avatarCard': 'avatarCard__02e4c',
      'avatarConnector': 'verticalConnector__02e4c' 'horizontalConnector__02e4c',
      'viewServerButton': 'viewServerButton__2485e',
    ),

    'boost': (
      // used in sticker settings too
      'tierProgressBackground': 'background_c44edb',
      'tierInProgress': 'tierInProgress_c44edb',
      'tierCard': 'tier_f15dca',
      'tierHeader': 'tierHeader_f15dca',
      'tierHeaderLocked': 'tierHeaderLocked_f15dca',
      'tierLock': 'tierLock_f15dca',
      'tierHeaderUnlocked': 'tierHeaderUnlocked_f15dca',
      'tierBody': 'tierBody_f15dca',
    ),

    'template': (      
      'descriptionBox': 'descriptionBox__981f7',
      'descriptionIcon': 'descriptionIcon__981f7',
    ),

    'insights': (
      'developerPortal': 'developerPortalCtaWrapper_bf485f',
      'analyticsCard': 'analyticsCard__5931c',
      'notEnoughMembers': 'notEnoughMembersError_bf485f',
      'insightsContainer': 'memberInsightsContainer_cfaf72',
      'insightsActions': 'insightsActions_cfaf72',
    ),

    
    'guildSettingsWelcomeEnable': 'enableContainer__5ea8c',
    'guildSettingsWelcomePreview': 'previewContainer__5579e',
    'guildSettingsWelcomeEditCircle': 'editCircle__5ea8c',
    'guildSettingsWelcomeChannel': 'welcomeChannel__5579e',
    'guildSettingsWelcomeChannelIcon': 'channelIcon__5579e',

  ),

  'popouts': (
    // unless the popout profile has previously loaded, click on a username in chat or someone in the member list
    // the line this on appears to be the only rule.
    'loading': (
      'popout': 'loadingPopout__58f1c',
    ),

    // Shoody name? Yes. Multiple modals use it? Also yes, sadly.
    // It's in the Emojis, Command Autocomplete and Stickers. Open any of them.
    'categoryList': (
      'wrapper': 'wrapper__4e6ce',
      'scroller': 'scroller_affa7e',
      // maybe? it appears in soundboard at the least. can also appear as main scroller
      'listItems': 'listItems_affa7e',
      'listHeight': 'listHeight_affa7e',

      // WILL ALWAYS HAVE INLINE STYLE FOR HEIGHT
      // these few appear elsewhere
      'svg': 'svg__2338f',
      'mask': 'mask__0fa6d',
      'guildIcon': 'guildIcon__0fa6d',
      'lockedCategory': 'categoryItemLockIconContainer__0fa6d',
    ),

    // Start a message with a `/`
    'autocomplete': (
      'popout': 'autocomplete__13533',
      'inner': 'autocompleteInner__13533',
      'contentTitle': 'contentTitle__13533',
      'rail': 'rail_d1405b',
      // sidebar thingy w/ default commands and bot icons
      'railWrapper': 'wrapper_b1e4f3',
      // background applied to this class. ugh.
      'categorySelectable': 'selectable__1a58a',
      'categorySelected': 'selected__1a58a',
      'categoryIcon': 'icon__1a58a',
      'sidebarList': 'list_b1e4f3',
      // if you see below at the category of the same name, this is paired with WRAPPER.
      'categoryHeader': 'categoryHeader_d1405b',
      'autocompleteRowVertical': 'autocompleteRowVertical__13533',
      // class exists, could reside in js. my scraper only scrapes css
      'clickable': 'clickable__13533',
      'base': 'base__13533',
      // wanna apply theming to this? background-modifier-hover: clickable[aria-disabled=false]>:hover,clickable[aria-selected=true]>
      // option does not cover optional stuff
      'option': 'option_a19535',
      'optionError': 'error_a19535',
      'optionActive': 'active_a19535',
    ),

    'menus': (
      'menu': 'menu_c1e9c4',
      'flexible': 'flexible_c1e9c4',
      // mostly elsewhere
      'fixed': 'fixed_c1e9c4',
      // click server name
      'scroller': 'scroller_c1e9c4',
      'separator': 'separator_c1e9c4',
      'customItem': 'customItem_c1e9c4',
      // found in quick react
      'item': 'item_c1e9c4',
      'labelContainer': 'labelContainer_c1e9c4',
      'itemDisabled': 'disabled_c1e9c4',
      'itemFocused': 'focused_c1e9c4',
      'itemHideInteraction': 'hideInteraction_c1e9c4',
      // best seen in the css rules with :not(), banner in status has it
      'label': 'label_c1e9c4',
      'subtext': 'subtext_c1e9c4',
      // "muted until $time" for easiest way of bringing this up
      'iconContainer': 'iconContainer_c1e9c4',
      'iconContainerLeft': 'iconContainerLeft_c1e9c4',
      // change status has this
      'icon': 'icon_c1e9c4',

      'caret': 'caret_c1e9c4',
      'checkboxContainer': 'checkboxContainer_c1e9c4',
      'checkbox': 'checkbox_c1e9c4',
      'checkboxCheck': 'check_c1e9c4',
      'radioSelection': 'radioSelection_c1e9c4',

      'colorDefault': 'colorDefault_c1e9c4',
      'colorBrand': 'colorBrand_c1e9c4',
      // invite people
      'colorDanger': 'colorDanger_c1e9c4',
      // leave server, report raid, server mute/deaf, kick, ban, disconnect, timeout etc
      'colorPremium': 'colorPremium_c1e9c4',
      // sets icon to boost color
      'colorPremiumGradient': 'colorPremiumGradient_c1e9c4',
      // gradient to focused and :active:not(:hideInteraction)
      'colorSuccess': 'colorSuccess_c1e9c4',

      // if you can find greens...
      'submenuPaddingContainer': 'submenuPaddingContainer_c1e9c4',
      // change status for easiest
      'submenu': 'submenu_c1e9c4',

      'hintContainer': 'hintContainer_c1e9c4',

      // this is the remove custom status thing
      'groupLabel': 'groupLabel_c1e9c4',
      // no idea where
      'loader': 'loader_c1e9c4',
      // no idea where
      'sparkles': 'sparkles_c1e9c4',

      // no idea where
      // Right click a message in a channel you can add reactions to
      'quickReactWrapper': 'wrapper_f563df',
      'quickReactionButton': 'button_f563df',

      // Change status
      'mainStatusIcon': 'mainStatusIcon_ad5fac',
      'statusItem': 'statusItem_af7fb7',
      // within submenu
      'statusMask': 'mask_a423bd',
      'status': 'status_a423bd',
      // inline background color
      'statusicon': 'icon_af7fb7',
      // >foreignObject>div has inline style
      'statusText': 'status_af7fb7',
      // contains text
      'statusDescription': 'description_af7fb7',

      // used with do not disturb and invis
      'accountSwitcher': (
        'focused': 'focused_d40c56',
        // put on a parent class, one actually with an "item-" class
        'item': 'userMenuItem_d40c56',
        // nested inside *another* item
        'username': 'userMenuUsername_d40c56',
        'text': 'userMenuText_d40c56',
        'discriminator': 'userMenuDiscriminator_d40c56',
        'activeIcon': 'activeIcon_d40c56',
        // child "circle" changes fill via js
      ),
    ),

    // Be in a private call, change region
    'regionSelect': (
      'popout': 'regionSelectPopout__5621e',
    ),

    // Click the in-chat search bar in header
    'search': (
      'container': 'container__55c99',
      'query': 'queryContainer__55c99',
      'queryFocused': 'focused__55c99',
      'queryText': 'queryText__55c99',
      'queryShortcut': 'queryShortcut__55c99',

      'header': 'header__56fec',
      'learnMore': 'searchLearnMore__56fec',
      // (?) link
      'resultsGroup': 'resultsGroup__56fec',
      'option': 'option__56fec',
      'searchOption': 'searchOption__56fec',
      'filter': 'filter__56fec',
      'answer': 'answer__56fec',
      'plusIcon': 'plusIcon__56fec',

      'optionUser': 'user__56fec',
      'displayedNick': 'displayedNick__56fec',
      'displayUsername': 'displayUsername__56fec',

      'resultChannel': 'resultChannel__56fec',
      'resultChannelIcon': 'searchResultChannelIcon__56fec',
      'resultChannelCategory': 'searchResultChannelCategory__56fec',

      'historyRow': 'searchHistoryRow__56fec',
      'clearHistory': 'searchClearHistory__56fec',
      'datePicker': 'datePicker__56fec',
      'datePickerHint': 'datePickerHint__56fec',
      'hint': 'hint__56fec',
      'hintValue': 'hintValue__56fec',

      'calendar': (
        // outer class
        'picker': 'calendarPicker_d27f17',

        'navigation': 'react-datepicker__navigation',
        'navigation--next': 'react-datepicker__navigation--next',
        'navigation--previous': 'react-datepicker__navigation--previous',
        'navigation-icon': 'react-datepicker__navigation-icon',

        'datePicker': 'react-datepicker',
        'monthContainer': 'react-datepicker__month-container',
        'header': 'react-datepicker__header',
        'currentMonth': 'react-datepicker__current-month',
        'dayNames': 'react-datepicker__day-names',
        'dayName': 'react-datepicker__day-name',

        'month': 'react-datepicker__month',
        'week': 'react-datepicker__week',
        'day': 'react-datepicker__day',
        'dayDisabled': 'react-datepicker__day--disabled',
        'daySelected': 'react-datepicker__day--selected',
        'dayOutsideMonth': 'react-datepicker__day--outside-month',
        'dayKeyboardSelected': 'react-datepicker__day--keyboard-selected',
        'today': 'react-datepicker__day--today',
      ),
    ),

    // Best seen in Voice + Video settings, right at the top there's two
    'dropdown': (
      'wrapper': 'wrapper__3f413',
      'select': 'select__3f413',
      'filled': 'lookFilled__3f413',

      'open': 'open__3f413',

      'value': 'value__3f413',
      'icons': 'icons__3f413',

      'popout': 'popout__3f413',
      'positionTop': 'popoutPositionTop__3f413',
      'measurement': 'measurement__3f413',
      // there's a hidden one next to the popout???
      'option': 'option__3f413',
      'selectedIcon': 'selectedIcon__3f413',
      // checkmark
      'focused': 'focused__3f413',
      // hover over item
      'multi': 'multi__3f413',

      // multi select
      'optionPillContainer': 'optionPillContainer__3f413',
      'optionPillItem': 'optionPillItem__3f413',
      'optionPillBtn': 'optionPillBtn__3f413',
      'optionPill': 'optionPill__3f413',
      'deleteOptionIcon': 'deleteOptionIcon__3f413',
      'multiSelectCheckbox': 'multiSelectCheckbox__3f413',
      'unchecked': 'unchecked__3f413',
      'checked': 'checked__3f413',

      'clear': 'clear__3f413',

      // i can't find this class but it's in a rule
      // idk where lmao
      'searchable': 'searchable__3f413',
      'searchInput': 'searchInput__3f413',
      'editing': 'editing__3f413',
      'label': 'label_f6639d',
      'selectPositionTop': 'selectPositionTop__3f413',
      'disabled': 'disabled__3f413',
      'hidden': 'hidden_f6639d',
      'iconsContainer': 'iconsContainer__3f413',
      'iconsCenter': 'iconsCenter__3f413',
      'placeholder': 'placeholder__3f413',
      'dropdownIcon': 'dropdownIcon__3f413',
      'noResults': 'noResults__3f413',
      'loading': 'loading__3f413',
      'loadingSpinner': 'loadingSpinner__3f413',
      'searchableSelect': 'searchableSelect__3f413',
      'prefix': 'prefix__3f413',
      'suffix': 'suffix__3f413',
      'content': 'content__3f413',
      'optionPillWrapper': 'optionPillWrapper_f6639d',
      'noScrollbar': 'noScrollbar__3f413',
      'multiSelectCheck': 'multiSelectCheck__3f413',
    ),

    // Click on the emoji, sticker or gif within the chatbar
    'expressionPicker': (
      'positionLayer': 'positionLayer__08434',
      // has relevant theme-[dark/light] class applied to it
      'positionContainer': 'positionContainer__08434',
      'drawerSizingWrapper': 'drawerSizingWrapper__08434',
      'resizeHandle': 'resizeHandle__08434',
      'contentWrapper': 'contentWrapper__08434',
      'nav': 'nav__08434',
      'navItem': 'navItem__08434',
      'navButton': 'navButton__08434',
      'navButtonActive': 'navButtonActive__08434',

      'inspector': 'inspector_aeaaeb',

      // Emoji within charbar combined popout
      'emoji': (
        'wrapper': 'wrapper_c0e32c',
        // want just floating? :not( below ). has ID
        'hasTabWrapper': 'emojiPickerHasTabWrapper_c0e32c',
        'picker': 'emojiPicker_c0e32c',

        'header': 'header_c0e32c',
        'searchBar': 'searchBar_c0e32c',
        'skinSelector': 'diversitySelector_c0e32c',
        'skinSelectorButton': 'diversitySelectorButton_a45a2a',
        'skinSelectorImage': 'diversityEmojiItemImage_a45a2a',
        // uses style for image, asset will likely change with each update though
        // click the clapping emoji for these
        'skinOptions': 'diversitySelectorOptions_a45a2a',
        'skinOptionsEmojiItem': 'diversityEmojiItem_a45a2a',
        // if you wish to select one skin type, the above class has `data-list-item-id="diversity___item-n"`
        // where n is 0-5; 0 being yellow, 1 being lightest and 5 being darkest
        'body': 'bodyWrapper_c0e32c',
        'pickerListWrapper': 'emojiPickerListWrapper_c0e32c',
        'listWrapper': 'listWrapper_c656ac',
        'list': 'list_c656ac',
        'categorySection': 'categorySection_c656ac',
        'categoryHeader': 'header_c656ac',
        'categoryHeaderWrapper': 'wrapper__14245',
        'categoryHeaderInner': 'header__14245',
        'listRowLarge': 'emojiListRowLargeSize_fc7141',
        // widen the modal above 400px wide for rows
        'item': 'emojiItem_fc7141',
        'itemLarge': 'emojiItemLarge_fc7141',
        'itemSelected': 'emojiItemSelected_fc7141',
        'imageLoading': 'imageLoading__1859b',

        'inspectorGrid': 'inspector_c0e32c',
        // bar at bottom should use the class under expressionPicker.
        'graphicPrimary': 'graphicPrimary_aeaaeb',
        'emoji': 'emoji__045fa',
        'textWrapper': 'textWrapper_aeaaeb',
        'titlePrimary': 'titlePrimary_aeaaeb',
        'favorite': 'favorite_aeaaeb',
        // it's a star~
        'titleSecondary': 'titleSecondary_aeaaeb',
        'graphicSecondary': 'graphicSecondary_aeaaeb',

        'categoryList': 'categoryList_c0e32c',

        'categoryItem': 'categoryItem_b9ee0c',
        'defaultCategory': 'categoryItemDefaultCategory_b9ee0c',
        'defaultCategorySelected': 'categoryItemDefaultCategorySelected_b9ee0c',
        'categoryIcon': 'categoryIcon_b9ee0c',
        'categorySeparator': 'guildCategorySeparator_b9ee0c',
        'unicodeShortcut': 'unicodeShortcut_b9ee0c',
        // for all the non-server emotes
        'unicodeShortcutInvisible': 'unicodeShortcutInvisible_b9ee0c',

        'premiumRetention': 'premiumRetentionNotice_a606ef',

        // When you're hoving over a message, click the add reaction button. This also includes "super" reactions.
        'floating': (
          'sparkleStar': 'sparkleStar__24af7',
          'sparklePlus': 'sparklePlus__24af7',

          // only named so as it's the dumb preview thing that begs for the user to buy nitro
          'nonNitroBlocker': (
            'wrapper': 'wrapper__97f37',
            'banner': 'banner__97f37',
            // video, with autoplay in the tag.
            'hasTrialOffer': 'hasTrialOffer__97f37',
            'content': 'content__97f37',
            'header': 'header__97f37',
            'headerText': 'headerText__97f37',
            'subheaderText': 'subheaderText__97f37',
            'ctaActionWrapper': 'ctaActionWrapper__97f37',
          ),

          'upsellContainer': 'upsellContainer_a3bc57',
          // "Unlock these emojis with Nitro" shows up when reacting
        ),
      ),

      // Gif within chatbar combined popout
      'gif': (
        'container': 'container_fed6d3',
        // has ID on it
        'header': 'header_fed6d3',
        'searchBar': 'searchBar_fed6d3',
        'content': 'content_fed6d3',
        'scroller': 'container_d02962',
        'resultPlaceholder': 'placeholder__2dc39',
        'result': 'result__2dc39',
        'resultFocused': 'focused_bad108',
        'favoritesFade': 'categoryFadeBlurple_d02962',
        'categoryFade': 'categoryFade_d02962',
        'categoryText': 'categoryText_d02962',
        'categoryIcon': 'categoryIcon_d02962',
        'categoryName': 'categoryName_d02962',
        'endContainer': 'endContainer__2dc39',
        'results': 'results__2dc39',
        'noResultsWrapper': 'wrapper__29ebd',
        'sadImage': 'sadImage__29ebd',
        // search "hentai" or something
        // shown in favourites when they're empty or something. i used a plugin that allowed for searching and it brought these up.
        'emptyHintCard': 'emptyHintCard__2dc39',
        'emptyHintFavourite': 'emptyHintFavorite__2dc39',
        // star
      ),

      // Sticker within chatbar combined popout
      'sticker': (
        'wrapper': 'wrapper__8ef02',
        // has ID on it
        'header': 'header__8ef02',
        'searchWrapper': 'wrapper_cdf8a9',
        // for the bar, use child of above
        'listWrapper': 'listWrapper__8ef02',
        'gridWrapper': 'wrapper_e94b8c',

        // holds stickers in grid
        'packHeader': 'packHeader_e94b8c',
        // has a pos sticky and top 0
        'packRow': 'row_c6367b',
        'sticker': 'sticker_c6367b',
        // border radius and padding, doesn't apply to in-chat sticker
        'stickerCursor': 'sticker_e94b8c',
        // only cursor, doesn't apply to in-chat sticker
        'inspected': 'stickerInspected_c6367b',
        'inspectedIndicator': 'inspectedIndicator_c6367b',
        // hover over a sticker
        'upsell': 'upsell_ac65bb',
        // In a server you can manage stickers on with at least 1 free slot
        'emptyGuildUpsell': 'emptyGuildUpsell_e94b8c',
        // also above but zero stickers
        // bar at bottom should be under GSE
        'categoryList': 'categoryList__3ad28',
        'categorySeparator': 'guildCategorySeparator__3ad28',
        'category': 'stickerCategory__3ad28',
        'categoryGeneric': 'stickerCategoryGeneric__3ad28',
        // used on freq used
        'categoryGenericSelected': 'stickerCategoryGenericSelected__3ad28',
        'firstPartyCategorySelected': 'firstPartyCategorySelected__3ad28',

        'stickerSearchSuggestion': 'searchSuggestion_e94b8c',

        // search result empty
        'standardStickerShortcut': 'standardStickerShortcut__3ad28',
      ),
    ),

    'stickerSuggestion': (
      'focused': 'suggestedExpressionFocused_d4ced7',
      'mask': 'mask_d4ced7',
      'maskBackground': 'maskBackground_d4ced7',
      'background': 'containerBackground_d4ced7',
    ),

    'apps': (
      'popout': 'contentWrapper__9c62c',
      'container': 'container__927fc',
      'loading': 'container_ccbbbb',
      'sectionRowsContainer': 'sectionRowsContentContainer__927fc',
      'itemContainer': 'container_cb32c7',
      'rowContainer': 'rowContainer_cb32c7',
      'rowDivider': 'rowDivider_cb32c7',
      'viewMore': 'viewMore__32c75',
      'learnMore': 'container__19cf2',

      'details': (
        'container': 'container__7bdb0',
        'backButton': 'clickable__8c853',
        'stickyBanner': 'stickyBanner__57d3f',
        'banner': 'bannerBackground__57d3f',
        'appIcon': 'appIcon__7bdb0',
        'overviewNoVideo': 'overviewContainerNoVideo__95856',
        'overviewWithVideo': 'overviewContainerWithVideo__95856',
        'overviewShowMore': 'expandableDescriptionClickable__95856',
        'dropdown': 'sortDropdown__27f60',
        'commandContainer': 'commandContainer_c94584',
        'command': 'command_c94584',
        'tag': 'tagContainer__95856',
      ),

      'search': (
        'sectionContainer': 'sectionContentContainer_b18295',
        'itemClickable': 'clickable__761e5',
        'itemDivider': 'underline__761e5',
      ),
    ),

    // In voice call, open up the sound board
    'soundboard': (
      'picker': 'picker__09f65',
      'refresh': 'refresh__09f65',
      // less compact version, appears to be the "new" version that is being used.
      'header': 'header__0856d',
      'searchWrapper': 'wrapper__0d1ef',
      'volumeClickArea': 'settingsClickArea__61424',
      'volumeIcon': 'settingsIcon__61424',

      'categoryList': 'categoryList_a1e0e0',
      // sidebar uses `modals sidebarList wrapper` too
      'category': 'category_a1e0e0',
      // individual server or default discord sounds
      'categoryIcon': 'categoryIcon_a1e0e0',
      // default discord sounds
      'categoryIconIcon': 'categoryIconIcon_a1e0e0',
      // wonderful name, discord. child is path[class=""]
      'categorySelected': 'selected_a1e0e0',
      // used for icon-based ones when selected
      
      'listWrapper': 'listWrapper__0856d',
      // wrapper to the wrapper
      'wrapper': 'wrapper__0c74f',
      // wrapper to the scroller
      // scroller uses the same `modals sidebarList scroller` weirdly enough
      'section': (
        // used for each category **HEADER**
        'container': 'sectionContainer__61424',
        'header': 'sectionHeader__61424',
        // class as [aria-expanded="true"|"false"]
        'notFirstSection': 'notFirstSectionHeader__61424',
        'content': 'sectionHeaderContent__61424',
        'title': 'sectionTitle__61424',
        'icon': 'headerIcon__61424',
      ),
      'sound': (
        // and now for the rows
        'row': 'soundRow__61424',
        'button': (
          'wrapper': 'soundButtonWrapper__9be63',
          'button': 'soundButton__9be63' 'soundButtonRefresh__9be63',
          'interactive': 'soundButtonInteractive__9be63' 'soundButtonInteractiveRefresh__9be63',
          // :hover on this to show overlay
          'focused': 'focused__9be63',
          // arrow keys to navigate work
          'hoverActiveBackground': 'hoverActiveBackground__9be63',
          // voice & video choose entrance sound
          'name': 'soundName__9be63' 'soundNameRefresh__9be63',

          'overlay': 'buttonOverlay__9be63',
          'overlayBackground': 'buttonOverlayBackground__9be63',
          // never appears in refresh
          'overlayActions': 'buttonOverlayActions__9be63' 'buttonOverlayActionsRefresh__9be63',
          'absoluteFill': 'absoluteFill__9be63',
          // position absolute; top,left,right,bottom 0
        ),
        'primaryIcon': 'primaryIcon__9be63' 'primaryIconRefresh__9be63',
        // only on refresh for nitro locked
        'lockIcon': 'lockIcon__9be63',
        // only on refresh for nitro locked without emoji
        'secondary': (
          // action buttons. "play", "favourite" etc
          'button': 'secondaryButton__9be63' 'secondaryButtonRefresh__9be63',
          'icon': 'secondaryIcon__9be63',
          'favourite': 'favoriteIconFavorite__9be63',
          // only shows up when sound is favourited
        ),
        'animated': 'animated__9be63',
        'playing': 'playing__9be63',
        'previewing': 'previewing__9be63',
        'info': 'soundInfo__9be63' 'soundInfoRefresh__9be63',
        'emoji': (
          'hasEmoji': 'hasEmoji__9be63',
          'circle': 'emojiCircle__9be63',
          'emoji': 'emoji__9be63',
        ),
        'add': (
          'button': 'soundAddButton__58c6c' 'soundAddButtonRefresh__58c6c',
          'info': 'soundAddInfoRefresh__58c6c',
          // only appears in refresh
          'icon': 'soundAddIcon__58c6c' 'soundAddIconRefresh__58c6c',
          'text': 'soundAddText_c06ee5' 'soundAddTextRefresh__58c6c',
        ),
      ),
      'nitro': (
        // because not everyone has nitro
        'topDivider': (
          'container': 'nitroTopDividerContainer_b3fb5f',
          'upper': 'nitroTopDividerUpper_b3fb5f',
          'shadow': 'nitroTopDividerShadow_b3fb5f',
          'lock': (
            'container': 'nitroTopDividerLockContainer_b3fb5f',
            'border': 'nitroTopDividerLockBorder_b3fb5f',
            // "left" line
            'circle': 'nitroTopDividerLockCircle_b3fb5f',
            // > svg > path[fill]
            'borderReversed': 'nitroTopDividerLockBorderReversed_b3fb5f',
            // "right" line
          ),
          'lower': 'nitroTopDividerLower_b3fb5f',
        ),
        'sectionLocked': 'sectionContainerNitroLocked__61424',
        // on section/header. has background
        'rowLocked': 'soundRowNitroLocked__61424',
        // on row. has background like section/header
        'premiumDisabled': 'premiumDisabledRefresh__9be63',

        // only appears in refresh. on button. hover this also gives emojiCircle background gradient
        'upsell': (
          // floating thing at bottom that shows up when scrolling
          'container': 'upsellContainer__0b69f',
          // has inline style for transform: translateY(0-120%);opacity: 0-1;
          'shadow': 'upsellContainerShadow__0b69f',
          'innerFloating': 'upsellContainerFloating__0b69f',
          'text': 'upsellText__0b69f',
          'button': 'upsellButton__0b69f'
        ),

        'cta': (
          // large container that appears when clicking sound from outside server without nitro
          // "Express yourself with more sounds"
          'container': 'container_d829e7',
          'noParentContainer': 'noParentContainer_d829e7',
          'close': 'closeButton_d829e7',
          'contentContainer': 'contentContainer_d829e7',
          'image': 'image_d829e7',
          'title': 'title_d829e7',
          'titleNoSocialProof': 'titleNoSocialProof_d829e7',
          'body': 'body_d829e7',

          // footer equiv
          'ctaContainer': 'ctaContainer_d829e7',
          'secondaryCTA': 'secondaryCTA_d829e7',
          // "View All Nitro Perks"
            // the right button does not have a dedicated class
        ),
      ),

      'keybindHint': 'keybindHint__46002',
    ),

    'pins': (
      'popout': 'messagesPopoutWrap__45690',
      'header': 'header__45690',
      'titleContainer': 'titleContainer__45690',
      'messages': 'messagesPopout__45690',
      'messageGroup': 'messageGroupWrapper__45690',
      'messageCozy': 'messageGroupCozy__45690',
      'actionButtons': 'actionButtons__45690',
      'jumpButton': 'jumpButton__45690',
      'loading': 'loading__45690',
      'loadingVisible': 'visible__45690',
      'remove': 'closeIcon__45690',

      // no pins
      'emptyPlaceholder': 'emptyPlaceholder__45690',
      'emptyImage': 'image__45690',
      'emptyBody': 'body__45690',
      'footer': 'footer__45690',
      'block': 'block__30cbe',
      // discord put this on the rules for some reason? lots of inline
      'protip': 'pro__30cbe',
      // inline color
      'tip': 'tip__30cbe',
    ),

    'inbox': (
      'popout': 'recentMentionsPopout__95796',
      'header': 'header_ab6641',
      'tabBar': 'tabBar_ab6641',
      'tab': 'tab_ab6641',
      'tabActive': 'active_f0cd33',
      'controls': 'controls_ab6641',
      'button': 'button__06eda',
      'primary': 'primary__06eda',
      'secondary': 'secondary__06eda',
      // background secondary, hover primary
      'tertiary': 'tertiary__06eda',
      // background tertiary, hover floating
      'buttonDisabled': 'disabled__06eda',
      'size32': 'size32__06eda',
      'channelHeader': 'channelHeader__35a7e',
      'guildIcon': 'guildIcon__35a7e',
      'dmIcon': 'dmIcon__35a7e',
      'channelNameSection': 'channelNameSection__35a7e',
      'channelNameHeader': 'channelNameHeader__35a7e',
      'channelName': 'channelName__35a7e',
      'channelNameSpan': 'channelNameSpan__35a7e',
      'subtextContainer': 'subtextContainer__35a7e',
      'subtext': 'subtext__35a7e',
      'guildName': 'guildName__35a7e',
      'jumpButton': 'jumpButton_ed0c8c',
      'jumpButtonText': 'text_ed0c8c',
      'emptyContainer': 'container_d404a3',
      'emptyIconContainer': 'iconContainer_d404a3',
      'emptyIcon': 'icon_d404a3',
      'emptyStars': 'stars_d404a3',
      'emptyHeader': 'header_d404a3',
      'emptyProtip': 'protip_d404a3',

      // inline color
      'friendRequestsButton': 'friendRequestsButton__523aa',

      'forYou': (
        'container': 'container_fc561d',
        'bodyContainer': 'container__0f711',
        'avatarContainer': 'container_db811b',
        'avatarMask': 'mask_db811b',
        'imageContainer': 'imageContainer_db811b',
        'image': 'image_db811b',
        'maskBackground': 'maskBackground_db811b',
        'maskIcon': 'maskIcon_db811b',
      ),
      'mentions': (
        'scroller': 'scroller__95796',
        'container': 'container__95796',
        'close': 'closeButton__95796',
        'messageContainer': 'messageContainer__95796',
        'message': 'message__95796',
        'scrollingFooterWrap': 'scrollingFooterWrap__45690',
      ),

      'unread': (
        'popout': 'container__2692d',
        'scroller': 'scroller__2692d',
        'tutorial': 'tutorial__2692d',
        // "Stay up to date with the latest messages"
        'tutorialIcon': 'tutorialIcon__2692d',
        'channel': 'channel__427f0',
        'mentionBadge': 'badge__35a7e',
        'markRead': 'markReadButton__427f0',
        'collapseButton': 'collapseButton__427f0',
        'collapsed': 'collapsed__427f0',
        'messages': 'messages__1ccd1',
        'messageContainer': 'messageContainer__1ccd1',
        'jumpButton': 'jumpButton__1ccd1',
        'message': 'message__1ccd1',
        'divider': 'divider__1ccd1',

        // Click the "mark inbox as read" button and another modal pops up
        'markAll': (
          'content': 'content__1688d',
        ),
      ),
    ),

    // Either dropdown in header bar or from hovering on a channel with an active thread
    // Line numbers based on 2022-09-11 https://canary.discord.com/assets/40532.2f0570f42394060c451f.css
    'threads': (
        'browser': 'browser_d98031',
        'container': 'container_d9c882',
        'header': 'header_d9c882',
        'threadIcon': 'threadIcon_d9c882',
        'title': 'title_d9c882',
        'divider': 'divider_d9c882',
        'searchBox': 'searchBox_d9c882',
        'spacer': 'spacer_d9c882',
        'createButton': 'createButton_d9c882',
        'closeIcon': 'closeIcon_d9c882',

        'list': 'list_c441f0',
        'listHeader': 'sectionHeader_c441f0',
        'listItem': 'container__6764b',
        'left': 'left__6764b',
        'threadNameLine': 'threadNameLine__6764b',
        'threadName': 'threadName__6764b',
        'subtext': 'subtext__6764b',
        'avatar': 'avatar__6764b',
        'authorName': 'authorName__6764b',
        'messageContent': 'messageContent__6764b',
        'facepile': 'facepile__6764b',

        // empty list
        'emptyContainer': 'container__1b24f',
        'emptyIconContainer': 'iconContainer__1b24f',
        'emptyIcon': 'icon__1b24f',
        'emptyStars': 'stars__1b24f',
        'emptyHeader': 'header__1b24f',
        'emptyCreateButton': 'cta__1b24f',

        // Channel popout
        'channelPopout': 'popout__76f04',
      ),

    
    // @everyone with a larger server
    'mentionWarning': (
      'popout': 'contentWarningPopout_be95d0',
      'body': 'body_be95d0',
      'animation': 'animation_be95d0',
      'content': 'content_be95d0',
      'header': 'header_be95d0',
      'footer': 'footer_be95d0',
    ),

    // Click either an Emoji or a Sticker within chat
    'emojiStickerPopout': (
      'container': 'popoutContainer__0f481',
      'emojiSection': 'emojiSection_d5cd2d',
      // also used with sticker
      'guildSection': 'guildSection_d5cd2d',
      'guildTitle': 'guildTitle_d5cd2d',

      'loading': 'popoutLoader_dfa983',
      'loadingBackground': 'popoutLoadingBackground__0f481',
      // contains mask
      'loadingForeground': 'popoutLoadingForeground__0f481',
      // contains background-image
    ),

    // click on guild tag beside user name
    'guildTag': (
      'spinner': 'spinnerContainer__86bf6',
      'container': 'container__86bf6',
    ),

    'streamPreview': (
      'popout': 'streamPreview__6da2d',
      'previewContainer': 'previewContainer__6da2d',
      'watchButton': 'watchButton__6da2d',
    ),

    'vcPreview': (
      // hover private vc with members playing games/listening to spotify
      'popout': 'container__4e30a',
      'peopleContainer': 'container_b1bfd4',
    ),
  ),

  'modals': (
    'layer': 'layer_bc663c',
    'hidden': 'hidden_bc663c',
    // best way to get this class is to change banner/avi and click gifs
    'focusLock': 'focusLock__49fc1',
    'root': 'root__49fc1' 'container__8a031' /* quickswitcher, external links, server notifs */ ,
    'header': 'header__49fc1',
    // header text doesn't have its own class per se but can be targeted with header>h2
    'close': 'close__49fc1',
    // most modals that have this also have a second class attached
    'closeWithCircleBackground': 'closeWithCircleBackground__49fc1',
    'closeIcon': 'closeIcon__49fc1',
    'body': 'content__49fc1',
    'footer': 'footer__49fc1',

    // sizes
    'small': 'small__49fc1',
    'medium': 'medium__49fc1',
    'large': 'large__49fc1',

    'fullscreenMobile': 'fullscreenOnMobile__49fc1',
    'hideOnFullscreen': 'hideOnFullscreen__49fc1',
    'rootWithShadow': 'rootWithShadow__49fc1',
    'spinnerContainer': 'spinnerContainer__49fc1',

    // both rules are basically box shadows
    'separator': 'separator__49fc1',
    'footerSeparator': 'footerSeparator__49fc1',

    // animations are in own group
    'translate': 'translate_faf9c0',
    'fade': 'fade_faf9c0',
    'scale': 'scale_faf9c0',
    'didRender': 'didRender_faf9c0',
    'animator': (
      'center': 'animatorCenter_faf9c0',
      'left': 'animatorLeft_faf9c0',
      'right': 'animatorRight_faf9c0',
      'top': 'animatorTop_faf9c0',
      'bottom': 'animatorBottom_faf9c0',
    ),

    // When creating a new channel
    'createChannel': (
      // different line for some reason
      'searchBar': 'searchBar__3e00d',

      // make a private channel and click next
      // more -- i cannot remember how to pull this up.
      'modal': 'modal_ac72c6',
      'modalContent': 'modalContent_ac72c6',
      'modalFooter': 'modalFooter_ac72c6',
      'footer': 'footer_ac72c6',
      'description': 'description_ac72c6',
      'name': 'name_ac72c6',
      'type': 'type_ac72c6',
      'icon': 'icon_ac72c6',
      'error': 'error_ac72c6',
      'header': 'header_ac72c6',
      'title': 'title_ac72c6',
      'subtitle': 'subtitle_ac72c6',
      'subtitleIcon': 'subtitleIcon_ac72c6',
      'closeButton': 'closeButton_ac72c6',
      'sectionTitle': 'sectionTitle_ac72c6',
      'clone': 'clone_ac72c6',
      'permissionsTitle': 'permissionsTitle_ac72c6',
      'background': 'background_ac72c6',
      'foreground': 'foreground_ac72c6',
      'inputWrapper': 'inputWrapper_ac72c6',
      'inputInner': 'inputInner_ac72c6',
      'inputPrefix': 'inputPrefix_ac72c6',
      'switchIcon': 'switchIcon_ac72c6',
      'channelTypeDescription': 'channelTypeDescription_ac72c6',
      'storeChannelOptionSelector': 'storeChannelOptionSelector_ac72c6',
      'username': 'username_ac72c6',
      'emptyRoles': 'emptyRoles_ac72c6',
      'owner': 'owner_ac72c6',
      'addMembersContainer': 'addMembersContainer_ac72c6',
      'addMemberError': 'addMemberError_ac72c6',
      'createError': 'createError_ac72c6',
      'channelNameNote': 'channelNameNote_ac72c6',
      'radioLabelName': 'radioLabelName_ac72c6',
      'radioLabelDescription': 'radioLabelDescription_ac72c6',
      'newBadge': 'newBadge_ac72c6',
      'radioBar': 'radioBar_ac72c6',
      'radioBarLabel': 'radioBarLabel_ac72c6',
      'radioBarIcon': 'radioBarIcon_ac72c6',
      'radioItemName': 'radioItemName_ac72c6',
    ),

    // When creating a new event
    'createEvent': (
      'container': 'container_f2ceaa',
      'progressBar': 'progressBar_f2ceaa',
      // tab at top, unselected
      'progressBarSelected': 'selectedProgressBar_f2ceaa',
      // above selected
      'stepContainer': 'stepContainer_f2ceaa',

      'textInput': 'textInput__97cfe',
      // different line for some reason
      'previewCard': 'previewCard_f70348',
    ),

    // In a server with pending/active events, click "x Event(s)" at the top of the sidebar
    'eventsList': (
      'header': 'header_d0b769',
      'content': 'content_d0b769',
      'icon': 'icon_d0b769',
      // if cihld of iconButton, it's the close button
      'divider': 'divider_d0b769',
      'button': 'button_d0b769',
      'iconButton': 'iconButton_d0b769',
    ),

    // Within modal above, click an event
    // two major rules apply to this modal
    'eventFull': (
      'modal': 'root__4325e',
      'banner': 'banner__4325e',
      'container': 'container__4325e',
      'contentContainer': 'contentContainer__4325e',
      'footer': 'footer__4325e',
    ),

    // When reading an event, either in preview modal or list modal
    'eventCard': (
      'card': 'card__88264',
      'header': 'container__4efb4',
      'guildIcon': 'guildIcon__88264',
      'rsvpCount': 'rsvpCount_b5010b',
    ),

    // Clicking on an invite in your browser while not signed in and being redirect to the app
    // above: [broken? non-linux only? firefox settings likely]
    // Not sure how to get this anymore.
    'browserInvite': (
      'contentWrapper': 'contentWrapper__9b0f4',
      'inviteSplash': 'inviteSplash__9b0f4',
      // has style for background image
      'scroller': 'scroller_ed5743',
      'headerContainer': 'container_fa285e',
      // houses guild icon, guild name, online/total count
      'guildIcon': 'guildIcon_fa285e',
      'title': 'title_fa285e',
      'activityCount': 'activityCount_fa285e',
      'pill': 'pill__921c5',
      'pillOnline': 'pillOnline__921c5',
      'pillIcon': 'pillIcon__921c5',
      'pillIconOnline': 'pillIconOnline__921c5',
      'pillMessage': 'pillMessage_b83a05',
      'pillIconTotal': 'pillIconTotal__921c5',
      // edit notification button
      'editProfileContainer': 'editProfileContainer__42179',
    ),

    // Click "Invite People" in the server header dropdown
    'inviteOthers': (
      'scroller': 'scroller__67dba',
      'footer': 'footer__67dba',
    ),

    // "Time Out" on another user
    'timeout': (
      'groupBar': 'group__3d4a0',
      'item': 'item__3d4a0',

      // there are many more classes in the group below
      'selectorButton': 'selectorButton__0907c',
      'selectorButtonSelected': 'selectorButtonSelected__0907c',
    ),

    'ban': (
      'radioItem': 'radioItemStyles__837b7',
      'otherReasonClickable': 'banReasonOtherClickable__837b7',
    ),

    // Click the x next to a pinned message OR pin a message WITHOUT holding shift
    // Not to be confused with pinned; this isn't a dropdown
    'pin': (
      'message': 'message__89466',
    ),

    // Get an incoming call
    'incomingCall': (
      'root': 'root__2dbe1',
    ),

    // Ctrl+/ (CMD on Mac) to pull this modal up
    'keyboard': (
      'shortcuts': 'keybind-shortcuts',

      'modal': 'keyboardShortcutsModal_f061f6',
      'title': 'modalTitle_f061f6',
      'subtitle': 'modalSubtitle_f061f6',
      'list': 'keyboardShortcutList_f061f6',
      'group': 'keyboardShortcutListGroup_f061f6',
      'firstGroup': 'firstGroup_f061f6',
      'groupDescription': 'keybindGroupDescription_f061f6',
      'keybindGroup': 'keybindGroup_f061f6',
      'keybindkey': 'keybindKey_f061f6',

      'ddrArrows': 'ddrArrows_f061f6',
      'arrow': 'arrow_f061f6',
      'active': 'active_f061f6',
      'left': 'left_f061f6',
      'down': 'down_f061f6',
      'up': 'up_f061f6',
      'right': 'right_f061f6',
    ),

    // Join a server with the "Rules Screening" set up but not onboarding. It's got a checkbox at the bottom. Rules are on a few lines.
    'rulesScreening': (
      // one line, main shit really
      'container': 'container_b962dc',
      // whole modal
      'guildSidebar': 'guildSidebar_b962dc',
      // sidebar, has background color
      'guildDescription': 'guildDescription_b962dc',
      'guildIcon': 'guildIcon_b962dc',
      'guildIconNoIcon': 'guildIconNoIcon_b962dc',
      // has background color
      'guildName': 'guildName_b962dc',
      'emojisContainer': 'emojisContainer_b962dc',
      'emoji': 'emoji_b962dc',
      // the extra +n emoji has an inline style, uses header secondary
      'onlineCount': 'onlineCount_b962dc',
      'dot': 'dot_b962dc',
      'dotOnline': 'dotOnline_b962dc',
      'dotMembers': 'dotMembers_a74b6',
      'divider': 'divider_b962dc',
      'modal': 'modal_b962dc',
      // actually for the main body of the modal in question. wankers.
      'sequencer': 'sequencer_b962dc',
      'modalContent': 'modalContent_b962dc',
      'content': 'content_b962dc',
      'centerContent': 'centerContent_b962dc',
      'closeButton': 'closeButton_b962dc',
      'applicationIcon': 'applicationIcon_b962dc',
      'animationAndSparklesContainer': 'animationAndSparklesContainer_b962dc',
      // within content has an animation, a title and a description
      'sparkleIcon': 'sparkleIcon_b962dc',
      'sparkleTop': 'sparkleTop_b962dc',
      'sparkleBottom': 'sparkleBottom_b962dc',
      'animation': 'animation_b962dc',
      'header': 'header_b962dc',
      'subheader': 'subheader_b962dc',
      'footer': 'footer_b962dc',
      'submitButton': 'submitButton_b962dc',
      'formItem': 'formItem_b962dc',
      'resendButton': 'resendButton_b962dc',
      'confirmation': 'confirmation_b962dc',
      'confirmationContent': 'confirmationContent_b962dc',
      'confirmationButtonRow': 'confirmationButtonRow_b962dc',
      'confirmationButton': 'confirmationButton_b962dc',
      'confirmationButtonColumn': 'confirmationButtonColumn_b962dc',
      'notice': 'notice_b962dc',
      'rejectionReasonLabel': 'rejectionReasonLabel_b962dc',
      'rejectionReason': 'rejectionReason_b962dc',

      // questions stuff, different line
      'questions': (
        'questionContainer': 'questionContainer__0a749',
        'questionTitle': 'questionTitle__0a749',
        'requirementContainer': 'requirementContainer__0a749',
        'requirementIcon': 'requirementIcon__0a749',
        'requirementText': 'requirementText__0a749',
        'requirementSuccess': 'requirementSuccess__0a749',
        'requirementFailure': 'requirementFailure__0a749',
        'footnote': 'footnote__0a749',
      ),
    ),

    'screenshare': (
      // selector pills
      'pillContainer': 'pillContainer__9e06a',
      'pillItem': 'pillItem__9e06a',
      'pillItemSelected': 'pillItemSelected__9e06a',

      'source': 'source_febe19',
      'sourceSelected': 'selectedSource_febe1',
      'sourcePreviewContainer': 'sourcePreviewContainer_febe19',
      'sourcePreview': 'sourcePreview_febe19',
      'sourceOverlayCTA': 'sourceOverlayCTA_febe19',
    ),


    // Join a server with "Welcome Screen" set up
    'welcome': (
      'main': 'main__949ab',
      // modal itself
      'options': 'options__949ab',
      'optionContainer': 'optionContainer__949ab',
    ),

    // On a message with reactions, right click and click "Show reactions"
    'reactions': (
      'modal': 'container_cc2dff',
      'sidebar': 'scroller_cc2dff',
      'default': 'reactionDefault_cc2dff',
      'selected': 'reactionSelected_cc2dff',
      'reactors': 'reactors_cc2dff',
    ),

    // Ctrl+K or Ctrl+T to open (CMD on Mac)
    'quickswitcher': (
      'container': 'container_ac6cb0',
      'modal': 'quickswitcher_ac6cb0',
      'search': 'input_ac6cb0',
      'scroller': 'scroller_ac6cb0',      
      'result': 'result__71961',
      'ping': 'wrapper_dc0b29',
    ),

    // Quickly join and leave a server for a modal with this to show up
    // Will show up if you select anything but happy in the "How'd x go?" rating modal
    // You'll also have to have not clicked the "don't show me this again" box
    'problemInfo': (
      'section': 'problemInfo__6c12c',
      'root': 'root__66e7e',
      'option': 'option__66e7e',
      'text': 'text__66e7e',
      'caret': 'caret__66e7e',
    ),

    // Submit feedback in above
    'submitFeedback': (
      // literally on own rule for no margin
      'title': 'title__62160',
    ),

    // Get timed out. Use an alt to time you out. Best not to attempt it on any non-private servers
    'timedOut': (
      'container': 'container__65338',
      // This one can be closed by clicking "okay"
      'iconContainer': 'iconContainer__65338',
      'icon': 'icon__65338',
      'header': 'header__65338',
      'headerText': 'headerText__65338',
      'button': 'button__65338',

      'spamBanner': 'spamBanner_a2eac3',
      'bannerIcon': 'bannerIcon__1d97f',
      'bannerText': 'bannerText_a2eac3',
    ),

    // Time someone out, yes that's really the best way to get these to show up
    // Or you can switch account
    'toasts': (
      'containerTop': 'containerTop__45edc',
      // contains z-index and alignment stuff. rule paired with bottom
      'containerBottom': 'containerBottom__45edc',
      'toast': 'toast__3fde7',
      'icon': 'icon__3fde7',
    ),

    // Click on a banned user under the bans tab in server settings
    'bannedUser': (
      'modal': 'bannedUserModal_a73dc3',
      'header': 'header_a73dc3',
      'username': 'userUsername_a73dc3',
      'discrim': 'userDiscrim_a73dc3',
      'content': 'content_a73dc3',
      // contains reason
      'reasonHeader': 'reasonHeader_a73dc3',
      'footer': 'footer_a73dc3',
    ),

    // Change Nickname of another user in a server
    // These could apply to friends.
  'nicknameChange': (
    'modalContent': 'modalContent__9522a',
    'card': 'card__9522a',
    'warningText': 'warning__9522a',
    'itemGroup': 'itemGroup__9522a',
    // used for "Nickname" title
    'disabled': 'disabled__9522a',
    'nickError': 'nickError__9522a',
    'reset': 'reset__9522a',

    // friends nickname. they don't seem to overlap in retrospect.
    'friends': (
        'description': 'description_d9ee11',
        'input': 'input_d9ee11',
        'reset': 'reset_d9ee11',
      ),
    ),

    // Within server settings, click "members" and then "prune" at the top
    // aka "purge"
    'prune': (
        'pruneDetails': 'pruneDetails_ce3fe1',
        'role': 'role_ce3fe1',
        'content': 'content_bad290',
        'spacing': 'spacing_bad290',
      ),

    // Create Group DM
    // classes could be used elsewhere; all classes ripped from two rules, both nowhere near each other
    // Click the plus in the header of the private messages sidebar
    // Alternatively within the DMs of someone, click the person with a plus in the headerbar
    'groupDm': (
        'popout': 'popout_cba592',
        'searchBar': 'searchBar_cba592',
        'searchBarComponent': 'searchBarComponent_cba592',
        'addButton': 'addButton_cba592',
        'subtitleWarning': 'subtitleWarning_cba592',
        'scroller': 'scroller_cba592',
        'mobileToolsContainer': 'mobileToolsContainer_cba592',
        'mobileToolsCloseIcon': 'mobileToolsCloseIcon_cba592',
        'copyInput': 'copyInput_e6af9c',
        'copyButton': 'copyButton_e6af9c',
        'errorState': 'errorState_cba592',
        'errorStateIcon': 'errorStateIcon_cba592',
        'notFriends': 'notFriends_cba592',
        'noFriends': 'noFriends_cba592',
        'partyFull': 'partyFull_cba592',
        'noResults': 'noResults_cba592',
        'footerSeparator': 'footerSeparator_e6af9c',
        'footer': 'footer_cba592',
        'selectExistingFormHeader': 'selectExistingFormHeader_cba592',
        'confirmChannelItemContainer': 'confirmChannelItemContainer_cba592',
        'confirmChannelName': 'confirmChannelName_cba592',
        'lastActiveTimestamp': 'lastActiveTimestamp_cba592',
        'confirmInviteScroller': 'confirmInviteScroller_cba592',
        'subtitle': 'subtitle_cba592',
        'footerText': 'footerText_cba592',
      ),

    // In a channel with active threads, hover over it and click "see all". These may apply to the dropdown
    'threads': (
        'modal': 'modal__9a792',
        'browser': 'browser__9a792',
      ),

    // Stay within a voice channel/call or run an activity to show this up
    // You'll also have to have not ticked the "don't show me this again" box
    // All of this is done within the base-modal header
    'rating': (
        'headerContainer': 'headerContainer__6c12c',
        'body': 'ratingBody__6c12c',
        'ratingSelector': 'ratingsSelector__6c12c',
        'emojis': 'emojis__6c12c',
        'emoji': 'emoji__6c12c',
        'emojiSelected': 'selected__6c12c',
        'sad': 'emojiSad__6c12c',
        'neutral': 'emojiNeutral__6c12c',
        'happy': 'emojiHappy__6c12cb',
      ),

    // Click the rocket within the chat bar or
    // Click the rocket within the panel within the voice panel
    'activities': (
        'root': 'root__52f07',

        'shelfTopBackground': 'shelfTopBackground__52f07',
        // also on fg class
        'shelfTopForeground': 'shelfTopForeground__52f07',

        // z index only
        'header': 'modalHeader__52f07',
        'shelfTitle': 'activityShelfTitle__52f07',
        'closeButton': 'modalCloseButton__52f07',

        'divider': 'modalDivider__52f07',

        'slideContainerSquished': 'slideContentOuterContainerSquished__52f07',
        'slideContainerTall': 'slideContentOuterContainerTall__52f07',
        'scrollContainer': 'scrollContainer__35455',

        'scrollBackgroundContainer': 'scrollBackgroundContainer__35455',

        'scrollSection': '!scrollSection-HnJkHK',
        'nitroCTAContainer': '!tierCtaContainer-f-B1mz',
        'shelf': '!shelf-3D6g4D',
        'item': '!activityItem-1Z9CTr',
        'image': '!activityImage-3308Ih',
        'video': '!activityVideo-3VVUcy',
        // also has image class, has anim and pos. duplicated as child with video tag rather than div
        'overlayBadge': '!overlayBadge-2HAW2N',
        'badgeContainer': '!badgeContainer-2a1nPp',
        'textContainer': '!activityTextContainer-2l4Dnr',
        // body of item
        'tagsContainer': '!activityTagsContainer-2tHK0W',
        'tag': '!activityTag-3C3YK5',

        'footer': '!footer-yVEuwO',
      ),

    // Change your avatar (or banner w/ nitro) or a server's icon
    'avatarUpload': (
        'header': 'modalHeader_edf440',
        'title': 'modalTitle_edf440',
        'closeButton': 'modalCloseButton_edf440',
        'content': 'modalContent_edf440',
        'imagePickerContainer': 'imagePickerContainer_edf440',
        'optionBox': 'optionBox_edf440',
        'text': 'optionBoxText_edf440',
        'description': 'optionBoxDescription_edf440',
        'contentCircle': 'contentCircle_edf440',
        'uploadIcon': 'uploadIcon_edf440',
        'gifGrid': 'gifGrid_edf440',
        'gif': 'gif_edf440',
        'gifIconContainer': 'gifIconContainer_edf440',
        'gifIcon': 'gifIcon_edf440',

        // Gif Picker
        // no nitro preview thing
        'nitroPreview': (
            'upsell': 'nitroPreviewUpsell_c8eb34',

            // own line
            'notice': 'notice_d37fb3',
            'withRightPadding': 'noticeWithRightPadding_d37fb3',
            'withoutRightPadding': 'noticeWithoutRightPadding_d37fb3',
            'left': 'noticeLeft_d37fb3',
            'icon': 'icon_d37fb3',
            'text': 'text_d37fb3',
          ),
        // Picker itself, uses the main gif modal as children classes
        'gifPicker': (
            'header': 'modalHeader__6c39d',
            'titleCase': 'titleCase__6c39d',
            'closeButton': 'modalCloseButton__6c39d',
            'picker': 'gifPicker__6c39d',
            'loadingOverlay': 'loadingOverlay__6c39d',
            'spinner': 'spinner__6c39d',
          ),
      ),

    // bot/external application authentication/oauth
    // Quickest way might be starting an activity that requires an external application, like youtube/"watch together"
    'oauth': (
        'authorize': 'authorize__3d3b0',
        'header': 'header__03630',
        'headerIcons': 'headerIcons__03630',
        'label': 'label__03630',

        'scopes': 'scopes__29337',
        // basically permissions of application
        'sectionLabel': 'sectionLabel__29337',
        'scope': 'scope__29337',
        'scopeIcon': 'icon__29337',
        'scopeInner': 'scopeInner__29337',

        'applicationDetails': 'applicationDetails__94ab2',
        'entry': 'entry__94ab2',
        'entryIcon': 'entryIcon__94ab2',
        'entryInner': 'entryInner__94ab2',

        'footer': 'footer__3d3b0',
      ),

    // Ctrl+N or click the green + at the bottom of the server list
    'addServer': (
      'modal': 'container__024d4',

      // first screen "Create a server"
      'createServerHeader': 'header_c04f35',
      'createServerTitle': 'title_c04f35',
      'createServerCloseButton': 'closeButton_c04f35',
      'createServerSubtitle': 'subtitle_c04f35',
      'createServerTemplatesList': 'templatesList_c04f35',
      'optionHeader': 'optionHeader_c04f35',
      'optionContainer': 'container_eb2cd2',
      'optionIcon': 'icon_eb2cd2',
      'optionText': 'text_eb2cd2',
      'optionArrow': 'arrow_eb2cd2',
      'footerTitle': 'footerTitle_c04f35',

      // second screen "Tell us more about your server"
      'tellUsMoreHeader': 'header__78f69',
      'tellUsMoreTitle': 'title__78f69',
      'tellUsMoreSubtitle': 'subtitle__78f69',
      'tellUsMoreBackButton': 'backButton__78f69',
      'tellUsMoreOptionsList': 'optionsList__78f69',
      'tellUsMoreCloseButton': 'closeButton__78f69',
      'tellUsMoreSkip': 'skip__78f69',

      // third screen "Customise your server"
      'customiseHeader': 'header_b917ac',
      'customiseTitle': 'title_b917ac',
      'customiseSubtitle': 'subtitle_b917ac',
      'customiseCreateServer': 'createGuild_b917ac',
      'customiseUploadIcon': 'uploadIcon_b917ac',
      'customiseIconContainer': 'iconContainer__98cf7',

      // alternate second screen "Join a server" - click already have an invite button
      'joinAServerHeader': 'header__991a0',
      'joinAServerInput': 'input__991a0',
      'joinServerExample': 'sampleLink__991a0',
      'joinServerRowContainer': 'rowContainer__991a0',
      // used as pointer to discovery
      'joinServerRowText': 'rowText__991a0',
      'joinServerRowArrow': 'rowArrow__991a0',
      'joinServerBackButton': 'backButton_b917ac',
    ),

    // Upload a file. That's really all there is to it.
    // For subcategories:
    // "drop" is when you drag and drop a file onto discord
    // "fileTypes" are for the different icons, likely mostly unused lol
    // "pop" refers to the little elements that appear briefly, named after one of the elements
    // "modify" is when you've clicked the pencil icon in the chatbar, it's got some overlap with drop most likely
    // "fail" was probably removed? i don't know.
    'upload': (
      'areaPosition': 'uploadArea_f75fb0',
      // applies position fixed and other things with thread sidebar open/floating
      'inner': 'inner_dbca3c',

      // Used in drop and modify
      'drop': (
        'area': 'uploadArea_dbca3c',
        'droppable': 'droppable_dbca3c',
        'modalIn': 'uploadModalIn_dbca3c',

        'modal': 'uploadDropModal_dbca3c',
        'error': 'error_dbca3c',
        // upload a folder to get this to appear
        // "pops" are in another (sub) category
        'bgScale': 'bgScale_dbca3c',
        'icons': 'icons_dbca3c',
        // While the icons in this list are in order, the html tree order is one-three-two
        // the "uses" comment are other classes on the same element. they're listed all below under "fileTypes"
        'wrapOne': 'wrapOne_dbca3c',
        'one': 'one_dbca3c',

        // uses document
        'wrapTwo': 'wrapTwo_dbca3c',
        'two': 'two_dbca3c',

        // uses image
        'wrapThree': 'wrapThree_dbca3c',
        'three': 'three_dbca3c',

        // uses code
        'instructions': 'instructions_dbca3c',
        'title': 'title_dbca3c',
      ),

      // All of these rules have a background-image applied to them. You can find these under the same line as drop, above
      // After the first the rules all seem to be prefixed by uploadModal inner(from drop) file(from drop) icon.[type]
      // (these aren't even the only set of things like this!)
      'fileTypes': (
        'icon': 'icon_dbca3c',
        // Base class for all of them
        'document': 'document_dbca3c',
        'image': 'image_dbca3c',
        'code': 'code_dbca3c',
        'video': 'video_dbca3c',
        'acrobat': 'acrobat_dbca3c',
        'ae': 'ae_dbca3c',
        'sketch': 'sketch_dbca3c',
        'ai': 'ai_dbca3c',
        'archive': 'archive_dbca3c',
        'photoshop': 'photoshop_dbca3c',
        'ps': 'ps_dbca3c',
        // This class uses the same image as photoshop. why there's two is anyone's guess
        'spreadsheet': 'spreadsheet_dbca3c',
        'webcode': 'webcode_dbca3c',
        'audio': 'audio_dbca3c',
        // This class also has a margin applied to it
        'unknown': 'unknown_dbca3c',
      ),

      // These little things appear briefly and ARE used elsewhere within modals or the app itself.
      'pop': (
        'base': 'base_e42a84',
        'sparkle': 'sparkle_e42a84',
        'pop': 'pop_e42a84',
        'light': 'light_e42a84',
        'cross': 'cross_e42a84',

        'sparkleOne': 'sparkleOne_dbca3c',
        'sparkleTwo': 'sparkleTwo_dbca3c',
        'popOne': 'popOne_dbca3c',
        // There doesn't seem to be a popTwo
        'lightOne': 'lightOne_dbca3c',
        'lightTwo': 'lightTwo_dbca3c',
        'crossOne': 'crossOne_dbca3c',
        'crossTwo': 'crossTwo_dbca3c',

        // Colors use images
        'sparkleWhite': 'sparkleWhite_e42a84',
        'sparkleGrey': 'sparkleGrey_bce2e6',
        'sparkleBlurple': 'sparkleBlurple_bce2e6',
        'popWhite': 'popWhite_e42a84',
        'popGrey': 'popGrey_bce2e6',
        'popBlurple': 'popBlurple_bce2e6',
        'lightWhite': 'lightWhite_e42a84',
        'lightGrey': 'lightGrey_bce2e6',
        'lightBlurple': 'lightBlurple_bce2e6',
        'crossWhite': 'crossWhite_e42a84',
        'crossGrey': 'crossGrey_e42a84',
        'crossBlurple': 'crossBlurple_bce2e6',
      ),

      'modify': (
        'modal': 'uploadModal_dbca3c',
        'file': 'file_dbca3c',
        'expandable': 'expandable_dbca3c',
        // used with images and gifs
        'description': 'description_dbca3c',
        'filename': 'filename_dbca3c',
        'comment': 'comment_dbca3c',
        'label': 'label_dbca3c',
        // section header thingy
        'filenameInputWrapper': 'channelTextAreaUpload_dbca3c',
        // it's unique here
        'optional': 'optional_dbca3c',
        // found in css
        'footer': 'footer_dbca3c',
        'hasSpoilers': 'hasSpoilers_dbca3c',
        'footerRightAlign': 'footerRightAlign_dbca3c',
        'cancelAllButton': 'cancelAllButton_dbca3c',
        // found within css
      ),

      // Line 532 of 2022-09-14: https://canary.discord.com/assets/40532.a635ae389e26e316ec3b.css
      // Line 533 also applies here and anything on that line is mentioned
      'fail': (
        'modal': 'root__3ec70',
        'artContainer': 'artContainer__3ec70',
        'artContainerAlign': 'artContainer__8162d',
        'content': 'content__3ec70',
        'header': 'header__3ec70',
        'body': 'body__8162d',
        'footer': 'footer__3ec70',
        'primaryActions': 'primaryActions__3ec70',

        // The rest were found in css but I couldn't find them in the modal and are listed in the css list order
        'secondaryAction': 'secondaryAction__3ec70',
        'artContainerBoxShadow': 'artContainerBoxShadow__3ec70',
        'art': 'art__3ec70',
        'sparkleBadge': 'sparkleBadge__3ec70',
        'newBadge': 'newBadge__3ec70',
        // typo
      ),
    ),

    // Click an image (png, jpg, gif) in chat. This may not apply to videos or other embeds.
    'imageViewer': (
      'carouselModal': 'carouselModal_d3a6f0',
      // put on modal root
      'base': 'base__5cd44',
      // applies to top bar and action buttons
      'topBar': 'topBar__6088c',
      // has ::before with gradient background

      'actionButtons': 'actionButtons_cc1819',
      // paired with base. holds many buttons.
      'actionButton': 'actionButton_cc1819',
      // individual button. paired with actionButtonWrapper for some reason. has aira-label.
      'actionButtonWrapper': 'actionButtonWrapper_cc1819',
      // parent to actionButtonInner
      'actionButtonInner': 'actionButtonInner_cc1819',
      
      'closeButton': 'closeButton__6088c',
      'closeButtonInner': 'closeButtonInner__6088c',
      'messageContents': 'messageContents__6088c',
      // displayed in topBar
      'timestamp': 'timestamp__6088c',

      'group': 'group__5cd44',

      // holds action buttons and wrapper chain
      'mediaContainerWrapper': 'wrapper_b2eddf',
      // parent of mediaContainer
      'mediaContainer': 'mediaContainer_b2eddf',
      // parent of mediaWrapper
      'mediaWrapper': 'mediaWrapper_b2eddf',
      // parent of innerWrapper
      'innerWrapper': 'innerWrapper_b2eddf',
      // parent of imageWrapperZoom and imageWrapperParent (same element)
      'imageWrapperZoom': 'wrapper_a22bfd',
      // class named so as it has a zoomed class with same suffix. paired with imageWrapperParent... why are there so many wrappers.
      'zoomed': 'zoomed_a22bfd',
      // click on image
      'imageWrapperParent': 'wrapper__091cf',
      // paired with imageWrapperZoom. parent to imageWrapperInner
      'imageWrapperInner': 'imageWrapper_af017a',
      // WHY ARE THERE SO MANY WRAPPERS. parent to loadingOverlay
      'loadingOverlay': 'loadingOverlay_af017a',
      // parent to the img element.
    ),
    
    'purchase': (
      'backgroundRefresh': 'premiumBrandRefreshBackground_e5f3a9',

      'nitroTier': (
        'header': 'skuSelectModalHeader_e50a4d',
        'content': 'skuSelectModalContent_e50a4d',
        'contentRefresh': 'premiumBrandRefreshContent_e50a4d',

        'card': 'card__6df1a',
      ),

      'gift': (
        'spinner': 'spinner_ca0af2',
        'header': 'modalHeaderCustomGift_b54a5b',
        'giftBox': 'customGiftBox_d50aac',
        'giftBoxSelected': 'customGiftBoxHighlighted_d50aac',

        // nitro
        'selectionBox': 'selectionBox_b13085',
        'selectionBoxSelected': 'selectedPlan_b13085',
        'shopIcon': 'iconBackground__33980',

        // profile decoration
        'customMessage': 'customGiftMessage_bf1b4a',
        'preview': 'previewContainerSelected__50f14',
      ),

      'payment': (
        'note': 'paymentNote_a8c622',
        'breadcrumb': 'wrapper__4106a',
        'body': 'body_c6f1a4',
        'table': 'table_fda3e4',
        'cardPageBody': 'body_b25217',
        'cardInputWrapper': 'cardNumberWrapper__8b579',
        'cardInput': 'cardInput__8b579',
        'cardInputFocused': 'cardInputFocused__8b579',
      ),

      'boost': (
        'content': 'content_a8c622',
        'quantityIconWrapper': 'iconWrapper__96f95',
        'quantityIcon': 'icon__96f95',
        'quantityValue': 'value__96f95',
        'upsellFooter': 'upsellFooter__5e07c',
      ),
    ),

    'poll': (
      'container': 'container__53cea',

      'create': (
        'expressionPickerButton': 'expressionPickerButton__7b848',
        'expressionPickerIconDefault': 'expressionPickerIconDefault__7b848',
        'addAnswerButton': 'addAnswerButton_d97f89',
      ),

      // click 'votes' in a poll
      'votes': (
        'sidebarScroller': 'scroller__01c8c',
        'voters': 'voters__01c8c',
        'voteDefault': 'voteDefault__01c8c',
        'voteSelected': 'voteSelected__01c8c',
      ),
    ),
  ),
  
  // Client Mods
  // Powercord and Replugged support have been dropped.
  'vencord': (
      // genericish classes
      // numbers are margin for side in px
      'margin': (
          'top': (
            '8': 'vc-m-top-8',
            '16': 'vc-m-top-16',
            '20': 'vc-m-top-20',
          ),
          'bottom': (
            '8': 'vc-m-bottom-8',
            '16': 'vc-m-bottom-16',
            '20': 'vc-m-bottom-20',
          ),
          'left': (
            '8': 'vc-m-left-8',
            '16': 'vc-m-left-16',
            '20': 'vc-m-left-20',
          ),
          'right': (
            '8': 'vc-m-right-8',
            '16': 'vc-m-right-16',
            '20': 'vc-m-right-20',
          ),
        ),

      'icon': 'vc-icon',
      // list of icons used and in what places. most do not have any css applied to them.
      'icons': (
          'heart': 'vc-heart-icon',
          // Vencord page > donation card
          'log': 'vc-log-icon',
          // Vencord page > quick actions
          'paintbrush': 'vc-paintbrush-icon',
          // Vencord page > quick actions, Themes page > Local > Quick Actions
          'restart': 'vc-restart-icon',
          // Vencord page > quick actions, Themes page > Local > Quick Actions
          'folder': 'vc-folder-icon',
          // Vencord page > quick actions, Themes page > Local > Quick Actions
          'cogWheel': 'vc-cog-wheel',
          // Plugin page > plugin has settings
          'info': 'vc-info-icon',

          // Plugin page > plugin lacks settings
          // below were found in js(x) files, could be used anywhere
          'link': 'vc-link-icon',
          'copy': 'vc-copy-icon',
          'openExternal': 'vc-open-external-icon',
          'image': 'vc-image-icon',
          'ownerCrown': 'vc-owner-crown-icon',
          'screenshare': 'vc-screenshare-icon',
          'imageVisible': 'vc-image-visible',
          'imageInvisible': 'vc-image-invisible',
          'microphone': 'vc-microphone',
          'reply': 'vc-reply-icon',
          'delete': 'vc-delete-icon',
          'plus': 'vc-plus-icon',
          'noEntrySign': 'vc-no-entry-sign-icon',
          'safety': 'vc-safety-icon',
          'notes': 'vc-notes-icon',
          'pencil': 'vc-pencil-icon',
          // Both GitHub and a generic "Website" lack classes
        ),

      // --- Settings ---
      // -- "Vencord" page --
      // these relate to the donation card
      'donationCard': (
          'card': 'vc-special-card',
          'cardSpecial': 'vc-special-card-special',
          'flex': 'vc-special-card-flex',
          'flexMain': 'vc-special-card-flex-main',
          'title': 'vc-special-title',
          'subtitle': 'vc-special-subtitle',
          'text': 'vc-special-text',
          'donateButton': 'vc-donate-button',
          'imageContainer': 'vc-special-image-container',
          'image': 'vc-special-image',
          'separator': 'vc-special-seperator',
          // [sic]
          'hyperlink': 'vc-special-hyperlink',
          'hyperlinkText': 'vc-special-hyperlink-text',
        ),
      'quickActions': (
        'card': 'vc-settings-quickActions-card',
        // background overwritten by cardPrimary
        'pill': 'vc-settings-quickActions-pill',
        // has background as does :hover
        'image': 'vc-settings-quickActions-img',
      ),

      // -- Plugins page --
      // also Themes page
      // Card up top about plugin management
      'pluginsInfo': (
          'card': 'vc-plugins-info-card',
          // background overwritten by cardPrimary
          'button': 'vc-plugins-info-button',
        ),

      'pluginsGrid': 'vc-plugins-grid',

      // grid of available plugins
      // Also used with themes. Mostly.
      'addon': (
          'disabled': 'vc-addon-card-disabled',
          // relates to "Required" plugins only, opacity .6
          'card': 'vc-addon-card',
          // has background
          'header': 'vc-addon-header',
          // contains the name, author, settings/info and toggle
          'nameAuthor': 'vc-addon-name-author',
          // contains the name and author
          'name': 'vc-addon-name',
          // contains titleContainer
          'titleContainer': 'vc-addon-title-container',
          // contains title
          'title': 'vc-addon-title',
          'author': 'vc-addon-author',

          // has ::before
          'switchSlider': 'vc-switch-slider',

          'note': 'vc-addon-note',

          // description
          // General plugin stuff
          'infoButton': 'vc-plugins-info-button',
          'infoIcon': 'vc-plugins-info-icon',
        ),

      // Used in Themes
      'tabBar': (
          'bar': 'vc-settings-tab-bar',
          'item': 'vc-settings-tab-bar-item',
        ),

      'settingsCard': 'vc-settings-card',
      // background overwritten by cardPrimary
      'textSelectable': 'vc-text-selectable',
      // Online themes has this
      'themeLinks': 'vc-settings-theme-links',

      // -- Backup & Restore page --
      'backupRestoreCard': 'vc-backup-restore-card',

      // -- other non-plugin classes --
      'errorCard': 'vc-error-card',

      // click on the (i) or settings of a plugin for this modal
      'pluginModal': (
          'info': 'vc-plugin-modal-info',
          'description': 'vc-plugin-modal-description',
        ),

      // click on the plugin author's avatar for this modal
      'authorModal': (
          'root': 'vc-author-modal-root',
          'header': 'vc-author-modal-header',
          'name': 'vc-author-modal-name',
          'avatar': 'vc-author-modal-avatar',
          'links': 'vc-author-modal-links',
          'plugins': 'vc-author-modal-plugins',
        ),

      // vencord's own notification system
      'notification': (
          'root': 'vc-notification-root',
          // actual notification itself
          'notification': 'vc-notification',
          'content': 'vc-notification-content',
          'header': 'vc-notification-header',
          'title': 'vc-notification-title',
          'closeButton': 'vc-notification-close-btn',
          'icon': 'vc-notification-icon',
          'progressBar': 'vc-notification-progressbar',
          'p': 'vc-notification-p',
          'img': 'vc-notification-img',

          'log': (
            'empty': 'vc-notification-log-empty',
            'container': 'vc-notification-log-container',
            'wrapper': 'vc-notification-log-wrapper',
            'removing': 'vc-notification-log-removing',
            'body': 'vc-notification-log-body',
            'timestamp': 'vc-notification-log-timestamp',
            'dangerButton': 'vc-notification-log-danger-btn',
          ),
        ),

      // --- PLUGINS ---
      // show hidden channels - bc ur a lil sneaky :3
      'shc': (
          'container': 'vc-shc-container',
          'logo': 'vc-shc-logo',
          'headingContainer': 'vc-shc-heading-container',
          'headingNsfwIcon': 'vc-shc-heading-nsfw-icon',
          'topicContainer': 'vc-shc-topic-container',
          'defaultEmojiContainer': 'vc-shc-default-emoji-container',
          'tagsContainer': 'vc-shc-tags-container',
          'tags': 'vc-shc-tags',
          'allowedUsersAndRolesContainer': 'vc-shc-allowed-users-and-roles-container',
          'allowedUsersAndRolesContainerTitle': 'vc-shc-allowed-users-and-roles-container-title',
          'allowedUsersAndRolesContainerToggleBtn': 'vc-shc-allowed-users-and-roles-container-toggle-btn',
          'allowedUsersAndRolesContainerPermdetailsBtn': 'vc-shc-allowed-users-and-roles-container-permdetails-btn',
          'hiddenChannelIcon': 'vc-shc-hidden-channel-icon',
        ),

      // spotify - music platform stuff
      'spotify': (
          'player': '#vc-spotify-player',
          'button': 'vc-spotify-button',
          'buttonIcon': 'vc-spotify-button-icon',
          'shuffle': 'vc-spotify-shuffle',
          'repeat': 'vc-spotify-repeat',
          'repeatContext': 'vc-spotify-repeat-context',
          'repeatTrack': 'vc-spotify-repeat-track',
          'shuffleOn': 'vc-spotify-shuffle-on',
          'tooltipText': 'vc-spotify-tooltip-text',
          'repeat1': 'vc-spotify-repeat-1',
          'buttonRow': 'vc-spotify-button-row',
          'infoWrapper': '#vc-spotify-info-wrapper',
          'albumImage': '#vc-spotify-album-image',
          'albumExpandedWrapper': '#vc-spotify-album-expanded-wrapper',
          'titles': '#vc-spotify-titles',
          'songTitle': '#vc-spotify-song-title',
          'ellipoverflow': 'vc-spotify-ellipoverflow',
          'artist': 'vc-spotify-artist',
          'album': 'vc-spotify-album',
          'comma': 'vc-spotify-comma',
          'albumTitle': '#vc-spotify-album-title',
          'progressBar': '#vc-spotify-progress-bar',
          'progressText': '#vc-spotify-progress-text',
          'progressTime': 'vc-spotify-progress-time',
          'timeLeft': 'vc-spotify-time-left',
          'timeRight': 'vc-spotify-time-right',
          'fallback': 'vc-spotify-fallback',
        ),

      // dearrow - plugin that changes youtube titles and thumbnails to better represent the video
      'dearrow': (
          'toggleOff': 'vc-dearrow-toggle-off',
          'toggleOn': 'vc-dearrow-toggle-on',
          'icon': 'vc-dearrow-icon',
        ),

      // client theme - allows for custom gradient themes akin to an old experiment
      'clientTheme': (
          'settings': 'vc-clientTheme-settings',
          'container': 'vc-clientTheme-container',
          'labels': 'vc-clientTheme-labels',
          'warningText': 'vc-clientTheme-warning-text',
          'contrastWarning': 'vc-clientTheme-contrast-warning',
        ),

      // copy file contents - adds a button to text files
      'cfcButton': 'vc-cfc-button',

      // decor - allows for custom avatar decorations
      'decor': (
          'dangerBtn': 'vc-decor-danger-btn',
          'changeDecorationModalContent': 'vc-decor-change-decoration-modal-content',
          'changeDecorationModalPreview': 'vc-decor-change-decoration-modal-preview',
          'changeDecorationModalDecoration': 'vc-decor-change-decoration-modal-decoration',
          'changeDecorationModalFooter': 'vc-decor-change-decoration-modal-footer',
          'changeDecorationModalFooterBtnContainer': 'vc-decor-change-decoration-modal-footer-btn-container',
          'createDecorationModalContent': 'vc-decor-create-decoration-modal-content',
          'createDecorationModalFormPreviewContainer': 'vc-decor-create-decoration-modal-form-preview-container',
          'modalHeader': 'vc-decor-modal-header',
          'modalFooter': 'vc-decor-modal-footer',
          'createDecorationModalForm': 'vc-decor-create-decoration-modal-form',
          'sectionedGridListContainer': 'vc-decor-sectioned-grid-list-container',
          'sectionedGridListGrid': 'vc-decor-sectioned-grid-list-grid',
          'sectionRemoveMargin': 'vc-decor-section-remove-margin',
        ),

      // fake profile themes - 3y3 encoding my beloved
      'fptPreview': 'vc-fpt-preview',

      // hide media - hide attachments per message
      'hideAttachments': (
          'accessory': 'vc-hideAttachments-accessory',
          'noContent': 'vc-hideAttachments-no-content',
        ),

      // member count - show how many are in a server
      'memberCount': (
          'widget': 'vc-membercount-widget',
          'tooltip': 'vc-membercount-tooltip',
          'memberList': 'vc-membercount-member-list',
          'online': 'vc-membercount-online',
          'total': 'vc-membercount-total',
          'onlineDot': 'vc-membercount-online-dot',
          'totalDot': 'vc-membercount-total-dot',
        ),

      // mention avatars - show avatars and role icons in @ mentions
      'mentionAvatars': (
          'icon': 'vc-mentionAvatars-icon',
          'roleIcon': 'vc-mentionAvatars-role-icon',
        ),

      // message logger - bots do it already, why shouldn't you?
      'messageLogger': (
          'deleted': 'messagelogger-deleted',
          'deletedAttachment': 'messagelogger-deleted-attachment',
          'edited': 'messagelogger-edited',
          'editMarker': 'messagelogger-edit-marker',
        ),

      // message latency - ping!
      'ml': (
          'modalTimestamp': 'vc-ml-modal-timestamp',
          'modalTabBar': 'vc-ml-modal-tab-bar',
        ),

      // permissions viewer - server backend info is useful
      'permViewer': (
          'userHeaderContainer': 'vc-permviewer-user-header-container',
          'userHeaderBtns': 'vc-permviewer-user-header-btns',
          'userHeaderBtn': 'vc-permviewer-user-header-btn',
          'modal': (
            'content': 'vc-permviewer-modal-content',
            'title': 'vc-permviewer-modal-title',
            'noPerms': 'vc-permviewer-modal-no-perms',
            'container': 'vc-permviewer-modal-container',
            'list': 'vc-permviewer-modal-list',
            'listItemBtn': 'vc-permviewer-modal-list-item-btn',
            'listItem': 'vc-permviewer-modal-list-item',
            'listItemActive': 'vc-permviewer-modal-list-item-active',
            'listItemText': 'vc-permviewer-modal-list-item-text',
            'roleCircle': 'vc-permviewer-modal-role-circle',
            'roleImage': 'vc-permviewer-modal-role-image',
            'userImg': 'vc-permviewer-modal-user-img',
            'divider': 'vc-permviewer-modal-divider',
            'perms': 'vc-permviewer-modal-perms',
            'permsItem': 'vc-permviewer-modal-perms-item',
            'permsItemIcon': 'vc-permviewer-modal-perms-item-icon',
          ),
          'roleButton': 'vc-permviewer-role-button',
          'grantedByContainer': 'vc-permviewer-granted-by-container',
          'grantedByContent': 'vc-permviewer-granted-by-content',
        ),

      // picture in picture - mobile app might have this
      'pipButton': 'vc-pip-button',

      // pin dms - you can do this on mobile
      'pinDms': (
          'sectionContainer': 'vc-pindms-section-container',
          'modalContent': 'vc-pindms-modal-content',
          'collapseIcon': 'vc-pindms-collapse-icon',
          'collapsed': 'vc-pindms-collapsed',
        ),

      // platform indicator - here you can see that i'm actually on web not desktop
      'platformIndicator': 'vc-platform-indicator',

      // read all notifications button - (1)
      'ranbButton': 'vc-ranb-button',

      // reply timestamp - (read at 17:53)
      'replyTimestamp': 'vc-reply-timestamp',

      // review db - review your fellow discord users and servers (you can opt out on the website)
      'reviewDB': (
          'view': 'vc-rdb-view',
          'badge': 'vc-rdb-badge',
          'input': 'vc-rdb-input',
          'modalFooterWrapper': 'vc-rdb-modal-footer-wrapper',
          'placeholder': 'vc-rdb-placeholder',
          'modalFooter': 'vc-rdb-modal-footer',
          'modalHeader': 'vc-rdb-modal-header',
          'modalReviews': 'vc-rdb-modal-reviews',
          'review': 'vc-rdb-review',
          'reviewComment': 'vc-rdb-review-comment',
          'blockedBadge': 'vc-rdb-blocked-badge',
          'blockModalHeader': 'vc-rdb-block-modal-header',
          'blockModal': 'vc-rdb-block-modal',
          'buttonGrid': 'vc-rdb-button-grid',
          'blockModalRow': 'vc-rdb-block-modal-row',
          'blockModalAvatar': 'vc-rdb-block-modal-avatar',
          'blockModalUsername': 'vc-rdb-block-modal-username',
          'blockModalUnblock': 'vc-rdb-block-modal-unblock',
        ),

      // send timestamps - don't wanna deal with an external website tyvm
      'sendTimestamps': (
          'datePicker': 'vc-st-date-picker',
          'formatSelect': 'vc-st-format-select',
          'formatLabel': 'vc-st-format-label',
          'modalHeader': 'vc-st-modal-header',
          'modalTitle': 'vc-st-modal-title',
          'modalCloseButton': 'vc-st-modal-close-button',
          'previewText': 'vc-st-preview-text',
        ),

      // server info - get more info about a server!
      'serverInfo': (
          'root': 'vc-gp-root',
          'banner': 'vc-gp-banner',
          'header': 'vc-gp-header',
          'icon': 'vc-gp-icon',
          'nameAndDescription': 'vc-gp-name-and-description',
          'name': 'vc-gp-name',
          'tabTar': 'vc-gp-tab-bar',
          'tab': 'vc-gp-tab',
          'tabContent': 'vc-gp-tab-content',
          'selected': 'vc-gp-selected',
          'info': 'vc-gp-info',
          'serverInfoPair': 'vc-gp-server-info-pair',
          'owner': 'vc-gp-owner',
          'ownerAvatar': 'vc-gp-owner-avatar',
          'scroller': 'vc-gp-scroller',
        ),

      // shiki codeblocks - bc vscodium does it better
      'shiki': (
          'container': 'vc-shiki-container',
          'root': 'vc-shiki-root',
          'code': 'vc-shiki-code',
          'devicon': 'vc-shiki-devicon',
          'plain': 'vc-shiki-plain',
          'btns': 'vc-shiki-btns',
          'btn': 'vc-shiki-btn',
          'spinnerContainer': 'vc-shiki-spinner-container',
          'preview': 'vc-shiki-preview',
          'lang': 'vc-shiki-lang',
          'table': 'vc-shiki-table',
          'tableRow': 'vc-shiki-table-row',
          'tableCell': 'vc-shiki-table-cell',
        ),

      // show connections - because the user popout not crowded enough
      'showConnections': (
          'userConnection': 'vc-user-connection',
          'tooltip': 'vc-sc-tooltip',
          'connectionName': 'vc-sc-connection-name',
          'tooltipIcon': 'vc-sc-tooltip-icon',
        ),

      // show me your name - no nicks pls
      'smynSuffix': 'vc-smyn-suffix',

      // show timeout duration - because it's useful to know that someone else can type again in 2d23h48m24s
      'stdWrapper': 'vc-std-wrapper',

      // sort friend requests - ...you guys get friend requests?
      'sfr': (
          'wrapper': 'vc-sortFriendRequests-wrapper',
          'tooltip': 'vc-sortFriendRequests-tooltip',
          'date': 'vc-sortFriendRequests-date',
        ),

      // translate - parce que je ne parle pas français
      'translate': (
          'modalContent': 'vc-trans-modal-content',
          'modalHeader': 'vc-trans-modal-header',
          'modalTitle': 'vc-trans-modal-title',
          'accessory': 'vc-trans-accessory',
          'accessoryIcon': 'vc-trans-accessory-icon',
          'dismiss': 'vc-trans-dismiss',
          'autoTranslate': 'vc-trans-auto-translate',
          'chatButton': 'vc-trans-chat-button',
        ),

      // typing indicator - (...)
      'typingIndicator': (
          'indicator': 'vc-typing-indicator',
          'avatars': 'vc-typing-indicator-avatars',
          'dots': 'vc-typing-indicator-dots',
        ),

      // user voice show - server icon has an indicator when someone's in voice
      'uvs': (
          'speaker': 'vc-uvs-speaker',
          'clickable': 'vc-uvs-clickable',
          'tooltipContainer': 'vc-uvs-tooltip-container',
          'tooltipContent': 'vc-uvs-tooltip-content',
          'name': 'vc-uvs-name',
          'guildIcon': 'vc-uvs-guild-icon',
          'vcMembers': 'vc-uvs-vc-members',
        ),

      // vencord toolbox - it holds the wrenches and code :3
      'toolbox': (
          'btn': 'vc-toolbox-btn',
          'icon': 'vc-toolbox-icon',
        ),

      // voice download - download voice messages directly
      'voiceDownload': 'vc-voice-download',

      // voice messages - JUST LIKE ON MOBILE!!!
      'vmsg': (
          'modal': 'vc-vmsg-modal',
          'buttons': 'vc-vmsg-buttons',
          'preview': 'vc-vmsg-preview',
          'previewIndicator': 'vc-vmsg-preview-indicator',
          'previewRecording': 'vc-vmsg-preview-recording',
          'previewTime': 'vc-vmsg-preview-time',
          'previewLabel': 'vc-vmsg-preview-label',
        ),

      // --- no idea where these go ---
      'positionInherit': 'vc-position-inherit',
      'imageModal': 'vc-image-modal',
      'switchSlider': 'vc-switch-slider',
      'pluginsSettingsButton': 'vc-plugins-settings-button',
      'pluginsFilterControls': 'vc-plugins-filter-controls',
      'pluginsBadge': 'vc-plugins-badge',
      'pluginsDepName': 'vc-plugins-dep-name',
      'pluginsRestartCard': 'vc-plugins-restart-card',
      'pluginsRestartButton': 'vc-plugins-restart-button',
      'cloudSettingsSyncGrid': 'vc-cloud-settings-sync-grid',
      'cloudEraseDataDangerBtn': 'vc-cloud-erase-data-danger-btn',
      'updaterModal': 'vc-updater-modal',
      'updaterModalCloseButton': 'vc-updater-modal-close-button',
      'chatbarButton': 'vc-chatbar-button',
      'settingsModalLinkIcon': 'vc-settings-modal-link-icon',
      'settingsModalLinks': 'vc-settings-modal-links',
      'settingsDonate': 'vc-settings-donate',
      'settingsThemeGrid': 'vc-settings-theme-grid',
      'settingsThemeCard': 'vc-settings-theme-card',
      'settingsThemeCardText': 'vc-settings-theme-card-text',
      'settingsThemeAuthor': 'vc-settings-theme-author',
    ),

  'bd': (
    'addonList': 'bd-addon-list',
    'addonCard': 'bd-addon-card',
    'addonHeader': 'bd-addon-header',
    'addonDescWrap': 'bd-description-wrap',
    'addonFooter': 'bd-footer',
    'addonStore': 'bd-store-card',
    'addonStoreCard': 'bd-addon-store-card',
    'addonStoreTag': 'bd-addon-store-card-tag',
    'searchWrapper': 'bd-search-wrapper',
    'notices': '#bd-notices',
    'notice': 'bd-notice',
    'noticeInfo': 'bd-notice-info',
  ),
  'bdEditor': (
    'floatingWindow': 'floating-window',
    'resizable': 'resizable',
    'floatingWindowTitlebar': 'floating-window-titlebar',
    'floatingWindowContent': 'floating-window-content',
  ),
  'bdPlugin': (
    'channelTabsTabContainer': 'channelTabs-tabContainer',
    'channelTabsTab': 'channelTabs-tab',
    'channelTabsTabSelected': 'channelTabs-selected',
    'channelTabsTabIcon': 'channelTabs-tabIcon',
    'channelTabsTabName': 'channelTabs-tabName',
    'channelTabsClose': 'channelTabs-closeTab',
    'channelTabsNewTab': 'channelTabs-newTab',
    'channelTabsFavContainer': 'channelTabs-favContainer',
    'channelTabsNoFavs': 'channelTabs-noFavs',
    'channelTabsFav': 'channelTabs-fav',
    'channelTabsFavIcon': 'channelTabs-favIcon',
    'channelTabsFavName': 'channelTabs-favName',
    'channelTabsUnreadBadge': 'channelTabs-unreadBadge',
    'channelTabsNoUnread': 'channelTabs-noUnread',
    'channelTabsMentionBadge': 'channelTabs-mentionBadge',
    'channelTabsNoMention': 'channelTabs-noMention',

    'betterImageViewer': 'biv-overlay',
    'betterImageViewerLensRound': 'BIV-zoom-lens-round',
    'betterImageViewerLens': 'BIV-zoom-lens',

    'xenoLibNotifs': 'xenoLib-notifications',
    'xenoLibNotifContentWrapper': 'xenoLib-notification-content-wrapper',
    'xenoLibNotifLoadbar': 'xenoLib-notification-loadbar',
  ),

  // This category is for the random stuff that I'm unable to find
  // locations of or don't really fit anywhere above.
  // Former is usually true.
  // These classes may be paired with another though.
  // Shit definitely needs sorting.
  'other': (
      'developerPortalCtaWrapper': 'developerPortalCtaWrapper_bf485f',
      // Random stuff found while attempting to convert ClearVision 6 to this class format. Comments show where the selector is used.
      // This category **WILL** be removed over time and without warning.
      'cv': (
          'bdSettingsSidebar': '#bd-settings-sidebar',
          // src/injectors/bd/sidebar.scss
          'bdSettingsSidebarHeader': 'ui-tab-bar-header',
          // src/injectors/bd/sidebar.scss
          'bdSettingsSidebarItem': 'ui-tab-bar-item',
          // src/injectors/bd/sidebar.scss
          'bdSettingsSidebarItemSelected': 'selected',
          // src/injectors/bd/sidebar.scss | so... https://sass-lang.com/documentation/breaking-changes/extend-compound/
          'bdSettingsSidebarSeparator': 'ui-tab-bar-separator',
          // src/injectors/bd/sidebar.scss
          // below: sorted, has location(s)
          'userSummaryIcon': 'icon__183c2',
          // src/channels/channels.scss
          'userSummaryMoreUsers': 'moreUsers__183c2',
          // src/channels/channels.scss
          'accountPanelTagButton': 'withTagAsButton_b2ca13',
          // src/channels/panels.scss
          'accountPanelTagless': 'withTagless_b2ca13',
          // src/channels/panels.scss
          'listeningAlongPanel': 'listeningAlong_e0cf27',
          // src/channels/panels.scss
          'rtcConnectionStatus': 'rtcConnectionStatus_c0cb95',
          // src/channels/panels.scss
          'rtcConnectionPing': 'ping_c0cb95',
          // src/channels/panels.scss
          'panelLiveBadge': 'liveBadge__8c6c2',
          // src/channels/panels.scss
          'privateChannelActivityContainer': 'container__9fa5a',
          // src/channels/privateChannels.scss
          'callInviteButton': 'button_c6e099',
          // src/chat/call.scss
          'flowerStarIcon': 'icon__09691',
          // src/??/badge.scss ; as "tooltipHubIcon" src/??/tooltip.scss
          'messageBlockedAction': 'blockedAction__7a70a',
          // src/??/blocked.scss ; includes "messageGroupBlockedAction" (same file)
          'automodDropdown': 'resultsListContainer__6ae25',
          // src/??/serverSettings.scss ; as "onboardingQuestionDropdown" src/??/onboarding.scss
          'automodDropdownRowLabel': 'searchRowLabel__6ae25',

          // src/??/serverSettings.scss ; as "onboardingEnterRoles" src/??/onboarding.scss
          // unknown areas or i couldn't be bothered sorting.
          'membersChannelContainer': 'mainTableContainer_dd2627',

          // below: known to not exist elsewhere in this file
          'libraryScroller': 'scroller__4a84a',
          'libraryTable': 'table_adb41f',
          'libraryTableHeader': 'header_adb41f',
          'libraryTableHeaderCell': 'headerCell_adb41f',
          'libraryTableHeaderCellSorted': 'headerCellSorted_adb41f',
          'libraryTableHeaderCellContent': 'headerCellContent__5fe04',
          'libraryTableRowWrapper': 'rowWrapper_adb41f',
          'libraryTableRowWrapperActive': 'rowWrapperActive_adb41f',
          'libraryTableRowWrapperDim': 'rowWrapperDim_adb41f',
          'libraryTableRow': 'row_adb41f',
          'libraryTableBodyCell': 'bodyCell_adb41f',
          'libraryTableNameCell': 'nameBodyCell_adb41f',
          'libraryTableGameIcon': 'gameIcon_adb41f',
          'libraryGameDownloadContainer': 'gameUpdates__49035',
          'libraryTableNameCellInfo': 'nameCellInfo_adb41f',
          'libraryTableNameCellText': 'nameCellText_adb41f',
          'libraryTableTextCell': 'textCell_adb41f',
          'libraryTableLastPlayedCellNew': 'lastPlayedCellNew_adb41f',
          'libraryTableActionsCell': 'actionsCell_adb41f',
          'libraryTableSettingsIcons': 'settingIcons_adb41f',
          'libraryTableSettingIcon': 'settingIcon_adb41f',
          'libraryTableSettingIconHidden': 'hidden_adb41f',
          'librarySettingsScroller': 'scroller_fb04e1',
          'libraryInstallationPath': 'installationPath_a6f654',
          'libraryUsageBackground': 'background__27106',
          'libraryUsageForeground': 'foreground__27106',
          'libraryDefaultIndicator': 'defaultIndicator_a6f654',
          'libraryPlayButton': 'playButton__0cb56',
          'libraryPlayButtonContents': 'playButtonContents__0cb56',
          'authModalInApp': 'inApp_c5a065',
          'authModalScopeTimes': 'iconWrapper_cf14a8',
          'connectionDebugPopout': 'container__50387',
          'connectionDebugText': 'popoutText_effb26',
          'connectionDebugTextDetails': 'popoutTextDetails_effb26',
          'connectionDebugBottom': 'popoutBottom_effb26',
          'connectionDebugSecured': 'secured_effb26',
          'searchHubHeader': 'searchHeader__83bd4',
          'settingsContentSidebarScrollable': 'sidebarScrollable_ff90b2',
          'settingsToolsContainer': 'toolsContainer__23e6b',
          'settingsTools': 'tools__23e6b',
          'settingsImageUploaderInner': 'imageUploaderInner_e4d0bf',
          'settingsImageUploaderIcon': 'imageUploaderIcon_e4d0bf',
          'settingsAttendeeCTA': 'attendeeCTA_ca5ce6',
          'guildFeatureAvailabilityIndicator': 'availabilityIndicator__40463',
          'screenshareSegmentContainer': 'segmentControl_a2de16',
          'screenshareSegmentControlOption': 'segmentControlOption_a2de16',
          'myScreenControlOptions': 'interactive__2f4f7',
          'streamStillRunning': 'videoWrapper__2f4f7',
          'serverWelcomeCards': 'card_aae012',
          'serverInviteTick': 'checkmark_aae012',
          'stageMessageToast': 'toast_d3c698',
          'stageMessageToastWrapper': 'messageContentWrapper_d3c698',
          'stageTopicForm': 'topicFormItem__327b5',
          'stageTopicInput': 'textInput__327b5',
          'stageIconBigBackground': 'background__506d9',
          'stageIconBigForeground': 'foreground__506d9',
          'stageIconBackground': 'iconBackground__0b34e',
          'stageSeparator': 'separator__0b34e',
          'pageButtonDisabled': 'disabled__2d021',
          'consentCard': 'consentCard_ea523e',
          'activeNowPreviewWrapper': 'applicationStreamingPreviewWrapper__00943',
          'emptyActiveNowText': 'emptyText__7e549',
          'promotedQuestActivity': 'wrapper__960df',
          'promotedQuestPill': 'promotedTagBackground__1d868',
          'quickReactButtonFocused': 'focused_f563df',
          'quickReactPremiumUpsell': 'premiumUpsell_aae531',
          'regionSelectName': 'regionSelectName__5621e',
          'messagesPopoutThread': 'forumPost__7d15e',
          'inboxChattingAbout': 'calloutContainer__6fddf',
          'channelThreadPopoutRow': 'row__76f04',
          'channelThreadPopoutMore': 'more__76f04',
          'threadMembersEmptyHeader': 'emptyStateHeader__7641b',
          'threadMembersEmptyIcon': 'emptyStateIcon__7641b',
          'waveButtonDisabled': 'compactButtonDisabled__7ff28',
          'vcActivityPopout': 'popout__7fe3a',
          'vcSetActivityPopout': 'popout__669b5',
          'vcSetActivityPopoutIcon': 'iconWidget__669b5',
          'vcSetActivityPopoutButton': 'setCustomButton__669b5',
          'eventIconCircle': 'circle__710ee',
          'eventNewBadgeText': 'newBadgeText__29021',
          'eventStatusLabel': 'eventStatusLabel__29021',
          'eventIconContainer': 'eventStatusContainer__29021',
          'eventRSVPIcon': 'rsvpIcon_b5010b',
          'eventInfoIconCircle': 'circle__60626',
          'createEventProgressBar': 'progressBar__5537c',
          'createEventProgressBarSelected': 'selectedProgressBar__5537c',
          'createEventCreateStageContainer': 'container__03b47',
          'createEventColorMuted': 'colorMuted_c9946a',
          'createEventColorBrand': 'colorBrand_c9946a',
          'giftQuestContainer': 'outerContainer__2055a',
          'giftQuestProgress': 'gridProgressBar__2055a',
          'phoneInput': 'phoneField_a0c54f',
          'phoneInputField': 'inputField_a0c54f',
          'hubContainer': 'pageContainer__09fde',
          'hubCategoryItem': 'optionItem__7394f',
          'hubCategoryItemIcon': 'avatar__30fd0',
          'hubHeader': 'headerContent_a7218d',
          'hubSearch': 'searchBox_a7218d',
          'hubTabBar': 'tabBar_a7218d',
          'hubCard': 'card__0c0bf',
          'hubCardIconMask': 'iconMask__0c0bf',
          'hubCardIcon': 'icon__0c0bf',
          'hubSplash': 'splash__0c0bf',
          'activitiesScroller': 'scrollTierBackground__35455',
          'activityItem': 'activityItem__18da2',
          'activityItemDisabled': 'disabled__18da2',
          'activityTag': 'activityTag__18da2',
          'serverSubscription': 'scroller__808a1',
          'serverSubscriptionTier': 'tierInfoContainer__3efc4',
          'serverSubscriptionPerk': 'subscriptionPerks__3efc4',
          'serverSubscriptionPreview': 'roleMessagePreview__3efc4',
          'serverExperienceNav': 'navButtons_fe70ca',
          'serverExperiencePrompt': 'prompt_fe70ca',
          'serverExperienceTerms': 'termsFieldBody_fe70ca',
          'serverExperienceGradient': 'overlay_fe70ca',
          'customizeChannelsPill': 'selectValuePill__05934',
          'customizeChannelsOption': 'optionButtonWrapper__270d7',
          'membersChannelRowContainer': 'memberRowContainer__71c22',
          'userSettingsProfilesPreviewStatus': 'statusDot_ab876d',
          'avatarEditingContainer': 'editingContainer__11787',
          'messageReqSpam': 'selected_dcc822',
          'messageReqSpamCheck': 'hamBanner__6a41e',
          'sidebarPFPUpsell': 'editor__2a891',
          'chatToolbarButton': 'button_bba883',
          'chatToolbarIcon': 'icon_bba883',
          'previewServerIconContainer': 'iconContainer__1b9f0',
          'previewServerChannelIcon': 'channelIcon__949ab',
          'previewServerChannelTitleIcon': 'channelTitleIcon__949ab',
          'previewServerChannelOptionArrow': 'optionArrow__949ab',
          'previewServerHeader': 'header_c5cd6a',
          'previewServerContainer': 'container__7e919',
          'previewServerBackButton': 'button_c5cd6a',
          'previewServerHomeContainer': 'container_c68a2c',
          'serverShopIntro': 'container_adb50a',
          'serverShopSelected': 'selected_d804ff',
          'inboxPopoutPill': 'unread__6fddf',
          'beforeTalkRulesBackground': 'fieldBackground_d48a51',
          'beforeTalkRule': 'termsRow_d48a51',
          'webhookFooter': 'footer__51eb2',
          'webhookPopout': 'guildPopout__51eb2',
          'webhookEmojiRow': 'emojiCounter__51eb2',
          'clipsShareTo': 'channelRow__1db97',
          'clipsUploadModal': 'sizeClip_aa605f',
          'clipsUploadGame': 'gameIcon_b52e4f',
          'clipsUploadTitle': 'text-md-semibold__8664f',
          'clipsInterfaceGeneralInfo': 'root_a77292',
          'clipsInterfaceParticipants': 'root_f90ef0',
          'clipsInterfaceOptionsModal': 'clipForm__54978',
          'clipsInterfaceParticipantsCounter': 'userCountPill_f90ef0',
          'clipsInterfaceTimeScroller': 'timePillBackground__10841',
          'clipsInterfacePlayPause': 'playPauseButtonWrapper__10841',
          'clipsInterfaceDragHandles': 'dragHandle__10841',
          'clipInChatFooter': 'container_b9f75c',
          'subEnabledServers': 'integrationWrapper_c7f964',
          'freeBoost': 'header__99020',
          'nitroTrial': 'tile_ff4e03',

          // SORTED AND NEED ALIASES
        ),
    ),

  // Test stuff because sometimes it's needed
  'test': (
      // category to test simple shit; foo = bar, foo2 = bar2
      'a': (
          'foo': 'bar',
          'foo2': 'bar2',
        ),
      // category to test different base name, "a foo" != "b foo". bar2 is example in this case.
      'b': (
          'foo': 'bar2',
        ),
      // category to test for quick debug traces
      'c': (
          'a': '!a',
          'b': '!b',
          'foo': '!bar',
        ),
      // category for alias
      'd': (
          'foobar': 'alias test a foo',
          // output should be "bar"
           // "loopback": "alias test d loopback" // should error; commented because **IT DOES**,,
        ),
      // category to test dots (for class names) and hashes (for ids) etc
      'e': (
          'dot': '.dot',
          // should throw error, this list does not need "." before classes
          'hash': '#hash',
          // should not throw error, generation explicitly checks for "#" at start
          'multi': 'class1.class2',
          // should not throw error
        ),
      // category to test lists outputting to :is(<contents of list>)
      'f': (
          'foo': (
            'item1' 'item2' 'item3',
          ),
          // outputs a :where() list
          'spaceSep': 'item4' 'item5' 'item6',
          // outputs an :is() list
          // below is only commented because vscode thinks it's funny to have a fake syntax error show up
           // "brackets": ["item7" "item8" "item9" "item with spaces"], // also outputs a :where() list //,,
        ),
    ),
);

// Known things to get classes for:
// in-voice, click noise suppression button for popout
