How an Increase Web Accessibility Can Improve Apps

We use apps for every conceivable need. In our highly connected, increasingly digital world, mobile and desktop applications are a part of life that we would now be hard-pressed to do without. Unfortunately, however, many app developers forget how important it is to design applications for everyone, implementing the accessibility features that can make all…

25+ Business & Marketing PowerPoint Templates 2021

Using the default PowerPoint layout to design a business presentation isn’t usually a great idea. You need a business PowerPoint template that’s going to stand out, make an impression, and look professional. A complete redesign for the heavily outdated default PowerPoint templates is long overdue. But, there’s no need to wait for Microsoft to fix…

10 Client-side Storage Options and When to Use Them

10 Client-side Storage Options and When to Use Them – SitePointSkip to main contentFree JavaScript Book!Write powerful, clean and maintainable JavaScript.RRP $11.95 Storing and manipulating data in the browser — also known as client-side storage — is useful when it’s not necessary or practical to send it to the web server.
Situations for storing and manipulating data in the browser include:
retaining the state of a client-side application — such as the current screen, entered data, user preferences, etc.
utilities which access local data or files and have strict privacy requirements
progressive web apps (PWAs) which work offline
Here are ten options for storing browser data:
JavaScript variables
DOM node storage
Web Storage (localStorage and sessionStorage)
IndexedDB
Cache API (don’t use AppCache!)
File System Access API
File and Directory Entries API
cookies
window.name
WebSQL
This article investigates these ten different ways to store data in the browser, covering their limits, pros, cons, and the best uses of each technique.
Before we browse the options, a quick note about data persistence …
Data Persistence
In general, data you store will either be:
persistent: it remains until your code chooses to delete it, or
volatile: it remains until the browser session ends, typically when the user closes the tab
The reality is more nuanced.
Persistent data can be blocked or deleted by the user, operating system, browser, or plugins at any point. The browser can decide to delete older or larger items as it approaches the capacity allocated to that storage type.
Browsers also record page state. You can navigate away from a site and click back or close and re-open a tab; the page should look identical. Variables and data regarded as session-only are still available.
1. JavaScript Variables
metric
comment
capacity
no strict limit but browser slowdowns or crashes could occur as you fill memory
read/write speed
the fastest option
persistence
poor: data is wiped by a browser refresh
Storing state in JavaScript variables is the quickest and easiest option. I’m sure you don’t need an example, but …

const
a = 1,
b = ‘two’,
state = {
msg: ‘Hello’,
name: ‘Craig’
};

Advantages:
easy to use
fast
no need for serialization or de-serialization
Disadvantages:
fragile: refreshing or closing the tab wipes everything
third-party scripts can examine or overwrite global (window) values
You’re already using variables. You could consider permanently storing variable state when the page unloads.
2. DOM Node Storage
metric
comment
capacity
no strict limit but not ideal for lots of data
read/write speed
fast
persistence
poor: data can be wiped by other scripts or a refresh
Most DOM elements, either on the page or in-memory, can store values in named attributes. It’s safer to use attribute names prefixed with data-:
the attribute will never have associated HTML functionality
you can access values via a dataset property rather than the longer .setAttribute() and .getAttribute() methods.
Values are stored as strings so serialization and de-serialization may be required. For example:

const main = document.querySelector(‘main’);

main.dataset.value1 = 1;
main.dataset.state = JSON.stringify({ a:1, b:2 });

console.log( main.dataset.value1 );
console.log( JSON.parse(main.dataset.state).a );

Advantages:
you can define values in JavaScript or HTML — such as
useful for storing the state of a specific component
the DOM is fast! (contrary to popular opinion)
Disadvantages:
fragile: refreshing or closing the tab wipes everything (unless a value is server-rendered into the HTML)
strings only: requires serialization and de-serialization
a larger DOM affects performance
third-party scripts can examine or overwrite values
DOM node storage is slower than variables. Use it sparingly in situations where it’s practical to store a component’s state in HTML.
3. Web Storage (localStorage and sessionStorage)
metric
comment
capacity
5MB per domain
read/write speed
synchronous operation: can be slow
persistence
data remains until cleared
Web Storage provides two similar APIs to define name/value pairs. Use:
window.localStorage to store persistent data, and
window.sessionStorage to retain session-only data while the browser tab remains open (but see Data Persistence)
Store or update named items with .setItem():

localStorage.setItem(‘value1’, 123);
localStorage.setItem(‘value2’, ‘abc’);
localStorage.setItem(‘state’, JSON.stringify({ a:1, b:2, c:3 }));

Retrieve them with .getItem():

const state = JSON.parse( localStorage.getItem(‘state’) );

And delete them with .removeItem():

localStorage.removeItem(‘state’)

Other properties and methods include:
Changing any value raises a storage event in other browser tabs/windows connected to the same domain. Your application can respond accordingly:

window.addEventListener(‘storage’, s = > {

console.log(`item changed: ${ s.key }`);
console.log(`from value : ${ s.oldValue }`);
console.log(`to new value: ${ s.newValue }`);

});

Advantages:
simple name/value pair API
session and persistent storage options
good browser support
Disadvantages:
strings only: requires serialization and de-serialization
unstructured data with no transactions, indexing, or search
synchronous access will affect the performance of large datasets
Web Storage is ideal for simpler, smaller, ad-hoc values. It’s less practical for storing large volumes of structured information, but you may be able to avoid performance issues by writing data when the page unloads.
4. IndexedDB
metric
comment
capacity
depends on device. At least 1GB, but can be up to 60% of remaining disk space
read/write speed
fast
persistence
data remains until cleared
IndexedDB offers a NoSQL-like low-level API for storing large volumes of data. The store can be indexed, updated using transactions, and searched using asynchronous methods.
The IndexedDB API is complex and requires some event juggling. The following function opens a database connection when passed a name, version number, and optional upgrade function (called when the version number changes):

function dbConnect(dbName, version, upgrade) {

return new Promise((resolve, reject) = > {

const request = indexedDB.open(dbName, version);

request.onsuccess = e = > {
resolve(e.target.result);
};

request.onerror = e = > {
console.error(`indexedDB error: ${ e.target.errorCode }`);
};

request.onupgradeneeded = upgrade;

});

}

The following code connects to a myDB database and initializes a todo object store (analogous to a SQL table or MongoDB collection). It then defines an auto-incrementing key named id:

(async () = > {

const db = await dbConnect(‘myDB’, 1.0, e = > {

db = e.target.result;
const store = db.createObjectStore(‘todo’, { keyPath: ‘id’, autoIncrement: true });

})

})();

Once the db connection is ready, you can .add new data items in a transaction:

db.transaction([‘todo’], ‘readwrite’)
.objectStore(‘todo’)
.add({ task: ‘do something’ })
.onsuccess = () = > console.log( ‘added’ );

And you can retrieve values, such as the first item:

db.transaction([‘todo’], ‘readonly’)
.objectStore(‘todo’)
.get(1)
.onsuccess = data = > console.log( data.target.result );

