diff --git a/.gitignore b/.gitignore index 5bb3aad..91f8086 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,6 @@ pnpm-debug.log* .DS_Store # PageFind -public/pagefind \ No newline at end of file +public/pagefind + +md-to-html.exe \ No newline at end of file diff --git a/README.md b/README.md index b7e8ae9..68ae899 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,17 @@ [![Coworking website](public/assets/cowo.webp)](https://coworking-guide.vercel.app/) +hello + --- ## Table of Contents - [Coworking Guide](#coworking-guide) - [Table of Contents](#table-of-contents) - - [Introduction](#introduction) + - [Contributing](#contributing) --- -## Introduction +## Contributing diff --git a/astro.config.mjs b/astro.config.mjs index 0344ea7..50c748c 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -3,11 +3,23 @@ import tailwind from "@astrojs/tailwind"; import mdx from "@astrojs/mdx"; import react from "@astrojs/react"; import expressiveCode from "astro-expressive-code"; +import remarkDirective from "remark-directive"; +import remarkCalloutDirectives from "./src/assets/plugins/remark-callout-directives-customized.js"; // https://astro.build/config export default defineConfig({ - integrations: [tailwind(), expressiveCode(), mdx(), react()], + integrations: [ + tailwind(), + expressiveCode(), + mdx({ + remarkPlugins: [remarkDirective, remarkCalloutDirectives], + }), + react(), + ], server: { - port: 3000, + port: 4321, + }, + markdown: { + remarkPlugins: [remarkDirective, remarkCalloutDirectives], }, }); diff --git a/package-lock.json b/package-lock.json index d15119b..857e132 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "framer-motion": "^11.0.12", "react": "^18.2.0", "react-dom": "^18.2.0", + "remark-directive": "^3.0.0", "tailwind-merge": "^2.2.1", "tailwindcss": "^3.4.1", "typescript": "^5.4.3" @@ -4379,6 +4380,25 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", @@ -4740,6 +4760,24 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-extension-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", + "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", @@ -6501,6 +6539,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-expressive-code": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/remark-expressive-code/-/remark-expressive-code-0.33.5.tgz", diff --git a/package.json b/package.json index 36695b5..ccffcb3 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "astro dev --open", "start": "astro dev", - "build": "astro build && pagefind --site dist && copy -r dist/pagefind public/", + "build": "astro build && pagefind --site dist", "preview": "astro preview", "astro": "astro" }, @@ -23,6 +23,7 @@ "framer-motion": "^11.0.12", "react": "^18.2.0", "react-dom": "^18.2.0", + "remark-directive": "^3.0.0", "tailwind-merge": "^2.2.1", "tailwindcss": "^3.4.1", "typescript": "^5.4.3" diff --git a/src/assets/plugins/remark-callout-directives-customized.js b/src/assets/plugins/remark-callout-directives-customized.js new file mode 100644 index 0000000..b055bcb --- /dev/null +++ b/src/assets/plugins/remark-callout-directives-customized.js @@ -0,0 +1,116 @@ +/* taken from MIT Licensed https://github.com/Microflash/remark-callout-directives */ + +import { visit } from "unist-util-visit"; +import { fromMarkdown } from "mdast-util-from-markdown"; +import { h } from "hastscript"; + +function generate(title, children, hint) { + const indicators = []; + + if (hint) { + indicators.push({ + type: "html", + value: hint, + }); + } + + const titleNode = fromMarkdown(title).children[0]; + if (titleNode.type === "paragraph") { + titleNode.data = { + hName: "div", + hProperties: { className: ["callout-title"] }, + }; + } else { + titleNode.data = { + hProperties: { className: ["callout-title"] }, + }; + } + indicators.push(titleNode); + + return [ + { + type: "paragraph", + data: { + hName: "div", + hProperties: { className: ["callout-indicator"] }, + }, + children: indicators, + }, + { + type: "paragraph", + data: { + hName: "div", + hProperties: { className: ["callout-content"] }, + }, + children, + }, + ]; +} + +const callouts = { + note: { + title: "Note", + hint: ``, + }, + success: { + title: "Success", + hint: ``, + }, + warn: { + title: "Warning", + hint: ``, + }, + danger: { + title: "Danger", + hint: ``, + }, + tip: { + title: "Tip", + hint: ``, + }, +}; + +/** + * adds callouts/admonitions + * ``` + * :::warn{title="example"} + * example warning + * ::: + * ``` + * + * supports: warn, note, success, danger, tip + * @see {@link callouts} to edit icons + */ +export default function remarkCalloutDirectives() { + return (tree) => { + visit(tree, (node) => { + if (node.type === "containerDirective") { + if (!callouts[node.name]) { + return; + } + const callout = callouts[node.name]; + const data = node.data || (node.data = {}); + const { title, ...attributes } = node.attributes; + + node.attributes = { + ...attributes, + class: + "class" in attributes + ? `callout callout-${node.name} ${attributes.class}` + : `callout callout-${node.name}`, + }; + + node.children = generate( + title || callout.title, + node.children, + callout.hint, + ); + + const tagName = callout.tagName || "aside"; + const hast = h(tagName, node.attributes); + data.hName = hast.tagName; + data.hProperties = hast.properties; + } + }); + }; +} diff --git a/src/assets/styles/remark-callout-directives.css b/src/assets/styles/remark-callout-directives.css new file mode 100644 index 0000000..cbb8be9 --- /dev/null +++ b/src/assets/styles/remark-callout-directives.css @@ -0,0 +1,102 @@ +/* This is taken from @microflash/remark-callout-directives/themes/github/index.css and modified. Modified to work with tailwind darkMode: class, among other things */ + +/* html { + --callout-headingFontColor-note: hsl(235, 76%, 29%); + --callout-bg-note: hsl(236, 77%, 90%); + --callout-border-note: hsl(235, 82%, 59%); + --callout-headingFontColor-success: hsl(137, 72%, 24%); + --callout-bg-success: hsl(96, 79%, 91%); + --callout-border-success: hsl(137, 66%, 30%); + --callout-headingFontColor-tip: hsl(277, 76%, 31%); + --callout-bg-tip: hsl(276, 70%, 90%); + --callout-border-tip: hsl(277, 81%, 60%); + --callout-headingFontColor-warn: hsl(41, 57%, 27%); + --callout-bg-warn: hsl(43, 80%, 88%); + --callout-border-warn: hsl(41, 80%, 63%); + --callout-headingFontColor-danger: hsl(342, 62%, 31%); + --callout-bg-danger: hsl(338, 57%, 89%); + --callout-border-danger: hsl(341, 72%, 60%); +} */ + +html { + --callout-headingFontColor-note: hsl(235, 86%, 86%); + --callout-bg-note: hsl(235, 50%, 20%); + --callout-border-note: hsl(235, 90%, 59%); + --callout-headingFontColor-success: hsl(96, 77%, 81%); + --callout-bg-success: hsl(95, 33%, 23%); + --callout-border-success: hsl(96, 77%, 81%); + --callout-headingFontColor-tip: hsl(276, 72%, 89%); + --callout-bg-tip: hsl(276, 36%, 22%); + --callout-border-tip: hsl(277, 81%, 60%); + --callout-headingFontColor-warn: hsl(42, 72%, 87%); + --callout-bg-warn: hsl(43, 33%, 22%); + --callout-border-warn: hsl(42, 72%, 65%); + --callout-headingFontColor-danger: hsl(338, 61%, 86%); + --callout-bg-danger: hsl(339, 32%, 21%); + --callout-border-danger: hsl(340, 64%, 62%); +} + +.callout { + --calloutheadingFontColor: var(--callout-headingFontColor); + --callout-bg: var(--callout-bg); + --callout-border: var(--callout-border); + border-left: 0.25em solid var(--callout-border); + padding: 0.5rem 1rem; + color: inherit; + background-color: var(--callout-bg); +} + +.callout-indicator { + display: flex; + align-items: center; + line-height: 1; + margin-bottom: 16px; + color: var(--calloutheadingFontColor); +} + +.callout-title { + font-weight: 600; + font-size: 18px; + letter-spacing: 0.025em; +} + +.callout-indicator > svg:first-of-type { + margin-right: 0.5rem; +} + +.callout-content:first-child, +.callout-content:only-child { + margin-block-start: 0; +} + +.callout-content:last-child, +.callout-content:only-child { + margin-block-end: 0; +} + +.callout-note { + --callout-headingFontColor: var(--callout-headingFontColor-note); + --callout-bg: var(--callout-bg-note); + --callout-border: var(--callout-border-note); +} + +.callout-success { + --callout-headingFontColor: var(--callout-headingFontColor-success); + --callout-bg: var(--callout-bg-success); + --callout-border: var(--callout-border-success); +} +.callout-warn { + --callout-headingFontColor: var(--callout-headingFontColor-warn); + --callout-bg: var(--callout-bg-warn); + --callout-border: var(--callout-border-warn); +} +.callout-danger { + --callout-headingFontColor: var(--callout-headingFontColor-danger); + --callout-bg: var(--callout-bg-danger); + --callout-border: var(--callout-border-danger); +} +.callout-tip { + --callout-headingFontColor: var(--callout-headingFontColor-tip); + --callout-bg: var(--callout-bg-tip); + --callout-border: var(--callout-border-tip); +} diff --git a/src/components/blocks/BlogPostPreview.astro b/src/components/blocks/BlogPostPreview.astro index 68f4f60..16a8a63 100644 --- a/src/components/blocks/BlogPostPreview.astro +++ b/src/components/blocks/BlogPostPreview.astro @@ -35,10 +35,11 @@ const { title, tagline, pubDate, url } = Astro.props;

