From a53e808aec50cb064057002b79a74e749858e047 Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Tue, 8 Apr 2025 13:36:39 -0400 Subject: [PATCH] feat: Updates to network article. --- Sources/Docs/Templates/BaseLayout.swift | 11 +--- Sources/Docs/Templates/HomeLink.swift | 13 ++-- Sources/Docs/Templates/RenderPage.swift | 45 +++++++------ content/articles/2025-04-02-Network.md | 76 ++++++++++++++++++---- content/articles/2025-04-04-servers.md | 20 ++++-- content/articles/2025-04-07-PhoneSystem.md | 1 + content/articles/2025-04-07-TimeMachine.md | 1 + content/articles/2025-04-08-LinkSharing.md | 1 + content/static/input.css | 2 +- content/static/output.css | 2 +- 10 files changed, 122 insertions(+), 50 deletions(-) diff --git a/Sources/Docs/Templates/BaseLayout.swift b/Sources/Docs/Templates/BaseLayout.swift index 7cefa0f..7fc7dda 100644 --- a/Sources/Docs/Templates/BaseLayout.swift +++ b/Sources/Docs/Templates/BaseLayout.swift @@ -20,7 +20,7 @@ func baseLayout( return [ .documentType("html"), html(lang: "en-US") { - generateHeader(pageTitle, extraHeader) + generateHead(pageTitle, extraHeader) body(class: "text-white text-lg pb-5 font-avenir \(section.rawValue)") { siteHeader(section) @@ -80,19 +80,16 @@ private func footer(_ rssLink: String) -> Node { "(" %a( class: "[&:hover]:border-b border-green-400", - href: "https://github.com/m-housh/mhoush.com", + href: "https://git.housh.dev/homelab/docs", rel: "nofollow", target: "_blank" ) { "source" } %")." } - script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js") - script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js") - script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js") } } -private func generateHeader(_ pageTitle: String, _ extraHeader: NodeConvertible) -> Node { +private func generateHead(_ pageTitle: String, _ extraHeader: NodeConvertible) -> Node { head { meta(charset: "utf-8") meta(content: "#0e1112", name: "theme-color", customAttributes: ["media": "(prefers-color-scheme: dark)"]) @@ -128,8 +125,6 @@ private func generateHeader(_ pageTitle: String, _ extraHeader: NodeConvertible) link(href: "/static/output.css", rel: "stylesheet") link(href: "/articles/feed.xml", rel: "alternate", title: SiteMetadata.name, type: "application/rss+xml") extraHeader - // script(src: "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js") - // Node.raw(""" diff --git a/Sources/Docs/Templates/HomeLink.swift b/Sources/Docs/Templates/HomeLink.swift index e90e8cb..93d98bf 100644 --- a/Sources/Docs/Templates/HomeLink.swift +++ b/Sources/Docs/Templates/HomeLink.swift @@ -46,12 +46,15 @@ extension HomeLink: NodeConvertible { } private func internalLink() -> Node { - a(class: "bg-orange-400 border-2 border-green-600 p-4 rounded-lg [&:hover]:bg-orange-500", href: href) { + a( + class: "bg-orange-400 border-2 border-green-600 p-4 rounded-lg [&:hover]:bg-orange-500", + href: href + ) { div(class: "flex text-3xl") { i(class: "mt-1", customAttributes: ["data-lucide": icon]) - p(class: "ps-2") { title } + span(class: "ps-2") { title } } - p(class: "text-sm") { description } + span(class: "text-sm") { description } } } @@ -64,9 +67,9 @@ extension HomeLink: NodeConvertible { ) { div(class: "flex text-3xl") { i(class: "mt-1", customAttributes: ["data-lucide": icon]) - p(class: "ps-2") { title } + span(class: "ps-2") { title } } - p(class: "text-sm") { description } + span(class: "text-sm") { description } } } } diff --git a/Sources/Docs/Templates/RenderPage.swift b/Sources/Docs/Templates/RenderPage.swift index 221eb46..59b52a2 100644 --- a/Sources/Docs/Templates/RenderPage.swift +++ b/Sources/Docs/Templates/RenderPage.swift @@ -37,14 +37,7 @@ func renderHome(body: String) -> Node { "Articles", icon: "newspaper", href: "/articles/", - description: "Click here to view articles." - ) - - HomeLink.external( - "Service Monitor", - icon: "heart-pulse", - href: "https://uptime.housh.dev/status/housh-dev", - description: "Click here to view the service status." + description: "Click here to view all articles." ) HomeLink.external( @@ -55,17 +48,10 @@ func renderHome(body: String) -> Node { ) HomeLink.external( - "Excalidraw", - icon: "pen-tool", - href: "https://draw.housh.dev", - description: "A drawing utility." - ) - - HomeLink.external( - "Gitea", - icon: "git-branch", - href: "https://git.housh.dev/explore/repos", - description: "Explore source code." + "Service Monitor", + icon: "heart-pulse", + href: "https://uptime.housh.dev/status/housh-dev", + description: "Server and services uptime status page." ) HomeLink.external( @@ -75,12 +61,33 @@ func renderHome(body: String) -> Node { description: "Network management." ) + HomeLink.external( + "Excalidraw", + icon: "pen-tool", + href: "https://draw.housh.dev", + description: "A drawing utility that runs locally in your browser." + ) + + HomeLink.external( + "Gitea", + icon: "git-branch", + href: "https://git.housh.dev/explore/repos", + description: "Explore source code." + ) + HomeLink.external( "Legacy Purchase Orders", icon: "file-archive", href: "https://legach-po.housh.dev", description: "Legacy purchase order application (pre-2025)." ) + + HomeLink.external( + "HVAC Toolbox", + icon: "hammer", + href: "https://hvac-toolbox.com", + description: "A collection of HVAC calculators." + ) } } script(src: "https://unpkg.com/lucide@latest") diff --git a/content/articles/2025-04-02-Network.md b/content/articles/2025-04-02-Network.md index 9ace2cc..213f6ad 100644 --- a/content/articles/2025-04-02-Network.md +++ b/content/articles/2025-04-02-Network.md @@ -1,8 +1,9 @@ --- date: 2025-4-02 -updated: 2025-4-03 +updated: 2025-4-08 author: "Michael Housh" tags: network, infrastructure +primaryTag: infrastructure --- # Networking @@ -10,9 +11,31 @@ tags: network, infrastructure All of the networking setup is done through [unifi](https://unifi.ui.com). The network is segmented into several different networks to isolate communication. +> Note: If you are unable to connect to the unifi management console linked +> above or if the internet is down, you can connect directly with the management +> console at `http://192.168.1.1`. + +## Backup + +The network management console get's backed up automatically each week (Sundays +@2:30am), however you can manually backup the server by going to +`Settings -> Control Plane -> Backups`. This is where you can also restore from +a backup if needed. + ## Networks -An overview of the networks that are setup. +A brief overview of the networks that are setup, their uses, and why they are +needed. + +| Network | VLAN ID | Subnet | Usable IP's | +| --------- | ------- | ---------------- | ----------- | +| Default | 1 | 192.168.1.0/24 | 249 | +| Main | 10 | 192.168.10.0/24 | 205 | +| Phones | 20 | 192.168.20.0/28 | 13 | +| IoT | 30 | 192.168.30.0/24 | 249 | +| housh.dev | 50 | 192.168.50.0/28 | 12 | +| Guest | 60 | 192.168.60.0/26 | 61 | +| Mangement | 254 | 192.168.254.0/24 | 249 | ### Default Network @@ -21,8 +44,8 @@ unifi networking gear. It is also generally the network a new device will go if it is plugged into an ethernet cable / switch. For this reason this network is isolated from communicating with other networks. -New devices that end up on this network should be configured to the appropriate -network by a network administrator. +New devices that end up on this network should be configured / moved to the +appropriate network by a network administrator. ### Management Network @@ -33,26 +56,32 @@ someone gained access to the network. ### Main Network This is where the majority of "trusted" devices should be placed on the network, -such as computers, phones, etc. This is also the network when people join the -non-guest WiFi. +such as computers, mobile phones, etc. This is also the network used when people +join the non-guest WiFi. -This network has the ability to communicate with most all other networks. +This network has the ability to communicate with most all other networks, +therefore only trusted devices should be allowed on this network. ### housh.dev Network -This is the network where all the servers are placed. This network is primarily -setup to allow "responses", but not initiate communication with other networks. -This is to help reduce the risk if one of the servers gets compromised, an -attacker should not easily be able to transition to another network. +This is the network where the majority of servers are placed. This network is +primarily setup to allow "responses", but not allowed to initiate communication +with other networks. This is to help reduce the risk if one of the servers gets +compromised, an attacker should not easily be able to transition to another +network. ### Phones Network This is the network where all the VoIP phones are on. It is considered "untrusted" and should not be able to communicate with any other network. +This is merely considered "untrusted" because there's no reason for anything on +this network to try and reach anything else. It should only handle phone +traffic. + ### IoT Network -This is the network where all IoT (internet of things) devices are. This is +This is the network where IoT (internet of things) devices are. This is considered an "untrusted" network and communications with other networks are minimized to what is actually needed to work. This network is not able to communicate with the internet, because these devices are made by so many @@ -64,6 +93,24 @@ such as home-pods and apple-tv because there are network challenges with these devices operating properly when placed on the IoT network, such as airdrop and screen casting (which may be resolved in the future). +### Guest Network + +This is the network where guests are placed, it is considered "untrusted" and +should only be able to access the internet. Devices on this network are also not +able to communicate with other devices attached to the guest network. + +## Wifi Networks + +The following wifi networks are setup and broadcast via the access points. All +networks require a password to use. Ask Michael for passwords if you need them. + +| Wifi SSID | Network | +| ------------------------ | ----------------------- | +| Center of Monroe | Main | +| Jarvis | IoT | +| Center of Monroe - Guest | Guest | +| Housh Home Energy | Main (VPN traffic only) | + ## Firewall The unifi management console is what handles firewall rules for the networks. It @@ -74,6 +121,11 @@ is accessed via `Settings -> Security -> Firewall` on the management console. This is where settings are made to either allow or deny traffic on the networks from communicating with other networks or the internet. +> Note: Be aware that making changes here may break things / render networks or +> services to be unusable. It is recommended to make a backup prior to making +> changes. One of the biggest things to _not_ do is block traffic from +> `Main -> Gateway`, most everything else done is recoverable. + ## DNS DNS is what translates IP addresses to domain names (i.e. diff --git a/content/articles/2025-04-04-servers.md b/content/articles/2025-04-04-servers.md index 4006f42..c793f8a 100644 --- a/content/articles/2025-04-04-servers.md +++ b/content/articles/2025-04-04-servers.md @@ -1,6 +1,8 @@ --- date: 2025-04-04 +updated: 2025-04-08 tags: servers, infrastructure, homelab +primaryTag: infrastructure --- # Servers @@ -15,7 +17,9 @@ services based on that. Meaning services that I run primarily for personal items are running on servers that I own, while services that are supporting business functionality run on the companies server. -All of the servers run the services in `Docker Containers`. +All of the servers run the services in `Docker Containers`, which allows for +them to be isolated from the host system (server) and makes them more easily +portable between servers if needed. There is also a `Raspberry-Pi` that runs `Home Assitant`, which is another one of my personal devices. @@ -27,10 +31,14 @@ of my personal devices. | rogue-mini | roguemini.housh.dev | 192.168.50.4 | | home-assistant | homeassitant.housh.dev | 192.168.30.5 | | NAS | nas.housh.dev | 192.168.10.105 | +| Backup NAS | nas.hhe | 192.168.1.10 | You can read more about the network setup [here](https://docs.housh.dev/articles/2025/network/). +> Note: The backup NAS is used to backup our primary NAS, for now it is not easy +> to use, and will be used for camera / security footage in the future. + ## Containers Services run inside of docker containers that are spread between several @@ -44,7 +52,8 @@ is hosted on an [internal git server](https://git.housh.dev/homelab). The configuration will consist of a docker compose file (generally named `compose.yaml`). There is often an `example.env` file for the service, these are examples for documentation and variable naming purposes. The environment -variables themselves are setup in the container orchestrator for the service. +variables themselves are setup in the container orchestrator for the service to +prevent sensitive data being "leaked". ### Container orchestrator @@ -99,7 +108,7 @@ access may be implemented in the future. If access is required outside of our network then using our VPN is required. The VPN setup is done automatically via unifi (our network router). -`DNS` is what translates domain names to `IP` addresses, currently the public +`DNS` is what translates domain names to `IP addresses`, currently the public DNS records are handled by cloudflare. Cloudflare is used to validate that we own the `housh.dev` domain name in order for Let's Encrypt to issue free `TLS` certificates. TLS is used to encrypt traffic over the web (`https://`). @@ -107,4 +116,7 @@ certificates. TLS is used to encrypt traffic over the web (`https://`). Internal DNS records are setup in our unifi router `Settings -> Routing -> DNS`. The internal DNS is fairly simple and just needs to map to servers appropriately (primarily just to the primary caddy instance, which then handles all the -routing to the individual service that is requested). +routing to the individual service that is requested). All devices that connect +to the network will be able to use the internal DNS to resolve host names +properly (meaning it all should just work automatically without any knowledge +from the user). diff --git a/content/articles/2025-04-07-PhoneSystem.md b/content/articles/2025-04-07-PhoneSystem.md index 157ffb6..0a99631 100644 --- a/content/articles/2025-04-07-PhoneSystem.md +++ b/content/articles/2025-04-07-PhoneSystem.md @@ -1,6 +1,7 @@ --- date: 2025-04-07 tags: phones, infrastructure, unifi +primaryTag: infrastructure --- # Phone System diff --git a/content/articles/2025-04-07-TimeMachine.md b/content/articles/2025-04-07-TimeMachine.md index 027cc7a..1cd8944 100644 --- a/content/articles/2025-04-07-TimeMachine.md +++ b/content/articles/2025-04-07-TimeMachine.md @@ -1,6 +1,7 @@ --- date: 2025-04-07 tags: how-to, backups, nas +primaryTag: how-to --- # Time Machine Backups diff --git a/content/articles/2025-04-08-LinkSharing.md b/content/articles/2025-04-08-LinkSharing.md index f25c727..1aab807 100644 --- a/content/articles/2025-04-08-LinkSharing.md +++ b/content/articles/2025-04-08-LinkSharing.md @@ -1,6 +1,7 @@ --- date: 2025-04-08 tags: how-to, nas +primaryTag: how-to --- # Link Sharing diff --git a/content/static/input.css b/content/static/input.css index 41a373d..f42c328 100644 --- a/content/static/input.css +++ b/content/static/input.css @@ -151,7 +151,7 @@ article a:hover { } article code { - @apply bg-violet-600; + @apply text-white bg-violet-600 px-2; } article ol { diff --git a/content/static/output.css b/content/static/output.css index 6b49c9c..760d244 100644 --- a/content/static/output.css +++ b/content/static/output.css @@ -1,2 +1,2 @@ /*! tailwindcss v4.1.1 | MIT License | https://tailwindcss.com */ -@import "https://fonts.cdnfonts.com/css/avenir";@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-500:oklch(76.9% .188 70.08);--color-green-400:oklch(79.2% .209 151.711);--color-green-600:oklch(62.7% .194 149.214);--color-sky-400:oklch(74.6% .16 232.661);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-600:oklch(54.6% .245 262.881);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-200:oklch(92.8% .006 264.531);--color-white:#fff;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-thin:100;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-avenir:"Avenir",sans-serif}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:color-mix(in oklab,currentColor 50%,transparent)}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-gray-200,currentColor)}::file-selector-button{border-color:var(--color-gray-200,currentColor)}}@layer components;@layer utilities{.static{position:static}.isolate{isolation:isolate}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-580{margin:calc(var(--spacing)*580)}.my-24{margin-block:calc(var(--spacing)*24)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-10{margin-top:calc(var(--spacing)*10)}.mt-16{margin-top:calc(var(--spacing)*16)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-10{margin-bottom:calc(var(--spacing)*10)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.mb-auto{margin-bottom:auto}.flex{display:flex}.grid{display:grid}.inline{display:inline}.w-full{width:100%}.transform{transform:var(--tw-rotate-x)var(--tw-rotate-y)var(--tw-rotate-z)var(--tw-skew-x)var(--tw-skew-y)}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.justify-between{justify-content:space-between}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.gap-10{gap:calc(var(--spacing)*10)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded-lg{border-radius:var(--radius-lg)}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-green-400{border-color:var(--color-green-400)}.border-green-600{border-color:var(--color-green-600)}.border-orange-400{border-color:var(--color-orange-400)}.border-slate-400{border-color:var(--color-slate-400)}.bg-orange-400{background-color:var(--color-orange-400)}.p-4{padding:calc(var(--spacing)*4)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.ps-2{padding-inline-start:calc(var(--spacing)*2)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-8{padding-top:calc(var(--spacing)*8)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pl-2{padding-left:calc(var(--spacing)*2)}.text-center{text-align:center}.font-avenir{font-family:var(--font-avenir)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.text-amber-500{color:var(--color-amber-500)}.text-orange-400{color:var(--color-orange-400)}.text-slate-400{color:var(--color-slate-400)}.text-white{color:var(--color-white)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:gap-x-5{column-gap:calc(var(--spacing)*5)}}.\[\&\:hover\]\:border-b:hover{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&\:hover\]\:bg-orange-500:hover{background-color:var(--color-orange-500)}.\[\&\>h1\>strong\]\:font-bold>h1>strong{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}}@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){@layer base{*,:before,:after,::backdrop{--tw-rotate-x:rotateX(0);--tw-rotate-y:rotateY(0);--tw-rotate-z:rotateZ(0);--tw-skew-x:skewX(0);--tw-skew-y:skewY(0);--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}:root{--accent:#a6e3a1;--background:#222129;--color:#fff;--border-color:#ffffff1a;--phoneWidth:(max-width: 684px);--tabletWidth:(max-width: 900px);--orange:#f5a87f;--green:#a6e3a1}*{box-sizing:border-box;-ms-box-sizing:border-box}.header{flex-direction:column;display:flex;position:relative}.header__inner{justify-center:space-between;align-items:center;display:flex}.header__logo{flex:1;display:flex}.header__logo:after{content:"";background:repeating-linear-gradient(90deg,#ffa86a,#ffa86a 2px,#0000 0 10px);background:repeating-linear-gradient(90deg,var(--accent),var(--accent)2px,transparent 0,transparent 10px);width:100%;display:block;right:10px}.header__logo a{flex:none;max-width:100%;text-decoration:none}.logo{background:#ffa86a;background:var(--accent);color:#000;align-items:center;padding:5px 10px;text-decoration:none;display:flex}.header .menu{flex-wrap:wrap;margin:0;padding:10px;list-style:none;display:flex}nav a:hover,nav a.active{border-bottom-style:var(--tw-border-style);border-bottom-width:2px;border-color:var(--color-orange-400)}body{background-color:var(--color-slate-900);font-family:var(--font-avenir);font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}h1{padding-bottom:calc(var(--spacing)*2);font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}h2{margin-bottom:calc(var(--spacing)*8);padding-top:calc(var(--spacing)*4);font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height));color:var(--green)}h3{padding-block:calc(var(--spacing)*4);font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold);color:var(--color-violet-500)}h4{padding-block:calc(var(--spacing)*4);font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));color:var(--color-sky-400)}section h3{color:var(--color-orange-400)}p{margin-bottom:calc(var(--spacing)*8)}article h2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px;border-color:var(--color-slate-200)}article a{color:var(--color-orange-400)}article a:hover{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-green-400)}article code{background-color:var(--color-violet-600)}article ol{list-style-type:decimal}table{width:100%}table,th,td{border-collapse:collapse;border:1px solid}table{margin-bottom:calc(var(--spacing)*8)}table td{padding-inline:calc(var(--spacing)*6)}.container{padding-inline:calc(var(--spacing)*10)}.container img{padding-top:10px;padding-bottom:10px}blockquote{margin-block:calc(var(--spacing)*10);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:2px;border-color:var(--color-blue-600);background-color:var(--color-blue-300)}blockquote p{padding-inline:calc(var(--spacing)*6);padding-top:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-blue-600)}@property --tw-rotate-x{syntax:"*";inherits:false;initial-value:rotateX(0)}@property --tw-rotate-y{syntax:"*";inherits:false;initial-value:rotateY(0)}@property --tw-rotate-z{syntax:"*";inherits:false;initial-value:rotateZ(0)}@property --tw-skew-x{syntax:"*";inherits:false;initial-value:skewX(0)}@property --tw-skew-y{syntax:"*";inherits:false;initial-value:skewY(0)}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false} \ No newline at end of file +@import "https://fonts.cdnfonts.com/css/avenir";@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-500:oklch(76.9% .188 70.08);--color-green-400:oklch(79.2% .209 151.711);--color-green-600:oklch(62.7% .194 149.214);--color-sky-400:oklch(74.6% .16 232.661);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-600:oklch(54.6% .245 262.881);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-200:oklch(92.8% .006 264.531);--color-white:#fff;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-thin:100;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-avenir:"Avenir",sans-serif}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:color-mix(in oklab,currentColor 50%,transparent)}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-gray-200,currentColor)}::file-selector-button{border-color:var(--color-gray-200,currentColor)}}@layer components;@layer utilities{.static{position:static}.isolate{isolation:isolate}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-580{margin:calc(var(--spacing)*580)}.my-24{margin-block:calc(var(--spacing)*24)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-10{margin-top:calc(var(--spacing)*10)}.mt-16{margin-top:calc(var(--spacing)*16)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-10{margin-bottom:calc(var(--spacing)*10)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.mb-auto{margin-bottom:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.w-full{width:100%}.transform{transform:var(--tw-rotate-x)var(--tw-rotate-y)var(--tw-rotate-z)var(--tw-skew-x)var(--tw-skew-y)}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.justify-between{justify-content:space-between}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.gap-10{gap:calc(var(--spacing)*10)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded-lg{border-radius:var(--radius-lg)}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-green-400{border-color:var(--color-green-400)}.border-green-600{border-color:var(--color-green-600)}.border-orange-400{border-color:var(--color-orange-400)}.border-slate-400{border-color:var(--color-slate-400)}.bg-orange-400{background-color:var(--color-orange-400)}.p-4{padding:calc(var(--spacing)*4)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.ps-2{padding-inline-start:calc(var(--spacing)*2)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-8{padding-top:calc(var(--spacing)*8)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pl-2{padding-left:calc(var(--spacing)*2)}.text-center{text-align:center}.font-avenir{font-family:var(--font-avenir)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.leading-\[1\.25\]{--tw-leading:1.25;line-height:1.25}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.text-amber-500{color:var(--color-amber-500)}.text-orange-400{color:var(--color-orange-400)}.text-slate-400{color:var(--color-slate-400)}.text-white{color:var(--color-white)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:gap-x-5{column-gap:calc(var(--spacing)*5)}}.\[\&\:hover\]\:border-b:hover{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&\:hover\]\:bg-orange-500:hover{background-color:var(--color-orange-500)}.\[\&\>h1\>strong\]\:font-bold>h1>strong{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}}@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){@layer base{*,:before,:after,::backdrop{--tw-rotate-x:rotateX(0);--tw-rotate-y:rotateY(0);--tw-rotate-z:rotateZ(0);--tw-skew-x:skewX(0);--tw-skew-y:skewY(0);--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}:root{--accent:#a6e3a1;--background:#222129;--color:#fff;--border-color:#ffffff1a;--phoneWidth:(max-width: 684px);--tabletWidth:(max-width: 900px);--orange:#f5a87f;--green:#a6e3a1}*{box-sizing:border-box;-ms-box-sizing:border-box}.header{flex-direction:column;display:flex;position:relative}.header__inner{justify-center:space-between;align-items:center;display:flex}.header__logo{flex:1;display:flex}.header__logo:after{content:"";background:repeating-linear-gradient(90deg,#ffa86a,#ffa86a 2px,#0000 0 10px);background:repeating-linear-gradient(90deg,var(--accent),var(--accent)2px,transparent 0,transparent 10px);width:100%;display:block;right:10px}.header__logo a{flex:none;max-width:100%;text-decoration:none}.logo{background:#ffa86a;background:var(--accent);color:#000;align-items:center;padding:5px 10px;text-decoration:none;display:flex}.header .menu{flex-wrap:wrap;margin:0;padding:10px;list-style:none;display:flex}nav a:hover,nav a.active{border-bottom-style:var(--tw-border-style);border-bottom-width:2px;border-color:var(--color-orange-400)}body{background-color:var(--color-slate-900);font-family:var(--font-avenir);font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}h1{padding-bottom:calc(var(--spacing)*2);font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}h2{margin-bottom:calc(var(--spacing)*8);padding-top:calc(var(--spacing)*4);font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height));color:var(--green)}h3{padding-block:calc(var(--spacing)*4);font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold);color:var(--color-violet-500)}h4{padding-block:calc(var(--spacing)*4);font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));color:var(--color-sky-400)}section h3{color:var(--color-orange-400)}p{margin-bottom:calc(var(--spacing)*8)}article h2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px;border-color:var(--color-slate-200)}article a{color:var(--color-orange-400)}article a:hover{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-green-400)}article code{background-color:var(--color-violet-600);padding-inline:calc(var(--spacing)*2);color:var(--color-white)}article ol{list-style-type:decimal}table{width:100%}table,th,td{border-collapse:collapse;border:1px solid}table{margin-bottom:calc(var(--spacing)*8)}table td{padding-inline:calc(var(--spacing)*6)}.container{padding-inline:calc(var(--spacing)*10)}.container img{padding-top:10px;padding-bottom:10px}blockquote{margin-block:calc(var(--spacing)*10);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:2px;border-color:var(--color-blue-600);background-color:var(--color-blue-300)}blockquote p{padding-inline:calc(var(--spacing)*6);padding-top:calc(var(--spacing)*6);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-blue-600)}@property --tw-rotate-x{syntax:"*";inherits:false;initial-value:rotateX(0)}@property --tw-rotate-y{syntax:"*";inherits:false;initial-value:rotateY(0)}@property --tw-rotate-z{syntax:"*";inherits:false;initial-value:rotateZ(0)}@property --tw-skew-x{syntax:"*";inherits:false;initial-value:skewX(0)}@property --tw-skew-y{syntax:"*";inherits:false;initial-value:skewY(0)}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false} \ No newline at end of file