From a428f76d2aa9bb80c4ebeaef707a0f38a37a81d5 Mon Sep 17 00:00:00 2001 From: yakhyo Date: Wed, 25 Feb 2026 13:12:49 +0900 Subject: [PATCH 01/16] Fix redundant spacing inside parentheses in tutorial code --- tools/python-formatter.njk | 4 ++-- tutorial/basic/12-python-strings.md | 10 +++++----- tutorial/basic/14-python-lists.md | 4 ++-- tutorial/basic/16-python-tuples.md | 6 +++--- tutorial/basic/19-python-date-time.md | 2 +- tutorial/basic/20-python-functions.md | 2 +- tutorial/intermediate/22-python-modules.md | 2 +- .../intermediate/26-python-database-access.md | 20 +++++++++---------- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/tools/python-formatter.njk b/tools/python-formatter.njk index 2f66be6..beaf990 100644 --- a/tools/python-formatter.njk +++ b/tools/python-formatter.njk @@ -37,11 +37,11 @@ permalink: /python-formatter/
# Messy code example
-def calculate(  x,y ):
+def calculate(x, y):
   if x>y:
       return x-y
   else: return y-x
-print( calculate( 10,  5 ))
+print(calculate(10, 5))
diff --git a/tutorial/basic/12-python-strings.md b/tutorial/basic/12-python-strings.md index 483e348..8cd058d 100644 --- a/tutorial/basic/12-python-strings.md +++ b/tutorial/basic/12-python-strings.md @@ -77,7 +77,7 @@ Assume string variable a is 'Hello' and variable b is 'Python', then below are t | `+ ` | `a + b ` | will result into HelloPython Concatenation - Adds values on both sides of the operator | | `* ` | `a*2` | will result into HelloHello Repetition - Creates new string, concatenating multiple copies of the same string | | ` []` | `a[1]` | will result into e Slice - Gives character from the given index | -| `[ : ]` | `a[1:4]` | will result into ell Range Slice - Gives characters from the given range | +| `[:]` | `a[1:4]` | will result into ell Range Slice - Gives characters from the given range | | `in` | `H in a ` | will result into 1 Membership - Returns true if a character exists in the given string | | ` not in` | ` Z not in a` | will result into 1 Membership - Returns true if a character does not exist in the given string | | `r/R ` | `print r'\n' prints \n and print R'\n'prints \n` | Raw String - Suppresses actual meaning of Escape characters. Syntax for raw strings is exactly same as normal strings except the raw string operator, letter "r", which precedes the quote. "R" can be lowercase (r) or uppercase (R) and must be placed immediately before the first quote. | @@ -115,9 +115,9 @@ Here is an example: ```python triplequotes = """this is a long string that is made up of several lines and non-printable characters such as -TAB( \t ) and they will show up that way when displayed. +TAB(\t) and they will show up that way when displayed. NEWLINEs within the string, whether explicitly given like -this within the brackets [ \n ], or just a NEWLINE within +this within the brackets [\n], or just a NEWLINE within the variable assignment will also show up. """ print(triplequotes) @@ -156,11 +156,11 @@ Python includes the following built-in methods to manipulate strings: | `min(str)` | Returns the min alphabetic character from the string str. | | `replace(old, new [, max])` | Replaces all occurrences of old in string with new or at most max occurrences if max given. | | `rfind(str, beg = 0,end = len(string))` | Same as find(), but search backwards in string. | -| `rindex( str, beg = 0, end = len(string))` | Same as index(), but search backwards in string. | +| `rindex(str, beg = 0, end = len(string))` | Same as index(), but search backwards in string. | | `rjust(width,[, fillchar])` | Returns a space-padded string with the original string right-justified to a total of width columns. | | `rstrip()` | Removes all trailing whitespace of string. | | `split(str="", num=string.count(str))` | Splits string according to delimiter str (space if not provided) and returns list of substrings; split into at most num substrings if given. | -| `splitlines( num=string.count('\n')) ` | Splits string at all (or num) NEWLINEs and returns a list of each line with NEWLINEs removed. | +| `splitlines(num=string.count('\n'))` | Splits string at all (or num) NEWLINEs and returns a list of each line with NEWLINEs removed. | | `startswith(str, beg=0,end=len(string)` | Determines if string or a substring of string (if starting index beg and ending index end are given) starts with substring str; returns true if so and false otherwise. | | `strip([chars])` | Performs both lstrip() and rstrip() on string | | `swapcase()` | Inverts case for all letters in string. | diff --git a/tutorial/basic/14-python-lists.md b/tutorial/basic/14-python-lists.md index b5fa5b9..1830ca5 100644 --- a/tutorial/basic/14-python-lists.md +++ b/tutorial/basic/14-python-lists.md @@ -20,7 +20,7 @@ Creating a list is very simple, just entering comma-separated values between squ ```python #Simple example of creating list in python programming language list1 = ['chemistry', 'physics', 1993, 2017] -list2 = [1, 2, 3, 4, 5 ] +list2 = [1, 2, 3, 4, 5] list3 = ["a", "b", "c", "d"] ``` @@ -34,7 +34,7 @@ Here is an example of how to access values in a python list : #Way to access value in Python list list1 = ['physics', 'chemistry', 1993, 2017] -list2 = [1, 2, 3, 4, 5, 6, 7 ] +list2 = [1, 2, 3, 4, 5, 6, 7] print("list1[0]: ", list1[0]) print("list2[1:5]: ", list2[1:5]) diff --git a/tutorial/basic/16-python-tuples.md b/tutorial/basic/16-python-tuples.md index 62412e7..d83bcc3 100644 --- a/tutorial/basic/16-python-tuples.md +++ b/tutorial/basic/16-python-tuples.md @@ -15,7 +15,7 @@ Creating a tuple is as easy as putting comma-separated values. Optionally, you c #Simple example of creating tuple in python programming language tup1 = ('physics', 'chemistry', 1993, 2017) -tup2 = (1, 2, 3, 4, 5 ) +tup2 = (1, 2, 3, 4, 5) tup3 = "a", "b", "c", "d" ``` @@ -31,7 +31,7 @@ To access values in a tuple, use square brackets for slicing along with the inde #How to access tuple values tup1 = ('physics', 'chemistry', 1993, 2017) -tup2 = (1, 2, 3, 4, 5, 6, 7 ) +tup2 = (1, 2, 3, 4, 5, 6, 7) print("tup1[0]: ", tup1[0]) print("tup2[1:5]: ", tup2[1:5]) @@ -91,7 +91,7 @@ In fact, Tuples respond to all of the general sequence operations we used on Str | Python Expression | Result | Explanation | | ----------------------------------------- | -------------------------------------- | ------------- | | `len((1, 2, 3))` | `3` | Length | -| `(1, 2, 3) + (4, 5, 6) ` | `(1, 2, 3, 4, 5, 6)` | Concatenation | +| `(1, 2, 3) + (4, 5, 6)` | `(1, 2, 3, 4, 5, 6)` | Concatenation | | `('Hello!',) \* 4` | `('Hello!', 'Hello!', 'Hello!', 'Hello!')` | Repetition | | `3 in (1, 2, 3)` | `True` | Membership | | `for x in (1,2,3) : print(x, end = ' ')` | `1 2 3` | Iteration | diff --git a/tutorial/basic/19-python-date-time.md b/tutorial/basic/19-python-date-time.md index 1381368..b0f4c17 100644 --- a/tutorial/basic/19-python-date-time.md +++ b/tutorial/basic/19-python-date-time.md @@ -70,7 +70,7 @@ You can format any time as per your requirement, but simple method to get time i ```python import time; -localtime = time.asctime( time.localtime(time.time()) ) +localtime = time.asctime(time.localtime(time.time())) print("Current local time :", localtime) ``` diff --git a/tutorial/basic/20-python-functions.md b/tutorial/basic/20-python-functions.md index c5ad6ee..ded93e8 100644 --- a/tutorial/basic/20-python-functions.md +++ b/tutorial/basic/20-python-functions.md @@ -22,7 +22,7 @@ You can define functions to provide the required functionality. Here are simple Example of function ```python -def printme( str ): +def printme(str): "This prints a passed string into this function" print(str) return diff --git a/tutorial/intermediate/22-python-modules.md b/tutorial/intermediate/22-python-modules.md index 6e8871d..038abae 100644 --- a/tutorial/intermediate/22-python-modules.md +++ b/tutorial/intermediate/22-python-modules.md @@ -14,7 +14,7 @@ Simply put, a module is a file consisting of Python code. A module can define fu Here is an example of a simple Python module: ```python -def print_func( par ): +def print_func(par): print("Hello : ", par) return ``` diff --git a/tutorial/intermediate/26-python-database-access.md b/tutorial/intermediate/26-python-database-access.md index 310462b..36ed69c 100644 --- a/tutorial/intermediate/26-python-database-access.md +++ b/tutorial/intermediate/26-python-database-access.md @@ -70,7 +70,7 @@ Below is an example of connection with MySQL database "TESTDB" import pymysql.cursors # Open database connection -db = pymysql.connect("localhost","testuser","test123","TESTDB" ) +db = pymysql.connect("localhost", "testuser", "test123", "TESTDB") # prepare a cursor object using cursor() method cursor = db.cursor() @@ -93,7 +93,7 @@ db.close() import pymysql.cursors # Open database connection -db = pymysql.connect("localhost","testuser","test123","TESTDB" ) +db = pymysql.connect("localhost", "testuser", "test123", "TESTDB") # prepare a cursor object using cursor() method cursor = db.cursor() @@ -107,7 +107,7 @@ sql = """CREATE TABLE EMPLOYEE( LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), - INCOME FLOAT )""" + INCOME FLOAT)""" cursor.execute(sql) @@ -123,7 +123,7 @@ The following example executes SQL INSERT statement to create a record into EMPL import pymysql.cursors # Open database connection -db = pymysql.connect("localhost","testuser","test123","TESTDB" ) +db = pymysql.connect("localhost", "testuser", "test123", "TESTDB") # prepare a cursor object using cursor() method cursor = db.cursor() @@ -151,7 +151,7 @@ The example above can be written as follows to create SQL queries dynamically import pymysql.cursors # Open database connection -db = pymysql.connect("localhost","testuser","test123","TESTDB" ) +db = pymysql.connect("localhost", "testuser", "test123", "TESTDB") # prepare a cursor object using cursor() method cursor = db.cursor() @@ -159,7 +159,7 @@ cursor = db.cursor() # Prepare SQL query to INSERT a record into the database. sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ - VALUES('%s', '%s', '%d', '%c', '%d' )" % \ + VALUES('%s', '%s', '%d', '%c', '%d')" % \ ('Mac', 'Mohan', 20, 'M', 2000) try: # Execute the SQL command @@ -192,7 +192,7 @@ The following procedure queries all records from EMPLOYEE table having salary mo import pymysql.cursors # Open database connection -db = pymysql.connect("localhost","testuser","test123","TESTDB" ) +db = pymysql.connect("localhost", "testuser", "test123", "TESTDB") # prepare a cursor object using cursor() method cursor = db.cursor() @@ -213,7 +213,7 @@ try: income = row[4] # Now print fetched result print("fname = %s,lname = %s,age = %d,sex = %s,income = %d" % \ - (fname, lname, age, sex, income )) + (fname, lname, age, sex, income)) except: print("Error: unable to fetch data") @@ -233,7 +233,7 @@ The following procedure updates all the records having SEX as 'M'. Here, we incr import pymysql.cursors # Open database connection -db = pymysql.connect("localhost","testuser","test123","TESTDB" ) +db = pymysql.connect("localhost", "testuser", "test123", "TESTDB") # prepare a cursor object using cursor() method cursor = db.cursor() @@ -261,7 +261,7 @@ DELETE Operation is required when you want to delete some records from your data import pymysql.cursors # Open database connection -db = pymysql.connect("localhost","testuser","test123","TESTDB" ) +db = pymysql.connect("localhost", "testuser", "test123", "TESTDB") # prepare a cursor object using cursor() method cursor = db.cursor() From eab3e05edfa7f46b9273fc5c44248d4124553a56 Mon Sep 17 00:00:00 2001 From: yakhyo Date: Wed, 25 Feb 2026 14:09:01 +0900 Subject: [PATCH 02/16] some updates --- .eleventy.js | 1 - CONTRIBUTING.md => .github/CONTRIBUTING.md | 0 CNAME | 1 - CODE_OF_CONDUCT.md | 29 - README.md | 28 +- _includes/head.njk | 2 +- _includes/landing.njk | 16 +- _includes/navbar.njk | 2 +- _layouts/tutorial.njk | 2 +- assets/css/base.css | 2622 +++++++++++++++++++- package.json | 4 +- 11 files changed, 2646 insertions(+), 61 deletions(-) rename CONTRIBUTING.md => .github/CONTRIBUTING.md (100%) delete mode 100644 CNAME delete mode 100644 CODE_OF_CONDUCT.md diff --git a/.eleventy.js b/.eleventy.js index cc6fcf2..4111e7c 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -24,7 +24,6 @@ module.exports = function (eleventyConfig) { eleventyConfig.addPassthroughCopy({ "assets/img": "img" }); eleventyConfig.addPassthroughCopy({ "assets/css": "css" }); - eleventyConfig.addPassthroughCopy("CNAME"); eleventyConfig.addPassthroughCopy(".nojekyll"); eleventyConfig.addPassthroughCopy({ "assets/img/favicon.png": "favicon.png" }); diff --git a/CONTRIBUTING.md b/.github/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to .github/CONTRIBUTING.md diff --git a/CNAME b/CNAME deleted file mode 100644 index 73894c6..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -belajarpython.com diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index dcd51e4..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,29 +0,0 @@ -# Code of Conduct - -## Our Commitment - -We are committed to providing a friendly, safe, and inclusive environment for everyone. - -## Expected Behavior - -- Be respectful and constructive in discussions. -- Focus feedback on ideas and implementation. -- Welcome contributors with different backgrounds and experience levels. - -## Unacceptable Behavior - -- Harassment, hate speech, or personal attacks. -- Trolling, intimidation, or repeated disruptive behavior. -- Sharing private information without consent. - -## Enforcement - -Project maintainers may remove, edit, or reject contributions and interactions that violate this code of conduct. - -## Scope - -This code of conduct applies to all project spaces, including issues, pull requests, and discussions. - -## Contact - -If you experience or witness unacceptable behavior, open a private issue or contact the maintainers through the repository contact channels. diff --git a/README.md b/README.md index 6ea915c..09d8368 100755 --- a/README.md +++ b/README.md @@ -4,38 +4,34 @@ --- -# [Belajarpython](https://www.belajarpython.com/) · [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/belajarpythoncom/belajarpython.com/blob/main/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](./CONTRIBUTING.md) +# [Belajarpython](https://www.belajarpython.com/) · [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/codeuzhub/python-lessons/blob/main/LICENSE) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/codeuzhub/python-lessons/blob/main/.github/CONTRIBUTING.md) -Belajarpython adalah situs kolaboratif tutorial pemrograman Python bahasa Indonesia +Belajarpython is a collaborative platform for learning Python. -- **Ikuti Tutorial:** Mulai belajar bahasa pemrograman python dari tingkat dasar dengan tutorial yang dikhususkan untuk pemula agar lebih cepat mempelajari bahasa pemrograman python. -- **Baca Artikel:** Baca artikel terbaru dan terpopuler tentang bahasa pemrograman python dengan beragam topik. Artikel dibuat oleh komunitas dan ditujukan untuk komunitas. -- **Ajukan Pertanyaan:** Ajukan setiap pertanyaan yang anda temui tentang bahasa pemrograman python. Setiap orang di komunitas akan segera menyelesaikan setiap pertanyaan pengguna. +- **Follow Tutorials:** Start learning Python from the basics with beginner-focused tutorials designed to help you progress faster. +- **Read Articles:** Explore the latest and most popular Python articles across a wide range of topics. Content is created by the community for the community. +- **Ask Questions:** Ask any Python-related question you run into. Community members are ready to help you solve it. -## Kontribusi +## Contributing -Belajarpython adalah situs terbuka (open source) yang dikembangkan oleh developer untuk developer. Semua orang baik dari kalangan :trollface: developer, :man: mahasiswa, :older_woman: pengajar, bahkan :baby: anak kecil yang baru mempelajari bahasa pemrograman python bisa ikut memberikan :heart: kontribusinya [disini](./CONTRIBUTING.md) +Belajarpython is an open-source website built by developers for developers. Everyone is welcome to contribute: :trollface: developers, :man: students, :older_woman: educators, and even :baby: young beginners who are just learning Python can share their :heart: contributions [here](https://github.com/codeuzhub/python-lessons/blob/main/.github/CONTRIBUTING.md). -### [Code of Conduct](./CODE_OF_CONDUCT.md) +### [Contribution Guide](https://github.com/codeuzhub/python-lessons/blob/main/.github/CONTRIBUTING.md) -Belajarpython telah mengadopsi Kode Etik yang kami harapkan akan diikuti oleh peserta proyek terbuka ini. Mohon baca [full text](./CODE_OF_CONDUCT.md) sehingga anda dapat mengerti aksi apa yang yang bisa dan tidak bisa ditoleransi. - -### [Panduan Kontribusi](./CONTRIBUTING.md) - -Baca [panduan kontribusi](./CONTRIBUTING.md) dari kami untuk mempelajari tentang proses pengembangan konten disini. +Read our [contribution guide](https://github.com/codeuzhub/python-lessons/blob/main/.github/CONTRIBUTING.md) to learn about the content development workflow. ### Good First Issues -Untuk membantu Anda membuat kaki Anda basah dan membuat Anda terbiasa dengan proses kontribusi kami, kami memiliki daftar [good first issues](https://github.com/belajarpythoncom/belajarpython.com/issues) yang mengandung bug yang memiliki lingkup yang relatif terbatas. Ini adalah tempat yang bagus untuk memulai. +To help you get started and become familiar with our contribution process, we maintain a list of [good first issues](https://github.com/codeuzhub/python-lessons/issues) with relatively small scope. It is a great place to begin. -## Pengembangan Lokal +## Local Development ```bash npm ci npm run dev ``` -Build produksi: +Production build: ```bash npm run build diff --git a/_includes/head.njk b/_includes/head.njk index b45d725..56931ea 100644 --- a/_includes/head.njk +++ b/_includes/head.njk @@ -71,7 +71,7 @@ {"@context":"https://schema.org","@type":"WebSite","@id":"{{ site.url }}/#website","url":"{{ site.url }}","name":"{{ site.name }}","description":"{{ pageDescription }}","inLanguage":"{{ 'uz-UZ' if langCode == 'uz' else 'en-US' }}"} diff --git a/_includes/navbar.njk b/_includes/navbar.njk index f55afa4..6e5cf2f 100644 --- a/_includes/navbar.njk +++ b/_includes/navbar.njk @@ -19,7 +19,7 @@ + href="https://github.com/codeuzhub/python-lessons"> Join on Github diff --git a/_layouts/tutorial.njk b/_layouts/tutorial.njk index e1e9fc4..959b9fe 100644 --- a/_layouts/tutorial.njk +++ b/_layouts/tutorial.njk @@ -76,7 +76,7 @@

Edit this tutorial diff --git a/assets/css/base.css b/assets/css/base.css index bcd5cc1..15d997e 100644 --- a/assets/css/base.css +++ b/assets/css/base.css @@ -1 +1,2621 @@ -*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.left-0{left:0}.left-4{left:1rem}.right-0{right:0}.top-0{top:0}.top-24{top:6rem}.top-4{top:1rem}.isolate{isolation:isolate}.z-10{z-index:10}.z-\[60\]{z-index:60}.z-\[70\]{z-index:70}.z-\[80\]{z-index:80}.m-0{margin:0}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-auto{margin-left:auto;margin-right:auto}.-mt-0\.5{margin-top:-.125rem}.-mt-10{margin-top:-2.5rem}.-mt-4{margin-top:-1rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-5{margin-right:1.25rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-10{height:2.5rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-3{height:.75rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[calc\(100vh-6rem\)\]{height:calc(100vh - 6rem)}.h-auto{height:auto}.h-full{height:100%}.min-h-0{min-height:0}.min-h-\[100px\]{min-height:100px}.min-h-\[200px\]{min-height:200px}.min-h-\[48px\]{min-height:48px}.min-h-full{min-height:100%}.w-1\/2{width:50%}.w-12{width:3rem}.w-20{width:5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-4\/5{width:80%}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-7xl{max-width:80rem}.max-w-\[280px\]{max-width:280px}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.translate-y-\[-1px\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-1px\]{--tw-translate-y:-1px}.scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.scale-110,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-nowrap{flex-wrap:nowrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-\[10px\]{gap:10px}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.scroll-smooth{scroll-behavior:smooth}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-none{border-style:none}.border-\[\#1e1e1e\]{--tw-border-opacity:1;border-color:rgb(30 30 30/var(--tw-border-opacity,1))}.border-\[\#252526\]{--tw-border-opacity:1;border-color:rgb(37 37 38/var(--tw-border-opacity,1))}.border-\[\#414141\]{--tw-border-opacity:1;border-color:rgb(65 65 65/var(--tw-border-opacity,1))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-primary-500{--tw-border-opacity:1;border-color:rgb(42 88 128/var(--tw-border-opacity,1))}.border-primary-700{--tw-border-opacity:1;border-color:rgb(29 63 91/var(--tw-border-opacity,1))}.border-primary-800{--tw-border-opacity:1;border-color:rgb(28 58 85/var(--tw-border-opacity,1))}.border-primary-900{--tw-border-opacity:1;border-color:rgb(30 41 51/var(--tw-border-opacity,1))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity,1))}.border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity,1))}.border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-white\/30{border-color:hsla(0,0%,100%,.3)}.bg-\[\#007acc\]{--tw-bg-opacity:1;background-color:rgb(0 122 204/var(--tw-bg-opacity,1))}.bg-\[\#0f172a\]{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.bg-\[\#1e1e1e\]{--tw-bg-opacity:1;background-color:rgb(30 30 30/var(--tw-bg-opacity,1))}.bg-\[\#1e293b\]{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.bg-\[\#252526\]{--tw-bg-opacity:1;background-color:rgb(37 37 38/var(--tw-bg-opacity,1))}.bg-\[\#282c34\]{--tw-bg-opacity:1;background-color:rgb(40 44 52/var(--tw-bg-opacity,1))}.bg-\[\#2d2d2d\]{--tw-bg-opacity:1;background-color:rgb(45 45 45/var(--tw-bg-opacity,1))}.bg-\[\#333333\]{--tw-bg-opacity:1;background-color:rgb(51 51 51/var(--tw-bg-opacity,1))}.bg-\[\#37373d\]{--tw-bg-opacity:1;background-color:rgb(55 55 61/var(--tw-bg-opacity,1))}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity,1))}.bg-primary-500{--tw-bg-opacity:1;background-color:rgb(42 88 128/var(--tw-bg-opacity,1))}.bg-primary-800{--tw-bg-opacity:1;background-color:rgb(28 58 85/var(--tw-bg-opacity,1))}.bg-primary-900\/50{background-color:rgba(30,41,51,.5)}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/20{background-color:hsla(0,0%,100%,.2)}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity,1))}.bg-opacity-20{--tw-bg-opacity:0.2}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-primary-600,.from-primary-700{--tw-gradient-from:#1d3f5b var(--tw-gradient-from-position);--tw-gradient-to:rgba(29,63,91,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-secondary-500{--tw-gradient-from:#fdd03f var(--tw-gradient-from-position);--tw-gradient-to:rgba(253,208,63,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-yellow-500{--tw-gradient-from:#eab308 var(--tw-gradient-from-position);--tw-gradient-to:rgba(234,179,8,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-primary-800{--tw-gradient-to:#1c3a55 var(--tw-gradient-to-position)}.to-primary-900{--tw-gradient-to:#1e2933 var(--tw-gradient-to-position)}.to-secondary-400{--tw-gradient-to:#ffdf76 var(--tw-gradient-to-position)}.to-yellow-400{--tw-gradient-to:#facc15 var(--tw-gradient-to-position)}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[6px\]{padding-top:6px;padding-bottom:6px}.pb-10{padding-bottom:2.5rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pl-\[30px\]{padding-left:30px}.pr-4{padding-right:1rem}.pr-9{padding-right:2.25rem}.pt-1{padding-top:.25rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[15px\]{font-size:15px}.text-\[18px\]{font-size:18px}.text-\[20px\]{font-size:20px}.text-\[56px\]{font-size:56px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.leading-none{line-height:1}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[\#0A66C2\]{--tw-text-opacity:1;color:rgb(10 102 194/var(--tw-text-opacity,1))}.text-\[\#25D366\]{--tw-text-opacity:1;color:rgb(37 211 102/var(--tw-text-opacity,1))}.text-\[\#29618a\]{--tw-text-opacity:1;color:rgb(41 97 138/var(--tw-text-opacity,1))}.text-\[\#306b96\]{--tw-text-opacity:1;color:rgb(48 107 150/var(--tw-text-opacity,1))}.text-\[\#858585\]{--tw-text-opacity:1;color:rgb(133 133 133/var(--tw-text-opacity,1))}.text-\[\#cccccc\]{--tw-text-opacity:1;color:rgb(204 204 204/var(--tw-text-opacity,1))}.text-\[\#d4d4d4\]{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity,1))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity,1))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.text-primary-100{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity,1))}.text-primary-200{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity,1))}.text-primary-300{--tw-text-opacity:1;color:rgb(55 118 171/var(--tw-text-opacity,1))}.text-primary-500{--tw-text-opacity:1;color:rgb(42 88 128/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity,1))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity,1))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity,1))}.text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity,1))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/80{color:hsla(0,0%,100%,.8)}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}.text-opacity-70{--tw-text-opacity:0.7}.no-underline{text-decoration-line:none}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-90{opacity:.9}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-2xl,.shadow-inner{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-sm,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.shadow-yellow-900\/20{--tw-shadow-color:rgba(113,63,18,.2);--tw-shadow:var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px)}.blur,.brightness-125{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)}.brightness-125{--tw-brightness:brightness(1.25)}.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)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}main blockquote{border-left:4px solid #e8e8e8;padding-left:15px;color:#e2b215;font-size:18px;letter-spacing:-1px;font-style:italic}main hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}main p{margin-top:0;margin-bottom:1.3rem}main .tutorial a,main a{color:#007be4}main .tutorial a:hover,main a{text-decoration:underline}main .tutorial a:hover{color:#e2b215}main pre{max-width:100%;overflow-x:auto;border-radius:.5rem}main pre code{display:block;overflow-x:auto;white-space:pre;border:none;background:transparent;padding:0}main code{background-color:#eee;padding:2px 4px;font-size:.9em;border:1px solid #e0e0e0;border-radius:3px;word-break:break-all}main h1{font-size:3rem;font-weight:600}main h2{font-size:2.2rem;font-weight:600;margin-top:24px}main h3{font-size:1.7rem;font-weight:600;margin-top:23px}main h4{font-size:1.4rem;font-weight:600;margin-top:22px}main h5{font-size:1.2rem;font-weight:600;margin-top:21px}main h6{font-size:1rem;font-weight:600;margin-top:20px}main ol{list-style:number}main ol,main ul{padding-left:30px;margin-bottom:1.3rem}main ul{list-style:square}main table{border-collapse:collapse;width:100%}main table td,main table th{border:1px solid #ddd;padding:10px}main table tr:nth-child(2n){background-color:#f2f2f2}main table tr:hover{background-color:#dfe6ed}main table th{padding-top:12px;padding-bottom:12px;text-align:left;background-color:#c4d4e3;color:#000}main kbd{padding:.15rem .35rem;font-size:87.5%;color:#fff;margin:0 2px;background-color:#212529;border-radius:.2rem}main{word-wrap:break-word;overflow-wrap:break-word;word-break:break-word}main,main img{max-width:100%}main img{height:auto}main table{display:block;overflow-x:auto;white-space:nowrap}main code,main pre{max-width:100%;overflow-wrap:normal;word-break:normal}@media (max-width:768px){main h1{font-size:2.2rem!important}main h2{font-size:1.8rem!important}main h3{font-size:1.5rem!important}}.custom-scrollbar::-webkit-scrollbar{width:6px}.custom-scrollbar::-webkit-scrollbar-track{background:#f1f5f9;border-radius:10px}.custom-scrollbar::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:10px}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background:#94a3b8}.no-scrollbar::-webkit-scrollbar{display:none}.no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.selection\:bg-blue-500\/30 ::-moz-selection{background-color:rgba(59,130,246,.3)}.selection\:bg-blue-500\/30 ::selection{background-color:rgba(59,130,246,.3)}.selection\:bg-blue-500\/30::-moz-selection{background-color:rgba(59,130,246,.3)}.selection\:bg-blue-500\/30::selection{background-color:rgba(59,130,246,.3)}.focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.hover\:bg-\[\#2a2d2e\]:hover{--tw-bg-opacity:1;background-color:rgb(42 45 46/var(--tw-bg-opacity,1))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity,1))}.hover\:bg-slate-300:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity,1))}.hover\:bg-slate-700:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.hover\:bg-white\/10:hover{background-color:hsla(0,0%,100%,.1)}.hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity,1))}.hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity,1))}.hover\:text-black:hover{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.hover\:text-primary-300:hover{--tw-text-opacity:1;color:rgb(55 118 171/var(--tw-text-opacity,1))}.hover\:text-primary-500:hover{--tw-text-opacity:1;color:rgb(42 88 128/var(--tw-text-opacity,1))}.hover\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:text-opacity-100:hover{--tw-text-opacity:1}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.hover\:shadow-xl:hover,.hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.group:hover .group-hover\:text-\[\#1d5883\]{--tw-text-opacity:1;color:rgb(29 88 131/var(--tw-text-opacity,1))}@media (min-width:768px){.md\:mb-16{margin-bottom:4rem}.md\:mb-4{margin-bottom:1rem}.md\:mr-0{margin-right:0}.md\:mr-10{margin-right:2.5rem}.md\:mt-0{margin-top:0}.md\:block{display:block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-12{height:3rem}.md\:h-5{height:1.25rem}.md\:h-auto{height:auto}.md\:w-1\/3{width:33.333333%}.md\:w-3\/12{width:25%}.md\:w-5{width:1.25rem}.md\:w-9\/12{width:75%}.md\:w-auto{width:auto}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:items-end{align-items:flex-end}.md\:justify-center{justify-content:center}.md\:justify-between{justify-content:space-between}.md\:gap-4{gap:1rem}.md\:gap-6{gap:1.5rem}.md\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.md\:overflow-visible{overflow:visible}.md\:border-l{border-left-width:1px}.md\:border-t-0{border-top-width:0}.md\:p-6{padding:1.5rem}.md\:p-8{padding:2rem}.md\:px-0{padding-left:0;padding-right:0}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.md\:py-16{padding-top:4rem;padding-bottom:4rem}.md\:py-3{padding-top:.75rem;padding-bottom:.75rem}.md\:pb-0{padding-bottom:0}.md\:pr-20{padding-right:5rem}.md\:text-center{text-align:center}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-\[20px\]{font-size:20px}.md\:text-\[80px\]{font-size:80px}.md\:text-base{font-size:1rem;line-height:1.5rem}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}}@media (prefers-color-scheme:dark){.dark\:border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity,1))}.dark\:border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity,1))}.dark\:bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity,1))}.dark\:bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity,1))}.dark\:bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.dark\:bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity,1))}.dark\:text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity,1))}.dark\:text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity,1))}.dark\:text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.dark\:text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}} \ No newline at end of file +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +/* +! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden]:where(:not([hidden="until-found"])) { + display: none; +} + +.\!container { + width: 100% !important; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .\!container { + max-width: 640px !important; + } + + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .\!container { + max-width: 768px !important; + } + + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .\!container { + max-width: 1024px !important; + } + + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .\!container { + max-width: 1280px !important; + } + + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .\!container { + max-width: 1536px !important; + } + + .container { + max-width: 1536px; + } +} + +.collapse { + visibility: collapse; +} + +.static { + position: static; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.sticky { + position: sticky; +} + +.inset-0 { + inset: 0px; +} + +.left-0 { + left: 0px; +} + +.left-4 { + left: 1rem; +} + +.right-0 { + right: 0px; +} + +.top-0 { + top: 0px; +} + +.top-24 { + top: 6rem; +} + +.top-4 { + top: 1rem; +} + +.isolate { + isolation: isolate; +} + +.z-10 { + z-index: 10; +} + +.z-\[60\] { + z-index: 60; +} + +.z-\[70\] { + z-index: 70; +} + +.z-\[80\] { + z-index: 80; +} + +.m-0 { + margin: 0px; +} + +.-mx-4 { + margin-left: -1rem; + margin-right: -1rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.-mt-0\.5 { + margin-top: -0.125rem; +} + +.-mt-10 { + margin-top: -2.5rem; +} + +.-mt-4 { + margin-top: -1rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-10 { + margin-bottom: 2.5rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-5 { + margin-bottom: 1.25rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.ml-1 { + margin-left: 0.25rem; +} + +.ml-2 { + margin-left: 0.5rem; +} + +.ml-auto { + margin-left: auto; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.mr-5 { + margin-right: 1.25rem; +} + +.mt-12 { + margin-top: 3rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-8 { + margin-top: 2rem; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.contents { + display: contents; +} + +.hidden { + display: none; +} + +.h-10 { + height: 2.5rem; +} + +.h-14 { + height: 3.5rem; +} + +.h-16 { + height: 4rem; +} + +.h-3 { + height: 0.75rem; +} + +.h-4 { + height: 1rem; +} + +.h-48 { + height: 12rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-8 { + height: 2rem; +} + +.h-9 { + height: 2.25rem; +} + +.h-\[calc\(100vh-6rem\)\] { + height: calc(100vh - 6rem); +} + +.h-auto { + height: auto; +} + +.h-full { + height: 100%; +} + +.min-h-0 { + min-height: 0px; +} + +.min-h-\[100px\] { + min-height: 100px; +} + +.min-h-\[200px\] { + min-height: 200px; +} + +.min-h-\[48px\] { + min-height: 48px; +} + +.min-h-full { + min-height: 100%; +} + +.w-1\/2 { + width: 50%; +} + +.w-12 { + width: 3rem; +} + +.w-20 { + width: 5rem; +} + +.w-3 { + width: 0.75rem; +} + +.w-4 { + width: 1rem; +} + +.w-4\/5 { + width: 80%; +} + +.w-48 { + width: 12rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-6 { + width: 1.5rem; +} + +.w-8 { + width: 2rem; +} + +.w-full { + width: 100%; +} + +.min-w-0 { + min-width: 0px; +} + +.min-w-fit { + min-width: -moz-fit-content; + min-width: fit-content; +} + +.max-w-2xl { + max-width: 42rem; +} + +.max-w-3xl { + max-width: 48rem; +} + +.max-w-4xl { + max-width: 56rem; +} + +.max-w-5xl { + max-width: 64rem; +} + +.max-w-7xl { + max-width: 80rem; +} + +.max-w-\[280px\] { + max-width: 280px; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-shrink { + flex-shrink: 1; +} + +.flex-shrink-0 { + flex-shrink: 0; +} + +.shrink-0 { + flex-shrink: 0; +} + +.-translate-x-full { + --tw-translate-x: -100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-\[-1px\] { + --tw-translate-y: -1px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.scale-110 { + --tw-scale-x: 1.1; + --tw-scale-y: 1.1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.cursor-not-allowed { + cursor: not-allowed; +} + +.cursor-pointer { + cursor: pointer; +} + +.select-none { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.resize-none { + resize: none; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.flex-col { + flex-direction: column; +} + +.flex-nowrap { + flex-wrap: nowrap; +} + +.items-start { + align-items: flex-start; +} + +.items-center { + align-items: center; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-2\.5 { + gap: 0.625rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-5 { + gap: 1.25rem; +} + +.gap-6 { + gap: 1.5rem; +} + +.gap-\[10px\] { + gap: 10px; +} + +.gap-x-2 { + -moz-column-gap: 0.5rem; + column-gap: 0.5rem; +} + +.space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.self-start { + align-self: flex-start; +} + +.overflow-auto { + overflow: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.overflow-y-auto { + overflow-y: auto; +} + +.overflow-x-hidden { + overflow-x: hidden; +} + +.scroll-smooth { + scroll-behavior: smooth; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.whitespace-pre-wrap { + white-space: pre-wrap; +} + +.break-all { + word-break: break-all; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-2xl { + border-radius: 1rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-sm { + border-radius: 0.125rem; +} + +.rounded-xl { + border-radius: 0.75rem; +} + +.rounded-b-3xl { + border-bottom-right-radius: 1.5rem; + border-bottom-left-radius: 1.5rem; +} + +.border { + border-width: 1px; +} + +.border-2 { + border-width: 2px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-l-2 { + border-left-width: 2px; +} + +.border-r { + border-right-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.border-t-2 { + border-top-width: 2px; +} + +.border-none { + border-style: none; +} + +.border-\[\#1e1e1e\] { + --tw-border-opacity: 1; + border-color: rgb(30 30 30 / var(--tw-border-opacity, 1)); +} + +.border-\[\#252526\] { + --tw-border-opacity: 1; + border-color: rgb(37 37 38 / var(--tw-border-opacity, 1)); +} + +.border-\[\#414141\] { + --tw-border-opacity: 1; + border-color: rgb(65 65 65 / var(--tw-border-opacity, 1)); +} + +.border-blue-500 { + --tw-border-opacity: 1; + border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.border-primary-500 { + --tw-border-opacity: 1; + border-color: rgb(42 88 128 / var(--tw-border-opacity, 1)); +} + +.border-primary-700 { + --tw-border-opacity: 1; + border-color: rgb(29 63 91 / var(--tw-border-opacity, 1)); +} + +.border-primary-800 { + --tw-border-opacity: 1; + border-color: rgb(28 58 85 / var(--tw-border-opacity, 1)); +} + +.border-primary-900 { + --tw-border-opacity: 1; + border-color: rgb(30 41 51 / var(--tw-border-opacity, 1)); +} + +.border-slate-100 { + --tw-border-opacity: 1; + border-color: rgb(241 245 249 / var(--tw-border-opacity, 1)); +} + +.border-slate-200 { + --tw-border-opacity: 1; + border-color: rgb(226 232 240 / var(--tw-border-opacity, 1)); +} + +.border-slate-300 { + --tw-border-opacity: 1; + border-color: rgb(203 213 225 / var(--tw-border-opacity, 1)); +} + +.border-slate-600 { + --tw-border-opacity: 1; + border-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); +} + +.border-slate-700 { + --tw-border-opacity: 1; + border-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); +} + +.border-white { + --tw-border-opacity: 1; + border-color: rgb(255 255 255 / var(--tw-border-opacity, 1)); +} + +.border-white\/30 { + border-color: rgb(255 255 255 / 0.3); +} + +.bg-\[\#007acc\] { + --tw-bg-opacity: 1; + background-color: rgb(0 122 204 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#0f172a\] { + --tw-bg-opacity: 1; + background-color: rgb(15 23 42 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#1e1e1e\] { + --tw-bg-opacity: 1; + background-color: rgb(30 30 30 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#1e293b\] { + --tw-bg-opacity: 1; + background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#252526\] { + --tw-bg-opacity: 1; + background-color: rgb(37 37 38 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#282c34\] { + --tw-bg-opacity: 1; + background-color: rgb(40 44 52 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#2d2d2d\] { + --tw-bg-opacity: 1; + background-color: rgb(45 45 45 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#333333\] { + --tw-bg-opacity: 1; + background-color: rgb(51 51 51 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#37373d\] { + --tw-bg-opacity: 1; + background-color: rgb(55 55 61 / var(--tw-bg-opacity, 1)); +} + +.bg-black\/50 { + background-color: rgb(0 0 0 / 0.5); +} + +.bg-blue-500 { + --tw-bg-opacity: 1; + background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1)); +} + +.bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1)); +} + +.bg-green-600 { + --tw-bg-opacity: 1; + background-color: rgb(22 163 74 / var(--tw-bg-opacity, 1)); +} + +.bg-indigo-600 { + --tw-bg-opacity: 1; + background-color: rgb(79 70 229 / var(--tw-bg-opacity, 1)); +} + +.bg-primary-500 { + --tw-bg-opacity: 1; + background-color: rgb(42 88 128 / var(--tw-bg-opacity, 1)); +} + +.bg-primary-800 { + --tw-bg-opacity: 1; + background-color: rgb(28 58 85 / var(--tw-bg-opacity, 1)); +} + +.bg-primary-900\/50 { + background-color: rgb(30 41 51 / 0.5); +} + +.bg-slate-100 { + --tw-bg-opacity: 1; + background-color: rgb(241 245 249 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-200 { + --tw-bg-opacity: 1; + background-color: rgb(226 232 240 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-50 { + --tw-bg-opacity: 1; + background-color: rgb(248 250 252 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-700 { + --tw-bg-opacity: 1; + background-color: rgb(51 65 85 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-800 { + --tw-bg-opacity: 1; + background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-900 { + --tw-bg-opacity: 1; + background-color: rgb(15 23 42 / var(--tw-bg-opacity, 1)); +} + +.bg-slate-950 { + --tw-bg-opacity: 1; + background-color: rgb(2 6 23 / var(--tw-bg-opacity, 1)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +.bg-white\/20 { + background-color: rgb(255 255 255 / 0.2); +} + +.bg-yellow-400 { + --tw-bg-opacity: 1; + background-color: rgb(250 204 21 / var(--tw-bg-opacity, 1)); +} + +.bg-opacity-20 { + --tw-bg-opacity: 0.2; +} + +.bg-gradient-to-b { + background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); +} + +.bg-gradient-to-l { + background-image: linear-gradient(to left, var(--tw-gradient-stops)); +} + +.bg-gradient-to-r { + background-image: linear-gradient(to right, var(--tw-gradient-stops)); +} + +.from-primary-600 { + --tw-gradient-from: #1d3f5b var(--tw-gradient-from-position); + --tw-gradient-to: rgb(29 63 91 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-primary-700 { + --tw-gradient-from: #1d3f5b var(--tw-gradient-from-position); + --tw-gradient-to: rgb(29 63 91 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-secondary-500 { + --tw-gradient-from: #fdd03f var(--tw-gradient-from-position); + --tw-gradient-to: rgb(253 208 63 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-yellow-500 { + --tw-gradient-from: #eab308 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(234 179 8 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.to-primary-800 { + --tw-gradient-to: #1c3a55 var(--tw-gradient-to-position); +} + +.to-primary-900 { + --tw-gradient-to: #1e2933 var(--tw-gradient-to-position); +} + +.to-secondary-400 { + --tw-gradient-to: #ffdf76 var(--tw-gradient-to-position); +} + +.to-yellow-400 { + --tw-gradient-to: #facc15 var(--tw-gradient-to-position); +} + +.p-0 { + padding: 0px; +} + +.p-0\.5 { + padding: 0.125rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.p-6 { + padding: 1.5rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.px-7 { + padding-left: 1.75rem; + padding-right: 1.75rem; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-1\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.py-10 { + padding-top: 2.5rem; + padding-bottom: 2.5rem; +} + +.py-12 { + padding-top: 3rem; + padding-bottom: 3rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.py-\[6px\] { + padding-top: 6px; + padding-bottom: 6px; +} + +.pb-10 { + padding-bottom: 2.5rem; +} + +.pb-2 { + padding-bottom: 0.5rem; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pl-\[30px\] { + padding-left: 30px; +} + +.pr-4 { + padding-right: 1rem; +} + +.pr-9 { + padding-right: 2.25rem; +} + +.pt-1 { + padding-top: 0.25rem; +} + +.pt-3 { + padding-top: 0.75rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.font-mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.font-sans { + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-\[15px\] { + font-size: 15px; +} + +.text-\[18px\] { + font-size: 18px; +} + +.text-\[20px\] { + font-size: 20px; +} + +.text-\[56px\] { + font-size: 56px; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.font-bold { + font-weight: 700; +} + +.font-medium { + font-weight: 500; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.lowercase { + text-transform: lowercase; +} + +.capitalize { + text-transform: capitalize; +} + +.leading-none { + line-height: 1; +} + +.leading-normal { + line-height: 1.5; +} + +.leading-relaxed { + line-height: 1.625; +} + +.tracking-wide { + letter-spacing: 0.025em; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.tracking-widest { + letter-spacing: 0.1em; +} + +.text-\[\#0A66C2\] { + --tw-text-opacity: 1; + color: rgb(10 102 194 / var(--tw-text-opacity, 1)); +} + +.text-\[\#25D366\] { + --tw-text-opacity: 1; + color: rgb(37 211 102 / var(--tw-text-opacity, 1)); +} + +.text-\[\#29618a\] { + --tw-text-opacity: 1; + color: rgb(41 97 138 / var(--tw-text-opacity, 1)); +} + +.text-\[\#306b96\] { + --tw-text-opacity: 1; + color: rgb(48 107 150 / var(--tw-text-opacity, 1)); +} + +.text-\[\#858585\] { + --tw-text-opacity: 1; + color: rgb(133 133 133 / var(--tw-text-opacity, 1)); +} + +.text-\[\#cccccc\] { + --tw-text-opacity: 1; + color: rgb(204 204 204 / var(--tw-text-opacity, 1)); +} + +.text-\[\#d4d4d4\] { + --tw-text-opacity: 1; + color: rgb(212 212 212 / var(--tw-text-opacity, 1)); +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.text-blue-200 { + --tw-text-opacity: 1; + color: rgb(191 219 254 / var(--tw-text-opacity, 1)); +} + +.text-blue-400 { + --tw-text-opacity: 1; + color: rgb(96 165 250 / var(--tw-text-opacity, 1)); +} + +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity, 1)); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity, 1)); +} + +.text-green-300 { + --tw-text-opacity: 1; + color: rgb(134 239 172 / var(--tw-text-opacity, 1)); +} + +.text-green-400 { + --tw-text-opacity: 1; + color: rgb(74 222 128 / var(--tw-text-opacity, 1)); +} + +.text-primary-100 { + --tw-text-opacity: 1; + color: rgb(224 242 254 / var(--tw-text-opacity, 1)); +} + +.text-primary-200 { + --tw-text-opacity: 1; + color: rgb(186 230 253 / var(--tw-text-opacity, 1)); +} + +.text-primary-300 { + --tw-text-opacity: 1; + color: rgb(55 118 171 / var(--tw-text-opacity, 1)); +} + +.text-primary-500 { + --tw-text-opacity: 1; + color: rgb(42 88 128 / var(--tw-text-opacity, 1)); +} + +.text-red-400 { + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity, 1)); +} + +.text-slate-200 { + --tw-text-opacity: 1; + color: rgb(226 232 240 / var(--tw-text-opacity, 1)); +} + +.text-slate-300 { + --tw-text-opacity: 1; + color: rgb(203 213 225 / var(--tw-text-opacity, 1)); +} + +.text-slate-400 { + --tw-text-opacity: 1; + color: rgb(148 163 184 / var(--tw-text-opacity, 1)); +} + +.text-slate-500 { + --tw-text-opacity: 1; + color: rgb(100 116 139 / var(--tw-text-opacity, 1)); +} + +.text-slate-600 { + --tw-text-opacity: 1; + color: rgb(71 85 105 / var(--tw-text-opacity, 1)); +} + +.text-slate-700 { + --tw-text-opacity: 1; + color: rgb(51 65 85 / var(--tw-text-opacity, 1)); +} + +.text-slate-800 { + --tw-text-opacity: 1; + color: rgb(30 41 59 / var(--tw-text-opacity, 1)); +} + +.text-slate-900 { + --tw-text-opacity: 1; + color: rgb(15 23 42 / var(--tw-text-opacity, 1)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.text-white\/80 { + color: rgb(255 255 255 / 0.8); +} + +.text-yellow-400 { + --tw-text-opacity: 1; + color: rgb(250 204 21 / var(--tw-text-opacity, 1)); +} + +.text-opacity-70 { + --tw-text-opacity: 0.7; +} + +.no-underline { + text-decoration-line: none; +} + +.opacity-0 { + opacity: 0; +} + +.opacity-100 { + opacity: 1; +} + +.opacity-90 { + opacity: 0.9; +} + +.shadow-2xl { + --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); + --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-inner { + --tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-xl { + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-yellow-900\/20 { + --tw-shadow-color: rgb(113 63 18 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.outline { + outline-style: solid; +} + +.blur { + --tw-blur: blur(8px); + 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); +} + +.brightness-125 { + --tw-brightness: brightness(1.25); + 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); +} + +.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); +} + +.backdrop-filter { + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-300 { + transition-duration: 300ms; +} + +main blockquote { + border-left: 4px solid #e8e8e8; + padding-left: 15px; + color: #e2b215; + font-size: 18px; + letter-spacing: -1px; + font-style: italic; +} + +main hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, .1); +} + +main p { + margin-top: 0; + margin-bottom: 1.3rem; +} + +main .tutorial a { + color: #007BE4; +} + +main a { + color: #007BE4; + text-decoration: underline; +} + +main .tutorial a:hover { + color: #e2b215; + text-decoration: underline; +} + +main pre { + max-width: 100%; + overflow-x: auto; + border-radius: 0.5rem; +} + +main pre code { + display: block; + overflow-x: auto; + white-space: pre; + border: none; + background: transparent; + padding: 0; +} + +main code { + background-color: #eee; + padding: 2px 4px; + font-size: 0.9em; + border: 1px solid #e0e0e0; + border-radius: 3px; + word-break: break-all; +} + +main h1 { + font-size: 3rem; + font-weight: 600; +} + +main h2 { + font-size: 2.2rem; + font-weight: 600; + margin-top: 24px; +} + +main h3 { + font-size: 1.7rem; + font-weight: 600; + margin-top: 23px; +} + +main h4 { + font-size: 1.4rem; + font-weight: 600; + margin-top: 22px; +} + +main h5 { + font-size: 1.2rem; + font-weight: 600; + margin-top: 21px; +} + +main h6 { + font-size: 1rem; + font-weight: 600; + margin-top: 20px; +} + +main ol { + list-style: number; + padding-left: 30px; + margin-bottom: 1.3rem; +} + +main ul { + list-style: square; + padding-left: 30px; + margin-bottom: 1.3rem; +} + +main table { + border-collapse: collapse; + width: 100%; +} + +main table td, +main table th { + border: 1px solid #ddd; + padding: 10px; +} + +main table tr:nth-child(even) { + background-color: #f2f2f2; +} + +main table tr:hover { + background-color: #dfe6ed; +} + +main table th { + padding-top: 12px; + padding-bottom: 12px; + text-align: left; + background-color: #c4d4e3; + color: black; +} + +main kbd { + padding: 0.15rem 0.35rem; + font-size: 87.5%; + color: #fff; + margin: 0 2px 0 2px; + background-color: #212529; + border-radius: 0.2rem; +} + +/* Fix Overflow Mobile */ + +main { + word-wrap: break-word; + overflow-wrap: break-word; + word-break: break-word; + max-width: 100%; +} + +main img { + max-width: 100%; + height: auto; +} + +main table { + display: block; + overflow-x: auto; + white-space: nowrap; +} + +main pre, +main code { + max-width: 100%; + overflow-wrap: normal; + word-break: normal; +} + +/* Heading responsive sizes */ + +@media (max-width: 768px) { + main h1 { + font-size: 2.2rem !important; + } + + main h2 { + font-size: 1.8rem !important; + } + + main h3 { + font-size: 1.5rem !important; + } +} + +/* Custom Scrollbar */ + +.custom-scrollbar::-webkit-scrollbar { + width: 6px; +} + +.custom-scrollbar::-webkit-scrollbar-track { + background: #f1f5f9; + border-radius: 10px; +} + +.custom-scrollbar::-webkit-scrollbar-thumb { + background: #cbd5e1; + border-radius: 10px; +} + +.custom-scrollbar::-webkit-scrollbar-thumb:hover { + background: #94a3b8; +} + +/* Hide scrollbar for Chrome, Safari and Opera */ + +.no-scrollbar::-webkit-scrollbar { + display: none; +} + +/* Hide scrollbar for IE, Edge and Firefox */ + +.no-scrollbar { + -ms-overflow-style: none; + /* IE and Edge */ + scrollbar-width: none; + /* Firefox */ +} + +.selection\:bg-blue-500\/30 *::-moz-selection { + background-color: rgb(59 130 246 / 0.3); +} + +.selection\:bg-blue-500\/30 *::selection { + background-color: rgb(59 130 246 / 0.3); +} + +.selection\:bg-blue-500\/30::-moz-selection { + background-color: rgb(59 130 246 / 0.3); +} + +.selection\:bg-blue-500\/30::selection { + background-color: rgb(59 130 246 / 0.3); +} + +.focus-within\:border-blue-500:focus-within { + --tw-border-opacity: 1; + border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.hover\:bg-\[\#2a2d2e\]:hover { + --tw-bg-opacity: 1; + background-color: rgb(42 45 46 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-blue-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-green-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(34 197 94 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-indigo-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(99 102 241 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-slate-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-slate-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(51 65 85 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-white\/10:hover { + background-color: rgb(255 255 255 / 0.1); +} + +.hover\:bg-yellow-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(253 224 71 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-yellow-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 252 232 / var(--tw-bg-opacity, 1)); +} + +.hover\:text-black:hover { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.hover\:text-primary-300:hover { + --tw-text-opacity: 1; + color: rgb(55 118 171 / var(--tw-text-opacity, 1)); +} + +.hover\:text-primary-500:hover { + --tw-text-opacity: 1; + color: rgb(42 88 128 / var(--tw-text-opacity, 1)); +} + +.hover\:text-slate-600:hover { + --tw-text-opacity: 1; + color: rgb(71 85 105 / var(--tw-text-opacity, 1)); +} + +.hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.hover\:text-opacity-100:hover { + --tw-text-opacity: 1; +} + +.hover\:no-underline:hover { + text-decoration-line: none; +} + +.hover\:opacity-80:hover { + opacity: 0.8; +} + +.hover\:shadow:hover { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.hover\:shadow-xl:hover { + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.focus\:border-blue-500:focus { + --tw-border-opacity: 1; + border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring-0:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-blue-500:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1)); +} + +.group:hover .group-hover\:text-\[\#1d5883\] { + --tw-text-opacity: 1; + color: rgb(29 88 131 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 768px) { + .md\:mb-16 { + margin-bottom: 4rem; + } + + .md\:mb-4 { + margin-bottom: 1rem; + } + + .md\:mr-0 { + margin-right: 0px; + } + + .md\:mr-10 { + margin-right: 2.5rem; + } + + .md\:mt-0 { + margin-top: 0px; + } + + .md\:block { + display: block; + } + + .md\:inline { + display: inline; + } + + .md\:flex { + display: flex; + } + + .md\:hidden { + display: none; + } + + .md\:h-12 { + height: 3rem; + } + + .md\:h-5 { + height: 1.25rem; + } + + .md\:h-auto { + height: auto; + } + + .md\:w-1\/3 { + width: 33.333333%; + } + + .md\:w-3\/12 { + width: 25%; + } + + .md\:w-5 { + width: 1.25rem; + } + + .md\:w-9\/12 { + width: 75%; + } + + .md\:w-auto { + width: auto; + } + + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .md\:flex-row { + flex-direction: row; + } + + .md\:items-start { + align-items: flex-start; + } + + .md\:items-end { + align-items: flex-end; + } + + .md\:justify-center { + justify-content: center; + } + + .md\:justify-between { + justify-content: space-between; + } + + .md\:gap-4 { + gap: 1rem; + } + + .md\:gap-6 { + gap: 1.5rem; + } + + .md\:gap-x-4 { + -moz-column-gap: 1rem; + column-gap: 1rem; + } + + .md\:overflow-visible { + overflow: visible; + } + + .md\:border-l { + border-left-width: 1px; + } + + .md\:border-t-0 { + border-top-width: 0px; + } + + .md\:p-6 { + padding: 1.5rem; + } + + .md\:p-8 { + padding: 2rem; + } + + .md\:px-0 { + padding-left: 0px; + padding-right: 0px; + } + + .md\:px-10 { + padding-left: 2.5rem; + padding-right: 2.5rem; + } + + .md\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + .md\:px-8 { + padding-left: 2rem; + padding-right: 2rem; + } + + .md\:py-14 { + padding-top: 3.5rem; + padding-bottom: 3.5rem; + } + + .md\:py-16 { + padding-top: 4rem; + padding-bottom: 4rem; + } + + .md\:py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + } + + .md\:pb-0 { + padding-bottom: 0px; + } + + .md\:pr-20 { + padding-right: 5rem; + } + + .md\:text-center { + text-align: center; + } + + .md\:text-2xl { + font-size: 1.5rem; + line-height: 2rem; + } + + .md\:text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; + } + + .md\:text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; + } + + .md\:text-5xl { + font-size: 3rem; + line-height: 1; + } + + .md\:text-\[20px\] { + font-size: 20px; + } + + .md\:text-\[80px\] { + font-size: 80px; + } + + .md\:text-base { + font-size: 1rem; + line-height: 1.5rem; + } + + .md\:text-lg { + font-size: 1.125rem; + line-height: 1.75rem; + } +} + +@media (prefers-color-scheme: dark) { + .dark\:border-slate-600 { + --tw-border-opacity: 1; + border-color: rgb(71 85 105 / var(--tw-border-opacity, 1)); + } + + .dark\:border-slate-700 { + --tw-border-opacity: 1; + border-color: rgb(51 65 85 / var(--tw-border-opacity, 1)); + } + + .dark\:bg-slate-700 { + --tw-bg-opacity: 1; + background-color: rgb(51 65 85 / var(--tw-bg-opacity, 1)); + } + + .dark\:bg-slate-800 { + --tw-bg-opacity: 1; + background-color: rgb(30 41 59 / var(--tw-bg-opacity, 1)); + } + + .dark\:bg-slate-900 { + --tw-bg-opacity: 1; + background-color: rgb(15 23 42 / var(--tw-bg-opacity, 1)); + } + + .dark\:bg-slate-950 { + --tw-bg-opacity: 1; + background-color: rgb(2 6 23 / var(--tw-bg-opacity, 1)); + } + + .dark\:text-slate-200 { + --tw-text-opacity: 1; + color: rgb(226 232 240 / var(--tw-text-opacity, 1)); + } + + .dark\:text-slate-300 { + --tw-text-opacity: 1; + color: rgb(203 213 225 / var(--tw-text-opacity, 1)); + } + + .dark\:text-slate-400 { + --tw-text-opacity: 1; + color: rgb(148 163 184 / var(--tw-text-opacity, 1)); + } + + .dark\:text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); + } +} \ No newline at end of file diff --git a/package.json b/package.json index 10a1824..1d5da55 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/belajarpythoncom/belajarpython.com.git" + "url": "git+https://github.com/codeuzhub/python-lessons.git" }, "keywords": [ "python", @@ -24,7 +24,7 @@ "author": "Purwanto", "license": "MIT", "bugs": { - "url": "https://github.com/belajarpythoncom/belajarpython.com/issues" + "url": "https://github.com/codeuzhub/python-lessons/issues" }, "homepage": "https://belajarpython.com", "devDependencies": { From a5c8ebf7e84536ba8937cb1883fc0cb390ff636c Mon Sep 17 00:00:00 2001 From: yakhyo Date: Wed, 25 Feb 2026 14:55:12 +0900 Subject: [PATCH 03/16] Improve embedded Python runtime and tutorial navigation UI --- .eleventy.js | 2 + _includes/pyodide-runtime.njk | 204 +++++++++++++++++++++ _includes/python-ast-transform-runtime.njk | 27 +-- _includes/python-runner.njk | 57 +++--- _includes/python-tool-runner.njk | 47 ++--- _layouts/tutorial.njk | 6 +- assets/js/pyodide-worker.js | 99 ++++++++++ tools/json-to-python.njk | 24 +-- tools/python-password-generator.njk | 22 +-- tools/python-regex-tester.njk | 29 ++- 10 files changed, 374 insertions(+), 143 deletions(-) create mode 100644 _includes/pyodide-runtime.njk create mode 100644 assets/js/pyodide-worker.js diff --git a/.eleventy.js b/.eleventy.js index 4111e7c..f3a0f5d 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -24,6 +24,7 @@ module.exports = function (eleventyConfig) { eleventyConfig.addPassthroughCopy({ "assets/img": "img" }); eleventyConfig.addPassthroughCopy({ "assets/css": "css" }); + eleventyConfig.addPassthroughCopy({ "assets/js": "js" }); eleventyConfig.addPassthroughCopy(".nojekyll"); eleventyConfig.addPassthroughCopy({ "assets/img/favicon.png": "favicon.png" }); @@ -61,6 +62,7 @@ module.exports = function (eleventyConfig) { }); eleventyConfig.addWatchTarget("./assets/css/"); + eleventyConfig.addWatchTarget("./assets/js/"); eleventyConfig.addWatchTarget("./tailwind.css"); eleventyConfig.setServerOptions({ diff --git a/_includes/pyodide-runtime.njk b/_includes/pyodide-runtime.njk new file mode 100644 index 0000000..d611d78 --- /dev/null +++ b/_includes/pyodide-runtime.njk @@ -0,0 +1,204 @@ + diff --git a/_includes/python-ast-transform-runtime.njk b/_includes/python-ast-transform-runtime.njk index 975e228..fa16e60 100644 --- a/_includes/python-ast-transform-runtime.njk +++ b/_includes/python-ast-transform-runtime.njk @@ -1,15 +1,6 @@ - +{% include "pyodide-runtime.njk" %} +{% include "pyodide-runtime.njk" %} +{% include "pyodide-runtime.njk" %} +{% include "pyodide-runtime.njk" %} +{% include "pyodide-runtime.njk" %} diff --git a/_includes/python-split-editor-tool.njk b/_includes/python-split-editor-tool.njk index 1bea9a2..0e5c0a7 100644 --- a/_includes/python-split-editor-tool.njk +++ b/_includes/python-split-editor-tool.njk @@ -18,7 +18,7 @@ Ready @@ -85,7 +85,7 @@

{% if tutorialNav.prev %} - + {{ tutorialNav.prev.data.title }} @@ -96,14 +96,14 @@ {% if tutorialNav.next %} {{ tutorialNav.next.data.title }} - + {% else %} Back to Start - + diff --git a/assets/css/base.css b/assets/css/base.css index a057150..02e1a2a 100644 --- a/assets/css/base.css +++ b/assets/css/base.css @@ -1434,8 +1434,8 @@ video { } .from-primary-600 { - --tw-gradient-from: #1d3f5b var(--tw-gradient-from-position); - --tw-gradient-to: rgb(29 63 91 / 0) var(--tw-gradient-to-position); + --tw-gradient-from: #234c6e var(--tw-gradient-from-position); + --tw-gradient-to: rgb(35 76 110 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); } @@ -2099,7 +2099,7 @@ main h6 { } main ol { - list-style: number; + list-style-type: decimal; padding-left: 30px; margin-bottom: 1.3rem; } @@ -2113,6 +2113,9 @@ main ul { main table { border-collapse: collapse; width: 100%; + display: block; + overflow-x: auto; + white-space: nowrap; } main table td, @@ -2160,12 +2163,6 @@ main img { height: auto; } -main table { - display: block; - overflow-x: auto; - white-space: nowrap; -} - main pre, main code { max-width: 100%; @@ -2245,6 +2242,12 @@ main code { border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); } +.hover\:scale-\[1\.15\]:hover { + --tw-scale-x: 1.15; + --tw-scale-y: 1.15; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + .hover\:bg-\[\#2a2d2e\]:hover { --tw-bg-opacity: 1; background-color: rgb(42 45 46 / var(--tw-bg-opacity, 1)); @@ -2433,6 +2436,10 @@ main code { width: auto; } + .md\:w-full { + width: 100%; + } + .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } diff --git a/assets/img/icon-github.svg b/assets/img/icon-github.svg deleted file mode 100644 index a2426a9..0000000 --- a/assets/img/icon-github.svg +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/img/icons/icon-python.ico b/assets/img/icons/icon-python.ico deleted file mode 100644 index c9efc5844a2627a8474949724a2aefe4ab2baee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmcgz3tUxI_P$#EqsLfjrKaN}rF^8R7zl#$e#lE9E2sH4T54qp=Bv_FY)l=~00C>% zF&`;O=A+c|g@6JoRF;_+O)YUI9mCN{y9!+PeBZujUk}%FFE4Tbe#_&%_nf`g+Uv2` z`qsf@YGS&@bnm?;TsxRvy47UzG?`2tI@mscjPIA>yI#Gt&+aBu=mREG7uBIOT=7iM}d`t)*vk<+$7lLzev?;P$@UuUtE$9x=ZJ;KgrrPHgxHf;L zREU_9LdZFeV2(pVxNCgi_W%&(dJNPKbQg&7bOiZ=o_PKjA=Dgxg=ez*=AT>JE$`gg zj@jqdw%TE%=1U6R#J!xW!>URCi7O}gS(c9T5%?VW>Nz3wa|A&aZ}9Or_~`tNZ9ljt z%@^lQ!To*LPYXKo@tXl+#Y8_5*{AKZiKUl6=Nu!z$J3A{8nUQ4dg|tQDEGHK^6=Tr zP|K&&g2kFQ{6*@Eo>}-VCgJD*t{HRIY8mmbYjXsGkAC1o&7tjQ*tR)?#Ah?Z#3yeB ziPe(_inNzKw}$j?^JmNx1qugI{{bO;PQ4OPVzqFN9^j)BWWo2L+3!Y+FW!j|8|;YSI9)bXCj zMTsr5!o`LeAwuoNl0+Z*Jm(;3a|A`65F!9`cpkQv;rY%5sd2k<7sQGkb0fv(zlIC7 z7t1I3iNBBat~Lkm4d$CEk7yr=h1)ibJz&o9fo%5n-?)JS{IdOncdx59A zfM~N$N6vzn4cliADwBILJy>MIE|$IKYgzP?*FrqRXK&FzeBpMJNs|6c7ynOE_iI-& z)B)rVVtnFAV&JLYP`=DPLL@Ww2Kj)vZ^0mckT<9&s3V9z?*?iDYUtqF%|PzGzWi}| z@BH&ydKUd|?oxEM?2)1h(Z0Y^+B)yDxy9zwS$EC;Gy(TTf*3P8fw->?<>8LNqH~i2 zekd;+@I$5W{=QQ5{jO3xey~Dx`>H~?gNF|LD@5DEa`9k(xwtp?N}1b&ZEs;+?hE$< z8ma$?EwRjuK5iA^N39~rTq&IKFyVNmICZ5;Og&L4?%Pu?+!pR+9Pp7712LB;o%$GK1k=#{*n8zwFa#}{GU}q@i62>^?e`@{a_Cs-@+cWeNgt$dXHS6=UHv{pLR~4 zxd(JVs3oZRs9&mtBM(u~MVMv}dLDX$hpw7Uwkxnu{zpM=L5z)@kMnYV+N9nul#g}B z_gUdAv!(=^KYr7{ zEc1;3@e$5E+!LONGuIUl+=oE;h1`cjHeINF=*;*4-+ZW`T-={`rR?79%VxLK?aX(A zG#Ht@{nd5hm8CY={zf&mYII#nfx8u4%#HfgjE`)vC_ z9-3ueqHR!T?Qkw8ZJRwvY@HP$J_irX7kE}PXTa~#Twn2!0A0KcdrTEx;ev!xp4ZP6-feUiX)|H1k;IkV_JL#0SVlGsf8RVU=5t4DCG5 z)jo9F_Z!d0o`q@gy9yV^iM=U0JxCrLe3EeiKFPSS`t^Z=`R9k@ePvF+IKf-I|H`#| zm^`G6_ArO-J~A^FzB%ZaRfIU`qDS7@kFkEI{TV}(_ov4T2m7 zU8NpS8+`~pEJaPgoPN{lUT|&$K*{7H8R) z7B6TEdG9G(Fz`vn1zmjpXp*u8=m9*~^l*&_u0ITMQu2TtO6|jd!{w}5yMcHHnTpef zPCtyC@JYr6+5*-NYv}qaKL2uPr_67EI~R79fVKTW%=zj)WPFBC z>IZ9S+ga^AJ}*t|Pak9cD}AiK45;}0b77`r;qaDZgZQlFOuG0C8(fVwS%=zvtUf&K zPl*jGNEvLoEw;OA*+P<|uYdSu|7`ZnkE*Z91w0nNE*)cvNXR~}d zJ;;pwdH0&v2NEMqx=_Ie6Y^UhO*}lA4GvxDODi zX*kG^QxIXeaf5ZvZ6MZRtbsa#h*L18u|D+!1%g6AtWWrv-?Mh^4q~lB+=F)9AX~!o zbsglLm?~>HkH^*>oX|7(%-YBD|C86f=yJ&;g_ld*frH4LGT(B#^`1*5EpsoGwD{ue z)@JLDFS}#T`b0d(oXsCZnHdY+K%BR+hveNm+Z^Qk&2PEB-DuV|H!#?8f!Bzq7O9M z_?((I1oyV45{>gYwFn1SjU#P#K5?5+j#B z4a`Bwa5MNHiMm5C12NoqL+PtVH^>gC2<65L4C50RFu|F8h@=?Js_3{N z9Few2eJX1H;u+vvN(Nxitl@5y3|NQpljoRPPhB6xcdQF}zPZZZ{tv(N-X5TVAo>$+ zQjr%i)7r{_=a@4N);+K0sq2*(FERH=L6pNN|Gh1JO#klaM`j{lEhE;-I+nN!F$LBy zcrIeBhWn0&9$3RlTXN6?aRuVg(x-uMFfQqB=?P^^!2cMR^tMC{j(vhw=-DtXv1f8O zVyoMVLupu_Ia41HZA^boH(izx><+xRRMwxsD2d6eMcu(Vm^C2#tav73+^<43R0j4I zoXOA;XPl7?&2YxuvE|o1@DK~4ozceCaNCp=VkW*xY>)UNYiQPw#Ff~qX0I7HM-cax zGW^?yzZ>cS*baT#Q4hr92ja|?_@{#m-KhuUd-Q2T8IWgC2DddwKLj5^pw=L%gN;eS ziL5(`kFu9boS2vtu{qe1O$OKz`Bzx2Ga3G@Y{@_dVr9-`AfD|^hL*6U`)Ny%;SV`i zEDpI+(=D?i%*1hsF%#z|*1iEahLiy~g7gK{@rr*}GO!QfOong`?`xT?h`4k!WwI{QjX8R5iK85jdT=E}4E&+KGPK!qnYQ4oa8TmG#J{8r%8uX*(vA$y1>_VZ z@4z20#}H5?s4h88nD_Ec!=k=BpBar>x;`?r-)rNaJ*GXtQ6-+N^}6T_)ncmdTyT|N z@SQZ`%*%jvv-d)*nY|D8UsUgb{g>3yeNQKk?)%lG_^xxhPM-Tzl=(`rk|9{@2kHGm z*%JGNe7A-E@Nj|T-#b5<7^v2t(J*l%Ur=`BD!*Wk#2y~|SF(pj8PKrlLhH|X%?oSJ0-wxr46ZsWgqLFy1Qv26BM>f;Oc97&g_vIofimy&^f55AX{ z;Y5b{FZ9mq@z#4!>TStU55&i8da%jho_%I5Y_@A*>W~fWPf0t{`a^Z~1*2S>GO%yM zcLQZF6a7^7kM#Xar2}5aMm;(;^5FRo^ggX*(BorD2KOz;lEHt+{pmxdvB$?gBkkyB z`+|~zI`H{u%hP;^r8Y9SFW>Vb_-|R565W%1QuOE`1MCR>T4_fMw3upeE;NQOB#-uB zJPc(|Q!fKCzF^=k?6)gDcz!GUoW!}CflLR|;!C9rv?HzW&i4--&joolyT~u}xwfj= z>f#GvCE^)kOF9`8#;2FTtLS1b?(Gb^9b_s_kDtaqt+XQpU#M+0m}-Jms*MBb@w@8e3#w+*-mzk@%(3p2c4TlasFb4*>^P;)mLkj*rTupuW9>_v#Bk&e+WNxH;9s9#{K8q? z=_0>CeZZWCf5&y*xq2goDa89CD%UQ|cvk$ld#N~CkSTIgpOF|$ed+@3YZTTY9&XRa9M`>(pQQ|`LzdGQBz{rPTpN7_ z^FI=N*^^*C)2RFIO#Zz2(Zg~U#4gX7A6=aNZj>4Li^T}bLw})k{fuBU`XZY$r}!^i z{e~~!qhT)7AihN}g)47^^rcD-HTJtKU^)l}Cj9%FUU
- Icon + File Edit Selection @@ -59,7 +59,7 @@ permalink: /online-python-ide/
- app.py + app.py ×
From d2ab75ad1973bea09690b82618f602b50b08d271 Mon Sep 17 00:00:00 2001 From: yakhyo Date: Thu, 26 Feb 2026 18:01:59 +0900 Subject: [PATCH 06/16] add uzbek language and other changes --- .eleventy.js | 57 +++ _includes/head.njk | 5 +- _includes/landing.njk | 42 ++- _includes/navbar.njk | 53 ++- _includes/sidebar-list.njk | 37 +- _includes/sidebar.njk | 4 +- _layouts/base.njk | 4 +- _layouts/tutorial.njk | 140 ++++--- assets/css/base.css | 99 +++-- assets/img/icons/bronze.svg | 28 ++ assets/img/icons/gold.svg | 25 ++ assets/img/icons/silver.svg | 32 ++ tailwind.config.js | 29 +- uz/.github/CONTRIBUTING.md | 44 +++ uz/README.md | 43 +++ uz/index.md | 8 + uz/tutorial/advanced/33-python-type-hints.md | 324 ++++++++++++++++ uz/tutorial/advanced/34-python-decorators.md | 145 ++++++++ .../35-python-iterators-generators.md | 145 ++++++++ .../advanced/36-python-context-managers.md | 126 +++++++ .../advanced/37-python-metaprogramming.md | 124 +++++++ ...8-python-multithreading-multiprocessing.md | 123 ++++++ uz/tutorial/advanced/39-python-async-await.md | 315 ++++++++++++++++ .../advanced/40-python-design-patterns.md | 160 ++++++++ .../advanced/41-python-unit-testing.md | 145 ++++++++ .../advanced/42-python-memory-management.md | 91 +++++ uz/tutorial/basic/01-what-is-python.md | 34 ++ uz/tutorial/basic/02-python-installation.md | 80 ++++ uz/tutorial/basic/03-running-python.md | 234 ++++++++++++ uz/tutorial/basic/04-hello-world-python.md | 53 +++ uz/tutorial/basic/05-python-comments.md | 66 ++++ uz/tutorial/basic/06-python-data-types.md | 71 ++++ uz/tutorial/basic/07-python-variables.md | 57 +++ uz/tutorial/basic/08-python-operators.md | 155 ++++++++ uz/tutorial/basic/09-python-conditions.md | 143 +++++++ uz/tutorial/basic/10-python-loops.md | 84 +++++ uz/tutorial/basic/11-python-numbers.md | 135 +++++++ uz/tutorial/basic/12-python-strings.md | 227 ++++++++++++ uz/tutorial/basic/13-python-f-strings.md | 209 +++++++++++ uz/tutorial/basic/14-python-lists.md | 127 +++++++ .../basic/15-python-list-comprehension.md | 220 +++++++++++ uz/tutorial/basic/16-python-tuples.md | 122 ++++++ uz/tutorial/basic/17-python-dictionaries.md | 86 +++++ uz/tutorial/basic/18-python-sets.md | 350 ++++++++++++++++++ uz/tutorial/basic/19-python-date-time.md | 135 +++++++ uz/tutorial/basic/20-python-functions.md | 91 +++++ uz/tutorial/basic/21-python-lambda.md | 288 ++++++++++++++ uz/tutorial/intermediate/22-python-modules.md | 116 ++++++ uz/tutorial/intermediate/23-python-file-io.md | 79 ++++ .../intermediate/24-python-exceptions.md | 115 ++++++ .../intermediate/25-python-class-objects.md | 169 +++++++++ .../intermediate/26-python-database-access.md | 165 +++++++++ .../intermediate/27-python-networking.md | 119 ++++++ .../intermediate/28-python-web-development.md | 116 ++++++ uz/tutorial/intermediate/29-python-regex.md | 173 +++++++++ uz/tutorial/intermediate/30-python-json.md | 125 +++++++ .../31-python-virtual-environment.md | 113 ++++++ .../intermediate/32-python-pip-package.md | 110 ++++++ 58 files changed, 6603 insertions(+), 112 deletions(-) create mode 100644 assets/img/icons/bronze.svg create mode 100644 assets/img/icons/gold.svg create mode 100644 assets/img/icons/silver.svg create mode 100644 uz/.github/CONTRIBUTING.md create mode 100644 uz/README.md create mode 100644 uz/index.md create mode 100644 uz/tutorial/advanced/33-python-type-hints.md create mode 100644 uz/tutorial/advanced/34-python-decorators.md create mode 100644 uz/tutorial/advanced/35-python-iterators-generators.md create mode 100644 uz/tutorial/advanced/36-python-context-managers.md create mode 100644 uz/tutorial/advanced/37-python-metaprogramming.md create mode 100644 uz/tutorial/advanced/38-python-multithreading-multiprocessing.md create mode 100644 uz/tutorial/advanced/39-python-async-await.md create mode 100644 uz/tutorial/advanced/40-python-design-patterns.md create mode 100644 uz/tutorial/advanced/41-python-unit-testing.md create mode 100644 uz/tutorial/advanced/42-python-memory-management.md create mode 100644 uz/tutorial/basic/01-what-is-python.md create mode 100644 uz/tutorial/basic/02-python-installation.md create mode 100644 uz/tutorial/basic/03-running-python.md create mode 100644 uz/tutorial/basic/04-hello-world-python.md create mode 100644 uz/tutorial/basic/05-python-comments.md create mode 100644 uz/tutorial/basic/06-python-data-types.md create mode 100644 uz/tutorial/basic/07-python-variables.md create mode 100644 uz/tutorial/basic/08-python-operators.md create mode 100644 uz/tutorial/basic/09-python-conditions.md create mode 100644 uz/tutorial/basic/10-python-loops.md create mode 100644 uz/tutorial/basic/11-python-numbers.md create mode 100644 uz/tutorial/basic/12-python-strings.md create mode 100644 uz/tutorial/basic/13-python-f-strings.md create mode 100644 uz/tutorial/basic/14-python-lists.md create mode 100644 uz/tutorial/basic/15-python-list-comprehension.md create mode 100644 uz/tutorial/basic/16-python-tuples.md create mode 100644 uz/tutorial/basic/17-python-dictionaries.md create mode 100644 uz/tutorial/basic/18-python-sets.md create mode 100644 uz/tutorial/basic/19-python-date-time.md create mode 100644 uz/tutorial/basic/20-python-functions.md create mode 100644 uz/tutorial/basic/21-python-lambda.md create mode 100644 uz/tutorial/intermediate/22-python-modules.md create mode 100644 uz/tutorial/intermediate/23-python-file-io.md create mode 100644 uz/tutorial/intermediate/24-python-exceptions.md create mode 100644 uz/tutorial/intermediate/25-python-class-objects.md create mode 100644 uz/tutorial/intermediate/26-python-database-access.md create mode 100644 uz/tutorial/intermediate/27-python-networking.md create mode 100644 uz/tutorial/intermediate/28-python-web-development.md create mode 100644 uz/tutorial/intermediate/29-python-regex.md create mode 100644 uz/tutorial/intermediate/30-python-json.md create mode 100644 uz/tutorial/intermediate/31-python-virtual-environment.md create mode 100644 uz/tutorial/intermediate/32-python-pip-package.md diff --git a/.eleventy.js b/.eleventy.js index e7dab71..a924afd 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,4 +1,6 @@ const markdownIt = require("markdown-it"); +const fs = require("fs"); +const nodePath = require("path"); function normalizePathPrefix(rawPathPrefix = "/") { if (!rawPathPrefix || rawPathPrefix === "/") { @@ -32,6 +34,26 @@ module.exports = function (eleventyConfig) { return new Date(dateObj).toISOString().split('T')[0]; }); + eleventyConfig.addFilter("fileLastModified", function (inputPath, langCode) { + if (!inputPath) { + return null; + } + + try { + const normalizedPath = String(inputPath).replace(/^\.\/+/, ""); + const absolutePath = nodePath.resolve(process.cwd(), normalizedPath); + const stats = fs.statSync(absolutePath); + const locale = langCode === "uz" ? "uz-UZ" : "en-US"; + return new Intl.DateTimeFormat(locale, { + year: "numeric", + month: "long", + day: "numeric" + }).format(stats.mtime); + } catch (_error) { + return null; + } + }); + eleventyConfig.addFilter("urlencode", function (str) { return encodeURIComponent(str); }); @@ -40,6 +62,35 @@ module.exports = function (eleventyConfig) { return String(value).padStart(length || 2, char || "0"); }); + eleventyConfig.addFilter("displayTutorialTitle", function (value) { + if (typeof value !== "string") { + return value; + } + + const original = value.trim(); + if (!original) { + return value; + } + + let title = original.replace(/\s+/g, " "); + const titleBeforeLeadingStrip = title; + + // Remove common tutorial title wrappers that redundantly include "Python". + title = title.replace(/\s*\(\s*Python\s*\)\s*$/i, ""); + title = title.replace(/\s+(?:to|in|with|for|on)\s+Python$/i, ""); + title = title.replace(/\s+Python$/i, ""); + title = title.replace(/^Python'(?:ga|ni|da|ning)\s+/i, ""); + title = title.replace(/^Python(?:ga|ni|da|ning)\s+/i, ""); + title = title.replace(/^Python\s+/i, ""); + + title = title.trim(); + if (titleBeforeLeadingStrip !== title && /^[a-z]/.test(title)) { + title = title.charAt(0).toUpperCase() + title.slice(1); + } + + return title || original; + }); + eleventyConfig.addFilter("getTutorialNav", function (tutorials, currentUrl) { if (!Array.isArray(tutorials) || !currentUrl) { return { first: null, prev: null, next: null }; @@ -61,6 +112,12 @@ module.exports = function (eleventyConfig) { }); }); + eleventyConfig.addCollection("tutorialsUz", function (collectionApi) { + return collectionApi.getFilteredByGlob("uz/tutorial/**/*.md").sort((a, b) => { + return (a.data.order || 0) - (b.data.order || 0); + }); + }); + eleventyConfig.addCollection("tools", function (collectionApi) { return collectionApi.getFilteredByGlob("tools/*.njk"); }); diff --git a/_includes/head.njk b/_includes/head.njk index 56931ea..360002e 100644 --- a/_includes/head.njk +++ b/_includes/head.njk @@ -1,10 +1,11 @@ {% set langCode = lang or 'en' %} + {% set tutorialDisplayTitle = (title | displayTutorialTitle) if title else title %} {% set pageDescription = description or site.description %} {% if isHomepage %} {% set pageTitle = "Python Programming Tutorial | " + site.name %} {% elif isTutorial %} - {% set pageTitle = title + " - Complete Tutorial Basic to Advanced" %} + {% set pageTitle = tutorialDisplayTitle + " - Complete Tutorial Basic to Advanced" %} {% elif title %} {% set pageTitle = title + " | " + site.name %} {% else %} @@ -78,7 +79,7 @@ {% else %} {% endif %} diff --git a/_includes/landing.njk b/_includes/landing.njk index c79d249..ec58439 100644 --- a/_includes/landing.njk +++ b/_includes/landing.njk @@ -1,5 +1,8 @@
- {% set tutorialList = tutorialItems or collections.tutorials %} + {% set currentUrl = page.url or '/' %} + {% set isUzPage = (lang or '') == 'uz' or currentUrl == '/uz/' or currentUrl.startsWith('/uz/') %} + {% set defaultTutorialList = collections.tutorialsUz if (isUzPage and collections.tutorialsUz) else collections.tutorials %} + {% set tutorialList = tutorialItems or defaultTutorialList %}

Python Tutorial Content List

@@ -17,21 +20,30 @@ md:text-base border-2 border-primary-900 shadow-lg transform scale-110 hover:scale-[1.15] transition-all duration-300 whitespace-nowrap" data-level="basic"> - + Basic Level Basic Level
@@ -43,7 +55,7 @@
- + Basic Level
@@ -90,22 +102,25 @@ title: 'Basic Level', description: 'Start your Python adventure from the basics! Learn fundamental concepts like variables, data types, operators, and contr' + 'ol structures. Suitable for beginners new to programming.', - iconClass: 'fa-solid fa-medal text-[56px] md:text-[80px] leading-none', - iconColor: '#cd7f32' + iconSrc: "{{ '/img/icons/bronze.svg' | url }}", + iconAlt: "Basic Level", + iconClass: 'w-14 md:w-20 h-14 md:h-20' }, intermediate: { title: 'Intermediate Level', description: 'Develop your Python skills further. Master concepts like modules, file I/O, exceptions, and Object-Oriented Programming ' + '(OOP). Aimed at those who understand Python basics and want to expand their capabilities.', - iconClass: 'fa-solid fa-medal text-[56px] md:text-[80px] leading-none', - iconColor: '#9ca3af' + iconSrc: "{{ '/img/icons/silver.svg' | url }}", + iconAlt: "Intermediate Level", + iconClass: 'w-14 md:w-20 h-14 md:h-20' }, advanced: { title: 'Advanced Level', description: 'Dive deep into advanced Python techniques. Learn type hints, decorators, iterators, generators, and professional program' + 'ming techniques like multithreading and async/await.', - iconClass: 'fa-solid fa-medal text-[56px] md:text-[80px] leading-none', - iconColor: '#d4af37' + iconSrc: "{{ '/img/icons/gold.svg' | url }}", + iconAlt: "Advanced Level", + iconClass: 'w-14 md:w-20 h-14 md:h-20' }, }; function filterTutorials(selectedLevel) { // Update level content @@ -120,8 +135,9 @@ levelDescription.textContent = content.description; if (levelIcon) { + levelIcon.src = content.iconSrc; + levelIcon.alt = content.iconAlt; levelIcon.className = content.iconClass; - levelIcon.style.color = content.iconColor; } // Filter tutorials tutorialItems.forEach(item => { diff --git a/_includes/navbar.njk b/_includes/navbar.njk index 7cf0db5..9620611 100644 --- a/_includes/navbar.njk +++ b/_includes/navbar.njk @@ -1,3 +1,14 @@ +{% set currentUrl = page.url or '/' %} +{% set isUzPage = currentUrl == '/uz/' or currentUrl.startsWith('/uz/') %} +{% set normalizedUrl = (currentUrl | replace('/uz', '')) if isUzPage else currentUrl %} +{% set hasUzPair = normalizedUrl == '/' or normalizedUrl.startsWith('/tutorial/') %} +{% set enUrl = normalizedUrl if hasUzPair else '/' %} +{% set uzUrl = '/uz/' if not hasUzPair or normalizedUrl == '/' else '/uz' + normalizedUrl %} +{% set homeUrl = '/uz/' if isUzPage else '/' %} +{% set tutorialUrl = '/uz/tutorial/what-is-python/' if isUzPage else '/tutorial/what-is-python/' %} +{% set tutorialLabel = "Darslar" if isUzPage else "Tutorial" %} +{% set githubLabel = "GitHub'da qo'shiling" if isUzPage else "Join on Github" %} +