Advantages:
flexible data store with the largest space
robust transactions, indexing, and search options
good browser support
Disadvantages:
a complex callback and event-based API
IndexedDB is the best option for reliably storing large quantities of data, but you’ll want to reach for a wrapper library such as idb, Dexie.js, or JsStore.
5. Cache API
metric
comment
capacity
depends on device, but Safari limits each domain to 50MB
read/write speed
fast
persistence
data remains until cleared or after two weeks in Safari
The Cache API provides storage for HTTP request and response object pairs. You can create any number of named caches for storing any number of network data items.
The API is typically used in service workers to cache network responses for progressive web apps. When a device disconnects from the network, cached assets can be re-served so a web app can function offline.
The following code stores a network response in a cache named myCache:

const cacheName = ‘myCache’;

(async () = > {

const stored = await cacheStore(‘/service.json’) );
console.log(stored ? ‘stored OK’ : ‘store failed’);

})();

async function cacheStore( url ) {

try {

const cache = await caches.open( cacheName );

await cache.add( url );
return true;

}
catch(err) {
return undefined;
}

}

A similar function can retrieve an item from the cache. In this example, it returns the response body text:

(async () = > {

const text = await cacheGet(‘/service.json’) );
console.log( text );

})();

async function cacheGet( url ) {

try {

const

cache = await caches.open( cacheName ),

resp = await cache.match(url);

return await resp.text();

}
catch(err) {
return undefined;
}

}

Advantages:
stores any network response
can improve web application performance
allows a web application to function offline
a modern Promise-based API
Disadvantages:
not practical for storing application state
possibly less useful outside progressive web apps
Apple has not been kind to PWAs and the Cache API
The Cache API is the best option for storing files and data retrieved from the network. You could probably use it to store application state, but it’s not designed for that purpose and there are better options.
5.5 AppCache
AppCache was the defunct predecessor to the Cache API. This isn’t the storage solution you’re looking for. Nothing to see here. Please move along.
6. File System Access API
metric
comment
capacity
depends on remaining disk space
read/write speed
depends on file system
persistence
data remains until cleared
The File System Access API allows a browser to read, write, modify, and delete files from your local file system. Browsers run in a sandboxed environment so the user must grant permission to a specific file or directory. This returns a FileSystemHandle so a web application can read or write data like a desktop app.
The following function saves a Blob to a local file:

async function save( blob ) {

const handle = await window.showSaveFilePicker();

const stream = await handle.createWritable();

await stream.write(blob);

await stream.close();
}

Advantages:
web apps can securely read and write to the local file system
less need to upload files or process data on a server
a great feature for progressive web apps
Disadvantages:
minimal browser support (Chrome only)
the API may change
This storage option excites me the most, but you’ll need to wait a couple of years before it becomes viable for production use.
7. File and Directory Entries API
metric
comment
capacity
depends on remaining disk space
read/write speed
unknown
persistence
data remains until cleared
The File and Directory Entries API provides a sandboxed file system available to a domain which can create, write, read, and delete directories and files.
Advantages:
could have some interesting uses
Disadvantages:
non-standard, incompatibilities between implementations, and behavior may change.
MDN explicitly states: do not use this on production sites. Widespread support is several years away at best.
8. Cookies
metric
comment
capacity
80Kb per domain (20 cookies with up to 4Kb in each)
read/write speed
fast
persistence
good: data remains until it’s wiped or expires
Cookies are domain-specific data. They have a reputation for tracking people, but they’re essential for any system which needs to maintain server state — such as logging on. Unlike other storage mechanisms, cookies are (usually) passed between the browser and server on every HTTP request and response. Both devices can examine, modify, and delete cookie data.
document.cookie sets cookie values in client-side JavaScript. You must define a string with a name and value separated by an equals symbol (=). For Example:

document.cookie = ‘cookie1=123’;
document.cookie = ‘anothercookie=abc’;

Values must not contain commas, semicolons, or whitespace, so encodeURIComponent() may be necessary:

document.cookie = `hello=${ encodeURIComponent(‘Hello, everyone!’) }`;

Further cookie settings can be appended with semi-colon separators, including:
;domain=: if not set, the cookie is only available on the current URL domain. Using ;path=mysite.com would permit it on any subdomain of mysite.com.
;path=: if not set, the cookie is only available in the current path and child paths. Set ;path=/ to allow any path in the domain.
;max-age=: the cookie expiry time in seconds — such as ;max-age=60.
;expires=: a cookie expiry date — such as ;expires=Thu, 04 July 2021 10:34:38 UTC (use date.toUTCString() to format appropriately).
;secure: the cookie will only be transmitted over HTTPS.
;HTTPOnly: makes cookies inaccessible to client-side JavaScript.
;samesite=: controls whether another domain can access a cookie. Set it to lax (the default, shares the cookie to the current domain), strict (stops the initial cookie being sent when following a link from another domain), or none (no restrictions).
Example: set a state cookie which expires in 10 minutes and is available on any path in the current domain:

const state = { a:1, b:2, c:3 };

document.cookie = `state=${ encodeURIComponent(JSON.stringify(state)) }; path=/; max=age=600`;

document.cookie returns a string containing every name and value pair separated by a semi-colon. For example:

console.log( document.cookie );

The function below parses the string and converts it to an object containing name-value pairs. For example:

const
cookie = cookieParser();
state = cookie.state;

console.log( state );

function cookieParser() {

const nameValue = {};

document.cookie
.split(‘; ‘)
.map(nv = > {

nv = nv.split(‘=’);
if (nv[0]) {

let v = decodeURIComponent( nv[1] || ” );

try { v = JSON.parse(v); }
catch(e){}

nameValue[ nv[0] ] = v;

}

})

return nameValue;

}

Advantages:
a reliable way to retain state between the client and server
limited to a domain and, optionally, a path
automatic expiry control with max-age (seconds) or Expires (date)
used in the current session by default (set an expiry date to persist the data beyond page refreshes and tab closing)
Disadvantages:
cookies are often blocked by browsers and plugins (they’re generally converted to session cookies so sites continue to work)
clunky JavaScript implementation (it’s best to create your own cookie handler or opt for a library such as js-cookie)
strings only (requires serialization and de-serialization)
limited storage space
cookies can be examined by third-party scripts unless you restrict access
blamed for privacy invasion (regional legislation may require you to show a warning for non-essential cookies)
cookie data is appended to every HTTP request and response which can affect performance (storing 50Kb of cookie data, then requesting ten 1 byte files, would incur one megabyte of bandwidth)
Avoid cookies unless there’s no viable alternative.
9. window.name
metric
comment
capacity
varies, but several megabytes should be possible
read/write speed
fast
persistence
session data remains until the tab is closed
The window.name property sets and gets the name of the window’s browsing context. You can set a single string value which persists between browser refreshes or linking elsewhere and clicking back. For example:

let state = { a:1, b:2, c:3 };
window.name = JSON.stringify( state );

Examine the value using:

state = JSON.parse( window.name );
console.log( state.b );

Advantages:
easy to use
can be used for session-only data
The disadvantages:
strings only: requires serialization and de-serialization
pages in other domains can read, modify, or delete the data (never use it for sensitive information)
window.name was never designed for data storage. It’s a hack and there are better options.
10. WebSQL
metric
comment
capacity
5MB per domain
read/write speed
sluggish
persistence
data remains until cleared
WebSQL was an effort to bring SQL-like database storage to the browser. Example code:

const db = openDatabase(‘todo’, ‘1.0’, ‘my to-do list’, 1024 * 1024);

db.transaction( t = > {

t.executeSql(‘CREATE TABLE task (id unique, name)’);
t.executeSql(‘INSERT INTO task (id,name) VALUES (1, “wash cat”)’);

});