{title}

{tagline}

diff --git a/src/components/blocks/navBar.astro b/src/components/blocks/navBar.astro index 782cf5a..06e2a0e 100644 --- a/src/components/blocks/navBar.astro +++ b/src/components/blocks/navBar.astro @@ -125,15 +125,17 @@ import SearchModal from "../ui/SearchModal.astro"; }); }); }); - window.addEventListener("DOMContentLoaded", (event) => { - // @ts-ignore - new PagefindUI({ - element: "#search", - showSubResults: false, - showEmptyFilters: false, - debounceTimeoutMs: 0, - showImages: false, - autofocus: false, - }); - }); + + // comment this out if you don't want the search modal + // window.addEventListener("DOMContentLoaded", (event) => { + // // @ts-ignore + // new PagefindUI({ + // element: "#search", + // showSubResults: false, + // showEmptyFilters: false, + // debounceTimeoutMs: 0, + // showImages: false, + // autofocus: false, + // }); + // }); diff --git a/src/components/ui/BlurBackground.astro b/src/components/ui/BlurBackground.astro index df64360..772dd31 100644 --- a/src/components/ui/BlurBackground.astro +++ b/src/components/ui/BlurBackground.astro @@ -1,5 +1,5 @@
Getting started with
Coworking streams
@@ -10,6 +10,6 @@
- Brought to you by RythonDev x Coworking Crew + Brought to you by RythonDev
diff --git a/src/components/ui/card-hover-effect.tsx b/src/components/ui/card-hover-effect.tsx index 0628a43..05dc0be 100644 --- a/src/components/ui/card-hover-effect.tsx +++ b/src/components/ui/card-hover-effect.tsx @@ -33,7 +33,7 @@ export const HoverEffect = ({ {hoveredIndex === idx && ( + +by [RythonDev](https://twitch.tv/RythonDev) + +
\ No newline at end of file diff --git a/src/content/posts/1-coworking-category.md b/src/content/posts/1-coworking-category.md deleted file mode 100644 index dd4ab22..0000000 --- a/src/content/posts/1-coworking-category.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -heading: Unofficial Coworking Category, Yay or Nay? -subheading: Recent unofficial coworking category has sparked an intense discussion amongst the community -author: RythonDev -slug: unofficial-coworking-category -pubDate: 2024-03-10 15:13 -image: { - url: "/images/blogs/coworking-category/coworking-category.webp", - alt: "Coworking Category" -} ---- - -## How it started - -On 27th February 2024, a "Coworking" category appeared on Twitch. However, this is not an official category from Twitch, rather a "small, distraction game" as listed in IGDB (Internet Game Database), the database Twitch uses to provide gaming categories. - -As a result, a significant number of coworking and study streamers use this category as a way to improve their discoverability since it is less saturated compared to the "Just Chatting" category. - -As of writing, the intention behind publishing the "Coworking" category still remains unclear. - ---- - -## Productivity streamers started using it - -The coworking & study community has been [petitioning for a Coworking and Study category](https://twitch.uservoice.com/forums/310210-discover/suggestions/46004791-coworking) since late 2022, stating that it would improve discoverability for productivity streamers. - -Once this "Coworking" category came out, coworking and study streamers became aware of it and started using it as a makeshift category to improve discoverability of their streams. It also clarifies that it's a productivity stream rather than a regular Just Chatting stream (from a following feed, as an example). - -While some of these streamers may be aware that it's a "game category", quite a number of them are not. - ---- - -## Why many streamers decided against using it - -Many experienced coworking streamers have shown disinterest with the new "Coworking" category because it is a game and has little viewers compared to Just Chatting. Since it has a much smaller audience compared to Just Chatting, it may lead to reduced chances of being discovered by potential viewers. - -A member of the coworking community said: - -> (Basically, because) I'm trying to hit partner, and if I use a non-Just Chatting category right now, I'd only be limiting my exposure to new viewers - -The official Coworking Crew team has also made a statement regarding this topic: - -> As a Coworking Crew Team, we believe it might affect individual streamers' discoverability and could give Twitch the wrong idea about our satisfaction with not having an officially endorsed category. - -There are other discussions about the cons of using the "Coworking" category: - -- Low chance of being in the "Reading, Studying and Coworking" collection on the front page -- Subjected to be in violation of Twitch TOS about "miscategorizing" since you're not playing the game. -- Causing a significant divide in algorithm from those productivity streamers using "Just Chatting" as their category -- May reduce likelihood of Twitch actually implementing an official Coworking category, due to concerns of conflicts in the algorithm (Twitch may think: A lot of people are streaming "coworking", implementing a "coworking & study" category will just mess things up) - -### But "I'm Only Sleeping" streamers are misusing the game category - -The coworking community is more passionate and dedicated to have their own space on the platform, compared to "I'm Only Sleeping" streamers who don't bother about having an official "sleeping" category. - -In the end, misusing the game category is still against Twitch's Terms of Service and doing so may lead to warnings, suspensions or a permanent strike on your channel. - ---- - -## How does the new category affect the Twitch algorithm? - -As mentioned several times, the "coworking" category is a game. This means that Twitch's algorithm will: - -- Register streamers in that category as "playing a game" -- Users who watch "Coworking" for a long period of time as avid gaming stream viewers - -As a result, Twitch's recommendation algorithm may: -- Recommend "Coworking" category streamers to avid gaming viewers -- Recommend gaming streams to productivity viewers - -Although Twitch's recommendation algorithm remain a mystery to the general public, companies that use data analytics tend to follow similar patterns. - ---- - -## Pros and Cons - -Here are the listed pros and cons of using the "Coworking" category, which may or may not include what has been elaborated before: - -### Pros of using "Coworking" category: - -1. Less competition than "Just Chatting". - -2. More discoverability from people searching by the category. - -3. Allow users to know when it's a productivity stream, rather than a regular Just Chatting stream (from a following feed, for example). - -### Cons of using "Coworking" category: - -1. Twitch thinks you're playing a game. - -2. (Speculation) Users who watch the "Coworking" category may be misunderstood by the algorithm, leading to more game recommendations. - -3. (Speculation) Streamers using the "Coworking" category may have a significant divide from those who are using the "Just Chatting" category by the Twitch algorithm (in terms of user recommendations). - -4. You're less likely to be on the "Reading, Studying, and Coworking" list on the front page. - -5. Subjected to be in violation of Twitch TOS about "miscategorizing" since you're not playing the game. - -6. (Speculation) May reduce likelihood of Twitch actually implementing an official Coworking category, due to concerns of conflicts in the algorithm (Twitch may think: A lot of people are streaming "coworking", implementing a "coworking & study" category will just mess things up). - ---- - -## Conclusion - -The purpose of this post is not to persuade people to "pick a side", rather it is meant to inform and show the bigger picture of this "Coworking" category. Please do not pressure nor target any streamers regarding this topic, and don't forget to [VOTE for an official Coworking and Study category](https://twitch.uservoice.com/forums/310210-discover/suggestions/46004791-coworking). - -## Edit: - -As of 15th March 2024, the "Coworking" game category has been removed from IGDB and Twitch. - ---- - -by [RythonDev](https://twitch.tv/RythonDev) \ No newline at end of file diff --git a/src/layouts/GuideLayout.astro b/src/layouts/GuideLayout.astro index 76b03c7..c5f1d3d 100644 --- a/src/layouts/GuideLayout.astro +++ b/src/layouts/GuideLayout.astro @@ -2,6 +2,7 @@ import Layout from "./Layout.astro"; import TableOfContent from "../components/blocks/TableOfContent.astro"; import VerticalNav from "../components/blocks/verticalNav.astro"; +import "../assets/styles/remark-callout-directives.css"; const { frontmatter, headings } = Astro.props; --- diff --git a/src/pages/blog/posts/[...slug].astro b/src/pages/blog/posts/[...slug].astro index b497ae3..20f3a62 100644 --- a/src/pages/blog/posts/[...slug].astro +++ b/src/pages/blog/posts/[...slug].astro @@ -4,42 +4,42 @@ import BlogPostLayout from "../../../layouts/BlogPostLayout.astro"; import { Image } from "astro:assets"; function timeAgo(date: Date) { - const dateObject = new Date(date); - const seconds = Math.floor( - (new Date().getTime() - dateObject.getTime()) / 1000, - ); - let interval = Math.floor(seconds / 31536000); + const dateObject = new Date(date); + const seconds = Math.floor( + (new Date().getTime() - dateObject.getTime()) / 1000 + ); + let interval = Math.floor(seconds / 31536000); - if (interval >= 1) { - return interval + (interval === 1 ? " year ago" : " years ago"); - } - interval = Math.floor(seconds / 2592000); - if (interval >= 1) { - return interval + (interval === 1 ? " month ago" : " months ago"); - } - interval = Math.floor(seconds / 86400); - if (interval >= 1) { - return interval + (interval === 1 ? " day ago" : " days ago"); - } - interval = Math.floor(seconds / 3600); - if (interval >= 1) { - return interval + (interval === 1 ? " hour ago" : " hours ago"); - } - interval = Math.floor(seconds / 60); - if (interval > 1) { - return interval + (interval === 1 ? " minute ago" : " minutes ago"); - } - return ( - Math.floor(seconds) + (seconds === 1 ? " second ago" : " seconds ago") - ); + if (interval >= 1) { + return interval + (interval === 1 ? " year ago" : " years ago"); + } + interval = Math.floor(seconds / 2592000); + if (interval >= 1) { + return interval + (interval === 1 ? " month ago" : " months ago"); + } + interval = Math.floor(seconds / 86400); + if (interval >= 1) { + return interval + (interval === 1 ? " day ago" : " days ago"); + } + interval = Math.floor(seconds / 3600); + if (interval >= 1) { + return interval + (interval === 1 ? " hour ago" : " hours ago"); + } + interval = Math.floor(seconds / 60); + if (interval > 1) { + return interval + (interval === 1 ? " minute ago" : " minutes ago"); + } + return ( + Math.floor(seconds) + (seconds === 1 ? " second ago" : " seconds ago") + ); } export async function getStaticPaths() { - const blogEntries = await getCollection("posts"); - return blogEntries.map((entry) => ({ - params: { slug: entry.slug }, - props: { entry }, - })); + const blogEntries = await getCollection("posts"); + return blogEntries.map((entry) => ({ + params: { slug: entry.slug }, + props: { entry }, + })); } const { entry } = Astro.props; @@ -47,24 +47,28 @@ const { Content, headings } = await entry.render(); --- -

{entry.data.heading}

-

{entry.data.subheading}

-

by {entry.data.author}

-

- Published {timeAgo(new Date(entry.data.pubDate))} -

+

{entry.data.heading}

+

{entry.data.subheading}

+
+

+ By {entry.data.author} +

+

+ Published {timeAgo(new Date(entry.data.pubDate))} +

+
- { - entry.data.image && ( - {entry.data.image.alt} - ) - } - + { + entry.data.image && ( + {entry.data.image.alt} + ) + } +
diff --git a/src/pages/credits/index.md b/src/pages/credits/index.md index 4e166fd..0ebe947 100644 --- a/src/pages/credits/index.md +++ b/src/pages/credits/index.md @@ -10,7 +10,7 @@ Credits to the wonderful team of people behind this guide! --- -RythonDev +RythonDev ## RythonDev diff --git a/src/pages/guide/moderation-and-trolls.md b/src/pages/guide/moderation-and-trolls.md index 4b8e629..92b6f37 100644 --- a/src/pages/guide/moderation-and-trolls.md +++ b/src/pages/guide/moderation-and-trolls.md @@ -21,7 +21,10 @@ Consider these three main things when choosing your mods: As well as this, it is ideal if mods are welcoming and active in your community - you can't always be there to say hi to everyone while your working so it's great to have a friendly mod team to welcome new people and answer questions! -> How you invite your mods is a personal choice! And don't feel bad if you ask someone and they say no - not everyone is up for the job! If you know someone you'd like as a mod you could DM them with a personal invite, otherwise you could create an application form if that suits you and your community better! +:::note +How you invite your mods is a personal choice! And don't feel bad if you ask someone and they say no - not everyone is up for the job! If you know someone you'd like as a mod you could DM them with a personal invite, otherwise you could create an application form if that suits you and your community better! +::: + --- diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 04a4302..98456ee 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -4,8 +4,8 @@ module.exports = { theme: { extend: { backgroundImage: (theme) => ({ - "gradient-pink-cyan": - "linear-gradient(to right, #F7418F,#FF7782 , aquamarine)", + "hero-gradient": + "linear-gradient(to right, #3F84D8, aquamarine, #C65BCF)", }), keyframes: { rotate: { @@ -32,16 +32,27 @@ module.exports = { opacity: "1", }, }, + scaleIn: { + from: { + transform: "scale(0)", + }, + to: { + transform: "scale(1)", + }, + }, }, animation: { "spin-slow": "rotate 15s linear infinite", gradient: "gradient 15s ease infinite", fadeIn: "fadeIn 0.3s ease-in-out forwards", + scaleIn: "scaleIn 0.3s ease-in-out forwards", }, colors: { "cowo-pink": "#FF7782", secondary: "#171717", primary: "#fafafa", + "primary-green": "#88D47D", + "primary-blue": "#3F84D8", }, }, },