├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── docs ├── ISO3166-1.alpha2.json ├── apiKey.example.json ├── apiKey.json ├── css │ ├── input.css │ ├── input.css.map │ ├── input.scss │ ├── style.css │ └── style.css.map ├── favicon.ico ├── icons │ ├── Openweathermap │ │ ├── 01d.svg │ │ ├── 01n.svg │ │ ├── 02d.svg │ │ ├── 02n.svg │ │ ├── 03d.svg │ │ ├── 03n.svg │ │ ├── 04d.svg │ │ ├── 04n.svg │ │ ├── 09d.svg │ │ ├── 09n.svg │ │ ├── 10d.svg │ │ ├── 10n.svg │ │ ├── 11d.svg │ │ ├── 11n.svg │ │ ├── 13d.svg │ │ ├── 13n.svg │ │ ├── 50d.svg │ │ ├── 50n.svg │ │ └── clear-day.svg │ ├── cardIcons │ │ ├── date.gif │ │ ├── humidity.svg │ │ ├── marker.png │ │ ├── markerNight.png │ │ ├── rocket.gif │ │ ├── rocketNew.gif │ │ ├── thermometer.svg │ │ ├── wind.svg │ │ └── windsock.svg │ ├── passwordIcons │ │ ├── crossedEye.svg │ │ └── eye.svg │ └── titleIcons │ │ ├── clear-day.svg │ │ ├── clear-night.svg │ │ ├── snow.svg │ │ └── tornado.svg ├── img │ ├── 01.webp │ ├── 02.webp │ └── weatherAppPr.png ├── index.html ├── script.js └── script.ts ├── package-lock.json ├── package.json ├── postcss.config.js ├── tailwind.config.js └── tsconfig.json /.gitattributes: -------------------------------------------------------------------------------- 1 | docs/* linguist-documentation=false 2 | 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | # docs/apiKey.json -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Friedrich WT 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Comprehensive Weather Fetch App ❄🌨☀️ 2 | 3 | --- 4 | 5 | A program made with **JavaScript** 🌐 that displays the current weather 🌦️ of the city you enter. Created using [openweathermap](https://openweathermap.org/)'s API . 6 | 7 | Have a quick show : [Comprehensive Weather App](https://friedrich482.github.io/Comprehensive-Weather-Fetch-App/) 8 | 9 | Here are the informations that are displayed : 10 | 11 | - The city 🏙️ and the country 🌍 12 | 13 | - The temperature 🌡️ (in degrees °C) 14 | 15 | - The humidity 💧 (in percent %) 16 | 17 | - "*Feels like 🌬️* " (also in degrees °C) 18 | 19 | - The description 📊 20 | 21 | - The day and the time 📅 (in real time) of the city entered 22 | 23 | To run it, simply clone the repository on your machine. 24 | 25 | ``` bash 26 | git clone https://github.com/Friedrich482/Comprehensive-Weather-Fetch-App.git 27 | 28 | ``` 29 | 30 | Then open it with your code editor, and open in your browser to see the result. 31 | 32 | FW01   33 | FW02 34 | 35 | You can join using my mail address 📧 : 36 | -------------------------------------------------------------------------------- /docs/ISO3166-1.alpha2.json: -------------------------------------------------------------------------------- 1 | { 2 | "AF": "Afghanistan", 3 | "AX": "Aland Islands", 4 | "AL": "Albania", 5 | "DZ": "Algeria", 6 | "AS": "American Samoa", 7 | "AD": "Andorra", 8 | "AO": "Angola", 9 | "AI": "Anguilla", 10 | "AQ": "Antarctica", 11 | "AG": "Antigua And Barbuda", 12 | "AR": "Argentina", 13 | "AM": "Armenia", 14 | "AW": "Aruba", 15 | "AU": "Australia", 16 | "AT": "Austria", 17 | "AZ": "Azerbaijan", 18 | "BS": "Bahamas", 19 | "BH": "Bahrain", 20 | "BD": "Bangladesh", 21 | "BB": "Barbados", 22 | "BY": "Belarus", 23 | "BE": "Belgium", 24 | "BZ": "Belize", 25 | "BJ": "Benin", 26 | "BM": "Bermuda", 27 | "BT": "Bhutan", 28 | "BO": "Bolivia", 29 | "BA": "Bosnia And Herzegovina", 30 | "BW": "Botswana", 31 | "BV": "Bouvet Island", 32 | "BR": "Brazil", 33 | "IO": "British Indian Ocean Territory", 34 | "BN": "Brunei Darussalam", 35 | "BG": "Bulgaria", 36 | "BF": "Burkina Faso", 37 | "BI": "Burundi", 38 | "KH": "Cambodia", 39 | "CM": "Cameroon", 40 | "CA": "Canada", 41 | "CV": "Cape Verde", 42 | "KY": "Cayman Islands", 43 | "CF": "Central African Republic", 44 | "TD": "Chad", 45 | "CL": "Chile", 46 | "CN": "China", 47 | "CX": "Christmas Island", 48 | "CC": "Cocos (Keeling) Islands", 49 | "CO": "Colombia", 50 | "KM": "Comoros", 51 | "CG": "Congo", 52 | "CD": "Congo, Democratic Republic", 53 | "CK": "Cook Islands", 54 | "CR": "Costa Rica", 55 | "CI": "Cote D\"Ivoire", 56 | "HR": "Croatia", 57 | "CU": "Cuba", 58 | "CY": "Cyprus", 59 | "CZ": "Czech Republic", 60 | "DK": "Denmark", 61 | "DJ": "Djibouti", 62 | "DM": "Dominica", 63 | "DO": "Dominican Republic", 64 | "EC": "Ecuador", 65 | "EG": "Egypt", 66 | "SV": "El Salvador", 67 | "GQ": "Equatorial Guinea", 68 | "ER": "Eritrea", 69 | "EE": "Estonia", 70 | "ET": "Ethiopia", 71 | "FK": "Falkland Islands (Malvinas)", 72 | "FO": "Faroe Islands", 73 | "FJ": "Fiji", 74 | "FI": "Finland", 75 | "FR": "France", 76 | "GF": "French Guiana", 77 | "PF": "French Polynesia", 78 | "TF": "French Southern Territories", 79 | "GA": "Gabon", 80 | "GM": "Gambia", 81 | "GE": "Georgia", 82 | "DE": "Germany", 83 | "GH": "Ghana", 84 | "GI": "Gibraltar", 85 | "GR": "Greece", 86 | "GL": "Greenland", 87 | "GD": "Grenada", 88 | "GP": "Guadeloupe", 89 | "GU": "Guam", 90 | "GT": "Guatemala", 91 | "GG": "Guernsey", 92 | "GN": "Guinea", 93 | "GW": "Guinea-Bissau", 94 | "GY": "Guyana", 95 | "HT": "Haiti", 96 | "HM": "Heard Island & Mcdonald Islands", 97 | "VA": "Holy See (Vatican City State)", 98 | "HN": "Honduras", 99 | "HK": "Hong Kong", 100 | "HU": "Hungary", 101 | "IS": "Iceland", 102 | "IN": "India", 103 | "ID": "Indonesia", 104 | "IR": "Iran, Islamic Republic Of", 105 | "IQ": "Iraq", 106 | "IE": "Ireland", 107 | "IM": "Isle Of Man", 108 | "IL": "Israel", 109 | "IT": "Italy", 110 | "JM": "Jamaica", 111 | "JP": "Japan", 112 | "JE": "Jersey", 113 | "JO": "Jordan", 114 | "KZ": "Kazakhstan", 115 | "KE": "Kenya", 116 | "KI": "Kiribati", 117 | "KR": "Korea", 118 | "KP": "North Korea", 119 | "KW": "Kuwait", 120 | "KG": "Kyrgyzstan", 121 | "LA": "Lao People\"s Democratic Republic", 122 | "LV": "Latvia", 123 | "LB": "Lebanon", 124 | "LS": "Lesotho", 125 | "LR": "Liberia", 126 | "LY": "Libyan Arab Jamahiriya", 127 | "LI": "Liechtenstein", 128 | "LT": "Lithuania", 129 | "LU": "Luxembourg", 130 | "MO": "Macao", 131 | "MK": "Macedonia", 132 | "MG": "Madagascar", 133 | "MW": "Malawi", 134 | "MY": "Malaysia", 135 | "MV": "Maldives", 136 | "ML": "Mali", 137 | "MT": "Malta", 138 | "MH": "Marshall Islands", 139 | "MQ": "Martinique", 140 | "MR": "Mauritania", 141 | "MU": "Mauritius", 142 | "YT": "Mayotte", 143 | "MX": "Mexico", 144 | "FM": "Micronesia, Federated States Of", 145 | "MD": "Moldova", 146 | "MC": "Monaco", 147 | "MN": "Mongolia", 148 | "ME": "Montenegro", 149 | "MS": "Montserrat", 150 | "MA": "Morocco", 151 | "MZ": "Mozambique", 152 | "MM": "Myanmar", 153 | "NA": "Namibia", 154 | "NR": "Nauru", 155 | "NP": "Nepal", 156 | "NL": "Netherlands", 157 | "AN": "Netherlands Antilles", 158 | "NC": "New Caledonia", 159 | "NZ": "New Zealand", 160 | "NI": "Nicaragua", 161 | "NE": "Niger", 162 | "NG": "Nigeria", 163 | "NU": "Niue", 164 | "NF": "Norfolk Island", 165 | "MP": "Northern Mariana Islands", 166 | "NO": "Norway", 167 | "OM": "Oman", 168 | "PK": "Pakistan", 169 | "PW": "Palau", 170 | "PS": "Palestinian Territory, Occupied", 171 | "PA": "Panama", 172 | "PG": "Papua New Guinea", 173 | "PY": "Paraguay", 174 | "PE": "Peru", 175 | "PH": "Philippines", 176 | "PN": "Pitcairn", 177 | "PL": "Poland", 178 | "PT": "Portugal", 179 | "PR": "Puerto Rico", 180 | "QA": "Qatar", 181 | "RE": "Reunion", 182 | "RO": "Romania", 183 | "RU": "Russian Federation", 184 | "RW": "Rwanda", 185 | "BL": "Saint Barthelemy", 186 | "SH": "Saint Helena", 187 | "KN": "Saint Kitts And Nevis", 188 | "LC": "Saint Lucia", 189 | "MF": "Saint Martin", 190 | "PM": "Saint Pierre And Miquelon", 191 | "VC": "Saint Vincent And Grenadines", 192 | "WS": "Samoa", 193 | "SM": "San Marino", 194 | "ST": "Sao Tome And Principe", 195 | "SA": "Saudi Arabia", 196 | "SN": "Senegal", 197 | "RS": "Serbia", 198 | "SC": "Seychelles", 199 | "SL": "Sierra Leone", 200 | "SG": "Singapore", 201 | "SK": "Slovakia", 202 | "SI": "Slovenia", 203 | "SB": "Solomon Islands", 204 | "SO": "Somalia", 205 | "ZA": "South Africa", 206 | "GS": "South Georgia And Sandwich Isl.", 207 | "ES": "Spain", 208 | "LK": "Sri Lanka", 209 | "SD": "Sudan", 210 | "SR": "Suriname", 211 | "SJ": "Svalbard And Jan Mayen", 212 | "SZ": "Swaziland", 213 | "SE": "Sweden", 214 | "CH": "Switzerland", 215 | "SY": "Syrian Arab Republic", 216 | "TW": "Taiwan", 217 | "TJ": "Tajikistan", 218 | "TZ": "Tanzania", 219 | "TH": "Thailand", 220 | "TL": "Timor-Leste", 221 | "TG": "Togo", 222 | "TK": "Tokelau", 223 | "TO": "Tonga", 224 | "TT": "Trinidad And Tobago", 225 | "TN": "Tunisia", 226 | "TR": "Turkey", 227 | "TM": "Turkmenistan", 228 | "TC": "Turks And Caicos Islands", 229 | "TV": "Tuvalu", 230 | "UG": "Uganda", 231 | "UA": "Ukraine", 232 | "AE": "United Arab Emirates", 233 | "GB": "United Kingdom", 234 | "US": "United States", 235 | "UM": "United States Outlying Islands", 236 | "UY": "Uruguay", 237 | "UZ": "Uzbekistan", 238 | "VU": "Vanuatu", 239 | "VE": "Venezuela", 240 | "VN": "Vietnam", 241 | "VG": "Virgin Islands, British", 242 | "VI": "Virgin Islands, U.S.", 243 | "WF": "Wallis And Futuna", 244 | "EH": "Western Sahara", 245 | "YE": "Yemen", 246 | "ZM": "Zambia", 247 | "ZW": "Zimbabwe" 248 | } 249 | -------------------------------------------------------------------------------- /docs/apiKey.example.json: -------------------------------------------------------------------------------- 1 | {"API_KEY" : "YOUR_OPENWEATHER_MAP_API_KEY"} 2 | -------------------------------------------------------------------------------- /docs/apiKey.json: -------------------------------------------------------------------------------- 1 | {"API_KEY" : "2232101b7a4c133da51de8620fc86462"} 2 | -------------------------------------------------------------------------------- /docs/css/input.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | .MV-boli { 5 | font-family: "MV boli"; 6 | } 7 | 8 | .weatherDayImg { 9 | background-image: url("../img/01.webp"); 10 | background-repeat: no-repeat; 11 | background-size: cover; 12 | background-position: center; 13 | background-attachment: fixed; 14 | color: black; 15 | } 16 | 17 | .weatherNightImg { 18 | background-image: url("../img/02.webp"); 19 | background-repeat: no-repeat; 20 | background-size: cover; 21 | background-position: center; 22 | background-attachment: fixed; 23 | color: white; 24 | } 25 | 26 | /*# sourceMappingURL=input.css.map */ 27 | -------------------------------------------------------------------------------- /docs/css/input.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["input.scss"],"names":[],"mappings":"AAAA;AACA;AACA;AAEA;EACE;;;AAEF;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA","file":"input.css"} -------------------------------------------------------------------------------- /docs/css/input.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | .MV-boli { 6 | font-family: "MV boli"; 7 | } 8 | .weatherDayImg { 9 | background-image: url("../img/01.webp"); 10 | background-repeat: no-repeat; 11 | background-size: cover; 12 | background-position: center; 13 | background-attachment: fixed; 14 | color: black 15 | } 16 | 17 | .weatherNightImg { 18 | background-image: url("../img/02.webp"); 19 | background-repeat: no-repeat; 20 | background-size: cover; 21 | background-position: center; 22 | background-attachment: fixed; 23 | color: white; 24 | } -------------------------------------------------------------------------------- /docs/css/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | ! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com 3 | */ 4 | 5 | /* 6 | 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 7 | 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) 8 | */ 9 | 10 | *, 11 | ::before, 12 | ::after { 13 | box-sizing: border-box; 14 | /* 1 */ 15 | border-width: 0; 16 | /* 2 */ 17 | border-style: solid; 18 | /* 2 */ 19 | border-color: #e5e7eb; 20 | /* 2 */ 21 | } 22 | 23 | ::before, 24 | ::after { 25 | --tw-content: ''; 26 | } 27 | 28 | /* 29 | 1. Use a consistent sensible line-height in all browsers. 30 | 2. Prevent adjustments of font size after orientation changes in iOS. 31 | 3. Use a more readable tab size. 32 | 4. Use the user's configured `sans` font-family by default. 33 | 5. Use the user's configured `sans` font-feature-settings by default. 34 | 6. Use the user's configured `sans` font-variation-settings by default. 35 | 7. Disable tap highlights on iOS 36 | */ 37 | 38 | html, 39 | :host { 40 | line-height: 1.5; 41 | /* 1 */ 42 | -webkit-text-size-adjust: 100%; 43 | /* 2 */ 44 | -moz-tab-size: 4; 45 | /* 3 */ 46 | -o-tab-size: 4; 47 | tab-size: 4; 48 | /* 3 */ 49 | font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 50 | /* 4 */ 51 | font-feature-settings: normal; 52 | /* 5 */ 53 | font-variation-settings: normal; 54 | /* 6 */ 55 | -webkit-tap-highlight-color: transparent; 56 | /* 7 */ 57 | } 58 | 59 | /* 60 | 1. Remove the margin in all browsers. 61 | 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. 62 | */ 63 | 64 | body { 65 | margin: 0; 66 | /* 1 */ 67 | line-height: inherit; 68 | /* 2 */ 69 | } 70 | 71 | /* 72 | 1. Add the correct height in Firefox. 73 | 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 74 | 3. Ensure horizontal rules are visible by default. 75 | */ 76 | 77 | hr { 78 | height: 0; 79 | /* 1 */ 80 | color: inherit; 81 | /* 2 */ 82 | border-top-width: 1px; 83 | /* 3 */ 84 | } 85 | 86 | /* 87 | Add the correct text decoration in Chrome, Edge, and Safari. 88 | */ 89 | 90 | abbr:where([title]) { 91 | -webkit-text-decoration: underline dotted; 92 | text-decoration: underline dotted; 93 | } 94 | 95 | /* 96 | Remove the default font size and weight for headings. 97 | */ 98 | 99 | h1, 100 | h2, 101 | h3, 102 | h4, 103 | h5, 104 | h6 { 105 | font-size: inherit; 106 | font-weight: inherit; 107 | } 108 | 109 | /* 110 | Reset links to optimize for opt-in styling instead of opt-out. 111 | */ 112 | 113 | a { 114 | color: inherit; 115 | text-decoration: inherit; 116 | } 117 | 118 | /* 119 | Add the correct font weight in Edge and Safari. 120 | */ 121 | 122 | b, 123 | strong { 124 | font-weight: bolder; 125 | } 126 | 127 | /* 128 | 1. Use the user's configured `mono` font-family by default. 129 | 2. Use the user's configured `mono` font-feature-settings by default. 130 | 3. Use the user's configured `mono` font-variation-settings by default. 131 | 4. Correct the odd `em` font sizing in all browsers. 132 | */ 133 | 134 | code, 135 | kbd, 136 | samp, 137 | pre { 138 | font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 139 | /* 1 */ 140 | font-feature-settings: normal; 141 | /* 2 */ 142 | font-variation-settings: normal; 143 | /* 3 */ 144 | font-size: 1em; 145 | /* 4 */ 146 | } 147 | 148 | /* 149 | Add the correct font size in all browsers. 150 | */ 151 | 152 | small { 153 | font-size: 80%; 154 | } 155 | 156 | /* 157 | Prevent `sub` and `sup` elements from affecting the line height in all browsers. 158 | */ 159 | 160 | sub, 161 | sup { 162 | font-size: 75%; 163 | line-height: 0; 164 | position: relative; 165 | vertical-align: baseline; 166 | } 167 | 168 | sub { 169 | bottom: -0.25em; 170 | } 171 | 172 | sup { 173 | top: -0.5em; 174 | } 175 | 176 | /* 177 | 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) 178 | 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) 179 | 3. Remove gaps between table borders by default. 180 | */ 181 | 182 | table { 183 | text-indent: 0; 184 | /* 1 */ 185 | border-color: inherit; 186 | /* 2 */ 187 | border-collapse: collapse; 188 | /* 3 */ 189 | } 190 | 191 | /* 192 | 1. Change the font styles in all browsers. 193 | 2. Remove the margin in Firefox and Safari. 194 | 3. Remove default padding in all browsers. 195 | */ 196 | 197 | button, 198 | input, 199 | optgroup, 200 | select, 201 | textarea { 202 | font-family: inherit; 203 | /* 1 */ 204 | font-feature-settings: inherit; 205 | /* 1 */ 206 | font-variation-settings: inherit; 207 | /* 1 */ 208 | font-size: 100%; 209 | /* 1 */ 210 | font-weight: inherit; 211 | /* 1 */ 212 | line-height: inherit; 213 | /* 1 */ 214 | color: inherit; 215 | /* 1 */ 216 | margin: 0; 217 | /* 2 */ 218 | padding: 0; 219 | /* 3 */ 220 | } 221 | 222 | /* 223 | Remove the inheritance of text transform in Edge and Firefox. 224 | */ 225 | 226 | button, 227 | select { 228 | text-transform: none; 229 | } 230 | 231 | /* 232 | 1. Correct the inability to style clickable types in iOS and Safari. 233 | 2. Remove default button styles. 234 | */ 235 | 236 | button, 237 | [type='button'], 238 | [type='reset'], 239 | [type='submit'] { 240 | -webkit-appearance: button; 241 | /* 1 */ 242 | background-color: transparent; 243 | /* 2 */ 244 | background-image: none; 245 | /* 2 */ 246 | } 247 | 248 | /* 249 | Use the modern Firefox focus style for all focusable elements. 250 | */ 251 | 252 | :-moz-focusring { 253 | outline: auto; 254 | } 255 | 256 | /* 257 | Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) 258 | */ 259 | 260 | :-moz-ui-invalid { 261 | box-shadow: none; 262 | } 263 | 264 | /* 265 | Add the correct vertical alignment in Chrome and Firefox. 266 | */ 267 | 268 | progress { 269 | vertical-align: baseline; 270 | } 271 | 272 | /* 273 | Correct the cursor style of increment and decrement buttons in Safari. 274 | */ 275 | 276 | ::-webkit-inner-spin-button, 277 | ::-webkit-outer-spin-button { 278 | height: auto; 279 | } 280 | 281 | /* 282 | 1. Correct the odd appearance in Chrome and Safari. 283 | 2. Correct the outline style in Safari. 284 | */ 285 | 286 | [type='search'] { 287 | -webkit-appearance: textfield; 288 | /* 1 */ 289 | outline-offset: -2px; 290 | /* 2 */ 291 | } 292 | 293 | /* 294 | Remove the inner padding in Chrome and Safari on macOS. 295 | */ 296 | 297 | ::-webkit-search-decoration { 298 | -webkit-appearance: none; 299 | } 300 | 301 | /* 302 | 1. Correct the inability to style clickable types in iOS and Safari. 303 | 2. Change font properties to `inherit` in Safari. 304 | */ 305 | 306 | ::-webkit-file-upload-button { 307 | -webkit-appearance: button; 308 | /* 1 */ 309 | font: inherit; 310 | /* 2 */ 311 | } 312 | 313 | /* 314 | Add the correct display in Chrome and Safari. 315 | */ 316 | 317 | summary { 318 | display: list-item; 319 | } 320 | 321 | /* 322 | Removes the default spacing and border for appropriate elements. 323 | */ 324 | 325 | blockquote, 326 | dl, 327 | dd, 328 | h1, 329 | h2, 330 | h3, 331 | h4, 332 | h5, 333 | h6, 334 | hr, 335 | figure, 336 | p, 337 | pre { 338 | margin: 0; 339 | } 340 | 341 | fieldset { 342 | margin: 0; 343 | padding: 0; 344 | } 345 | 346 | legend { 347 | padding: 0; 348 | } 349 | 350 | ol, 351 | ul, 352 | menu { 353 | list-style: none; 354 | margin: 0; 355 | padding: 0; 356 | } 357 | 358 | /* 359 | Reset default styling for dialogs. 360 | */ 361 | 362 | dialog { 363 | padding: 0; 364 | } 365 | 366 | /* 367 | Prevent resizing textareas horizontally by default. 368 | */ 369 | 370 | textarea { 371 | resize: vertical; 372 | } 373 | 374 | /* 375 | 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 376 | 2. Set the default placeholder color to the user's configured gray 400 color. 377 | */ 378 | 379 | input::-moz-placeholder, textarea::-moz-placeholder { 380 | opacity: 1; 381 | /* 1 */ 382 | color: #9ca3af; 383 | /* 2 */ 384 | } 385 | 386 | input::placeholder, 387 | textarea::placeholder { 388 | opacity: 1; 389 | /* 1 */ 390 | color: #9ca3af; 391 | /* 2 */ 392 | } 393 | 394 | /* 395 | Set the default cursor for buttons. 396 | */ 397 | 398 | button, 399 | [role="button"] { 400 | cursor: pointer; 401 | } 402 | 403 | /* 404 | Make sure disabled buttons don't get the pointer cursor. 405 | */ 406 | 407 | :disabled { 408 | cursor: default; 409 | } 410 | 411 | /* 412 | 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) 413 | 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) 414 | This can trigger a poorly considered lint error in some tools but is included by design. 415 | */ 416 | 417 | img, 418 | svg, 419 | video, 420 | canvas, 421 | audio, 422 | iframe, 423 | embed, 424 | object { 425 | display: block; 426 | /* 1 */ 427 | vertical-align: middle; 428 | /* 2 */ 429 | } 430 | 431 | /* 432 | Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) 433 | */ 434 | 435 | img, 436 | video { 437 | max-width: 100%; 438 | height: auto; 439 | } 440 | 441 | /* Make elements with the HTML hidden attribute stay hidden by default */ 442 | 443 | [hidden] { 444 | display: none; 445 | } 446 | 447 | *, ::before, ::after { 448 | --tw-border-spacing-x: 0; 449 | --tw-border-spacing-y: 0; 450 | --tw-translate-x: 0; 451 | --tw-translate-y: 0; 452 | --tw-rotate: 0; 453 | --tw-skew-x: 0; 454 | --tw-skew-y: 0; 455 | --tw-scale-x: 1; 456 | --tw-scale-y: 1; 457 | --tw-pan-x: ; 458 | --tw-pan-y: ; 459 | --tw-pinch-zoom: ; 460 | --tw-scroll-snap-strictness: proximity; 461 | --tw-gradient-from-position: ; 462 | --tw-gradient-via-position: ; 463 | --tw-gradient-to-position: ; 464 | --tw-ordinal: ; 465 | --tw-slashed-zero: ; 466 | --tw-numeric-figure: ; 467 | --tw-numeric-spacing: ; 468 | --tw-numeric-fraction: ; 469 | --tw-ring-inset: ; 470 | --tw-ring-offset-width: 0px; 471 | --tw-ring-offset-color: #fff; 472 | --tw-ring-color: rgb(59 130 246 / 0.5); 473 | --tw-ring-offset-shadow: 0 0 #0000; 474 | --tw-ring-shadow: 0 0 #0000; 475 | --tw-shadow: 0 0 #0000; 476 | --tw-shadow-colored: 0 0 #0000; 477 | --tw-blur: ; 478 | --tw-brightness: ; 479 | --tw-contrast: ; 480 | --tw-grayscale: ; 481 | --tw-hue-rotate: ; 482 | --tw-invert: ; 483 | --tw-saturate: ; 484 | --tw-sepia: ; 485 | --tw-drop-shadow: ; 486 | --tw-backdrop-blur: ; 487 | --tw-backdrop-brightness: ; 488 | --tw-backdrop-contrast: ; 489 | --tw-backdrop-grayscale: ; 490 | --tw-backdrop-hue-rotate: ; 491 | --tw-backdrop-invert: ; 492 | --tw-backdrop-opacity: ; 493 | --tw-backdrop-saturate: ; 494 | --tw-backdrop-sepia: ; 495 | } 496 | 497 | ::backdrop { 498 | --tw-border-spacing-x: 0; 499 | --tw-border-spacing-y: 0; 500 | --tw-translate-x: 0; 501 | --tw-translate-y: 0; 502 | --tw-rotate: 0; 503 | --tw-skew-x: 0; 504 | --tw-skew-y: 0; 505 | --tw-scale-x: 1; 506 | --tw-scale-y: 1; 507 | --tw-pan-x: ; 508 | --tw-pan-y: ; 509 | --tw-pinch-zoom: ; 510 | --tw-scroll-snap-strictness: proximity; 511 | --tw-gradient-from-position: ; 512 | --tw-gradient-via-position: ; 513 | --tw-gradient-to-position: ; 514 | --tw-ordinal: ; 515 | --tw-slashed-zero: ; 516 | --tw-numeric-figure: ; 517 | --tw-numeric-spacing: ; 518 | --tw-numeric-fraction: ; 519 | --tw-ring-inset: ; 520 | --tw-ring-offset-width: 0px; 521 | --tw-ring-offset-color: #fff; 522 | --tw-ring-color: rgb(59 130 246 / 0.5); 523 | --tw-ring-offset-shadow: 0 0 #0000; 524 | --tw-ring-shadow: 0 0 #0000; 525 | --tw-shadow: 0 0 #0000; 526 | --tw-shadow-colored: 0 0 #0000; 527 | --tw-blur: ; 528 | --tw-brightness: ; 529 | --tw-contrast: ; 530 | --tw-grayscale: ; 531 | --tw-hue-rotate: ; 532 | --tw-invert: ; 533 | --tw-saturate: ; 534 | --tw-sepia: ; 535 | --tw-drop-shadow: ; 536 | --tw-backdrop-blur: ; 537 | --tw-backdrop-brightness: ; 538 | --tw-backdrop-contrast: ; 539 | --tw-backdrop-grayscale: ; 540 | --tw-backdrop-hue-rotate: ; 541 | --tw-backdrop-invert: ; 542 | --tw-backdrop-opacity: ; 543 | --tw-backdrop-saturate: ; 544 | --tw-backdrop-sepia: ; 545 | } 546 | 547 | .invisible { 548 | visibility: hidden; 549 | } 550 | 551 | .m-0 { 552 | margin: 0px; 553 | } 554 | 555 | .m-1 { 556 | margin: 0.25rem; 557 | } 558 | 559 | .mb-0 { 560 | margin-bottom: 0px; 561 | } 562 | 563 | .mb-2 { 564 | margin-bottom: 0.5rem; 565 | } 566 | 567 | .mb-20 { 568 | margin-bottom: 5rem; 569 | } 570 | 571 | .mb-8 { 572 | margin-bottom: 2rem; 573 | } 574 | 575 | .mt-1 { 576 | margin-top: 0.25rem; 577 | } 578 | 579 | .mt-20 { 580 | margin-top: 5rem; 581 | } 582 | 583 | .mt-8 { 584 | margin-top: 2rem; 585 | } 586 | 587 | .flex { 588 | display: flex; 589 | } 590 | 591 | .hidden { 592 | display: none; 593 | } 594 | 595 | .size-10 { 596 | width: 2.5rem; 597 | height: 2.5rem; 598 | } 599 | 600 | .size-12 { 601 | width: 3rem; 602 | height: 3rem; 603 | } 604 | 605 | .size-6 { 606 | width: 1.5rem; 607 | height: 1.5rem; 608 | } 609 | 610 | .size-\[4\.5rem\] { 611 | width: 4.5rem; 612 | height: 4.5rem; 613 | } 614 | 615 | .max-h-10 { 616 | max-height: 2.5rem; 617 | } 618 | 619 | .w-3\/5 { 620 | width: 60%; 621 | } 622 | 623 | .w-5\/6 { 624 | width: 83.333333%; 625 | } 626 | 627 | .w-56 { 628 | width: 14rem; 629 | } 630 | 631 | .w-96 { 632 | width: 24rem; 633 | } 634 | 635 | .w-full { 636 | width: 100%; 637 | } 638 | 639 | .min-w-36 { 640 | min-width: 9rem; 641 | } 642 | 643 | .min-w-80 { 644 | min-width: 20rem; 645 | } 646 | 647 | .max-w-80 { 648 | max-width: 20rem; 649 | } 650 | 651 | .flex-shrink-0 { 652 | flex-shrink: 0; 653 | } 654 | 655 | .transform { 656 | 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)); 657 | } 658 | 659 | .cursor-pointer { 660 | cursor: pointer; 661 | } 662 | 663 | .flex-row { 664 | flex-direction: row; 665 | } 666 | 667 | .flex-col { 668 | flex-direction: column; 669 | } 670 | 671 | .flex-wrap { 672 | flex-wrap: wrap; 673 | } 674 | 675 | .items-center { 676 | align-items: center; 677 | } 678 | 679 | .justify-center { 680 | justify-content: center; 681 | } 682 | 683 | .justify-between { 684 | justify-content: space-between; 685 | } 686 | 687 | .gap-0 { 688 | gap: 0px; 689 | } 690 | 691 | .gap-2 { 692 | gap: 0.5rem; 693 | } 694 | 695 | .gap-4 { 696 | gap: 1rem; 697 | } 698 | 699 | .rounded-lg { 700 | border-radius: 0.5rem; 701 | } 702 | 703 | .border-2 { 704 | border-width: 2px; 705 | } 706 | 707 | .border-black { 708 | --tw-border-opacity: 1; 709 | border-color: rgb(0 0 0 / var(--tw-border-opacity)); 710 | } 711 | 712 | .border-pink-950 { 713 | --tw-border-opacity: 1; 714 | border-color: rgb(80 7 36 / var(--tw-border-opacity)); 715 | } 716 | 717 | .bg-black { 718 | --tw-bg-opacity: 1; 719 | background-color: rgb(0 0 0 / var(--tw-bg-opacity)); 720 | } 721 | 722 | .bg-slate-300 { 723 | --tw-bg-opacity: 1; 724 | background-color: rgb(203 213 225 / var(--tw-bg-opacity)); 725 | } 726 | 727 | .p-1 { 728 | padding: 0.25rem; 729 | } 730 | 731 | .text-center { 732 | text-align: center; 733 | } 734 | 735 | .indent-12 { 736 | text-indent: 3rem; 737 | } 738 | 739 | .text-6xl { 740 | font-size: 3.75rem; 741 | line-height: 1; 742 | } 743 | 744 | .text-lg { 745 | font-size: 1.125rem; 746 | line-height: 1.75rem; 747 | } 748 | 749 | .text-xl { 750 | font-size: 1.25rem; 751 | line-height: 1.75rem; 752 | } 753 | 754 | .font-bold { 755 | font-weight: 700; 756 | } 757 | 758 | .text-black { 759 | --tw-text-opacity: 1; 760 | color: rgb(0 0 0 / var(--tw-text-opacity)); 761 | } 762 | 763 | .text-red-600 { 764 | --tw-text-opacity: 1; 765 | color: rgb(220 38 38 / var(--tw-text-opacity)); 766 | } 767 | 768 | .text-white { 769 | --tw-text-opacity: 1; 770 | color: rgb(255 255 255 / var(--tw-text-opacity)); 771 | } 772 | 773 | .outline-none { 774 | outline: 2px solid transparent; 775 | outline-offset: 2px; 776 | } 777 | 778 | .duration-500 { 779 | transition-duration: 500ms; 780 | } 781 | 782 | .MV-boli { 783 | font-family: "MV boli"; 784 | } 785 | 786 | .weatherDayImg { 787 | background-image: url("../img/01.webp"); 788 | background-repeat: no-repeat; 789 | background-size: cover; 790 | background-position: center; 791 | background-attachment: fixed; 792 | color: black; 793 | } 794 | 795 | .weatherNightImg { 796 | background-image: url("../img/02.webp"); 797 | background-repeat: no-repeat; 798 | background-size: cover; 799 | background-position: center; 800 | background-attachment: fixed; 801 | color: white; 802 | } 803 | 804 | .hover\:scale-110:hover { 805 | --tw-scale-x: 1.1; 806 | --tw-scale-y: 1.1; 807 | 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)); 808 | } 809 | 810 | .active\:bg-slate-900:active { 811 | --tw-bg-opacity: 1; 812 | background-color: rgb(15 23 42 / var(--tw-bg-opacity)); 813 | } 814 | 815 | .active\:outline:active { 816 | outline-style: solid; 817 | } 818 | 819 | .active\:outline-2:active { 820 | outline-width: 2px; 821 | } 822 | 823 | .active\:outline-white:active { 824 | outline-color: #fff; 825 | } 826 | 827 | /*# sourceMappingURL=style.css.map */ -------------------------------------------------------------------------------- /docs/css/style.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["input.scss","input.css"],"names":[],"mappings":"AAAA;;CAAA;;AAAA;;;CAAA;;AAAA;;;EAAA,sBAAA;EAAA,MAAA;EAAA,eAAA;EAAA,MAAA;EAAA,mBAAA;EAAA,MAAA;EAAA,qBAAA;EAAA,MAAA;AAAA;;AAAA;;EAAA,gBAAA;AAAA;;AAAA;;;;;;;;CAAA;;AAAA;;EAAA,gBAAA;EAAA,MAAA;EAAA,8BAAA;EAAA,MAAA;EAAA,gBAAA;EAAA,MAAA;EAAA,cAAA;KAAA,WAAA;EAAA,MAAA;EAAA,+HAAA;EAAA,MAAA;EAAA,6BAAA;EAAA,MAAA;EAAA,+BAAA;EAAA,MAAA;EAAA,wCAAA;EAAA,MAAA;AAAA;;AAAA;;;CAAA;;AAAA;EAAA,SAAA;EAAA,MAAA;EAAA,oBAAA;EAAA,MAAA;AAAA;;AAAA;;;;CAAA;;AAAA;EAAA,SAAA;EAAA,MAAA;EAAA,cAAA;EAAA,MAAA;EAAA,qBAAA;EAAA,MAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,yCAAA;UAAA,iCAAA;AAAA;;AAAA;;CAAA;;AAAA;;;;;;EAAA,kBAAA;EAAA,oBAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,cAAA;EAAA,wBAAA;AAAA;;AAAA;;CAAA;;AAAA;;EAAA,mBAAA;AAAA;;AAAA;;;;;CAAA;;AAAA;;;;EAAA,+GAAA;EAAA,MAAA;EAAA,6BAAA;EAAA,MAAA;EAAA,+BAAA;EAAA,MAAA;EAAA,cAAA;EAAA,MAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,cAAA;AAAA;;AAAA;;CAAA;;AAAA;;EAAA,cAAA;EAAA,cAAA;EAAA,kBAAA;EAAA,wBAAA;AAAA;;AAAA;EAAA,eAAA;AAAA;;AAAA;EAAA,WAAA;AAAA;;AAAA;;;;CAAA;;AAAA;EAAA,cAAA;EAAA,MAAA;EAAA,qBAAA;EAAA,MAAA;EAAA,yBAAA;EAAA,MAAA;AAAA;;AAAA;;;;CAAA;;AAAA;;;;;EAAA,oBAAA;EAAA,MAAA;EAAA,8BAAA;EAAA,MAAA;EAAA,gCAAA;EAAA,MAAA;EAAA,eAAA;EAAA,MAAA;EAAA,oBAAA;EAAA,MAAA;EAAA,oBAAA;EAAA,MAAA;EAAA,cAAA;EAAA,MAAA;EAAA,SAAA;EAAA,MAAA;EAAA,UAAA;EAAA,MAAA;AAAA;;AAAA;;CAAA;;AAAA;;EAAA,oBAAA;AAAA;;AAAA;;;CAAA;;AAAA;;;;EAAA,0BAAA;EAAA,MAAA;EAAA,6BAAA;EAAA,MAAA;EAAA,sBAAA;EAAA,MAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,aAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,gBAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,wBAAA;AAAA;;AAAA;;CAAA;;AAAA;;EAAA,YAAA;AAAA;;AAAA;;;CAAA;;AAAA;EAAA,6BAAA;EAAA,MAAA;EAAA,oBAAA;EAAA,MAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,wBAAA;AAAA;;AAAA;;;CAAA;;AAAA;EAAA,0BAAA;EAAA,MAAA;EAAA,aAAA;EAAA,MAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,kBAAA;AAAA;;AAAA;;CAAA;;AAAA;;;;;;;;;;;;;EAAA,SAAA;AAAA;;AAAA;EAAA,SAAA;EAAA,UAAA;AAAA;;AAAA;EAAA,UAAA;AAAA;;AAAA;;;EAAA,gBAAA;EAAA,SAAA;EAAA,UAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,UAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,gBAAA;AAAA;;AAAA;;;CAAA;;AAAA;EAAA,UAAA;EAAA,MAAA;EAAA,cAAA;EAAA,MAAA;AAAA;;AAAA;;EAAA,UAAA;EAAA,MAAA;EAAA,cAAA;EAAA,MAAA;AAAA;;AAAA;;CAAA;;AAAA;;EAAA,eAAA;AAAA;;AAAA;;CAAA;;AAAA;EAAA,eAAA;AAAA;;AAAA;;;;CAAA;;AAAA;;;;;;;;EAAA,cAAA;EAAA,MAAA;EAAA,sBAAA;EAAA,MAAA;AAAA;;AAAA;;CAAA;;AAAA;;EAAA,eAAA;EAAA,YAAA;AAAA;;AAAA,wEAAA;;AAAA;EAAA,aAAA;AAAA;;AAAA;EAAA,wBAAA;EAAA,wBAAA;EAAA,mBAAA;EAAA,mBAAA;EAAA,cAAA;EAAA,cAAA;EAAA,cAAA;EAAA,eAAA;EAAA,eAAA;EAAA,aAAA;EAAA,aAAA;EAAA,kBAAA;EAAA,sCAAA;EAAA,8BAAA;EAAA,6BAAA;EAAA,4BAAA;EAAA,eAAA;EAAA,oBAAA;EAAA,sBAAA;EAAA,uBAAA;EAAA,wBAAA;EAAA,kBAAA;EAAA,2BAAA;EAAA,4BAAA;EAAA,sCAAA;EAAA,kCAAA;EAAA,2BAAA;EAAA,sBAAA;EAAA,8BAAA;EAAA,YAAA;EAAA,kBAAA;EAAA,gBAAA;EAAA,iBAAA;EAAA,kBAAA;EAAA,cAAA;EAAA,gBAAA;EAAA,aAAA;EAAA,mBAAA;EAAA,qBAAA;EAAA,2BAAA;EAAA,yBAAA;EAAA,0BAAA;EAAA,2BAAA;EAAA,uBAAA;EAAA,wBAAA;EAAA,yBAAA;EAAA;AAAA;;AAAA;EAAA,wBAAA;EAAA,wBAAA;EAAA,mBAAA;EAAA,mBAAA;EAAA,cAAA;EAAA,cAAA;EAAA,cAAA;EAAA,eAAA;EAAA,eAAA;EAAA,aAAA;EAAA,aAAA;EAAA,kBAAA;EAAA,sCAAA;EAAA,8BAAA;EAAA,6BAAA;EAAA,4BAAA;EAAA,eAAA;EAAA,oBAAA;EAAA,sBAAA;EAAA,uBAAA;EAAA,wBAAA;EAAA,kBAAA;EAAA,2BAAA;EAAA,4BAAA;EAAA,sCAAA;EAAA,kCAAA;EAAA,2BAAA;EAAA,sBAAA;EAAA,8BAAA;EAAA,YAAA;EAAA,kBAAA;EAAA,gBAAA;EAAA,iBAAA;EAAA,kBAAA;EAAA,cAAA;EAAA,gBAAA;EAAA,aAAA;EAAA,mBAAA;EAAA,qBAAA;EAAA,2BAAA;EAAA,yBAAA;EAAA,0BAAA;EAAA,2BAAA;EAAA,uBAAA;EAAA,wBAAA;EAAA,yBAAA;EAAA;AAAA;;AAEA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA,aAAA;EAAA;AAAA;;AAAA;EAAA,WAAA;EAAA;AAAA;;AAAA;EAAA,aAAA;EAAA;AAAA;;AAAA;EAAA,aAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA,sBAAA;EAAA;AAAA;;AAAA;EAAA,sBAAA;EAAA;AAAA;;AAAA;EAAA,kBAAA;EAAA;AAAA;;AAAA;EAAA,kBAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA,kBAAA;EAAA;AAAA;;AAAA;EAAA,mBAAA;EAAA;AAAA;;AAAA;EAAA,kBAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAAA;EAAA,oBAAA;EAAA;AAAA;;AAAA;EAAA,oBAAA;EAAA;AAAA;;AAAA;EAAA,oBAAA;EAAA;AAAA;;AAAA;EAAA,8BAAA;EAAA;AAAA;;AAAA;EAAA;AAAA;;AAEA;EACE,sBAAA;ACAF;;ADEA;EACI,uCAAA;EACA,4BAAA;EACA,sBAAA;EACA,2BAAA;EACA,4BAAA;EACA,YAAA;ACCJ;;ADEE;EACE,uCAAA;EACA,4BAAA;EACA,sBAAA;EACA,2BAAA;EACA,4BAAA;EACA,YAAA;ACCJ;;ADvBA;EAAA,iBC0BA;ED1BA,iBC0BA;ED1BA;AC0BA;;AD1BA;EAAA,kBC0BA;ED1BA;AC0BA;;AD1BA;EAAA;AC0BA;;AD1BA;EAAA;AC0BA;;AD1BA;EAAA;AC0BA","file":"style.css"} -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Friedrich482/Comprehensive-Weather-Fetch-App/b606d5d0841f527119f711846e633d3d15eece90/docs/favicon.ico -------------------------------------------------------------------------------- /docs/icons/Openweathermap/01d.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/01n.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/02d.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/02n.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/03d.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/03n.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/04d.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/04n.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/09d.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/09n.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/10d.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/10n.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/11d.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/11n.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/13d.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/13n.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/50d.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/50n.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/Openweathermap/clear-day.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/cardIcons/date.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Friedrich482/Comprehensive-Weather-Fetch-App/b606d5d0841f527119f711846e633d3d15eece90/docs/icons/cardIcons/date.gif -------------------------------------------------------------------------------- /docs/icons/cardIcons/humidity.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/cardIcons/marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Friedrich482/Comprehensive-Weather-Fetch-App/b606d5d0841f527119f711846e633d3d15eece90/docs/icons/cardIcons/marker.png -------------------------------------------------------------------------------- /docs/icons/cardIcons/markerNight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Friedrich482/Comprehensive-Weather-Fetch-App/b606d5d0841f527119f711846e633d3d15eece90/docs/icons/cardIcons/markerNight.png -------------------------------------------------------------------------------- /docs/icons/cardIcons/rocket.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Friedrich482/Comprehensive-Weather-Fetch-App/b606d5d0841f527119f711846e633d3d15eece90/docs/icons/cardIcons/rocket.gif -------------------------------------------------------------------------------- /docs/icons/cardIcons/rocketNew.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Friedrich482/Comprehensive-Weather-Fetch-App/b606d5d0841f527119f711846e633d3d15eece90/docs/icons/cardIcons/rocketNew.gif -------------------------------------------------------------------------------- /docs/icons/cardIcons/thermometer.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/cardIcons/wind.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/cardIcons/windsock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/passwordIcons/crossedEye.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /docs/icons/passwordIcons/eye.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /docs/icons/titleIcons/clear-day.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/titleIcons/clear-night.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/titleIcons/snow.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/icons/titleIcons/tornado.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/img/01.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Friedrich482/Comprehensive-Weather-Fetch-App/b606d5d0841f527119f711846e633d3d15eece90/docs/img/01.webp -------------------------------------------------------------------------------- /docs/img/02.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Friedrich482/Comprehensive-Weather-Fetch-App/b606d5d0841f527119f711846e633d3d15eece90/docs/img/02.webp -------------------------------------------------------------------------------- /docs/img/weatherAppPr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Friedrich482/Comprehensive-Weather-Fetch-App/b606d5d0841f527119f711846e633d3d15eece90/docs/img/weatherAppPr.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Fetch Weather App ❄🌨 7 | 8 | 9 | 14 | 15 | 16 | 19 |

22 | Weather App 23 |
24 | snow weather image 29 | 30 | tornado weather image 35 | 36 | sun weather image 42 |
43 |

44 |
49 | 56 | 62 |
63 | 64 | 165 | 169 | 170 | 171 | -------------------------------------------------------------------------------- /docs/script.js: -------------------------------------------------------------------------------- 1 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 2 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 3 | return new (P || (P = Promise))(function (resolve, reject) { 4 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 5 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 6 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 7 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 8 | }); 9 | }; 10 | function fetchApiKey() { 11 | return __awaiter(this, void 0, void 0, function* () { 12 | let request = yield fetch("apiKey.json"); 13 | let response = yield request.json(); 14 | const API_KEY = response["API_KEY"]; 15 | return API_KEY; 16 | }); 17 | } 18 | const API_KEY = await fetchApiKey(); 19 | // ! Here the goal is to reference all the dom Elements without using abusively the document.querySelector() method 20 | // ?I start by creating an array for each type of nodes ... 21 | const DivsElements = [ 22 | "card", 23 | "windDeg", 24 | "windSpeed", 25 | "descriptionDisplay", 26 | "locationDateDisplay", 27 | ]; 28 | const paragraphElements = [ 29 | "errorDisplay", 30 | "cityText", 31 | "temperatureText", 32 | "humidityText", 33 | "temperatureFlText", 34 | "descriptionText", 35 | ]; 36 | const imageElements = ["marker", "weatherIcon", "sunOrMoon"]; 37 | // ? At this level, I create objects made by key: value pairs, one for each type of node... 38 | const divsObject = {}; 39 | const paragraphsObject = {}; 40 | const imageObject = {}; 41 | //! This function allow me, for each value of each object, to make the value egal to the node 42 | function createHTMLElements(htmlElementsArray, htmlElementObject) { 43 | htmlElementsArray.forEach((htmlElement) => { 44 | htmlElementObject[htmlElement] = document.querySelector(`#${htmlElement}`); 45 | }); 46 | } 47 | createHTMLElements(DivsElements, divsObject); 48 | createHTMLElements(paragraphElements, paragraphsObject); 49 | createHTMLElements(imageElements, imageObject); 50 | // ? And lastly I use the object destructuring to access each node more easily (I dont want to write object.element to access the element) 51 | const { card, windDeg, windSpeed, descriptionDisplay, locationDateDisplay } = divsObject; 52 | const { errorDisplay, cityText, temperatureText, humidityText, temperatureFlText, descriptionText, } = paragraphsObject; 53 | const { marker, weatherIcon, sunOrMoon } = imageObject; 54 | // *The only form so no need to use the same technique than above... 55 | const weatherForm = document.getElementById("weatherForm"); 56 | // const footer = document.querySelector("footer") as HTMLElement; 57 | // const imageFooter = footer.querySelector("img") as HTMLImageElement; 58 | // imageFooter.src = "../../assets/icons/rocket.svg"; 59 | // footer.classList.add("hidden"); 60 | // const apiKey: string = API_KEY; 61 | let interval; // For the setInterval function later in the code 62 | //?All Arrays for css classes 63 | const flexCssClasses = ["flex", "items-center", "justify-center", "flex-row"]; 64 | const timeIconCssClasses = ["size-6", "rounded-lg", "ml-3"]; 65 | const errorDisplayCssClasses = [ 66 | ...flexCssClasses, 67 | "flex-wrap", 68 | "flex-col", 69 | "gap-1", 70 | "text-center", 71 | "text-red-600", 72 | ]; 73 | const timeIcon = document.createElement("img"); 74 | timeIcon.src = "./icons/cardIcons/date.gif"; 75 | timeIcon.classList.add(...timeIconCssClasses); 76 | // *These two functions are specially created to hidden or display elements (not toggle because it may lead to inappropriate behaviour) 77 | function displayElement(element) { 78 | element.classList.remove("hidden"); 79 | element.classList.add("flex"); 80 | } 81 | function hiddenElement(element) { 82 | element.classList.remove("flex"); 83 | element.classList.add("hidden"); 84 | } 85 | //! The main form submission event 🚀 86 | weatherForm.addEventListener("submit", (event) => __awaiter(void 0, void 0, void 0, function* () { 87 | clearInterval(interval); 88 | locationDateDisplay.classList.add("invisible"); 89 | let cityEntered = document.querySelector("#cityEntered") 90 | .value; 91 | event.preventDefault(); 92 | if (cityEntered === "") { 93 | displayError("Please enter a city 🏙️ !"); 94 | return; 95 | } 96 | try { 97 | hiddenElement(errorDisplay); 98 | const response = yield fetchData(cityEntered); 99 | displayElement(card); 100 | displayData(response); 101 | // footer.classList.remove("hidden"); 102 | } 103 | catch (error) { 104 | displayError(error); 105 | } 106 | })); 107 | function fetchData(city) { 108 | return __awaiter(this, void 0, void 0, function* () { 109 | let ApiUrl = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${API_KEY}`; 110 | let response = yield fetch(ApiUrl); 111 | if (!response.ok) { 112 | throw new Error("Couldn't fetch data ❌, try again !"); 113 | } 114 | else { 115 | return yield response.json(); 116 | } 117 | }); 118 | } 119 | function displayError(error) { 120 | hiddenElement(card); 121 | errorDisplay.classList.remove("hidden"); 122 | errorDisplay.classList.add(...errorDisplayCssClasses); 123 | if (error == "TypeError: NetworkError when attempting to fetch resource.") { 124 | errorDisplay.textContent = 125 | "It seems that you're not connected to internet 🌐. Please check you connexion"; 126 | return; 127 | } 128 | errorDisplay.textContent = String(error); 129 | } 130 | function displayData(data) { 131 | return __awaiter(this, void 0, void 0, function* () { 132 | const { name: city, main: { temp, humidity, feels_like }, weather: [{ description, icon }], sys: { country }, timezone: timezone, wind: { deg, speed }, } = data; 133 | cityText.innerHTML = ` ${city}`; 134 | let temperature = (temp - 273.15).toFixed(); 135 | // Avoid display like {-0°C} 136 | temperature === "-0" ? (temperature = "0") : true; 137 | temperatureText.textContent = `Temperature : ${temperature}°C`; 138 | let feels_like_fixed = (feels_like - 273.15).toFixed(); 139 | // Same thing here 140 | feels_like_fixed === "-0" ? (feels_like_fixed = "0") : true; 141 | temperatureFlText.textContent = ` Feels like : ${feels_like_fixed}°C`; 142 | humidityText.textContent = ` Humidity : ${humidity} %`; 143 | windDeg.textContent = `Wind Direction : ${deg} degrees`; 144 | windSpeed.textContent = `Wind Speed : ${speed} meters/s`; 145 | description.length > 17 146 | ? descriptionText.classList.remove("indent-12") 147 | : descriptionText.classList.add("indent-12"); 148 | descriptionText.textContent = description; 149 | let countryCode = country; 150 | //? Fetch the country from ISO3166-1.alpha2.json 151 | let actualCountry = yield fetchCountry(countryCode); 152 | cityText.innerHTML += `, ${actualCountry}`; 153 | function setDate() { 154 | locationDateDisplay.innerHTML = ""; 155 | let locationDate = getLocationDate(timezone); 156 | let day = locationDate.getDate(); 157 | let year = locationDate.getFullYear(); 158 | let month = stringMonths(locationDate.getMonth()); 159 | let weekDay = stringWeekDay(locationDate.getDay()); 160 | let locationHour = pad(locationDate.getHours()); 161 | let locationMins = pad(locationDate.getMinutes()); 162 | let locationsecs = pad(locationDate.getSeconds()); 163 | locationDateDisplay.innerHTML = `${weekDay} 164 | ${day} 165 | ${month} 166 | ${year}, 167 |
168 | ${locationHour}: 169 | ${locationMins}: 170 | ${locationsecs}`; 172 | locationDateDisplay.classList.remove("invisible"); 173 | locationDateDisplay.prepend(timeIcon); 174 | } 175 | interval = setInterval(setDate, 1000); 176 | displayEmoji(icon, descriptionDisplay); 177 | }); 178 | } 179 | function fetchCountry(countryCode) { 180 | return __awaiter(this, void 0, void 0, function* () { 181 | let countriesCodeResponse = yield fetch("ISO3166-1.alpha2.json"); 182 | let countriesCode = yield countriesCodeResponse.json(); 183 | const countryName = countriesCode[countryCode]; 184 | return countryName; 185 | }); 186 | } 187 | function getLocationDate(timezone) { 188 | let locationDate; 189 | let actualDate = new Date().toString(); 190 | let firstSlice; 191 | let minus = true; 192 | if (actualDate.indexOf("+") == -1) { 193 | firstSlice = actualDate.slice(actualDate.indexOf("-") + 1); 194 | } 195 | else { 196 | firstSlice = actualDate.slice(actualDate.indexOf("+") + 1); 197 | minus = false; 198 | } 199 | let gmt = Number(firstSlice.slice(0, firstSlice.indexOf(" "))); 200 | gmt = gmt / 100; 201 | // !The previous part get the user current gmt+`value` or gmt-`value`, I get this 'value' 202 | // !So if somebody hasn't the same timezone than me, it still works. 203 | if (minus) { 204 | locationDate = new Date(Date.now() + timezone * 1000 + 3600000 * gmt); 205 | } 206 | else { 207 | locationDate = new Date(Date.now() + timezone * 1000 - 3600000 * gmt); 208 | } 209 | return locationDate; 210 | } 211 | function pad(unit) { 212 | return unit < 10 ? "0" + unit : unit; 213 | } 214 | function stringMonths(month) { 215 | let months = [ 216 | "January", 217 | "February", 218 | "March", 219 | "April", 220 | "May", 221 | "June", 222 | "July", 223 | "August", 224 | "September", 225 | "October", 226 | "November", 227 | "December", 228 | ]; 229 | return months[month]; 230 | } 231 | function stringWeekDay(day) { 232 | let days = [ 233 | "Sunday", 234 | "Monday", 235 | "Tuesday", 236 | "Wednesday", 237 | "Thursday", 238 | "Friday", 239 | "Saturday", 240 | ]; 241 | return days[day]; 242 | } 243 | function displayEmoji(icon, descriptionDisplay) { 244 | weatherIcon.src = `./icons/Openweathermap/${icon}.svg`; 245 | descriptionDisplay.appendChild(weatherIcon); 246 | if (icon.indexOf("n") != -1) { 247 | document.body.classList.add("weatherNightImg"); 248 | document.body.classList.remove("weatherDayImg"); 249 | marker.src = "./icons/cardIcons/markerNight.png"; 250 | sunOrMoon.src = "./icons/titleIcons/clear-night.svg"; 251 | } 252 | else { 253 | document.body.classList.add("weatherDayImg"); 254 | document.body.classList.remove("weatherNightImg"); 255 | marker.src = "./icons/cardIcons/marker.png"; 256 | sunOrMoon.src = "./icons/titleIcons/clear-day.svg"; 257 | } 258 | } 259 | export {}; 260 | -------------------------------------------------------------------------------- /docs/script.ts: -------------------------------------------------------------------------------- 1 | export {} 2 | // ? This is the interface for the data fetched 3 | interface WeatherData { 4 | coord: { 5 | lon: number; 6 | lat: number 7 | }; 8 | weather: { 9 | id: number; 10 | main: string; 11 | description: string; 12 | icon: string; 13 | }[]; 14 | base: string; 15 | main: { 16 | temp: number; 17 | feels_like: number; 18 | temp_min: number; 19 | temp_max: number; 20 | pressure: number; 21 | humidity: number; 22 | }; 23 | visibility: number; 24 | wind: { 25 | speed: number; 26 | deg: number; 27 | }; 28 | rain?: { 29 | "1h": number; 30 | "3h": number; 31 | }; 32 | clouds: { 33 | all: number; 34 | }; 35 | dt: number; 36 | sys: { 37 | type: number; 38 | id: number; 39 | country: string; 40 | sunrise: number; 41 | sunset: number; 42 | }; 43 | timezone: number; 44 | id: number; 45 | name: string; 46 | cod: number; 47 | } 48 | async function fetchApiKey(): Promise{ 49 | let request = await fetch("apiKey.json"); 50 | let response = await request.json() 51 | const API_KEY: string = response["API_KEY"] 52 | return API_KEY; 53 | } 54 | const API_KEY = await fetchApiKey(); 55 | 56 | // ! Here the goal is to reference all the dom Elements without using abusively the document.querySelector() method 57 | // ?I start by creating an array for each type of nodes ... 58 | const DivsElements = [ 59 | "card", 60 | "windDeg", 61 | "windSpeed", 62 | "descriptionDisplay", 63 | "locationDateDisplay", 64 | ]; 65 | 66 | const paragraphElements = [ 67 | "errorDisplay", 68 | "cityText", 69 | "temperatureText", 70 | "humidityText", 71 | "temperatureFlText", 72 | "descriptionText", 73 | ]; 74 | 75 | const imageElements = ["marker", "weatherIcon", "sunOrMoon"]; 76 | // ? At this level, I create objects made by key: value pairs, one for each type of node... 77 | const divsObject: { [key: string]: HTMLDivElement } = {}; 78 | const paragraphsObject: { [key: string]: HTMLParagraphElement } = {}; 79 | const imageObject: { [key: string]: HTMLImageElement } = {}; 80 | 81 | //! This function allow me, for each value of each object, to make the value egal to the node 82 | 83 | function createHTMLElements( 84 | htmlElementsArray: string[], 85 | htmlElementObject: { [key: string]: HTMLElement }, 86 | ): void { 87 | htmlElementsArray.forEach((htmlElement) => { 88 | htmlElementObject[htmlElement] = document.querySelector( 89 | `#${htmlElement}`, 90 | ) as HTMLDivElement; 91 | }); 92 | } 93 | createHTMLElements(DivsElements, divsObject); 94 | createHTMLElements(paragraphElements, paragraphsObject); 95 | createHTMLElements(imageElements, imageObject); 96 | 97 | // ? And lastly I use the object destructuring to access each node more easily (I dont want to write object.element to access the element) 98 | const { card, windDeg, windSpeed, descriptionDisplay, locationDateDisplay } = 99 | divsObject; 100 | 101 | const { 102 | errorDisplay, 103 | cityText, 104 | temperatureText, 105 | humidityText, 106 | temperatureFlText, 107 | descriptionText, 108 | } = paragraphsObject; 109 | 110 | const { marker, weatherIcon, sunOrMoon } = imageObject; 111 | 112 | // *The only form so no need to use the same technique than above... 113 | const weatherForm = document.getElementById("weatherForm") as HTMLFormElement; 114 | 115 | // const footer = document.querySelector("footer") as HTMLElement; 116 | // const imageFooter = footer.querySelector("img") as HTMLImageElement; 117 | // imageFooter.src = "../../assets/icons/rocket.svg"; 118 | // footer.classList.add("hidden"); 119 | 120 | // const apiKey: string = API_KEY; 121 | let interval: ReturnType ; // For the setInterval function later in the code 122 | 123 | //?All Arrays for css classes 124 | const flexCssClasses = ["flex", "items-center", "justify-center", "flex-row"]; 125 | const timeIconCssClasses = ["size-6", "rounded-lg", "ml-3"]; 126 | const errorDisplayCssClasses = [ 127 | ...flexCssClasses, 128 | "flex-wrap", 129 | "flex-col", 130 | "gap-1", 131 | "text-center", 132 | "text-red-600", 133 | ]; 134 | 135 | const timeIcon = document.createElement("img"); 136 | timeIcon.src = "./icons/cardIcons/date.gif"; 137 | timeIcon.classList.add(...timeIconCssClasses); 138 | 139 | // *These two functions are specially created to hidden or display elements (not toggle because it may lead to inappropriate behaviour) 140 | 141 | function displayElement(element: HTMLElement): void { 142 | element.classList.remove("hidden"); 143 | element.classList.add("flex"); 144 | } 145 | 146 | function hiddenElement(element: HTMLElement): void { 147 | element.classList.remove("flex"); 148 | element.classList.add("hidden"); 149 | } 150 | 151 | //! The main form submission event 🚀 152 | 153 | weatherForm.addEventListener("submit", async (event) => { 154 | clearInterval(interval); 155 | locationDateDisplay.classList.add("invisible"); 156 | let cityEntered = (document.querySelector("#cityEntered") as HTMLInputElement) 157 | .value; 158 | 159 | event.preventDefault(); 160 | 161 | if (cityEntered === "") { 162 | displayError("Please enter a city 🏙️ !"); 163 | return; 164 | } 165 | 166 | try { 167 | hiddenElement(errorDisplay); 168 | const response: WeatherData = await fetchData(cityEntered); 169 | displayElement(card); 170 | displayData(response); 171 | // footer.classList.remove("hidden"); 172 | } catch (error) { 173 | displayError(error); 174 | } 175 | }); 176 | 177 | async function fetchData(city: string) { 178 | let ApiUrl = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${API_KEY}`; 179 | let response: Response = await fetch(ApiUrl); 180 | 181 | if (!response.ok) { 182 | throw new Error("Couldn't fetch data ❌, try again !"); 183 | } else { 184 | return await response.json(); 185 | } 186 | } 187 | 188 | function displayError(error: unknown): void { 189 | hiddenElement(card); 190 | errorDisplay.classList.remove("hidden"); 191 | errorDisplay.classList.add(...errorDisplayCssClasses); 192 | if (error == "TypeError: NetworkError when attempting to fetch resource.") { 193 | errorDisplay.textContent = 194 | "It seems that you're not connected to internet 🌐. Please check you connexion"; 195 | return; 196 | } 197 | 198 | errorDisplay.textContent = String(error); 199 | } 200 | 201 | async function displayData(data: WeatherData) { 202 | const { 203 | name: city, 204 | main: { temp, humidity, feels_like }, 205 | weather: [{ description, icon }], 206 | sys: { country }, 207 | timezone: timezone, 208 | wind: { deg, speed }, 209 | } = data; 210 | cityText.innerHTML = ` ${city}`; 211 | let temperature = (temp - 273.15).toFixed(); 212 | // Avoid display like {-0°C} 213 | temperature === "-0" ? (temperature = "0") : true; 214 | 215 | temperatureText.textContent = `Temperature : ${temperature}°C`; 216 | 217 | let feels_like_fixed = (feels_like - 273.15).toFixed(); 218 | // Same thing here 219 | feels_like_fixed === "-0" ? (feels_like_fixed = "0") : true; 220 | 221 | temperatureFlText.textContent = ` Feels like : ${feels_like_fixed}°C`; 222 | 223 | humidityText.textContent = ` Humidity : ${humidity} %`; 224 | 225 | windDeg.textContent = `Wind Direction : ${deg} degrees`; 226 | windSpeed.textContent = `Wind Speed : ${speed} meters/s`; 227 | description.length > 17 228 | ? descriptionText.classList.remove("indent-12") 229 | : descriptionText.classList.add("indent-12"); 230 | 231 | descriptionText.textContent = description; 232 | 233 | let countryCode = country; 234 | 235 | //? Fetch the country from ISO3166-1.alpha2.json 236 | 237 | let actualCountry = await fetchCountry(countryCode); 238 | 239 | cityText.innerHTML += `, ${actualCountry}`; 240 | 241 | function setDate(): void { 242 | locationDateDisplay.innerHTML = ""; 243 | let locationDate = getLocationDate(timezone); 244 | let day = locationDate.getDate(); 245 | let year = locationDate.getFullYear(); 246 | 247 | let month = stringMonths(locationDate.getMonth()); 248 | let weekDay = stringWeekDay(locationDate.getDay()); 249 | 250 | let locationHour = pad(locationDate.getHours()); 251 | let locationMins = pad(locationDate.getMinutes()); 252 | let locationsecs = pad(locationDate.getSeconds()); 253 | 254 | locationDateDisplay.innerHTML = `${weekDay} 255 | ${day} 256 | ${month} 257 | ${year}, 258 |
259 | ${locationHour}: 260 | ${locationMins}: 261 | ${locationsecs}`; 263 | locationDateDisplay.classList.remove("invisible"); 264 | locationDateDisplay.prepend(timeIcon); 265 | } 266 | 267 | interval = setInterval(setDate, 1000); 268 | displayEmoji(icon, descriptionDisplay); 269 | } 270 | 271 | type CountryCodes = { 272 | [countryCode: string]: string; 273 | }; 274 | 275 | async function fetchCountry(countryCode: string): Promise { 276 | let countriesCodeResponse = await fetch("ISO3166-1.alpha2.json"); 277 | let countriesCode: CountryCodes = await countriesCodeResponse.json(); 278 | const countryName = countriesCode[countryCode]; 279 | return countryName; 280 | } 281 | 282 | function getLocationDate(timezone: number) { 283 | let locationDate: Date; 284 | let actualDate = new Date().toString(); 285 | let firstSlice: string; 286 | let minus = true; 287 | if (actualDate.indexOf("+") == -1) { 288 | firstSlice = actualDate.slice(actualDate.indexOf("-") + 1); 289 | } else { 290 | firstSlice = actualDate.slice(actualDate.indexOf("+") + 1); 291 | minus = false; 292 | } 293 | let gmt = Number(firstSlice.slice(0, firstSlice.indexOf(" "))); 294 | gmt = gmt / 100; 295 | // !The previous part get the user current gmt+`value` or gmt-`value`, I get this 'value' 296 | // !So if somebody hasn't the same timezone than me, it still works. 297 | 298 | if (minus) { 299 | locationDate = new Date(Date.now() + timezone * 1000 + 3600000 * gmt); 300 | } else { 301 | locationDate = new Date(Date.now() + timezone * 1000 - 3600000 * gmt); 302 | } 303 | return locationDate; 304 | } 305 | 306 | function pad(unit: number) { 307 | return unit < 10 ? "0" + unit : unit; 308 | } 309 | 310 | function stringMonths(month: number): string { 311 | let months = [ 312 | "January", 313 | "February", 314 | "March", 315 | "April", 316 | "May", 317 | "June", 318 | "July", 319 | "August", 320 | "September", 321 | "October", 322 | "November", 323 | "December", 324 | ]; 325 | return months[month]; 326 | } 327 | 328 | function stringWeekDay(day: number): string { 329 | let days = [ 330 | "Sunday", 331 | "Monday", 332 | "Tuesday", 333 | "Wednesday", 334 | "Thursday", 335 | "Friday", 336 | "Saturday", 337 | ]; 338 | return days[day]; 339 | } 340 | 341 | function displayEmoji(icon: string, descriptionDisplay: HTMLParagraphElement) { 342 | weatherIcon.src = `./icons/Openweathermap/${icon}.svg`; 343 | descriptionDisplay.appendChild(weatherIcon); 344 | 345 | if (icon.indexOf("n") != -1) { 346 | document.body.classList.add("weatherNightImg"); 347 | document.body.classList.remove("weatherDayImg"); 348 | 349 | marker.src = "./icons/cardIcons/markerNight.png"; 350 | 351 | sunOrMoon.src = "./icons/titleIcons/clear-night.svg"; 352 | } else { 353 | document.body.classList.add("weatherDayImg"); 354 | document.body.classList.remove("weatherNightImg"); 355 | 356 | marker.src = "./icons/cardIcons/marker.png"; 357 | 358 | sunOrMoon.src = "./icons/titleIcons/clear-day.svg"; 359 | } 360 | } 361 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Fetch-weather-app", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "sass": "^1.72.0" 9 | }, 10 | "devDependencies": { 11 | "autoprefixer": "^10.4.19", 12 | "postcss": "^8.4.38", 13 | "tailwindcss": "^3.4.1", 14 | "typescript": "^5.4.3" 15 | } 16 | }, 17 | "node_modules/@alloc/quick-lru": { 18 | "version": "5.2.0", 19 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 20 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 21 | "dev": true, 22 | "engines": { 23 | "node": ">=10" 24 | }, 25 | "funding": { 26 | "url": "https://github.com/sponsors/sindresorhus" 27 | } 28 | }, 29 | "node_modules/@isaacs/cliui": { 30 | "version": "8.0.2", 31 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 32 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 33 | "dev": true, 34 | "dependencies": { 35 | "string-width": "^5.1.2", 36 | "string-width-cjs": "npm:string-width@^4.2.0", 37 | "strip-ansi": "^7.0.1", 38 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 39 | "wrap-ansi": "^8.1.0", 40 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 41 | }, 42 | "engines": { 43 | "node": ">=12" 44 | } 45 | }, 46 | "node_modules/@jridgewell/gen-mapping": { 47 | "version": "0.3.5", 48 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 49 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 50 | "dev": true, 51 | "dependencies": { 52 | "@jridgewell/set-array": "^1.2.1", 53 | "@jridgewell/sourcemap-codec": "^1.4.10", 54 | "@jridgewell/trace-mapping": "^0.3.24" 55 | }, 56 | "engines": { 57 | "node": ">=6.0.0" 58 | } 59 | }, 60 | "node_modules/@jridgewell/resolve-uri": { 61 | "version": "3.1.2", 62 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 63 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 64 | "dev": true, 65 | "engines": { 66 | "node": ">=6.0.0" 67 | } 68 | }, 69 | "node_modules/@jridgewell/set-array": { 70 | "version": "1.2.1", 71 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 72 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 73 | "dev": true, 74 | "engines": { 75 | "node": ">=6.0.0" 76 | } 77 | }, 78 | "node_modules/@jridgewell/sourcemap-codec": { 79 | "version": "1.4.15", 80 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 81 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 82 | "dev": true 83 | }, 84 | "node_modules/@jridgewell/trace-mapping": { 85 | "version": "0.3.25", 86 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 87 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 88 | "dev": true, 89 | "dependencies": { 90 | "@jridgewell/resolve-uri": "^3.1.0", 91 | "@jridgewell/sourcemap-codec": "^1.4.14" 92 | } 93 | }, 94 | "node_modules/@nodelib/fs.scandir": { 95 | "version": "2.1.5", 96 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 97 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 98 | "dev": true, 99 | "dependencies": { 100 | "@nodelib/fs.stat": "2.0.5", 101 | "run-parallel": "^1.1.9" 102 | }, 103 | "engines": { 104 | "node": ">= 8" 105 | } 106 | }, 107 | "node_modules/@nodelib/fs.stat": { 108 | "version": "2.0.5", 109 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 110 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 111 | "dev": true, 112 | "engines": { 113 | "node": ">= 8" 114 | } 115 | }, 116 | "node_modules/@nodelib/fs.walk": { 117 | "version": "1.2.8", 118 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 119 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 120 | "dev": true, 121 | "dependencies": { 122 | "@nodelib/fs.scandir": "2.1.5", 123 | "fastq": "^1.6.0" 124 | }, 125 | "engines": { 126 | "node": ">= 8" 127 | } 128 | }, 129 | "node_modules/@pkgjs/parseargs": { 130 | "version": "0.11.0", 131 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 132 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 133 | "dev": true, 134 | "optional": true, 135 | "engines": { 136 | "node": ">=14" 137 | } 138 | }, 139 | "node_modules/ansi-regex": { 140 | "version": "6.0.1", 141 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 142 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 143 | "dev": true, 144 | "engines": { 145 | "node": ">=12" 146 | }, 147 | "funding": { 148 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 149 | } 150 | }, 151 | "node_modules/ansi-styles": { 152 | "version": "6.2.1", 153 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 154 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 155 | "dev": true, 156 | "engines": { 157 | "node": ">=12" 158 | }, 159 | "funding": { 160 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 161 | } 162 | }, 163 | "node_modules/any-promise": { 164 | "version": "1.3.0", 165 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 166 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 167 | "dev": true 168 | }, 169 | "node_modules/anymatch": { 170 | "version": "3.1.3", 171 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 172 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 173 | "dependencies": { 174 | "normalize-path": "^3.0.0", 175 | "picomatch": "^2.0.4" 176 | }, 177 | "engines": { 178 | "node": ">= 8" 179 | } 180 | }, 181 | "node_modules/arg": { 182 | "version": "5.0.2", 183 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 184 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 185 | "dev": true 186 | }, 187 | "node_modules/autoprefixer": { 188 | "version": "10.4.19", 189 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", 190 | "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", 191 | "dev": true, 192 | "funding": [ 193 | { 194 | "type": "opencollective", 195 | "url": "https://opencollective.com/postcss/" 196 | }, 197 | { 198 | "type": "tidelift", 199 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 200 | }, 201 | { 202 | "type": "github", 203 | "url": "https://github.com/sponsors/ai" 204 | } 205 | ], 206 | "dependencies": { 207 | "browserslist": "^4.23.0", 208 | "caniuse-lite": "^1.0.30001599", 209 | "fraction.js": "^4.3.7", 210 | "normalize-range": "^0.1.2", 211 | "picocolors": "^1.0.0", 212 | "postcss-value-parser": "^4.2.0" 213 | }, 214 | "bin": { 215 | "autoprefixer": "bin/autoprefixer" 216 | }, 217 | "engines": { 218 | "node": "^10 || ^12 || >=14" 219 | }, 220 | "peerDependencies": { 221 | "postcss": "^8.1.0" 222 | } 223 | }, 224 | "node_modules/balanced-match": { 225 | "version": "1.0.2", 226 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 227 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 228 | "dev": true 229 | }, 230 | "node_modules/binary-extensions": { 231 | "version": "2.3.0", 232 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 233 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 234 | "engines": { 235 | "node": ">=8" 236 | }, 237 | "funding": { 238 | "url": "https://github.com/sponsors/sindresorhus" 239 | } 240 | }, 241 | "node_modules/brace-expansion": { 242 | "version": "2.0.1", 243 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 244 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 245 | "dev": true, 246 | "dependencies": { 247 | "balanced-match": "^1.0.0" 248 | } 249 | }, 250 | "node_modules/braces": { 251 | "version": "3.0.2", 252 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 253 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 254 | "dependencies": { 255 | "fill-range": "^7.0.1" 256 | }, 257 | "engines": { 258 | "node": ">=8" 259 | } 260 | }, 261 | "node_modules/browserslist": { 262 | "version": "4.23.0", 263 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", 264 | "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", 265 | "dev": true, 266 | "funding": [ 267 | { 268 | "type": "opencollective", 269 | "url": "https://opencollective.com/browserslist" 270 | }, 271 | { 272 | "type": "tidelift", 273 | "url": "https://tidelift.com/funding/github/npm/browserslist" 274 | }, 275 | { 276 | "type": "github", 277 | "url": "https://github.com/sponsors/ai" 278 | } 279 | ], 280 | "dependencies": { 281 | "caniuse-lite": "^1.0.30001587", 282 | "electron-to-chromium": "^1.4.668", 283 | "node-releases": "^2.0.14", 284 | "update-browserslist-db": "^1.0.13" 285 | }, 286 | "bin": { 287 | "browserslist": "cli.js" 288 | }, 289 | "engines": { 290 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 291 | } 292 | }, 293 | "node_modules/camelcase-css": { 294 | "version": "2.0.1", 295 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 296 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 297 | "dev": true, 298 | "engines": { 299 | "node": ">= 6" 300 | } 301 | }, 302 | "node_modules/caniuse-lite": { 303 | "version": "1.0.30001600", 304 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", 305 | "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", 306 | "dev": true, 307 | "funding": [ 308 | { 309 | "type": "opencollective", 310 | "url": "https://opencollective.com/browserslist" 311 | }, 312 | { 313 | "type": "tidelift", 314 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 315 | }, 316 | { 317 | "type": "github", 318 | "url": "https://github.com/sponsors/ai" 319 | } 320 | ] 321 | }, 322 | "node_modules/chokidar": { 323 | "version": "3.6.0", 324 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 325 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 326 | "dependencies": { 327 | "anymatch": "~3.1.2", 328 | "braces": "~3.0.2", 329 | "glob-parent": "~5.1.2", 330 | "is-binary-path": "~2.1.0", 331 | "is-glob": "~4.0.1", 332 | "normalize-path": "~3.0.0", 333 | "readdirp": "~3.6.0" 334 | }, 335 | "engines": { 336 | "node": ">= 8.10.0" 337 | }, 338 | "funding": { 339 | "url": "https://paulmillr.com/funding/" 340 | }, 341 | "optionalDependencies": { 342 | "fsevents": "~2.3.2" 343 | } 344 | }, 345 | "node_modules/chokidar/node_modules/glob-parent": { 346 | "version": "5.1.2", 347 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 348 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 349 | "dependencies": { 350 | "is-glob": "^4.0.1" 351 | }, 352 | "engines": { 353 | "node": ">= 6" 354 | } 355 | }, 356 | "node_modules/color-convert": { 357 | "version": "2.0.1", 358 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 359 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 360 | "dev": true, 361 | "dependencies": { 362 | "color-name": "~1.1.4" 363 | }, 364 | "engines": { 365 | "node": ">=7.0.0" 366 | } 367 | }, 368 | "node_modules/color-name": { 369 | "version": "1.1.4", 370 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 371 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 372 | "dev": true 373 | }, 374 | "node_modules/commander": { 375 | "version": "4.1.1", 376 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 377 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 378 | "dev": true, 379 | "engines": { 380 | "node": ">= 6" 381 | } 382 | }, 383 | "node_modules/cross-spawn": { 384 | "version": "7.0.3", 385 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 386 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 387 | "dev": true, 388 | "dependencies": { 389 | "path-key": "^3.1.0", 390 | "shebang-command": "^2.0.0", 391 | "which": "^2.0.1" 392 | }, 393 | "engines": { 394 | "node": ">= 8" 395 | } 396 | }, 397 | "node_modules/cssesc": { 398 | "version": "3.0.0", 399 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 400 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 401 | "dev": true, 402 | "bin": { 403 | "cssesc": "bin/cssesc" 404 | }, 405 | "engines": { 406 | "node": ">=4" 407 | } 408 | }, 409 | "node_modules/didyoumean": { 410 | "version": "1.2.2", 411 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 412 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 413 | "dev": true 414 | }, 415 | "node_modules/dlv": { 416 | "version": "1.1.3", 417 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 418 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 419 | "dev": true 420 | }, 421 | "node_modules/eastasianwidth": { 422 | "version": "0.2.0", 423 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 424 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 425 | "dev": true 426 | }, 427 | "node_modules/electron-to-chromium": { 428 | "version": "1.4.717", 429 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.717.tgz", 430 | "integrity": "sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==", 431 | "dev": true 432 | }, 433 | "node_modules/emoji-regex": { 434 | "version": "9.2.2", 435 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 436 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 437 | "dev": true 438 | }, 439 | "node_modules/escalade": { 440 | "version": "3.1.2", 441 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 442 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 443 | "dev": true, 444 | "engines": { 445 | "node": ">=6" 446 | } 447 | }, 448 | "node_modules/fast-glob": { 449 | "version": "3.3.2", 450 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 451 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 452 | "dev": true, 453 | "dependencies": { 454 | "@nodelib/fs.stat": "^2.0.2", 455 | "@nodelib/fs.walk": "^1.2.3", 456 | "glob-parent": "^5.1.2", 457 | "merge2": "^1.3.0", 458 | "micromatch": "^4.0.4" 459 | }, 460 | "engines": { 461 | "node": ">=8.6.0" 462 | } 463 | }, 464 | "node_modules/fast-glob/node_modules/glob-parent": { 465 | "version": "5.1.2", 466 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 467 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 468 | "dev": true, 469 | "dependencies": { 470 | "is-glob": "^4.0.1" 471 | }, 472 | "engines": { 473 | "node": ">= 6" 474 | } 475 | }, 476 | "node_modules/fastq": { 477 | "version": "1.17.1", 478 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 479 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 480 | "dev": true, 481 | "dependencies": { 482 | "reusify": "^1.0.4" 483 | } 484 | }, 485 | "node_modules/fill-range": { 486 | "version": "7.0.1", 487 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 488 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 489 | "dependencies": { 490 | "to-regex-range": "^5.0.1" 491 | }, 492 | "engines": { 493 | "node": ">=8" 494 | } 495 | }, 496 | "node_modules/foreground-child": { 497 | "version": "3.1.1", 498 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", 499 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", 500 | "dev": true, 501 | "dependencies": { 502 | "cross-spawn": "^7.0.0", 503 | "signal-exit": "^4.0.1" 504 | }, 505 | "engines": { 506 | "node": ">=14" 507 | }, 508 | "funding": { 509 | "url": "https://github.com/sponsors/isaacs" 510 | } 511 | }, 512 | "node_modules/fraction.js": { 513 | "version": "4.3.7", 514 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", 515 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", 516 | "dev": true, 517 | "engines": { 518 | "node": "*" 519 | }, 520 | "funding": { 521 | "type": "patreon", 522 | "url": "https://github.com/sponsors/rawify" 523 | } 524 | }, 525 | "node_modules/fsevents": { 526 | "version": "2.3.3", 527 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 528 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 529 | "hasInstallScript": true, 530 | "optional": true, 531 | "os": [ 532 | "darwin" 533 | ], 534 | "engines": { 535 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 536 | } 537 | }, 538 | "node_modules/function-bind": { 539 | "version": "1.1.2", 540 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 541 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 542 | "dev": true, 543 | "funding": { 544 | "url": "https://github.com/sponsors/ljharb" 545 | } 546 | }, 547 | "node_modules/glob": { 548 | "version": "10.3.10", 549 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", 550 | "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", 551 | "dev": true, 552 | "dependencies": { 553 | "foreground-child": "^3.1.0", 554 | "jackspeak": "^2.3.5", 555 | "minimatch": "^9.0.1", 556 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", 557 | "path-scurry": "^1.10.1" 558 | }, 559 | "bin": { 560 | "glob": "dist/esm/bin.mjs" 561 | }, 562 | "engines": { 563 | "node": ">=16 || 14 >=14.17" 564 | }, 565 | "funding": { 566 | "url": "https://github.com/sponsors/isaacs" 567 | } 568 | }, 569 | "node_modules/glob-parent": { 570 | "version": "6.0.2", 571 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 572 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 573 | "dev": true, 574 | "dependencies": { 575 | "is-glob": "^4.0.3" 576 | }, 577 | "engines": { 578 | "node": ">=10.13.0" 579 | } 580 | }, 581 | "node_modules/hasown": { 582 | "version": "2.0.2", 583 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 584 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 585 | "dev": true, 586 | "dependencies": { 587 | "function-bind": "^1.1.2" 588 | }, 589 | "engines": { 590 | "node": ">= 0.4" 591 | } 592 | }, 593 | "node_modules/immutable": { 594 | "version": "4.3.5", 595 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", 596 | "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" 597 | }, 598 | "node_modules/is-binary-path": { 599 | "version": "2.1.0", 600 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 601 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 602 | "dependencies": { 603 | "binary-extensions": "^2.0.0" 604 | }, 605 | "engines": { 606 | "node": ">=8" 607 | } 608 | }, 609 | "node_modules/is-core-module": { 610 | "version": "2.13.1", 611 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 612 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 613 | "dev": true, 614 | "dependencies": { 615 | "hasown": "^2.0.0" 616 | }, 617 | "funding": { 618 | "url": "https://github.com/sponsors/ljharb" 619 | } 620 | }, 621 | "node_modules/is-extglob": { 622 | "version": "2.1.1", 623 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 624 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 625 | "engines": { 626 | "node": ">=0.10.0" 627 | } 628 | }, 629 | "node_modules/is-fullwidth-code-point": { 630 | "version": "3.0.0", 631 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 632 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 633 | "dev": true, 634 | "engines": { 635 | "node": ">=8" 636 | } 637 | }, 638 | "node_modules/is-glob": { 639 | "version": "4.0.3", 640 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 641 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 642 | "dependencies": { 643 | "is-extglob": "^2.1.1" 644 | }, 645 | "engines": { 646 | "node": ">=0.10.0" 647 | } 648 | }, 649 | "node_modules/is-number": { 650 | "version": "7.0.0", 651 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 652 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 653 | "engines": { 654 | "node": ">=0.12.0" 655 | } 656 | }, 657 | "node_modules/isexe": { 658 | "version": "2.0.0", 659 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 660 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 661 | "dev": true 662 | }, 663 | "node_modules/jackspeak": { 664 | "version": "2.3.6", 665 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", 666 | "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", 667 | "dev": true, 668 | "dependencies": { 669 | "@isaacs/cliui": "^8.0.2" 670 | }, 671 | "engines": { 672 | "node": ">=14" 673 | }, 674 | "funding": { 675 | "url": "https://github.com/sponsors/isaacs" 676 | }, 677 | "optionalDependencies": { 678 | "@pkgjs/parseargs": "^0.11.0" 679 | } 680 | }, 681 | "node_modules/jiti": { 682 | "version": "1.21.0", 683 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", 684 | "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", 685 | "dev": true, 686 | "bin": { 687 | "jiti": "bin/jiti.js" 688 | } 689 | }, 690 | "node_modules/lilconfig": { 691 | "version": "2.1.0", 692 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", 693 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", 694 | "dev": true, 695 | "engines": { 696 | "node": ">=10" 697 | } 698 | }, 699 | "node_modules/lines-and-columns": { 700 | "version": "1.2.4", 701 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 702 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 703 | "dev": true 704 | }, 705 | "node_modules/lru-cache": { 706 | "version": "10.2.0", 707 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", 708 | "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", 709 | "dev": true, 710 | "engines": { 711 | "node": "14 || >=16.14" 712 | } 713 | }, 714 | "node_modules/merge2": { 715 | "version": "1.4.1", 716 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 717 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 718 | "dev": true, 719 | "engines": { 720 | "node": ">= 8" 721 | } 722 | }, 723 | "node_modules/micromatch": { 724 | "version": "4.0.5", 725 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 726 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 727 | "dev": true, 728 | "dependencies": { 729 | "braces": "^3.0.2", 730 | "picomatch": "^2.3.1" 731 | }, 732 | "engines": { 733 | "node": ">=8.6" 734 | } 735 | }, 736 | "node_modules/minimatch": { 737 | "version": "9.0.3", 738 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", 739 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 740 | "dev": true, 741 | "dependencies": { 742 | "brace-expansion": "^2.0.1" 743 | }, 744 | "engines": { 745 | "node": ">=16 || 14 >=14.17" 746 | }, 747 | "funding": { 748 | "url": "https://github.com/sponsors/isaacs" 749 | } 750 | }, 751 | "node_modules/minipass": { 752 | "version": "7.0.4", 753 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", 754 | "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", 755 | "dev": true, 756 | "engines": { 757 | "node": ">=16 || 14 >=14.17" 758 | } 759 | }, 760 | "node_modules/mz": { 761 | "version": "2.7.0", 762 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 763 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 764 | "dev": true, 765 | "dependencies": { 766 | "any-promise": "^1.0.0", 767 | "object-assign": "^4.0.1", 768 | "thenify-all": "^1.0.0" 769 | } 770 | }, 771 | "node_modules/nanoid": { 772 | "version": "3.3.7", 773 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 774 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 775 | "dev": true, 776 | "funding": [ 777 | { 778 | "type": "github", 779 | "url": "https://github.com/sponsors/ai" 780 | } 781 | ], 782 | "bin": { 783 | "nanoid": "bin/nanoid.cjs" 784 | }, 785 | "engines": { 786 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 787 | } 788 | }, 789 | "node_modules/node-releases": { 790 | "version": "2.0.14", 791 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", 792 | "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", 793 | "dev": true 794 | }, 795 | "node_modules/normalize-path": { 796 | "version": "3.0.0", 797 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 798 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 799 | "engines": { 800 | "node": ">=0.10.0" 801 | } 802 | }, 803 | "node_modules/normalize-range": { 804 | "version": "0.1.2", 805 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 806 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 807 | "dev": true, 808 | "engines": { 809 | "node": ">=0.10.0" 810 | } 811 | }, 812 | "node_modules/object-assign": { 813 | "version": "4.1.1", 814 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 815 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 816 | "dev": true, 817 | "engines": { 818 | "node": ">=0.10.0" 819 | } 820 | }, 821 | "node_modules/object-hash": { 822 | "version": "3.0.0", 823 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 824 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 825 | "dev": true, 826 | "engines": { 827 | "node": ">= 6" 828 | } 829 | }, 830 | "node_modules/path-key": { 831 | "version": "3.1.1", 832 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 833 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 834 | "dev": true, 835 | "engines": { 836 | "node": ">=8" 837 | } 838 | }, 839 | "node_modules/path-parse": { 840 | "version": "1.0.7", 841 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 842 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 843 | "dev": true 844 | }, 845 | "node_modules/path-scurry": { 846 | "version": "1.10.1", 847 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", 848 | "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", 849 | "dev": true, 850 | "dependencies": { 851 | "lru-cache": "^9.1.1 || ^10.0.0", 852 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 853 | }, 854 | "engines": { 855 | "node": ">=16 || 14 >=14.17" 856 | }, 857 | "funding": { 858 | "url": "https://github.com/sponsors/isaacs" 859 | } 860 | }, 861 | "node_modules/picocolors": { 862 | "version": "1.0.0", 863 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 864 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 865 | "dev": true 866 | }, 867 | "node_modules/picomatch": { 868 | "version": "2.3.1", 869 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 870 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 871 | "engines": { 872 | "node": ">=8.6" 873 | }, 874 | "funding": { 875 | "url": "https://github.com/sponsors/jonschlinkert" 876 | } 877 | }, 878 | "node_modules/pify": { 879 | "version": "2.3.0", 880 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 881 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 882 | "dev": true, 883 | "engines": { 884 | "node": ">=0.10.0" 885 | } 886 | }, 887 | "node_modules/pirates": { 888 | "version": "4.0.6", 889 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 890 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 891 | "dev": true, 892 | "engines": { 893 | "node": ">= 6" 894 | } 895 | }, 896 | "node_modules/postcss": { 897 | "version": "8.4.38", 898 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", 899 | "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", 900 | "dev": true, 901 | "funding": [ 902 | { 903 | "type": "opencollective", 904 | "url": "https://opencollective.com/postcss/" 905 | }, 906 | { 907 | "type": "tidelift", 908 | "url": "https://tidelift.com/funding/github/npm/postcss" 909 | }, 910 | { 911 | "type": "github", 912 | "url": "https://github.com/sponsors/ai" 913 | } 914 | ], 915 | "dependencies": { 916 | "nanoid": "^3.3.7", 917 | "picocolors": "^1.0.0", 918 | "source-map-js": "^1.2.0" 919 | }, 920 | "engines": { 921 | "node": "^10 || ^12 || >=14" 922 | } 923 | }, 924 | "node_modules/postcss-import": { 925 | "version": "15.1.0", 926 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", 927 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", 928 | "dev": true, 929 | "dependencies": { 930 | "postcss-value-parser": "^4.0.0", 931 | "read-cache": "^1.0.0", 932 | "resolve": "^1.1.7" 933 | }, 934 | "engines": { 935 | "node": ">=14.0.0" 936 | }, 937 | "peerDependencies": { 938 | "postcss": "^8.0.0" 939 | } 940 | }, 941 | "node_modules/postcss-js": { 942 | "version": "4.0.1", 943 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 944 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 945 | "dev": true, 946 | "dependencies": { 947 | "camelcase-css": "^2.0.1" 948 | }, 949 | "engines": { 950 | "node": "^12 || ^14 || >= 16" 951 | }, 952 | "funding": { 953 | "type": "opencollective", 954 | "url": "https://opencollective.com/postcss/" 955 | }, 956 | "peerDependencies": { 957 | "postcss": "^8.4.21" 958 | } 959 | }, 960 | "node_modules/postcss-load-config": { 961 | "version": "4.0.2", 962 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 963 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 964 | "dev": true, 965 | "funding": [ 966 | { 967 | "type": "opencollective", 968 | "url": "https://opencollective.com/postcss/" 969 | }, 970 | { 971 | "type": "github", 972 | "url": "https://github.com/sponsors/ai" 973 | } 974 | ], 975 | "dependencies": { 976 | "lilconfig": "^3.0.0", 977 | "yaml": "^2.3.4" 978 | }, 979 | "engines": { 980 | "node": ">= 14" 981 | }, 982 | "peerDependencies": { 983 | "postcss": ">=8.0.9", 984 | "ts-node": ">=9.0.0" 985 | }, 986 | "peerDependenciesMeta": { 987 | "postcss": { 988 | "optional": true 989 | }, 990 | "ts-node": { 991 | "optional": true 992 | } 993 | } 994 | }, 995 | "node_modules/postcss-load-config/node_modules/lilconfig": { 996 | "version": "3.1.1", 997 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", 998 | "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", 999 | "dev": true, 1000 | "engines": { 1001 | "node": ">=14" 1002 | }, 1003 | "funding": { 1004 | "url": "https://github.com/sponsors/antonk52" 1005 | } 1006 | }, 1007 | "node_modules/postcss-nested": { 1008 | "version": "6.0.1", 1009 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", 1010 | "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", 1011 | "dev": true, 1012 | "dependencies": { 1013 | "postcss-selector-parser": "^6.0.11" 1014 | }, 1015 | "engines": { 1016 | "node": ">=12.0" 1017 | }, 1018 | "funding": { 1019 | "type": "opencollective", 1020 | "url": "https://opencollective.com/postcss/" 1021 | }, 1022 | "peerDependencies": { 1023 | "postcss": "^8.2.14" 1024 | } 1025 | }, 1026 | "node_modules/postcss-selector-parser": { 1027 | "version": "6.0.16", 1028 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", 1029 | "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", 1030 | "dev": true, 1031 | "dependencies": { 1032 | "cssesc": "^3.0.0", 1033 | "util-deprecate": "^1.0.2" 1034 | }, 1035 | "engines": { 1036 | "node": ">=4" 1037 | } 1038 | }, 1039 | "node_modules/postcss-value-parser": { 1040 | "version": "4.2.0", 1041 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1042 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1043 | "dev": true 1044 | }, 1045 | "node_modules/queue-microtask": { 1046 | "version": "1.2.3", 1047 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1048 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1049 | "dev": true, 1050 | "funding": [ 1051 | { 1052 | "type": "github", 1053 | "url": "https://github.com/sponsors/feross" 1054 | }, 1055 | { 1056 | "type": "patreon", 1057 | "url": "https://www.patreon.com/feross" 1058 | }, 1059 | { 1060 | "type": "consulting", 1061 | "url": "https://feross.org/support" 1062 | } 1063 | ] 1064 | }, 1065 | "node_modules/read-cache": { 1066 | "version": "1.0.0", 1067 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 1068 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 1069 | "dev": true, 1070 | "dependencies": { 1071 | "pify": "^2.3.0" 1072 | } 1073 | }, 1074 | "node_modules/readdirp": { 1075 | "version": "3.6.0", 1076 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1077 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1078 | "dependencies": { 1079 | "picomatch": "^2.2.1" 1080 | }, 1081 | "engines": { 1082 | "node": ">=8.10.0" 1083 | } 1084 | }, 1085 | "node_modules/resolve": { 1086 | "version": "1.22.8", 1087 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1088 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1089 | "dev": true, 1090 | "dependencies": { 1091 | "is-core-module": "^2.13.0", 1092 | "path-parse": "^1.0.7", 1093 | "supports-preserve-symlinks-flag": "^1.0.0" 1094 | }, 1095 | "bin": { 1096 | "resolve": "bin/resolve" 1097 | }, 1098 | "funding": { 1099 | "url": "https://github.com/sponsors/ljharb" 1100 | } 1101 | }, 1102 | "node_modules/reusify": { 1103 | "version": "1.0.4", 1104 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1105 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1106 | "dev": true, 1107 | "engines": { 1108 | "iojs": ">=1.0.0", 1109 | "node": ">=0.10.0" 1110 | } 1111 | }, 1112 | "node_modules/run-parallel": { 1113 | "version": "1.2.0", 1114 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1115 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1116 | "dev": true, 1117 | "funding": [ 1118 | { 1119 | "type": "github", 1120 | "url": "https://github.com/sponsors/feross" 1121 | }, 1122 | { 1123 | "type": "patreon", 1124 | "url": "https://www.patreon.com/feross" 1125 | }, 1126 | { 1127 | "type": "consulting", 1128 | "url": "https://feross.org/support" 1129 | } 1130 | ], 1131 | "dependencies": { 1132 | "queue-microtask": "^1.2.2" 1133 | } 1134 | }, 1135 | "node_modules/sass": { 1136 | "version": "1.72.0", 1137 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", 1138 | "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", 1139 | "dependencies": { 1140 | "chokidar": ">=3.0.0 <4.0.0", 1141 | "immutable": "^4.0.0", 1142 | "source-map-js": ">=0.6.2 <2.0.0" 1143 | }, 1144 | "bin": { 1145 | "sass": "sass.js" 1146 | }, 1147 | "engines": { 1148 | "node": ">=14.0.0" 1149 | } 1150 | }, 1151 | "node_modules/shebang-command": { 1152 | "version": "2.0.0", 1153 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1154 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1155 | "dev": true, 1156 | "dependencies": { 1157 | "shebang-regex": "^3.0.0" 1158 | }, 1159 | "engines": { 1160 | "node": ">=8" 1161 | } 1162 | }, 1163 | "node_modules/shebang-regex": { 1164 | "version": "3.0.0", 1165 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1166 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1167 | "dev": true, 1168 | "engines": { 1169 | "node": ">=8" 1170 | } 1171 | }, 1172 | "node_modules/signal-exit": { 1173 | "version": "4.1.0", 1174 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1175 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1176 | "dev": true, 1177 | "engines": { 1178 | "node": ">=14" 1179 | }, 1180 | "funding": { 1181 | "url": "https://github.com/sponsors/isaacs" 1182 | } 1183 | }, 1184 | "node_modules/source-map-js": { 1185 | "version": "1.2.0", 1186 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 1187 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 1188 | "engines": { 1189 | "node": ">=0.10.0" 1190 | } 1191 | }, 1192 | "node_modules/string-width": { 1193 | "version": "5.1.2", 1194 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1195 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1196 | "dev": true, 1197 | "dependencies": { 1198 | "eastasianwidth": "^0.2.0", 1199 | "emoji-regex": "^9.2.2", 1200 | "strip-ansi": "^7.0.1" 1201 | }, 1202 | "engines": { 1203 | "node": ">=12" 1204 | }, 1205 | "funding": { 1206 | "url": "https://github.com/sponsors/sindresorhus" 1207 | } 1208 | }, 1209 | "node_modules/string-width-cjs": { 1210 | "name": "string-width", 1211 | "version": "4.2.3", 1212 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1213 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1214 | "dev": true, 1215 | "dependencies": { 1216 | "emoji-regex": "^8.0.0", 1217 | "is-fullwidth-code-point": "^3.0.0", 1218 | "strip-ansi": "^6.0.1" 1219 | }, 1220 | "engines": { 1221 | "node": ">=8" 1222 | } 1223 | }, 1224 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1225 | "version": "5.0.1", 1226 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1227 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1228 | "dev": true, 1229 | "engines": { 1230 | "node": ">=8" 1231 | } 1232 | }, 1233 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1234 | "version": "8.0.0", 1235 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1236 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1237 | "dev": true 1238 | }, 1239 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1240 | "version": "6.0.1", 1241 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1242 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1243 | "dev": true, 1244 | "dependencies": { 1245 | "ansi-regex": "^5.0.1" 1246 | }, 1247 | "engines": { 1248 | "node": ">=8" 1249 | } 1250 | }, 1251 | "node_modules/strip-ansi": { 1252 | "version": "7.1.0", 1253 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1254 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1255 | "dev": true, 1256 | "dependencies": { 1257 | "ansi-regex": "^6.0.1" 1258 | }, 1259 | "engines": { 1260 | "node": ">=12" 1261 | }, 1262 | "funding": { 1263 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1264 | } 1265 | }, 1266 | "node_modules/strip-ansi-cjs": { 1267 | "name": "strip-ansi", 1268 | "version": "6.0.1", 1269 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1270 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1271 | "dev": true, 1272 | "dependencies": { 1273 | "ansi-regex": "^5.0.1" 1274 | }, 1275 | "engines": { 1276 | "node": ">=8" 1277 | } 1278 | }, 1279 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1280 | "version": "5.0.1", 1281 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1282 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1283 | "dev": true, 1284 | "engines": { 1285 | "node": ">=8" 1286 | } 1287 | }, 1288 | "node_modules/sucrase": { 1289 | "version": "3.35.0", 1290 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 1291 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 1292 | "dev": true, 1293 | "dependencies": { 1294 | "@jridgewell/gen-mapping": "^0.3.2", 1295 | "commander": "^4.0.0", 1296 | "glob": "^10.3.10", 1297 | "lines-and-columns": "^1.1.6", 1298 | "mz": "^2.7.0", 1299 | "pirates": "^4.0.1", 1300 | "ts-interface-checker": "^0.1.9" 1301 | }, 1302 | "bin": { 1303 | "sucrase": "bin/sucrase", 1304 | "sucrase-node": "bin/sucrase-node" 1305 | }, 1306 | "engines": { 1307 | "node": ">=16 || 14 >=14.17" 1308 | } 1309 | }, 1310 | "node_modules/supports-preserve-symlinks-flag": { 1311 | "version": "1.0.0", 1312 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1313 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1314 | "dev": true, 1315 | "engines": { 1316 | "node": ">= 0.4" 1317 | }, 1318 | "funding": { 1319 | "url": "https://github.com/sponsors/ljharb" 1320 | } 1321 | }, 1322 | "node_modules/tailwindcss": { 1323 | "version": "3.4.1", 1324 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", 1325 | "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", 1326 | "dev": true, 1327 | "dependencies": { 1328 | "@alloc/quick-lru": "^5.2.0", 1329 | "arg": "^5.0.2", 1330 | "chokidar": "^3.5.3", 1331 | "didyoumean": "^1.2.2", 1332 | "dlv": "^1.1.3", 1333 | "fast-glob": "^3.3.0", 1334 | "glob-parent": "^6.0.2", 1335 | "is-glob": "^4.0.3", 1336 | "jiti": "^1.19.1", 1337 | "lilconfig": "^2.1.0", 1338 | "micromatch": "^4.0.5", 1339 | "normalize-path": "^3.0.0", 1340 | "object-hash": "^3.0.0", 1341 | "picocolors": "^1.0.0", 1342 | "postcss": "^8.4.23", 1343 | "postcss-import": "^15.1.0", 1344 | "postcss-js": "^4.0.1", 1345 | "postcss-load-config": "^4.0.1", 1346 | "postcss-nested": "^6.0.1", 1347 | "postcss-selector-parser": "^6.0.11", 1348 | "resolve": "^1.22.2", 1349 | "sucrase": "^3.32.0" 1350 | }, 1351 | "bin": { 1352 | "tailwind": "lib/cli.js", 1353 | "tailwindcss": "lib/cli.js" 1354 | }, 1355 | "engines": { 1356 | "node": ">=14.0.0" 1357 | } 1358 | }, 1359 | "node_modules/thenify": { 1360 | "version": "3.3.1", 1361 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 1362 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 1363 | "dev": true, 1364 | "dependencies": { 1365 | "any-promise": "^1.0.0" 1366 | } 1367 | }, 1368 | "node_modules/thenify-all": { 1369 | "version": "1.6.0", 1370 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 1371 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 1372 | "dev": true, 1373 | "dependencies": { 1374 | "thenify": ">= 3.1.0 < 4" 1375 | }, 1376 | "engines": { 1377 | "node": ">=0.8" 1378 | } 1379 | }, 1380 | "node_modules/to-regex-range": { 1381 | "version": "5.0.1", 1382 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1383 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1384 | "dependencies": { 1385 | "is-number": "^7.0.0" 1386 | }, 1387 | "engines": { 1388 | "node": ">=8.0" 1389 | } 1390 | }, 1391 | "node_modules/ts-interface-checker": { 1392 | "version": "0.1.13", 1393 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 1394 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 1395 | "dev": true 1396 | }, 1397 | "node_modules/typescript": { 1398 | "version": "5.4.3", 1399 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", 1400 | "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", 1401 | "dev": true, 1402 | "bin": { 1403 | "tsc": "bin/tsc", 1404 | "tsserver": "bin/tsserver" 1405 | }, 1406 | "engines": { 1407 | "node": ">=14.17" 1408 | } 1409 | }, 1410 | "node_modules/update-browserslist-db": { 1411 | "version": "1.0.13", 1412 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", 1413 | "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", 1414 | "dev": true, 1415 | "funding": [ 1416 | { 1417 | "type": "opencollective", 1418 | "url": "https://opencollective.com/browserslist" 1419 | }, 1420 | { 1421 | "type": "tidelift", 1422 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1423 | }, 1424 | { 1425 | "type": "github", 1426 | "url": "https://github.com/sponsors/ai" 1427 | } 1428 | ], 1429 | "dependencies": { 1430 | "escalade": "^3.1.1", 1431 | "picocolors": "^1.0.0" 1432 | }, 1433 | "bin": { 1434 | "update-browserslist-db": "cli.js" 1435 | }, 1436 | "peerDependencies": { 1437 | "browserslist": ">= 4.21.0" 1438 | } 1439 | }, 1440 | "node_modules/util-deprecate": { 1441 | "version": "1.0.2", 1442 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1443 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1444 | "dev": true 1445 | }, 1446 | "node_modules/which": { 1447 | "version": "2.0.2", 1448 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1449 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1450 | "dev": true, 1451 | "dependencies": { 1452 | "isexe": "^2.0.0" 1453 | }, 1454 | "bin": { 1455 | "node-which": "bin/node-which" 1456 | }, 1457 | "engines": { 1458 | "node": ">= 8" 1459 | } 1460 | }, 1461 | "node_modules/wrap-ansi": { 1462 | "version": "8.1.0", 1463 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1464 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1465 | "dev": true, 1466 | "dependencies": { 1467 | "ansi-styles": "^6.1.0", 1468 | "string-width": "^5.0.1", 1469 | "strip-ansi": "^7.0.1" 1470 | }, 1471 | "engines": { 1472 | "node": ">=12" 1473 | }, 1474 | "funding": { 1475 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1476 | } 1477 | }, 1478 | "node_modules/wrap-ansi-cjs": { 1479 | "name": "wrap-ansi", 1480 | "version": "7.0.0", 1481 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1482 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1483 | "dev": true, 1484 | "dependencies": { 1485 | "ansi-styles": "^4.0.0", 1486 | "string-width": "^4.1.0", 1487 | "strip-ansi": "^6.0.0" 1488 | }, 1489 | "engines": { 1490 | "node": ">=10" 1491 | }, 1492 | "funding": { 1493 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1494 | } 1495 | }, 1496 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 1497 | "version": "5.0.1", 1498 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1499 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1500 | "dev": true, 1501 | "engines": { 1502 | "node": ">=8" 1503 | } 1504 | }, 1505 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 1506 | "version": "4.3.0", 1507 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1508 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1509 | "dev": true, 1510 | "dependencies": { 1511 | "color-convert": "^2.0.1" 1512 | }, 1513 | "engines": { 1514 | "node": ">=8" 1515 | }, 1516 | "funding": { 1517 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1518 | } 1519 | }, 1520 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 1521 | "version": "8.0.0", 1522 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1523 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1524 | "dev": true 1525 | }, 1526 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 1527 | "version": "4.2.3", 1528 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1529 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1530 | "dev": true, 1531 | "dependencies": { 1532 | "emoji-regex": "^8.0.0", 1533 | "is-fullwidth-code-point": "^3.0.0", 1534 | "strip-ansi": "^6.0.1" 1535 | }, 1536 | "engines": { 1537 | "node": ">=8" 1538 | } 1539 | }, 1540 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 1541 | "version": "6.0.1", 1542 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1543 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1544 | "dev": true, 1545 | "dependencies": { 1546 | "ansi-regex": "^5.0.1" 1547 | }, 1548 | "engines": { 1549 | "node": ">=8" 1550 | } 1551 | }, 1552 | "node_modules/yaml": { 1553 | "version": "2.4.1", 1554 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", 1555 | "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", 1556 | "dev": true, 1557 | "bin": { 1558 | "yaml": "bin.mjs" 1559 | }, 1560 | "engines": { 1561 | "node": ">= 14" 1562 | } 1563 | } 1564 | } 1565 | } 1566 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "autoprefixer": "^10.4.19", 4 | "postcss": "^8.4.38", 5 | "tailwindcss": "^3.4.1", 6 | "typescript": "^5.4.3" 7 | }, 8 | "scripts": { 9 | "dev": "tailwindcss -i ./docs/css/input.css -o ./docs/css/style.css --watch", 10 | "tsc": "tsc --watch", 11 | "sass": "sass --watch ./docs/css/input.scss ./docs/css/input.css" 12 | }, 13 | "dependencies": { 14 | "sass": "^1.72.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | } 6 | } -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ["./docs/**/*.{html, ts}"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [], 8 | } 9 | 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "ES6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "ES6", /* Specify what module code is generated. */ 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 39 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 40 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 41 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 42 | // "resolveJsonModule": true, /* Enable importing .json files. */ 43 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 44 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 45 | 46 | /* JavaScript Support */ 47 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 48 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 49 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 50 | 51 | /* Emit */ 52 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 53 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 54 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 55 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 56 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 57 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 58 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 59 | // "removeComments": true, /* Disable emitting comments. */ 60 | // "noEmit": true, /* Disable emitting files from a compilation. */ 61 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 62 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 63 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 64 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 65 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 66 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 67 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 68 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 69 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 70 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 71 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 72 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 73 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 74 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 75 | 76 | /* Interop Constraints */ 77 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 78 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 79 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 80 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 81 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 82 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 83 | 84 | /* Type Checking */ 85 | "strict": true, /* Enable all strict type-checking options. */ 86 | "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 87 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 88 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 89 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 90 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 91 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 92 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 93 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 94 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 95 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 96 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 97 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 98 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 99 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 100 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 101 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 102 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 103 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 104 | 105 | /* Completeness */ 106 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 107 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 108 | } 109 | } 110 | --------------------------------------------------------------------------------