db.transaction( t = > {

t.executeSql(
“SELECT * FROM task”,
[],
(t, results) = > { console.log(results.rows); }
);

});

Chrome and some editions of Safari support the technology, but it was opposed by Mozilla and Microsoft in favor of IndexedDB.
Advantages:
designed for robust client-side data storage and access
familiar SQL syntax often used by server-side developers
Disadvantages:
limited and buggy browser support
inconsistent SQL syntax across browsers
asynchronous but clunky callback-based API
poor performance
Do not use WebSQL! It hasn’t been a viable option since the specification was deprecated in 2010.
Scrutinizing Storage
The Storage API can examine space available to Web Storage, IndexedDB, and the Cache API. All browsers except Safari and IE support the Promise-based API which offers an .estimate() method to calculate the quota (space available to the domain) and usage (space already used). For example:

(async () = > {

if (!navigator.storage) return;

const storage = await navigator.storage.estimate();

console.log(`bytes allocated : ${ storage.quota }`);
console.log(`bytes in use : ${ storage.usage }`);

const pcUsed = Math.round((storage.usage / storage.quota) * 100);
console.log(`storage used : ${ pcUsed }%`);

const mbRemain = Math.floor((storage.quota – storage.usage) / 1024 / 1024);
console.log(`storage remaining: ${ mbRemain } MB`);

})();

Two further asynchronous methods are available:
.persist(): returns true if the site has permission to store persistent data, and
.persisted(): returns true if the site has already stored persistent data
The Application panel in browser developer tools (named Storage in Firefox) allows you to view, modify, and clear localStorage, sessionStorage, IndexedDB, WebSQL, cookies, and cache storage.
You can also examine cookie data sent in the HTTP request and response headers by clicking any item in the developer tools’ Network panel.
Storage Smorgasbord
None of these storage solutions is perfect, and you’ll need to adopt several in a complex web application. That means learning more APIs. But having a choice in each situation is a good thing — assuming you can choose the appropriate option, of course!
Related Articles10 Top WordPress Ecommerce Themes for 2021WebBy

CSS Container Queries: Use-Cases And Migration Strategies

When we write media queries for a UI element, we always describe how that element is styled depending on the screen dimensions. This approach works well when the responsiveness of the target element media query should only depend on viewport size. Let’s take a look at the following responsive page layout example. However, responsive Web…

The Cat’s Meow: 8 CSS and JavaScript Code Snippets Celebrating Our Feline Friends

The internet without cats would be like an ocean without fish (which cats happen to love). The psychology behind this feline obsession must be fascinating. Perhaps it’s that silly, self-assured behavior that makes humans record every move our pets make. Whether it’s memes, videos or amusing anecdotes, cats seem to be a subject that brings…

15 Free Google Slides Templates & Themes

A professional slide deck can make all the difference between having a successful presentation or boring your audience and losing their interest. However, designing a slide deck from scratch is time-consuming so it’s a good thing that there are pre-made templates that can save you time. In this roundup, we’ve gathered the best templates and…

Nextjs project, styling with Tailwind CSS. I am also adding social media login.

._3bX7W3J0lU78fp7cayvNxx{max-width:208px;text-align:center}
._1PeZajQI0Wm8P3B45yshR{fill:var(–newCommunityTheme-actionIcon)}._1PeZajQI0Wm8P3B45yshR._3axV0unm-cpsxoKWYwKh2x{fill:#ea0027}
._1x9diBHPBP-hL1JiwUwJ5J{font-size:14px;font-weight:500;line-height:18px;color:#ff585b;padding-left:3px;padding-right:24px}._2B0OHMLKb9TXNdd9g5Ere-,._1xKxnscCn2PjBiXhorZef4{height:16px;padding-right:4px;vertical-align:top}._1LLqoNXrOsaIkMtOuTBmO5{height:20px;padding-right:8px;vertical-align:bottom}.isInIcons2020 .icon._1LLqoNXrOsaIkMtOuTBmO5{vertical-align:middle}.QB2Yrr8uihZVRhvwrKuMS{height:18px;padding-right:8px;vertical-align:top}._3w_KK8BUvCMkCPWZVsZQn0{font-size:14px;font-weight:500;line-height:18px;color:var(–newCommunityTheme-actionIcon)}._3w_KK8BUvCMkCPWZVsZQn0 ._1LLqoNXrOsaIkMtOuTBmO5,._3w_KK8BUvCMkCPWZVsZQn0 ._2B0OHMLKb9TXNdd9g5Ere-,._3w_KK8BUvCMkCPWZVsZQn0 ._1xKxnscCn2PjBiXhorZef4,._3w_KK8BUvCMkCPWZVsZQn0 .QB2Yrr8uihZVRhvwrKuMS{fill:var(–newCommunityTheme-actionIcon)}
._3K2ydhts9_ES4s9UpcXqBi{display:block;padding:0 16px;width:100%}
.FIYolDqalszTnjjNfThfT{max-width:256px;white-space:normal;text-align:center}
._9ZuQyDXhFth1qKJF4KNm8{padding:12px 12px 40px}._2iNJX36LR2tMHx_unzEkVM,._1JmnMJclrTwTPpAip5U_Hm{font-size:16px;font-weight:500;line-height:20px;color:var(–newCommunityTheme-bodyText);margin-bottom:40px;padding-top:4px}._306gA2lxjCHX44ssikUp3O{margin-bottom:32px}._1Omf6afKRpv3RKNCWjIyJ4{font-size:18px;font-weight:500;line-height:22px;border-bottom:2px solid var(–newCommunityTheme-line);color:var(–newCommunityTheme-bodyText);margin-bottom:8px;padding-bottom:8px}._2Ss7VGMX-UPKt9NhFRtgTz{margin-bottom:24px}._3vWu4F9B4X4Yc-Gm86-FMP{border-bottom:1px solid var(–newCommunityTheme-line);margin-bottom:8px;padding-bottom:2px}._3vWu4F9B4X4Yc-Gm86-FMP:last-of-type{border-bottom-width:0}._2qAEe8HGjtHsuKsHqNCa9u{font-size:14px;font-weight:500;line-height:18px;color:var(–newCommunityTheme-bodyText);padding-bottom:8px;padding-top:8px}.c5RWd-O3CYE-XSLdTyjtI{padding:8px 0}._3whORKuQps-WQpSceAyHuF{font-size:12px;font-weight:400;line-height:16px;color:var(–newCommunityTheme-actionIcon);margin-bottom:8px}._1Qk-ka6_CJz1fU3OUfeznu{margin-bottom:8px}._3ds8Wk2l32hr3hLddQshhG{font-weight:500}._1h0r6vtgOzgWtu-GNBO6Yb,._3ds8Wk2l32hr3hLddQshhG{font-size:12px;line-height:16px;color:var(–newCommunityTheme-actionIcon)}._1h0r6vtgOzgWtu-GNBO6Yb{font-weight:400}.horIoLCod23xkzt7MmTpC{font-size:12px;font-weight:400;line-height:16px;color:#ea0027}._33Iw1wpNZ-uhC05tWsB9xi{margin-top:24px}._2M7LQbQxH40ingJ9h9RslL{font-size:12px;font-weight:400;line-height:16px;color:var(–newCommunityTheme-actionIcon);margin-bottom:8px}
.s5ap8yh1b4ZfwxvHizW3f{color:var(–newCommunityTheme-metaText);padding-top:5px}.s5ap8yh1b4ZfwxvHizW3f._19JhaP1slDQqu2XgT3vVS0{color:#ea0027}
._1EPynDYoibfs7nDggdH7Gq{margin-bottom:8px;position:relative}._1EPynDYoibfs7nDggdH7Gq._3-0c12FCnHoLz34dQVveax{max-height:63px;overflow:hidden}._1zPvgKHteTOub9dKkvrOl4{font-family:Noto Sans,Arial,sans-serif;font-size:14px;line-height:21px;font-weight:400;word-wrap:break-word}._1dp4_svQVkkuV143AIEKsf{-ms-flex-align:baseline;align-items:baseline;background-color:var(–newCommunityTheme-body);bottom:-2px;display:-ms-flexbox;display:flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap;padding-left:2px;position:absolute;right:-8px}._5VBcBVybCfosCzMJlXzC3{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:21px;color:var(–newCommunityTheme-bodyText)}._3YNtuKT-Is6XUBvdluRTyI{position:relative;background-color:0;color:var(–newCommunityTheme-metaText);fill:var(–newCommunityTheme-metaText);border:0;padding:0 8px}._3YNtuKT-Is6XUBvdluRTyI:before{content:””;position:absolute;top:0;left:0;width:100%;height:100%;border-radius:9999px;background:var(–newCommunityTheme-metaText);opacity:0}._3YNtuKT-Is6XUBvdluRTyI:hover:before{opacity:.08}._3YNtuKT-Is6XUBvdluRTyI:focus{outline:none}._3YNtuKT-Is6XUBvdluRTyI:focus:before{opacity:.16}._3YNtuKT-Is6XUBvdluRTyI._2Z_0gYdq8Wr3FulRLZXC3e:before,._3YNtuKT-Is6XUBvdluRTyI:active:before{opacity:.24}._3YNtuKT-Is6XUBvdluRTyI:disabled,._3YNtuKT-Is6XUBvdluRTyI[data-disabled],._3YNtuKT-Is6XUBvdluRTyI[disabled]{cursor:not-allowed;filter:grayscale(1);background:none;color:var(–newCommunityTheme-metaTextAlpha50);fill:var(–newCommunityTheme-metaTextAlpha50)}._2ZTVnRPqdyKo1dA7Q7i4EL{transition:all .1s linear 0s}.k51Bu_pyEfHQF6AAhaKfS{transition:none}._2qi_L6gKnhyJ0ZxPmwbDFK{transition:all .1s linear 0s;display:block;background-color:var(–newCommunityTheme-field);border-radius:4px;padding:8px;margin-bottom:12px;margin-top:8px;border:1px solid var(–newCommunityTheme-canvas);cursor:pointer}._2qi_L6gKnhyJ0ZxPmwbDFK:focus{outline:none}._2qi_L6gKnhyJ0ZxPmwbDFK:hover{border:1px solid var(–newCommunityTheme-button)}._2qi_L6gKnhyJ0ZxPmwbDFK._3GG6tRGPPJiejLqt2AZfh4{transition:none;border:1px solid var(–newCommunityTheme-button)}.IzSmZckfdQu5YP9qCsdWO{cursor:pointer;transition:all .1s linear 0s}.IzSmZckfdQu5YP9qCsdWO ._1EPynDYoibfs7nDggdH7Gq{border:1px solid transparent;border-radius:4px;transition:all .1s linear 0s}.IzSmZckfdQu5YP9qCsdWO:hover ._1EPynDYoibfs7nDggdH7Gq{border:1px solid var(–newCommunityTheme-button);padding:4px}._1YvJWALkJ8iKZxUU53TeNO{font-size:12px;font-weight:700;line-height:16px;color:var(–newCommunityTheme-button)}._3adDzm8E3q64yWtEcs5XU7{display:-ms-flexbox;display:flex}._3adDzm8E3q64yWtEcs5XU7 ._3jyKpErOrdUDMh0RFq5V6f{-ms-flex:100%;flex:100%}._3adDzm8E3q64yWtEcs5XU7 .dqhlvajEe-qyxij0jNsi0{color:var(–newCommunityTheme-button)}._3adDzm8E3q64yWtEcs5XU7 ._12nHw-MGuz_r1dQx5YPM2v,._3adDzm8E3q64yWtEcs5XU7 .dqhlvajEe-qyxij0jNsi0{font-size:12px;font-weight:700;line-height:16px;cursor:pointer;-ms-flex-item-align:end;align-self:flex-end;-webkit-user-select:none;-ms-user-select:none;user-select:none}._3adDzm8E3q64yWtEcs5XU7 ._12nHw-MGuz_r1dQx5YPM2v{color:var(–newCommunityTheme-button);margin-right:8px;color:var(–newCommunityTheme-errorText)}._3zTJ9t4vNwm1NrIaZ35NS6{font-family:Noto Sans,Arial,sans-serif;font-size:14px;line-height:21px;font-weight:400;word-wrap:break-word;width:100%;padding:0;border:none;background-color:transparent;resize:none;outline:none;cursor:pointer;color:var(–newRedditTheme-bodyText)}._2JIiUcAdp9rIhjEbIjcuQ-{resize:none;cursor:auto}._2I2LpaEhGCzQ9inJMwliNO,._42Nh7O6pFcqnA6OZd3bOK{display:inline-block;margin-left:4px;vertical-align:middle}._42Nh7O6pFcqnA6OZd3bOK{fill:var(–newCommunityTheme-button);color:var(–newCommunityTheme-button);height:16px;width:16px;margin-bottom:2px}
@keyframes ibDwUVR1CAykturOgqOS5{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}._3LwT7hgGcSjmJ7ng7drAuq{–sizePx:0;font-size:4px;position:relative;text-indent:-9999em;border-radius:50%;border:4px solid var(–newCommunityTheme-bodyTextAlpha20);border-left-color:var(–newCommunityTheme-body);transform:translateZ(0);animation:ibDwUVR1CAykturOgqOS5 1.1s linear infinite}._3LwT7hgGcSjmJ7ng7drAuq,._3LwT7hgGcSjmJ7ng7drAuq:after{width:var(–sizePx);height:var(–sizePx)}._3LwT7hgGcSjmJ7ng7drAuq:after{border-radius:50%}._3LwT7hgGcSjmJ7ng7drAuq._2qr28EeyPvBWAsPKl-KuWN{margin:0 auto}
._2cHgYGbfV9EZMSThqLt2tx{margin-bottom:16px;border-radius:4px}._3Q7WCNdCi77r0_CKPoDSFY{width:75%;height:24px}._2wgLWvNKnhoJX3DUVT_3F-,._3Q7WCNdCi77r0_CKPoDSFY{background:var(–newCommunityTheme-field);background-size:200%;margin-bottom:16px;border-radius:4px}._2wgLWvNKnhoJX3DUVT_3F-{width:100%;height:46px}
.Rd5g7JmL4Fdk-aZi1-U_V{transition:all .1s linear 0s}._2TMXtA984ePtHXMkOpHNQm{font-size:16px;font-weight:500;line-height:20px;margin-bottom:4px}.CneW1mCG4WJXxJbZl5tzH{border-top:1px solid var(–newRedditTheme-line);margin-top:16px;padding-top:16px}._11ARF4IQO4h3HeKPpPg0xb{transition:all .1s linear 0s;display:none;fill:var(–newCommunityTheme-button);height:16px;width:16px;vertical-align:middle;margin-bottom:2px;margin-left:4px;cursor:pointer}._1I3N-uBrbZH-ywcmCnwv_B:hover ._11ARF4IQO4h3HeKPpPg0xb{display:inline-block}._2IvhQwkgv_7K0Q3R0695Cs{border-radius:4px;border:1px solid var(–newCommunityTheme-line)}._2IvhQwkgv_7K0Q3R0695Cs:focus{outline:none}._1I3N-uBrbZH-ywcmCnwv_B{transition:all .1s linear 0s;border-radius:4px;border:1px solid var(–newCommunityTheme-line)}._1I3N-uBrbZH-ywcmCnwv_B:focus{outline:none}._1I3N-uBrbZH-ywcmCnwv_B.IeceazVNz_gGZfKXub0ak,._1I3N-uBrbZH-ywcmCnwv_B:hover{border:1px solid var(–newCommunityTheme-button)}._35hmSCjPO8OEezK36eUXpk._35hmSCjPO8OEezK36eUXpk._35hmSCjPO8OEezK36eUXpk{margin-top:25px;left:-9px}._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP,._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP:focus-within,._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP._3aEIeAgUy9VfJyRPljMNJP:hover{transition:all .1s linear 0s;border:none;padding:8px 8px 0}._25yWxLGH4C6j26OKFx8kD5{display:inline}._2YsVWIEj0doZMxreeY6iDG{font-size:12px;font-weight:400;line-height:16px;color:var(–newCommunityTheme-metaText);display:-ms-flexbox;display:flex;padding:4px 6px}._1hFCAcL4_gkyWN0KM96zgg{color:var(–newCommunityTheme-button);margin-right:8px;margin-left:auto;color:var(–newCommunityTheme-errorText)}._1hFCAcL4_gkyWN0KM96zgg,._1dF0IdghIrnqkJiUxfswxd{font-size:12px;font-weight:700;line-height:16px;cursor:pointer;-ms-flex-item-align:end;align-self:flex-end;-webkit-user-select:none;-ms-user-select:none;user-select:none}._1dF0IdghIrnqkJiUxfswxd{color:var(–newCommunityTheme-button)}._3VGrhUu842I3acqBMCoSAq{font-weight:700;color:#ff4500;text-transform:uppercase;margin-right:4px}._3VGrhUu842I3acqBMCoSAq,.edyFgPHILhf5OLH2vk-tk{font-size:12px;line-height:16px}.edyFgPHILhf5OLH2vk-tk{font-weight:400;-ms-flex-preferred-size:100%;flex-basis:100%;margin-bottom:4px;color:var(–newCommunityTheme-metaText)}._19lMIGqzfTPVY3ssqTiZSX._19lMIGqzfTPVY3ssqTiZSX._19lMIGqzfTPVY3ssqTiZSX{margin-top:6px}._19lMIGqzfTPVY3ssqTiZSX._19lMIGqzfTPVY3ssqTiZSX._19lMIGqzfTPVY3ssqTiZSX._3MAHaXXXXi9Xrmc_oMPTdP{margin-top:4px}
.ehsOqYO6dxn_Pf9Dzwu37{margin-top:0;overflow:visible}._2pFdCpgBihIaYh9DSMWBIu{height:24px}._2pFdCpgBihIaYh9DSMWBIu.uMPgOFYlCc5uvpa2Lbteu{border-radius:2px}._2pFdCpgBihIaYh9DSMWBIu.uMPgOFYlCc5uvpa2Lbteu:focus,._2pFdCpgBihIaYh9DSMWBIu.uMPgOFYlCc5uvpa2Lbteu:hover{background-color:var(–newRedditTheme-navIconFaded10);outline:none}._38GxRFSqSC-Z2VLi5Xzkjy{color:var(–newCommunityTheme-actionIcon)}._2DO72U0b_6CUw3msKGrnnT{border-top:none;color:var(–newCommunityTheme-metaText);cursor:pointer;padding:8px 16px 8px 8px;text-transform:none}._2DO72U0b_6CUw3msKGrnnT:hover{background-color:#0079d3;border:none;color:var(–newCommunityTheme-body);fill:var(–newCommunityTheme-body)}
._1LHxa-yaHJwrPK8kuyv_Y4{width:100%}._1LHxa-yaHJwrPK8kuyv_Y4:hover ._31L3r0EWsU0weoMZvEJcUA{display:none}._1LHxa-yaHJwrPK8kuyv_Y4 ._31L3r0EWsU0weoMZvEJcUA,._1LHxa-yaHJwrPK8kuyv_Y4:hover ._11Zy7Yp4S1ZArNqhUQ0jZW{display:block}._1LHxa-yaHJwrPK8kuyv_Y4 ._11Zy7Yp4S1ZArNqhUQ0jZW{display:none}
._3Im6OD67aKo33nql4FpSp_{border:1px solid var(–newCommunityTheme-widgetColors-sidebarWidgetBorderColor);border-radius:5px 5px 4px 4px;overflow:visible;word-wrap:break-word;background-color:var(–newCommunityTheme-body);padding:12px}.lnK0-OzG7nLFydTWuXGcY{font-size:10px;font-weight:700;letter-spacing:.5px;line-height:12px;text-transform:uppercase;padding-bottom:4px;color:var(–newCommunityTheme-navIcon)}
._12xlue8dQ1odPw1J81FIGQ{display:inline-block;vertical-align:middle}
._3-SW6hQX6gXK9G4FM74obr{display:inline-block;vertical-align:text-bottom;width:16px;height:16px;font-size:16px;line-height:16px}
._37coyt0h8ryIQubA7RHmUc{margin-top:12px;padding-top:12px}._2XJvPvYIEYtcS4ORsDXwa3{border-radius:100%;box-sizing:border-box;-ms-flex:none;flex:none;margin-right:8px}._2Vkdik1Q8k0lBEhhA_lRKE{height:54px;width:54px}.eGjjbHtkgFc-SYka3LM3M,._2Vkdik1Q8k0lBEhhA_lRKE{border-radius:100%;box-sizing:border-box;-ms-flex:none;flex:none;margin-right:8px;background-position:50%;background-repeat:no-repeat;background-size:100%}.eGjjbHtkgFc-SYka3LM3M{height:36px;width:36px}.j9k2MUR13FjoBBeLo1C1m{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-top:13px;margin-bottom:2px}._3Evl5aOozId3QVjs7iry2c{font-size:12px;font-weight:400;line-height:16px;margin-right:4px;margin-left:4px}._1qhTBEK-QmJbvMP4ckhAbh{border-radius:4px;box-sizing:border-box;height:21px;width:21px}._1qhTBEK-QmJbvMP4ckhAbh:nth-child(2),._1qhTBEK-QmJbvMP4ckhAbh:nth-child(3){margin-left:-9px}._3nzVPnRRnrls4DOXO_I0fn{margin:auto 0 auto auto;padding-top:10px;vertical-align:middle}._3nzVPnRRnrls4DOXO_I0fn ._1LAmcxBaaqShJsi8RNT-Vp i{color:unset}._2bWoGvMqVhMWwhp4Pgt4LP{margin:16px 0;font-size:12px;font-weight:400;line-height:16px}.tWeTbHFf02PguTEonwJD0{font-size:16px;margin-right:4px}._2AbGMsrZJPHrLm9e-oyW1E{width:180px;text-align:center}._1cB7-TWJtfCxXAqqeyVb2q,.isInIcons2020 .icon._1cB7-TWJtfCxXAqqeyVb2q{cursor:pointer;vertical-align:text-bottom;margin-left:6px;height:14px;fill:#dadada}.isInIcons2020 .icon._1cB7-TWJtfCxXAqqeyVb2q{font-size:12px;vertical-align:middle}.isInIcons2020 .icon.tWeTbHFf02PguTEonwJD0{vertical-align:top}.hpxKmfWP2ZiwdKaWpefMn{background-color:var(–newCommunityTheme-active);background-size:cover;background-image:var(–newCommunityTheme-banner-backgroundImage);background-position-y:center;background-position-x:center;background-repeat:no-repeat;border-radius:3px 3px 0 0;height:34px;margin:-12px -12px 10px}._20Kb6TX_CdnePoT8iEsls6{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;margin-bottom:8px}._20Kb6TX_CdnePoT8iEsls6 >*{display:inline-block;vertical-align:middle}.t9oUK2WY0d28lhLAh3N5q{margin-top:-23px}._2KqgQ5WzoQRJqjjoznu22o{display:inline-block;-ms-flex-negative:0;flex-shrink:0;position:relative}._2D7eYuDY6cYGtybECmsxvE{-ms-flex:1 1 auto;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}._2D7eYuDY6cYGtybECmsxvE:hover{text-decoration:underline}._19bCWnxeTjqzBElWZfIlJb{font-size:16px;font-weight:500;line-height:20px;display:inline-block}._2TC7AdkcuxFIFKRO_VWis8{margin-left:10px;margin-top:30px}._2TC7AdkcuxFIFKRO_VWis8._35WVFxUni5zeFkPk7O4iiB{margin-top:35px}._7kAMkb9SAVF8xJ3L53gcW{display:-ms-flexbox;display:flex;margin-bottom:8px}._7kAMkb9SAVF8xJ3L53gcW >*{-ms-flex:auto;flex:auto}._1LAmcxBaaqShJsi8RNT-Vp{padding:0 2px 0 4px;vertical-align:middle}._3_HlHJ56dAfStT19Jgl1bF,.nEdqRRzLEN43xauwtgTmj{padding-right:4px}._3_HlHJ56dAfStT19Jgl1bF{padding-left:16px}._2QZ7T4uAFMs_N83BZcN-Em{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:18px;display:-ms-flexbox;display:flex;-ms-flex-flow:row nowrap;flex-flow:row nowrap}._19sQCxYe2NApNbYNX5P5-L{cursor:default;height:16px;margin-right:8px;width:16px}.isInIcons2020 .icon._19sQCxYe2NApNbYNX5P5-L{margin:-2px 8px 0 0}._3XFx6CfPlg-4Usgxm0gK8R{font-size:16px;font-weight:500;line-height:20px}._34InTQ51PAhJivuc_InKjJ{color:var(–newCommunityTheme-actionIcon)}._29_mu5qI8E1fq6Uq5koje8{font-size:12px;font-weight:500;line-height:16px;display:inline-block;word-break:break-word}._2BY2-wxSbNFYqAy98jWyTC{margin-top:10px}._3sGbDVmLJd_8OV8Kfl7dVv{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:21px;margin-top:8px;word-wrap:break-word}._1qiHDKK74j6hUNxM0p9ZIp{margin-top:12px}.Jy6FIGP1NvWbVjQZN7FHA,._326PJFFRv8chYfOlaEYmGt,._1eMniuqQCoYf3kOpyx83Jj,._1cDoUuVvel5B1n5wa3K507{-ms-flex-pack:center;justify-content:center;margin-top:12px;width:100%}._1eMniuqQCoYf3kOpyx83Jj{margin-bottom:8px}._2_w8DCFR-DCxgxlP1SGNq5{margin-right:4px;vertical-align:middle}._1aS-wQ7rpbcxKT0d5kjrbh{border-radius:4px;display:inline-block;padding:4px}._2cn386lOe1A_DTmBUA-qSM{border-top:1px solid var(–newCommunityTheme-widgetColors-lineColor);margin-top:10px}._2Zdkj7cQEO3zSGHGK2XnZv{display:inline-block}.wzFxUZxKK8HkWiEhs0tyE{font-size:12px;font-weight:700;line-height:16px;color:var(–newCommunityTheme-button);cursor:pointer;text-align:left;margin-top:2px}._3R24jLERJTaoRbM_vYd9v0._3R24jLERJTaoRbM_vYd9v0._3R24jLERJTaoRbM_vYd9v0{display:none}._38lwnrIpIyqxDfAF1iwhcV{background-color:var(–newRedditTheme-line);border:none;height:1px;margin:16px 0}.yobE-ux_T1smVDcFMMKFv{font-size:16px;font-weight:500;line-height:20px}._2DVpJZAGplELzFy4mB0epQ{margin-top:8px}._2DVpJZAGplELzFy4mB0epQ .x1f6lYW8eQcUFu0VIPZzb{color:inherit}._2DVpJZAGplELzFy4mB0epQ svg.LTiNLdCS1ZPRx9wBlY2rD{color:inherit;fill:inherit;padding-right:8px}._2DVpJZAGplELzFy4mB0epQ ._18e78ihYD3tNypPhtYISq3{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:18px;color:inherit}
.LalRrQILNjt65y-p-QlWH{fill:var(–newRedditTheme-actionIcon);height:18px;width:18px}.LalRrQILNjt65y-p-QlWH rect{stroke:var(–newRedditTheme-metaText)}._3J2-xIxxxP9ISzeLWCOUVc{height:18px}.FyLpt0kIWG1bTDWZ8HIL1{margin-top:4px}._2ntJEAiwKXBGvxrJiqxx_2,._1SqBC7PQ5dMOdF0MhPIkA8{vertical-align:middle}._1SqBC7PQ5dMOdF0MhPIkA8{-ms-flex-align:center;align-items:center;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center}
._2a172ppKObqWfRHr8eWBKV{-ms-flex-negative:0;flex-shrink:0;margin-right:8px}._39-woRduNuowN7G4JTW4I8{border-top:1px solid var(–newCommunityTheme-widgetColors-lineColor);margin-top:12px;padding-top:12px}._3AOoBdXa2QKVKqIEmG7Vkb{font-size:12px;font-weight:400;line-height:16px;-ms-flex-align:center;align-items:center;background-color:var(–newCommunityTheme-body);border-radius:4px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;margin-top:12px}.vzEDg-tM8ZDpEfJnbaJuU{color:var(–newCommunityTheme-button);fill:var(–newCommunityTheme-button);height:14px;width:14px}.r51dfG6q3N-4exmkjHQg_{font-size:10px;font-weight:700;letter-spacing:.5px;line-height:12px;text-transform:uppercase;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}._2ygXHcy_x6RG74BMk0UKkN{margin-left:8px}._2BnLYNBALzjH6p_ollJ-RF{display:-ms-flexbox;display:flex;margin-left:auto}._1-25VxiIsZFVU88qFh-T8p{padding:0}._3BmRwhm18nr4GmDhkoSgtb{color:var(–newCommunityTheme-bodyText);-ms-flex:0 0 auto;flex:0 0 auto;line-height:16px}
._2FKpII1jz0h6xCAw1kQAvS{background-color:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.1),0 2px 3px 0 rgba(0,0,0,.2);transition:left .15s linear;border-radius:57%;width:57%}._2FKpII1jz0h6xCAw1kQAvS:after{content:””;padding-top:100%;display:block}._2e2g485kpErHhJQUiyvvC2{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;background-color:var(–newCommunityTheme-navIconFaded10);border:2px solid transparent;border-radius:100px;cursor:pointer;position:relative;width:35px;transition:border-color .15s linear,background-color .15s linear}._2e2g485kpErHhJQUiyvvC2._3kUvbpMbR21zJBboDdBH7D{background-color:var(–newRedditTheme-navIconFaded10)}._2e2g485kpErHhJQUiyvvC2._3kUvbpMbR21zJBboDdBH7D._1L5kUnhRYhUJ4TkMbOTKkI{background-color:var(–newRedditTheme-active)}._2e2g485kpErHhJQUiyvvC2._3kUvbpMbR21zJBboDdBH7D._1L5kUnhRYhUJ4TkMbOTKkI._3clF3xRMqSWmoBQpXv8U5z{background-color:var(–newRedditTheme-buttonAlpha10)}._2e2g485kpErHhJQUiyvvC2._1asGWL2_XadHoBuUlNArOq{border-width:2.25px;height:24px;width:37.5px}._2e2g485kpErHhJQUiyvvC2._1asGWL2_XadHoBuUlNArOq ._2FKpII1jz0h6xCAw1kQAvS{height:19.5px;width:19.5px}._2e2g485kpErHhJQUiyvvC2._1hku5xiXsbqzLmszstPyR3{border-width:3px;height:32px;width:50px}._2e2g485kpErHhJQUiyvvC2._1hku5xiXsbqzLmszstPyR3 ._2FKpII1jz0h6xCAw1kQAvS{height:26px;width:26px}._2e2g485kpErHhJQUiyvvC2._10hZCcuqkss2sf5UbBMCSD{border-width:3.75px;height:40px;width:62.5px}._2e2g485kpErHhJQUiyvvC2._10hZCcuqkss2sf5UbBMCSD ._2FKpII1jz0h6xCAw1kQAvS{height:32.5px;width:32.5px}._2e2g485kpErHhJQUiyvvC2._1fCdbQCDv6tiX242k80-LO{border-width:4.5px;height:48px;width:75px}._2e2g485kpErHhJQUiyvvC2._1fCdbQCDv6tiX242k80-LO ._2FKpII1jz0h6xCAw1kQAvS{height:39px;width:39px}._2e2g485kpErHhJQUiyvvC2._2Jp5Pv4tgpAsTcnUzTsXgO{border-width:5.25px;height:56px;width:87.5px}._2e2g485kpErHhJQUiyvvC2._2Jp5Pv4tgpAsTcnUzTsXgO ._2FKpII1jz0h6xCAw1kQAvS{height:45.5px;width:45.5px}._2e2g485kpErHhJQUiyvvC2._1L5kUnhRYhUJ4TkMbOTKkI{-ms-flex-pack:end;justify-content:flex-end;background-color:var(–newCommunityTheme-active)}._2e2g485kpErHhJQUiyvvC2._3clF3xRMqSWmoBQpXv8U5z{cursor:default}._2e2g485kpErHhJQUiyvvC2._3clF3xRMqSWmoBQpXv8U5z ._2FKpII1jz0h6xCAw1kQAvS{box-shadow:none}._2e2g485kpErHhJQUiyvvC2._1L5kUnhRYhUJ4TkMbOTKkI._3clF3xRMqSWmoBQpXv8U5z{background-color:var(–newCommunityTheme-buttonAlpha10)}
._3Qx5bBCG_O8wVZee9J-KyJ{border-top:1px solid var(–newRedditTheme-line);margin-top:16px;padding-top:16px}._3Qx5bBCG_O8wVZee9J-KyJ ._2NbKFI9n3wPM76pgfAPEsN{margin:0;padding:0}._3Qx5bBCG_O8wVZee9J-KyJ ._2NbKFI9n3wPM76pgfAPEsN ._2btz68cXFBI3RWcfSNwbmJ{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:21px;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;margin:8px 0}._3Qx5bBCG_O8wVZee9J-KyJ ._2NbKFI9n3wPM76pgfAPEsN ._2btz68cXFBI3RWcfSNwbmJ.QgBK4ECuqpeR2umRjYcP2{opacity:.4}._3Qx5bBCG_O8wVZee9J-KyJ ._2NbKFI9n3wPM76pgfAPEsN ._2btz68cXFBI3RWcfSNwbmJ label{font-size:12px;font-weight:500;line-height:16px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}._3Qx5bBCG_O8wVZee9J-KyJ ._2NbKFI9n3wPM76pgfAPEsN ._2btz68cXFBI3RWcfSNwbmJ label svg{fill:currentColor;height:20px;margin-right:4px;width:20px;-ms-flex:0 0 auto;flex:0 0 auto}._3Qx5bBCG_O8wVZee9J-KyJ ._4OtOUaGIjjp2cNJMUxme_{-ms-flex-pack:justify;justify-content:space-between}._3Qx5bBCG_O8wVZee9J-KyJ ._4OtOUaGIjjp2cNJMUxme_ svg{display:inline-block;height:12px;width:12px}._2b2iJtPCDQ6eKanYDf3Jho{-ms-flex:0 0 auto;flex:0 0 auto}._4OtOUaGIjjp2cNJMUxme_{padding:0 12px}._1ra1vBLrjtHjhYDZ_gOy8F{font-family:Noto Sans,Arial,sans-serif;font-size:12px;letter-spacing:unset;line-height:16px;text-transform:unset;–textColor:var(–newCommunityTheme-widgetColors-sidebarWidgetTextColor);–textColorHover:var(–newCommunityTheme-widgetColors-sidebarWidgetTextColorShaded80);font-size:10px;font-weight:700;letter-spacing:.5px;line-height:12px;text-transform:uppercase;color:var(–textColor);fill:var(–textColor);opacity:1}._1ra1vBLrjtHjhYDZ_gOy8F._2UlgIO1LIFVpT30ItAtPfb{–textColor:var(–newRedditTheme-widgetColors-sidebarWidgetTextColor);–textColorHover:var(–newRedditTheme-widgetColors-sidebarWidgetTextColorShaded80)}._1ra1vBLrjtHjhYDZ_gOy8F:active,._1ra1vBLrjtHjhYDZ_gOy8F:hover{color:var(–textColorHover);fill:var(–textColorHover)}._1ra1vBLrjtHjhYDZ_gOy8F:disabled,._1ra1vBLrjtHjhYDZ_gOy8F[data-disabled],._1ra1vBLrjtHjhYDZ_gOy8F[disabled]{opacity:.5;cursor:not-allowed}.isInIcons2020 ._3a4fkgD25f5G-b0Y8wVIBe{margin-right:8px}
.c_dVyWK3BXRxSN3ULLJ_t{border-radius:4px 4px 0 0;height:34px;left:0;position:absolute;right:0;top:0}._1OQL3FCA9BfgI57ghHHgV3{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;-ms-flex-pack:start;justify-content:flex-start;margin-top:32px}._1OQL3FCA9BfgI57ghHHgV3 ._33jgwegeMTJ-FJaaHMeOjV{border-radius:9001px;height:32px;width:32px}._1OQL3FCA9BfgI57ghHHgV3 ._1wQQNkVR4qNpQCzA19X4B6{height:16px;margin-left:8px;width:200px}._39IvqNe6cqNVXcMFxFWFxx{display:-ms-flexbox;display:flex;margin:12px 0}._39IvqNe6cqNVXcMFxFWFxx ._29TSdL_ZMpyzfQ_bfdcBSc{-ms-flex:1;flex:1}._39IvqNe6cqNVXcMFxFWFxx .JEV9fXVlt_7DgH-zLepBH{height:18px;width:50px}._39IvqNe6cqNVXcMFxFWFxx ._3YCOmnWpGeRBW_Psd5WMPR{height:12px;margin-top:4px;width:60px}._2iO5zt81CSiYhWRF9WylyN{height:18px;margin-bottom:4px}._2iO5zt81CSiYhWRF9WylyN._2E9u5XvlGwlpnzki78vasG{width:230px}._2iO5zt81CSiYhWRF9WylyN.fDElwzn43eJToKzSCkejE{width:100%}._2iO5zt81CSiYhWRF9WylyN._2kNB7LAYYqYdyS85f8pqfi{width:250px}._2iO5zt81CSiYhWRF9WylyN._1XmngqAPKZO_1lDBwcQrR7{width:120px}._3XbVvl-zJDbcDeEdSgxV4_{border-radius:4px;height:32px;margin-top:16px;width:100%}._2hgXdc8jVQaXYAXvnqEyED{animation:_3XkHjK4wMgxtjzC1TvoXrb 1.5s ease infinite;background:linear-gradient(90deg,var(–newCommunityTheme-field),var(–newCommunityTheme-inactive),var(–newCommunityTheme-field));background-size:200%}._1KWSZXqSM_BLhBzkPyJFGR{background-color:var(–newCommunityTheme-widgetColors-sidebarWidgetBackgroundColor);border-radius:4px;padding:12px;position:relative;width:auto}
@keyframes _1tIZttmhLdrIGrB-6VvZcT{0%{opacity:0}to{opacity:1}}._3uK2I0hi3JFTKnMUFHD2Pd,.HQ2VJViRjokXpRbJzPvvc{–infoTextTooltip-overflow-left:0px;font-size:12px;font-weight:500;line-height:16px;padding:3px 9px;position:absolute;border-radius:4px;margin-top:-6px;background:#000;color:#fff;animation:_1tIZttmhLdrIGrB-6VvZcT .5s step-end;z-index:100;white-space:pre-wrap}._3uK2I0hi3JFTKnMUFHD2Pd:after,.HQ2VJViRjokXpRbJzPvvc:after{content:””;position:absolute;top:100%;left:calc(50% – 4px – var(–infoTextTooltip-overflow-left));width:0;height:0;border-top:3px solid #000;border-left:4px solid transparent;border-right:4px solid transparent}._3uK2I0hi3JFTKnMUFHD2Pd{margin-top:6px}._3uK2I0hi3JFTKnMUFHD2Pd:after{border-bottom:3px solid #000;border-top:none;bottom:100%;top:auto}
._2Gt13AX94UlLxkluAMsZqP{background-position:50%;background-repeat:no-repeat;background-size:contain;position:relative;display:inline-block}
._1QwShihKKlyRXyQSlqYaWW{height:16px;width:16px;vertical-align:bottom}._2X6EB3ZhEeXCh1eIVA64XM{margin-left:3px}._1jNPl3YUk6zbpLWdjaJT1r{font-size:12px;font-weight:500;line-height:16px;border-radius:2px;display:inline-block;margin-right:5px;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;white-space:pre;word-break:normal;padding:0 4px}._1jNPl3YUk6zbpLWdjaJT1r._39BEcWjOlYi1QGcJil6-yl{padding:0}._2hSecp_zkPm_s5ddV2htoj{font-size:12px;font-weight:500;line-height:16px;border-radius:2px;display:inline-block;margin-right:5px;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;white-space:pre;word-break:normal;margin-left:0;padding:0 4px}._2hSecp_zkPm_s5ddV2htoj._39BEcWjOlYi1QGcJil6-yl{padding:0}._1wzhGvvafQFOWAyA157okr{font-size:12px;font-weight:500;line-height:16px;border-radius:2px;margin-right:5px;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;white-space:pre;word-break:normal;box-sizing:border-box;line-height:14px;padding:0 4px}._3BPVpMSn5b1vb1yTQuqCRH,._1wzhGvvafQFOWAyA157okr{display:inline-block;height:16px}._3BPVpMSn5b1vb1yTQuqCRH{background-color:var(–newRedditTheme-body);border-radius:50%;margin-left:5px;text-align:center;width:16px}._2cvySYWkqJfynvXFOpNc5L{height:10px;width:10px}.aJrgrewN9C8x1Fusdx4hh{padding:2px 8px}._1wj6zoMi6hRP5YhJ8nXWXE{font-size:14px;padding:7px 12px}._2VqfzH0dZ9dIl3XWNxs42y{border-radius:20px}._2VqfzH0dZ9dIl3XWNxs42y:hover{opacity:.85}._2VqfzH0dZ9dIl3XWNxs42y:active{transform:scale(.95)}
._7_d4sJjd2oYzaJuU_QpOI{font-size:12px;font-weight:500;line-height:16px;border-radius:2px;display:inline-block;margin-right:5px;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;white-space:pre;word-break:normal;background-color:var(–newRedditTheme-flair);color:var(–newRedditTheme-linkText);margin-top:10px;padding:0 4px}._7_d4sJjd2oYzaJuU_QpOI._1rtoCmW_7bFJWYffSOwt4R{margin-top:0}
._13jLUpnQtcA8FXyw5Kv06q{display:-ms-inline-flexbox;display:inline-flex;-ms-flex:0 0 auto;flex:0 0 auto}

/*# sourceMappingURL=https://www.redditstatic.com/desktop2x/chunkCSS/IdCard.87dd817064f367bf3fa7.css.map*/._2JU2WQDzn5pAlpxqChbxr7{height:16px;margin-right:8px;width:16px}._3E45je-29yDjfFqFcLCXyH{margin-top:16px}._13YtS_rCnVZG1ns2xaCalg{font-family:Noto Sans,Arial,sans-serif;font-size:14px;font-weight:400;line-height:18px;display:-ms-flexbox;display:flex}._1m5fPZN4q3vKVg9SgU43u2{margin-top:12px}._17A-IdW3j1_fI_pN-8tMV-{display:inline-block;margin-bottom:8px;margin-right:5px}._5MIPBF8A9vXwwXFumpGqY{border-radius:20px;font-size:12px;font-weight:500;letter-spacing:0;line-height:16px;padding:3px 10px;text-transform:none}._5MIPBF8A9vXwwXFumpGqY:focus{outline:unset}

/*# sourceMappingURL=https://www.redditstatic.com/desktop2x/chunkCSS/TopicLinksContainer.361933014be843c79476.css.map*/