├── .DS_Store ├── 01-Baby-Name-Generator ├── .DS_Store ├── .gitignore ├── README.md ├── app.vue ├── components │ ├── Card │ │ └── Name.vue │ └── Option.vue ├── data.ts ├── nuxt.config.ts ├── package-lock.json ├── package.json └── tsconfig.json ├── 02-Top-Restaurants ├── .gitignore ├── README.md ├── boilerplate.vue ├── components │ ├── Nav.vue │ └── restaurant │ │ ├── Ad.vue │ │ ├── Row.vue │ │ └── Table.vue ├── data.json ├── layouts │ ├── custom.vue │ ├── default.vue │ └── error.vue ├── nuxt.config.ts ├── package-lock.json ├── package.json ├── pages │ ├── 404.vue │ ├── index.vue │ └── restaurants │ │ ├── [name].vue │ │ └── index.vue └── tsconfig.json ├── 03-DarkMode ├── .gitignore ├── README.md ├── app.vue ├── components │ ├── Card.vue │ ├── Cards.vue │ ├── Heading.vue │ └── Nav.vue ├── composables │ └── useDarkMode.ts ├── nuxt.config.ts ├── package-lock.json ├── package.json └── tsconfig.json ├── 04-WeatherApp ├── .gitignore ├── README.md ├── app.vue ├── assets │ └── css │ │ └── tailwind.css ├── nuxt.config.ts ├── package-lock.json ├── package.json ├── tailwind.config.js └── tsconfig.json ├── 05-TodoApp ├── .gitignore ├── README.md ├── app.vue ├── composables │ └── useTodos.ts ├── nuxt.config.ts ├── package-lock.json ├── package.json ├── server │ ├── api │ │ └── todo │ │ │ ├── [id].ts │ │ │ └── index.ts │ └── db │ │ └── index.ts └── tsconfig.json └── 06-NotesApp ├── .gitignore ├── README.md ├── components ├── Auth │ └── Card.vue └── Nav.vue ├── composables ├── useAuth.ts └── useSupabase.ts ├── layouts └── default.vue ├── nuxt.config.ts ├── package-lock.json ├── package.json ├── pages ├── index.vue └── myprofile.vue └── tsconfig.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harblaith7/Nuxt3-Course-Udemy/5b33e070ca11582a87f1fcd781cbb59596a02c79/.DS_Store -------------------------------------------------------------------------------- /01-Baby-Name-Generator/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harblaith7/Nuxt3-Course-Udemy/5b33e070ca11582a87f1fcd781cbb59596a02c79/01-Baby-Name-Generator/.DS_Store -------------------------------------------------------------------------------- /01-Baby-Name-Generator/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .nuxt 4 | nuxt.d.ts 5 | .output 6 | .env -------------------------------------------------------------------------------- /01-Baby-Name-Generator/README.md: -------------------------------------------------------------------------------- 1 | # Nuxt 3 Minimal Starter 2 | 3 | We recommend to look at the [documentation](https://v3.nuxtjs.org). 4 | 5 | ## Setup 6 | 7 | Make sure to install the dependencies 8 | 9 | ```bash 10 | yarn install 11 | ``` 12 | 13 | ## Development 14 | 15 | Start the development server on http://localhost:3000 16 | 17 | ```bash 18 | yarn dev 19 | ``` 20 | 21 | ## Production 22 | 23 | Build the application for production: 24 | 25 | ```bash 26 | yarn build 27 | ``` 28 | 29 | Checkout the [deployment documentation](https://v3.nuxtjs.org/docs/deployment). -------------------------------------------------------------------------------- /01-Baby-Name-Generator/app.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 79 | 80 | 119 | -------------------------------------------------------------------------------- /01-Baby-Name-Generator/components/Card/Name.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 21 | 22 | 42 | -------------------------------------------------------------------------------- /01-Baby-Name-Generator/components/Option.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 51 | 52 | 82 | -------------------------------------------------------------------------------- /01-Baby-Name-Generator/data.ts: -------------------------------------------------------------------------------- 1 | interface Name { 2 | id: number; 3 | name: string; 4 | gender: Gender; 5 | popularity: Popularity; 6 | length: Length; 7 | } 8 | 9 | export enum Gender { 10 | GIRL = "Girl", 11 | BOY = "Boy", 12 | UNISEX = "Unisex", 13 | } 14 | 15 | export enum Popularity { 16 | TRENDY = "Trendy", 17 | UNIQUE = "Unique", 18 | } 19 | 20 | export enum Length { 21 | SHORT = "Short", 22 | LONG = "Long", 23 | ALL = "All", 24 | } 25 | export const names: Name[] = [ 26 | { 27 | id: 1, 28 | name: "Laith", 29 | gender: Gender.BOY, 30 | popularity: Popularity.UNIQUE, 31 | length: Length.SHORT, 32 | }, 33 | { 34 | id: 2, 35 | name: "Jake", 36 | gender: Gender.BOY, 37 | popularity: Popularity.TRENDY, 38 | length: Length.SHORT, 39 | }, 40 | { 41 | id: 3, 42 | name: "Lamelo", 43 | gender: Gender.BOY, 44 | popularity: Popularity.UNIQUE, 45 | length: Length.SHORT, 46 | }, 47 | { 48 | id: 4, 49 | name: "Abraham", 50 | gender: Gender.BOY, 51 | popularity: Popularity.TRENDY, 52 | length: Length.LONG, 53 | }, 54 | { 55 | id: 5, 56 | name: "Bartholomew", 57 | gender: Gender.BOY, 58 | popularity: Popularity.UNIQUE, 59 | length: Length.LONG, 60 | }, 61 | { 62 | id: 6, 63 | name: "Noah", 64 | gender: Gender.BOY, 65 | popularity: Popularity.TRENDY, 66 | length: Length.SHORT, 67 | }, 68 | { 69 | id: 7, 70 | name: "Benjamin", 71 | gender: Gender.BOY, 72 | popularity: Popularity.TRENDY, 73 | length: Length.LONG, 74 | }, 75 | { 76 | id: 8, 77 | name: "William", 78 | gender: Gender.BOY, 79 | popularity: Popularity.TRENDY, 80 | length: Length.LONG, 81 | }, 82 | { 83 | id: 9, 84 | name: "Lucus", 85 | gender: Gender.BOY, 86 | popularity: Popularity.TRENDY, 87 | length: Length.SHORT, 88 | }, 89 | { 90 | id: 10, 91 | name: "Harrison", 92 | gender: Gender.BOY, 93 | popularity: Popularity.UNIQUE, 94 | length: Length.LONG, 95 | }, 96 | { 97 | id: 11, 98 | name: "Selma", 99 | gender: Gender.BOY, 100 | popularity: Popularity.UNIQUE, 101 | length: Length.SHORT, 102 | }, 103 | { 104 | id: 12, 105 | name: "Asher", 106 | gender: Gender.BOY, 107 | popularity: Popularity.UNIQUE, 108 | length: Length.SHORT, 109 | }, 110 | { 111 | id: 13, 112 | name: "Tucker", 113 | gender: Gender.BOY, 114 | popularity: Popularity.TRENDY, 115 | length: Length.SHORT, 116 | }, 117 | 118 | { 119 | id: 14, 120 | name: "Arya", 121 | gender: Gender.GIRL, 122 | popularity: Popularity.UNIQUE, 123 | length: Length.SHORT, 124 | }, 125 | { 126 | id: 15, 127 | name: "Olivia", 128 | gender: Gender.GIRL, 129 | popularity: Popularity.TRENDY, 130 | length: Length.SHORT, 131 | }, 132 | { 133 | id: 16, 134 | name: "Fay", 135 | gender: Gender.GIRL, 136 | popularity: Popularity.UNIQUE, 137 | length: Length.SHORT, 138 | }, 139 | { 140 | id: 17, 141 | name: "Brooklyn", 142 | gender: Gender.GIRL, 143 | popularity: Popularity.TRENDY, 144 | length: Length.LONG, 145 | }, 146 | { 147 | id: 18, 148 | name: "Genevieve", 149 | gender: Gender.GIRL, 150 | popularity: Popularity.UNIQUE, 151 | length: Length.LONG, 152 | }, 153 | { 154 | id: 19, 155 | name: "Zoe", 156 | gender: Gender.GIRL, 157 | popularity: Popularity.TRENDY, 158 | length: Length.SHORT, 159 | }, 160 | { 161 | id: 20, 162 | name: "Valentina", 163 | gender: Gender.GIRL, 164 | popularity: Popularity.TRENDY, 165 | length: Length.LONG, 166 | }, 167 | { 168 | id: 21, 169 | name: "Josephine", 170 | gender: Gender.GIRL, 171 | popularity: Popularity.TRENDY, 172 | length: Length.LONG, 173 | }, 174 | { 175 | id: 22, 176 | name: "Maya", 177 | gender: Gender.GIRL, 178 | popularity: Popularity.TRENDY, 179 | length: Length.SHORT, 180 | }, 181 | { 182 | id: 23, 183 | name: "Everleigh", 184 | gender: Gender.GIRL, 185 | popularity: Popularity.UNIQUE, 186 | length: Length.LONG, 187 | }, 188 | { 189 | id: 24, 190 | name: "Poppy", 191 | gender: Gender.GIRL, 192 | popularity: Popularity.UNIQUE, 193 | length: Length.SHORT, 194 | }, 195 | { 196 | id: 25, 197 | name: "Maia", 198 | gender: Gender.GIRL, 199 | popularity: Popularity.UNIQUE, 200 | length: Length.SHORT, 201 | }, 202 | { 203 | id: 26, 204 | name: "Ivy", 205 | gender: Gender.GIRL, 206 | popularity: Popularity.TRENDY, 207 | length: Length.SHORT, 208 | }, 209 | 210 | { 211 | id: 27, 212 | name: "Jude", 213 | gender: Gender.UNISEX, 214 | popularity: Popularity.UNIQUE, 215 | length: Length.SHORT, 216 | }, 217 | { 218 | id: 28, 219 | name: "Adrian", 220 | gender: Gender.UNISEX, 221 | popularity: Popularity.TRENDY, 222 | length: Length.SHORT, 223 | }, 224 | { 225 | id: 29, 226 | name: "Sunny", 227 | gender: Gender.UNISEX, 228 | popularity: Popularity.UNIQUE, 229 | length: Length.SHORT, 230 | }, 231 | { 232 | id: 30, 233 | name: "Channing", 234 | gender: Gender.UNISEX, 235 | popularity: Popularity.TRENDY, 236 | length: Length.LONG, 237 | }, 238 | { 239 | id: 31, 240 | name: "Tennessee", 241 | gender: Gender.UNISEX, 242 | popularity: Popularity.UNIQUE, 243 | length: Length.LONG, 244 | }, 245 | { 246 | id: 32, 247 | name: "Dallas", 248 | gender: Gender.UNISEX, 249 | popularity: Popularity.TRENDY, 250 | length: Length.SHORT, 251 | }, 252 | 253 | { 254 | id: 33, 255 | name: "Zephyr", 256 | gender: Gender.UNISEX, 257 | popularity: Popularity.UNIQUE, 258 | length: Length.LONG, 259 | }, 260 | 261 | { 262 | id: 34, 263 | name: "Teri", 264 | gender: Gender.UNISEX, 265 | popularity: Popularity.TRENDY, 266 | length: Length.SHORT, 267 | }, 268 | ]; 269 | -------------------------------------------------------------------------------- /01-Baby-Name-Generator/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | import { defineNuxtConfig } from 'nuxt3' 2 | 3 | // https://v3.nuxtjs.org/docs/directory-structure/nuxt.config 4 | export default defineNuxtConfig({ 5 | 6 | }) 7 | -------------------------------------------------------------------------------- /01-Baby-Name-Generator/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "nuxi dev", 5 | "build": "nuxi build", 6 | "start": "node .output/server/index.mjs" 7 | }, 8 | "devDependencies": { 9 | "nuxt3": "latest" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /01-Baby-Name-Generator/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://v3.nuxtjs.org/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /02-Top-Restaurants/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .nuxt 4 | nuxt.d.ts 5 | .output 6 | .env -------------------------------------------------------------------------------- /02-Top-Restaurants/README.md: -------------------------------------------------------------------------------- 1 | # Nuxt 3 Minimal Starter 2 | 3 | We recommend to look at the [documentation](https://v3.nuxtjs.org). 4 | 5 | ## Setup 6 | 7 | Make sure to install the dependencies 8 | 9 | ```bash 10 | yarn install 11 | ``` 12 | 13 | ## Development 14 | 15 | Start the development server on http://localhost:3000 16 | 17 | ```bash 18 | yarn dev 19 | ``` 20 | 21 | ## Production 22 | 23 | Build the application for production: 24 | 25 | ```bash 26 | yarn build 27 | ``` 28 | 29 | Checkout the [deployment documentation](https://v3.nuxtjs.org/docs/deployment). -------------------------------------------------------------------------------- /02-Top-Restaurants/boilerplate.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 26 | 27 | 75 | -------------------------------------------------------------------------------- /02-Top-Restaurants/components/Nav.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 32 | -------------------------------------------------------------------------------- /02-Top-Restaurants/components/restaurant/Ad.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /02-Top-Restaurants/components/restaurant/Row.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 28 | 29 | 54 | -------------------------------------------------------------------------------- /02-Top-Restaurants/components/restaurant/Table.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 37 | 38 | 53 | -------------------------------------------------------------------------------- /02-Top-Restaurants/data.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "rank": 1, 5 | "name": "McDonalds", 6 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 7 | "revenue": 42.4, 8 | "numberOfStores": "39,222", 9 | "imageUrl": "https://images.unsplash.com/photo-1602400236316-f5e3b6d2314c?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=5070&q=80" 10 | }, 11 | { 12 | "id": 2, 13 | "rank": 2, 14 | "name": "Starbucks", 15 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 16 | "revenue": 26.5, 17 | "numberOfStores": "33,295", 18 | "imageUrl": "https://images.unsplash.com/photo-1592321675774-3de57f3ee0dc?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MTV8fHN0YXJidWNrc3xlbnwwfHwwfHw%3D&auto=format&fit=crop&w=800&q=60" 19 | }, 20 | { 21 | "id": 3, 22 | "rank": 3, 23 | "name": "Chick-fil-A", 24 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 25 | "revenue": 4.3, 26 | "numberOfStores": "2,774", 27 | "imageUrl": "https://images.unsplash.com/photo-1558883188-817ab9ecf395?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MXx8Q2hpY2slMjBmaWwlMjBBfGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=800&q=60" 28 | }, 29 | { 30 | "id": 4, 31 | "rank": 4, 32 | "name": "Taco Bell", 33 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 34 | "revenue": 4.22, 35 | "numberOfStores": "7,072", 36 | "imageUrl": "https://www.tacobell.ca/static/images/homepage/bottom-right-mobile.ce18cb836e49.jpg" 37 | }, 38 | { 39 | "id": 5, 40 | "rank": 5, 41 | "name": "Wendy's", 42 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 43 | "revenue": 4.01, 44 | "numberOfStores": "6,534", 45 | "imageUrl": "https://ichef.bbci.co.uk/news/976/cpsprodpb/7A97/production/_118438313_wendys.jpg" 46 | }, 47 | { 48 | "id": 6, 49 | "rank": 6, 50 | "name": "Burger King", 51 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 52 | "revenue": 3.97, 53 | "numberOfStores": "6,933", 54 | "imageUrl": "https://image.cnbcfm.com/api/v1/image/106936180-1630511993739-gettyimages-1234486065-PWeaver-Milton-210804-04.jpeg?v=1630512088" 55 | }, 56 | { 57 | "id": 7, 58 | "rank": 7, 59 | "name": "Dunkin'", 60 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 61 | "revenue": 3.95, 62 | "numberOfStores": "8,522", 63 | "imageUrl": "https://www.boston.com/wp-content/uploads/2021/11/Dunkin-holiday-drinks-61815ecc2952c.jpg" 64 | }, 65 | { 66 | "id": 8, 67 | "rank": 8, 68 | "name": "Subway", 69 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 70 | "revenue": 16.4, 71 | "numberOfStores": "37,343", 72 | "imageUrl": "https://cdn.britannica.com/08/193908-050-66767D57/view-Subway-restaurant-Bangkok-Thailand.jpg" 73 | }, 74 | { 75 | "id": 9, 76 | "rank": 9, 77 | "name": "Domino's", 78 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 79 | "revenue": 42.4, 80 | "numberOfStores": "12,333", 81 | "imageUrl": "https://media-cdn.tripadvisor.com/media/photo-s/12/fe/c3/86/domino-s-pizza.jpg" 82 | }, 83 | { 84 | "id": 10, 85 | "rank": 10, 86 | "name": "Chipotle Mexican Grill", 87 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 88 | "revenue": 14.4, 89 | "numberOfStores": "2,333", 90 | "imageUrl": "https://www.investopedia.com/thmb/2sLc9U9RNVeFblgbDxh_uL1tnC4=/680x440/filters:fill(auto,1)/shutterstock_186861896-5bfc33c646e0fb00517d7538.jpg" 91 | }, 92 | { 93 | "id": 11, 94 | "rank": 11, 95 | "name": "Sonic Drive-In", 96 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 97 | "revenue": 4.7, 98 | "numberOfStores": "3.563", 99 | "imageUrl": "https://www.qsrmagazine.com/sites/default/files/styles/story_page/public/2020-07/SonicEXT.jpg?itok=X6-nYuXg" 100 | }, 101 | { 102 | "id": 12, 103 | "rank": 12, 104 | "name": "Pizza Hut", 105 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 106 | "revenue": 1.04, 107 | "numberOfStores": "18,435", 108 | "imageUrl": "https://www.ottawabusinessjournal.com/wp-content/uploads/2019/07/e5e17083-273e-40f5-91cf-63a5ca339e99-ea3557c8-71a1-48e8-967f-4c166054baab-pizza-image_no-text.jpg" 109 | }, 110 | { 111 | "id": 13, 112 | "rank": 13, 113 | "name": "Panera Bread", 114 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 115 | "revenue": 2.8, 116 | "numberOfStores": "2,333", 117 | "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQAONmid71xguDSR8lHs4QWYNjsauHfYgBTEQ&usqp=CAU" 118 | }, 119 | { 120 | "id": 14, 121 | "rank": 14, 122 | "name": "KFC", 123 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 124 | "revenue": 28.5, 125 | "numberOfStores": "24,536", 126 | "imageUrl": "https://www.tasteofhome.com/wp-content/uploads/2020/03/kfc-sign-GettyImages-921240630.jpg" 127 | }, 128 | { 129 | "id": 15, 130 | "rank": 15, 131 | "name": "Popeyes Louisiana Kitchen", 132 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 133 | "revenue": 42.4, 134 | "numberOfStores": "12,333", 135 | "imageUrl": "https://www.godairyfree.org/wp-content/uploads/2009/12/fast-food-popeyes.jpg" 136 | }, 137 | { 138 | "id": 16, 139 | "rank": 16, 140 | "name": "Arby's", 141 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 142 | "revenue": 42.4, 143 | "numberOfStores": "12,333", 144 | "imageUrl": "https://media-exp1.licdn.com/dms/image/C561BAQFOQyq-un_zNw/company-background_10000/0/1519796443509?e=2159024400&v=beta&t=0Olg06sblnfDhRfh8DRNvGDJFxZrO2072lkQHhvV5N8" 145 | }, 146 | { 147 | "id": 17, 148 | "rank": 17, 149 | "name": "Dairy Queen", 150 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 151 | "revenue": 42.4, 152 | "numberOfStores": "12,333", 153 | "imageUrl": "https://www.qsrmagazine.com/sites/default/files/styles/story_page/public/story/blizzard-incentives.jpg?itok=9R-RrxC9" 154 | }, 155 | { 156 | "id": 18, 157 | "rank": 18, 158 | "name": "Little Caesars", 159 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 160 | "revenue": 42.4, 161 | "numberOfStores": "12,333", 162 | "imageUrl": "https://www.masslive.com/resizer/M1NIHyzJjJdMcvw_LZt7jSwXFc8=/1280x0/smart/cloudfront-us-east-1.images.arcpublishing.com/advancelocal/2JI5P5VPDBEQNJR5CAYRC5VCMU.jpg" 163 | }, 164 | { 165 | "id": 19, 166 | "rank": 19, 167 | "name": "Panda Express", 168 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 169 | "revenue": 42.4, 170 | "numberOfStores": "12,333", 171 | "imageUrl": "https://www.seriouseats.com/thmb/n1EmSyrh7pEal-eSsXEYzuKyDqg=/1500x844/smart/filters:no_upscale()/__opt__aboutcom__coeus__resources__content_migration__serious_eats__seriouseats.com__images__2014__05__20140514-panda-express-sign-2e429c96c13746fb8d648e1b8eca9c80.jpg" 172 | }, 173 | { 174 | "id": 20, 175 | "rank": 20, 176 | "name": "Jack in the Box", 177 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 178 | "revenue": 42.4, 179 | "numberOfStores": "12,333", 180 | "imageUrl": "https://www.qsrmagazine.com/sites/default/files/styles/story_page/public/story/jack-box-expects-product-innovation-drive-growth.jpg?itok=tj3dRL1G" 181 | }, 182 | { 183 | "id": 21, 184 | "rank": 21, 185 | "name": "Olive Garden", 186 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 187 | "revenue": 42.4, 188 | "numberOfStores": "12,333", 189 | "imageUrl": "https://media.olivegarden.com/en_us/images/marketing/olive-garden-tuscan-italian-restaurant-g5-rdv.jpg" 190 | }, 191 | { 192 | "id": 22, 193 | "rank": 22, 194 | "name": "Papa John's", 195 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 196 | "revenue": 42.4, 197 | "numberOfStores": "12,333", 198 | "imageUrl": "https://fox59.com/wp-content/uploads/sites/21/2021/11/PapaJOhnsGettyImages-1044350104.jpg?w=1280" 199 | }, 200 | { 201 | "id": 23, 202 | "rank": 23, 203 | "name": "Buffalo Wild Wings", 204 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 205 | "revenue": 42.4, 206 | "numberOfStores": "12,333", 207 | "imageUrl": "https://www.mashed.com/img/gallery/scandals-that-buffalo-wild-wings-can-never-live-down/intro-1602864744.jpg" 208 | }, 209 | { 210 | "id": 24, 211 | "rank": 24, 212 | "name": "Applebee's", 213 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 214 | "revenue": 42.4, 215 | "numberOfStores": "12,333", 216 | "imageUrl": "https://www.nrn.com/sites/nrn.com/files/applebees-storefront.png" 217 | }, 218 | { 219 | "id": 25, 220 | "rank": 25, 221 | "name": "Chili's Grill & Bar", 222 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 223 | "revenue": 42.4, 224 | "numberOfStores": "12,333", 225 | "imageUrl": "https://media-cdn.tripadvisor.com/media/photo-s/06/a4/b9/e7/chili-s-grill-bar.jpg" 226 | }, 227 | { 228 | "id": 26, 229 | "rank": 26, 230 | "name": "Whataburger", 231 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 232 | "revenue": 42.4, 233 | "numberOfStores": "12,333", 234 | "imageUrl": "https://thumbor.forbes.com/thumbor/960x0/https%3A%2F%2Fspecials-images.forbesimg.com%2Fimageserve%2F5f29710fdb2bffa70809fa0f%2FWhataburger%2F960x0.jpg%3Ffit%3Dscale" 235 | }, 236 | { 237 | "id": 27, 238 | "rank": 27, 239 | "name": "Texas Roadhouse", 240 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 241 | "revenue": 42.4, 242 | "numberOfStores": "12,333", 243 | "imageUrl": "https://cdn.vox-cdn.com/thumbor/Om_vzCuDw_nMBs6RDOlYdHfpApQ=/0x0:1000x439/1200x800/filters:focal(421x92:581x252)/cdn.vox-cdn.com/uploads/chorus_image/image/66890945/Texas_Roadhouse.0.jpg" 244 | }, 245 | { 246 | "id": 28, 247 | "rank": 28, 248 | "name": "IHOP", 249 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 250 | "revenue": 42.4, 251 | "numberOfStores": "12,333", 252 | "imageUrl": "https://media.blogto.com/articles/20210816-ihop.jpg?w=2048&cmd=resize_then_crop&height=1365&quality=70" 253 | }, 254 | { 255 | "id": 29, 256 | "rank": 29, 257 | "name": "Outback Steakhouse", 258 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 259 | "revenue": 42.4, 260 | "numberOfStores": "12,333", 261 | "imageUrl": "https://www.nrn.com/sites/nrn.com/files/Bloomin-Brands-Outback-Q3-strides-toward-multi-channel.jpg" 262 | }, 263 | { 264 | "id": 30, 265 | "rank": 30, 266 | "name": "Zaxby's", 267 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 268 | "revenue": 42.4, 269 | "numberOfStores": "12,333", 270 | "imageUrl": "https://nmgprod.s3.amazonaws.com/media/files/1b/c9/1bc93563b43c4752c7203dd4f44507c5/cover_image_1620397420.jpg.760x400_q85_crop_upscale.jpg" 271 | }, 272 | { 273 | "id": 31, 274 | "rank": 31, 275 | "name": "Culver's", 276 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 277 | "revenue": 42.4, 278 | "numberOfStores": "12,333", 279 | "imageUrl": "https://www.mashed.com/img/gallery/what-you-dont-know-about-culvers/intro-1560520860.jpg" 280 | }, 281 | { 282 | "id": 32, 283 | "rank": 32, 284 | "name": "Jimmy John's Gourmet Sandwiches", 285 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 286 | "revenue": 42.4, 287 | "numberOfStores": "12,333", 288 | "imageUrl": "https://s11284.pcdn.co/wp-content/uploads/2020/06/jimmy-johns-sandwich-shop-700x467.jpg.optimal.jpg" 289 | }, 290 | { 291 | "id": 33, 292 | "rank": 33, 293 | "name": "Wingstop", 294 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 295 | "revenue": 42.4, 296 | "numberOfStores": "12,333", 297 | "imageUrl": "https://www.qsrmagazine.com/sites/default/files/styles/story_page/public/2020-11/Wingstop.jpg?itok=BLKTA-Z-" 298 | }, 299 | { 300 | "id": 34, 301 | "rank": 34, 302 | "name": "Hardee's", 303 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 304 | "revenue": 42.4, 305 | "numberOfStores": "12,333", 306 | "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/4/40/Hardee%27s%2C_Salem%2C_Virginia_.jpg" 307 | }, 308 | { 309 | "id": 35, 310 | "rank": 35, 311 | "name": "Cracker Barrel", 312 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 313 | "revenue": 42.4, 314 | "numberOfStores": "12,333", 315 | "imageUrl": "https://imagesvc.meredithcorp.io/v3/mm/image?url=https%3A%2F%2Fstatic.onecms.io%2Fwp-content%2Fuploads%2Fsites%2F9%2F2020%2F06%2F05%2Fcracker-barrel-reopening-testing-alcohol-sales-FT-BLOG0620.jpg" 316 | }, 317 | { 318 | "id": 36, 319 | "rank": 36, 320 | "name": "Red Lobster", 321 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 322 | "revenue": 42.4, 323 | "numberOfStores": "12,333", 324 | "imageUrl": "https://a57.foxnews.com/static.foxnews.com/foxnews.com/content/uploads/2021/05/931/524/Red-Lobster-iStock.jpg?ve=1&tl=1" 325 | }, 326 | { 327 | "id": 37, 328 | "rank": 37, 329 | "name": "Denny's", 330 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 331 | "revenue": 42.4, 332 | "numberOfStores": "12,333", 333 | "imageUrl": "https://www.nrn.com/sites/nrn.com/files/Dennys-off-premises-sales-Burger-Den-Melt-Down-Q2-2021.jpg" 334 | }, 335 | { 336 | "id": 38, 337 | "rank": 38, 338 | "name": "Raising Cane's Chicken Fingers", 339 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 340 | "revenue": 42.4, 341 | "numberOfStores": "12,333", 342 | "imageUrl": "" 343 | }, 344 | { 345 | "id": 39, 346 | "rank": 39, 347 | "name": "Five Guys", 348 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 349 | "revenue": 42.4, 350 | "numberOfStores": "12,333", 351 | "imageUrl": "https://www.gannett-cdn.com/presto/2021/05/01/NVIC/bfadcf26-3bd0-41ba-be08-585c996f25f5-Raising_Canes.jpg?auto=webp&crop=767,432,x0,y39&format=pjpg&width=1200" 352 | }, 353 | { 354 | "id": 40, 355 | "rank": 40, 356 | "name": "Jersey Mike's Subs", 357 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 358 | "revenue": 42.4, 359 | "numberOfStores": "12,333", 360 | "imageUrl": "https://www.jerseymikes.ca/media/static/locations/1.jpg" 361 | }, 362 | { 363 | "id": 41, 364 | "rank": 41, 365 | "name": "LongHorn Steakhouse", 366 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 367 | "revenue": 42.4, 368 | "numberOfStores": "12,333", 369 | "imageUrl": "https://i.ytimg.com/vi/8KwRTE91U9I/maxresdefault.jpg" 370 | }, 371 | { 372 | "id": 42, 373 | "rank": 42, 374 | "name": "The Cheesecake Factory", 375 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 376 | "revenue": 42.4, 377 | "numberOfStores": "12,333", 378 | "imageUrl": "https://cdn.vox-cdn.com/thumbor/Is5STGnbZqVB_hV43MzFReLWneg=/1400x788/filters:format(jpeg)/cdn.vox-cdn.com/uploads/chorus_asset/file/19832787/Cheesecake_Factory.jpg" 379 | }, 380 | { 381 | "id": 43, 382 | "rank": 43, 383 | "name": "Bojangles", 384 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 385 | "revenue": 42.4, 386 | "numberOfStores": "12,333", 387 | "imageUrl": "https://www.al.com/resizer/X2ZnTmIKqrG4RFpbSUSQco1Rfag=/1280x0/smart/cloudfront-us-east-1.images.arcpublishing.com/advancelocal/WNRWZSHLQVGEBNOJHGATJT7HHI.jpg" 388 | }, 389 | { 390 | "id": 44, 391 | "rank": 44, 392 | "name": "Carl's Jr.", 393 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 394 | "revenue": 42.4, 395 | "numberOfStores": "12,333", 396 | "imageUrl": "" 397 | }, 398 | { 399 | "id": 45, 400 | "rank": 45, 401 | "name": "In-N-Out Burger", 402 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 403 | "revenue": 42.4, 404 | "numberOfStores": "12,333", 405 | "imageUrl": "https://hips.hearstapps.com/del.h-cdn.co/assets/16/35/2560x1920/sd-aspect-1472672403-1659715513-dcdcd9dd17-o.jpg?resize=480:*" 406 | }, 407 | { 408 | "id": 46, 409 | "rank": 46, 410 | "name": "Red Robin", 411 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 412 | "revenue": 42.4, 413 | "numberOfStores": "12,333", 414 | "imageUrl": "https://www.mashed.com/img/gallery/the-real-reason-red-robin-is-struggling/intro-1553611735.jpg" 415 | }, 416 | { 417 | "id": 47, 418 | "rank": 47, 419 | "name": "El Pollo Loco", 420 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 421 | "revenue": 42.4, 422 | "numberOfStores": "12,333", 423 | "imageUrl": "https://cdn.winsightmedia.com/platform/files/public/2021-03/background/El-Pollo-Loco-Remodel_1615569606.png?VersionId=wruIYBU_U4juOW6GMUJ0nyZuzMHWo1PB" 424 | }, 425 | { 426 | "id": 48, 427 | "rank": 48, 428 | "name": "Del Taco", 429 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 430 | "revenue": 42.4, 431 | "numberOfStores": "12,333", 432 | "imageUrl": "https://www.qsrmagazine.com/sites/default/files/styles/story_page/public/news-image/del-taco-refranchises-san-diego-market.jpg?itok=o1zpCTL8" 433 | }, 434 | { 435 | "id": 49, 436 | "rank": 49, 437 | "name": "Qdoba Mexican Eats", 438 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 439 | "revenue": 42.4, 440 | "numberOfStores": "12,333", 441 | "imageUrl": "https://cdn.vox-cdn.com/thumbor/zBEzySds-coOKCa7Ymm2H56gr6A=/0x0:3500x2336/1200x800/filters:focal(1470x888:2030x1448)/cdn.vox-cdn.com/uploads/chorus_image/image/58037473/L_Omaha-1-2.0.0.jpg" 442 | }, 443 | { 444 | "id": 50, 445 | "rank": 50, 446 | "name": "Firehouse Subs", 447 | "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium maiores reprehenderit at culpa atque, dolorum tempore dignissimos nobis ipsam, aliquid iure accusantium natus quam dolor neque optio dolore cum! Laborum veritatis et sed soluta minima fuga impedit inventore doloremque at, reiciendis esse neque obcaecati voluptatum nemo. Omnis ducimus, perspiciatis dolores quidem optio adipisci explicabo facere consequatur, aspernatur fuga, molestias iure laboriosam obcaecati ipsa quasi. Iure dolorem dignissimos odio quisquam. Maiores quasi et laudantium aliquid sequi soluta unde hic optio deleniti!", 448 | "revenue": 42.4, 449 | "numberOfStores": "12,333", 450 | "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQJM5nrxZjrmUw3VpbmiRzil2TyCZXyQ2mx5w&usqp=CAU" 451 | } 452 | ] 453 | -------------------------------------------------------------------------------- /02-Top-Restaurants/layouts/custom.vue: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /02-Top-Restaurants/layouts/default.vue: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /02-Top-Restaurants/layouts/error.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /02-Top-Restaurants/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | import { defineNuxtConfig } from "nuxt3"; 2 | 3 | // https://v3.nuxtjs.org/docs/directory-structure/nuxt.config 4 | export default defineNuxtConfig({ 5 | meta: { 6 | link: [ 7 | { 8 | rel: "stylesheet", 9 | href: "https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css", 10 | }, 11 | ], 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /02-Top-Restaurants/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "nuxi dev", 5 | "build": "nuxi build", 6 | "start": "node .output/server/index.mjs" 7 | }, 8 | "devDependencies": { 9 | "nuxt3": "latest" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /02-Top-Restaurants/pages/404.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 27 | -------------------------------------------------------------------------------- /02-Top-Restaurants/pages/index.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 27 | -------------------------------------------------------------------------------- /02-Top-Restaurants/pages/restaurants/[name].vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 59 | 60 | 112 | -------------------------------------------------------------------------------- /02-Top-Restaurants/pages/restaurants/index.vue: -------------------------------------------------------------------------------- 1 | 21 | -------------------------------------------------------------------------------- /02-Top-Restaurants/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://v3.nuxtjs.org/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /03-DarkMode/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .nuxt 4 | nuxt.d.ts 5 | .output 6 | -------------------------------------------------------------------------------- /03-DarkMode/README.md: -------------------------------------------------------------------------------- 1 | # Nuxt 3 Minimal Starter 2 | 3 | We recommend to look at the [documentation](https://v3.nuxtjs.org). 4 | 5 | ## Setup 6 | 7 | Make sure to install the dependencies 8 | 9 | ```bash 10 | yarn install 11 | ``` 12 | 13 | ## Development 14 | 15 | Start the development server on http://localhost:3000 16 | 17 | ```bash 18 | yarn dev 19 | ``` 20 | 21 | ## Production 22 | 23 | Build the application for production: 24 | 25 | ```bash 26 | yarn build 27 | ``` 28 | 29 | Checkout the [deployment documentation](https://v3.nuxtjs.org/docs/deployment). -------------------------------------------------------------------------------- /03-DarkMode/app.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | 22 | -------------------------------------------------------------------------------- /03-DarkMode/components/Card.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 25 | 26 | 49 | -------------------------------------------------------------------------------- /03-DarkMode/components/Cards.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 50 | 51 | 74 | -------------------------------------------------------------------------------- /03-DarkMode/components/Heading.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 32 | 33 | 69 | -------------------------------------------------------------------------------- /03-DarkMode/components/Nav.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | 17 | 98 | -------------------------------------------------------------------------------- /03-DarkMode/composables/useDarkMode.ts: -------------------------------------------------------------------------------- 1 | const useDarkMode = () => { 2 | const isDarkMode = useState("darkMode", () => false); 3 | 4 | const toggleDarkMode = () => { 5 | isDarkMode.value = !isDarkMode.value; 6 | }; 7 | 8 | return { 9 | isDarkMode, 10 | toggleDarkMode, 11 | }; 12 | }; 13 | 14 | export default useDarkMode; 15 | -------------------------------------------------------------------------------- /03-DarkMode/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | import { defineNuxtConfig } from "nuxt3"; 2 | 3 | // https://v3.nuxtjs.org/docs/directory-structure/nuxt.config 4 | export default defineNuxtConfig({}); 5 | -------------------------------------------------------------------------------- /03-DarkMode/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "nuxi dev", 5 | "build": "nuxi build", 6 | "start": "node .output/server/index.mjs" 7 | }, 8 | "devDependencies": { 9 | "nuxt3": "latest" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /03-DarkMode/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://v3.nuxtjs.org/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /04-WeatherApp/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .nuxt 4 | nuxt.d.ts 5 | .output 6 | .env -------------------------------------------------------------------------------- /04-WeatherApp/README.md: -------------------------------------------------------------------------------- 1 | # Nuxt 3 Minimal Starter 2 | 3 | We recommend to look at the [documentation](https://v3.nuxtjs.org). 4 | 5 | ## Setup 6 | 7 | Make sure to install the dependencies 8 | 9 | ```bash 10 | yarn install 11 | ``` 12 | 13 | ## Development 14 | 15 | Start the development server on http://localhost:3000 16 | 17 | ```bash 18 | yarn dev 19 | ``` 20 | 21 | ## Production 22 | 23 | Build the application for production: 24 | 25 | ```bash 26 | yarn build 27 | ``` 28 | 29 | Checkout the [deployment documentation](https://v3.nuxtjs.org/docs/deployment). -------------------------------------------------------------------------------- /04-WeatherApp/app.vue: -------------------------------------------------------------------------------- 1 | 72 | 73 | 113 | 114 | 124 | -------------------------------------------------------------------------------- /04-WeatherApp/assets/css/tailwind.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss/base"; 2 | @import "tailwindcss/components"; 3 | @import "tailwindcss/utilities"; 4 | -------------------------------------------------------------------------------- /04-WeatherApp/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | import { defineNuxtConfig } from "nuxt3"; 2 | 3 | // https://v3.nuxtjs.org/docs/directory-structure/nuxt.config 4 | export default defineNuxtConfig({ 5 | publicRuntimeConfig: { 6 | WEATHER_APP_SECRET: process.env.WEATHER_APP_SECRET, 7 | }, 8 | privateRuntimeConfig: { 9 | HELLO: "world in the server not the client", 10 | }, 11 | css: ["~/assets/css/tailwind.css"], 12 | build: { 13 | postcss: { 14 | postcssOptions: { 15 | plugins: { 16 | tailwindcss: {}, 17 | autoprefixer: {}, 18 | }, 19 | }, 20 | }, 21 | }, 22 | }); 23 | -------------------------------------------------------------------------------- /04-WeatherApp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "nuxi dev", 5 | "build": "nuxi build", 6 | "start": "node .output/server/index.mjs" 7 | }, 8 | "devDependencies": { 9 | "nuxt3": "latest" 10 | }, 11 | "dependencies": { 12 | "@tailwindcss/aspect-ratio": "^0.4.0", 13 | "@tailwindcss/forms": "^0.5.0", 14 | "@tailwindcss/line-clamp": "^0.3.1", 15 | "@tailwindcss/typography": "^0.5.2", 16 | "tailwindcss": "^3.0.23" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /04-WeatherApp/tailwind.config.js: -------------------------------------------------------------------------------- 1 | const defaultTheme = require("tailwindcss/defaultTheme"); 2 | 3 | module.exports = { 4 | mode: "jit", 5 | content: { 6 | files: [ 7 | "./components/**/*.{vue,js}", 8 | "./layouts/**/*.vue", 9 | "./pages/**/*.vue", 10 | "./app.vue", 11 | "./plugins/**/*.{js,ts}", 12 | "./nuxt.config.{js,ts}", 13 | ], 14 | }, 15 | theme: { 16 | extend: { 17 | fontFamily: { 18 | sans: ['"Inter var"', ...defaultTheme.fontFamily.sans], 19 | }, 20 | }, 21 | }, 22 | variants: { 23 | extend: {}, 24 | }, 25 | plugins: [ 26 | require("@tailwindcss/forms"), 27 | require("@tailwindcss/typography"), 28 | require("@tailwindcss/line-clamp"), 29 | require("@tailwindcss/aspect-ratio"), 30 | ], 31 | }; 32 | -------------------------------------------------------------------------------- /04-WeatherApp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://v3.nuxtjs.org/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /05-TodoApp/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .nuxt 4 | nuxt.d.ts 5 | .output 6 | .env -------------------------------------------------------------------------------- /05-TodoApp/README.md: -------------------------------------------------------------------------------- 1 | # Nuxt 3 Minimal Starter 2 | 3 | We recommend to look at the [documentation](https://v3.nuxtjs.org). 4 | 5 | ## Setup 6 | 7 | Make sure to install the dependencies 8 | 9 | ```bash 10 | yarn install 11 | ``` 12 | 13 | ## Development 14 | 15 | Start the development server on http://localhost:3000 16 | 17 | ```bash 18 | yarn dev 19 | ``` 20 | 21 | ## Production 22 | 23 | Build the application for production: 24 | 25 | ```bash 26 | yarn build 27 | ``` 28 | 29 | Checkout the [deployment documentation](https://v3.nuxtjs.org/docs/deployment). -------------------------------------------------------------------------------- /05-TodoApp/app.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 31 | 32 | 64 | -------------------------------------------------------------------------------- /05-TodoApp/composables/useTodos.ts: -------------------------------------------------------------------------------- 1 | const useTodos = () => { 2 | const { data: todos, refresh } = useAsyncData("todos", () => { 3 | return $fetch("/api/todo"); 4 | }); 5 | 6 | const addTodo = async (item) => { 7 | if (!item) return; 8 | await $fetch("/api/todo", { method: "post", body: { item } }); 9 | refresh(); 10 | }; 11 | 12 | const updateTodo = async (id) => { 13 | await $fetch(`/api/todo/${id}`, { method: "put" }); 14 | refresh(); 15 | }; 16 | 17 | const deleteTodo = async (id) => { 18 | await $fetch(`/api/todo/${id}`, { method: "delete" }); 19 | refresh(); 20 | }; 21 | 22 | return { todos, addTodo, updateTodo, deleteTodo }; 23 | }; 24 | 25 | export default useTodos; 26 | -------------------------------------------------------------------------------- /05-TodoApp/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | import { defineNuxtConfig } from "nuxt3"; 2 | 3 | // https://v3.nuxtjs.org/docs/directory-structure/nuxt.config 4 | export default defineNuxtConfig({ 5 | modules: ["@nuxt/ui"], 6 | }); 7 | -------------------------------------------------------------------------------- /05-TodoApp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "nuxi dev", 5 | "build": "nuxi build", 6 | "start": "node .output/server/index.mjs" 7 | }, 8 | "devDependencies": { 9 | "nuxt3": "latest" 10 | }, 11 | "dependencies": { 12 | "@nuxt/ui": "^0.0.0-alpha.5", 13 | "uuid": "^8.3.2" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /05-TodoApp/server/api/todo/[id].ts: -------------------------------------------------------------------------------- 1 | import { db } from "../../db"; 2 | import { sendError } from "h3"; 3 | 4 | export default defineEventHandler((e) => { 5 | const method = e.req.method; 6 | const context = e.context; 7 | const { id } = context.params; 8 | 9 | const findTodoById = (todoId) => { 10 | let index; 11 | const todo = db.todos.find((t, i) => { 12 | if (t.id === todoId) { 13 | index = i; 14 | return true; 15 | } 16 | return false; 17 | }); 18 | 19 | if (!todo) { 20 | const TodoNotFoundError = createError({ 21 | statusCode: 404, 22 | statusMessage: "Todo not found", 23 | data: {}, 24 | }); 25 | 26 | sendError(e, TodoNotFoundError); 27 | } 28 | 29 | return { todo, index }; 30 | }; 31 | 32 | if (method === "PUT") { 33 | const { todo, index } = findTodoById(id); 34 | 35 | const updateTodo = { 36 | ...todo, 37 | completed: !todo.completed, 38 | }; 39 | 40 | db.todos[index] = updateTodo; 41 | 42 | return updateTodo; 43 | } 44 | 45 | if (method === "DELETE") { 46 | const { index } = findTodoById(id); 47 | 48 | db.todos.splice(index, 1); 49 | 50 | return { 51 | message: "item deleted", 52 | }; 53 | } 54 | }); 55 | -------------------------------------------------------------------------------- /05-TodoApp/server/api/todo/index.ts: -------------------------------------------------------------------------------- 1 | import { db } from "../../db"; 2 | import { v4 as uuid } from "uuid"; 3 | import { sendError } from "h3"; 4 | 5 | export default defineEventHandler(async (e) => { 6 | const method = e.req.method; 7 | 8 | if (method === "GET") { 9 | console.log(db.todos); 10 | return db.todos; 11 | } 12 | 13 | if (method === "POST") { 14 | const body = await useBody(e); 15 | 16 | if (!body.item) { 17 | const TodoNotFoundError = createError({ 18 | statusCode: 400, 19 | statusMessage: "No item provided", 20 | data: {}, 21 | }); 22 | 23 | sendError(e, TodoNotFoundError); 24 | } 25 | 26 | const newTodo = { 27 | id: uuid(), 28 | item: body.item, 29 | completed: false, 30 | }; 31 | 32 | db.todos.push(newTodo); 33 | 34 | return newTodo; 35 | } 36 | }); 37 | -------------------------------------------------------------------------------- /05-TodoApp/server/db/index.ts: -------------------------------------------------------------------------------- 1 | export const db = { 2 | todos: [], 3 | }; 4 | -------------------------------------------------------------------------------- /05-TodoApp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://v3.nuxtjs.org/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /06-NotesApp/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .nuxt 4 | nuxt.d.ts 5 | .output 6 | .env -------------------------------------------------------------------------------- /06-NotesApp/README.md: -------------------------------------------------------------------------------- 1 | # Nuxt 3 Minimal Starter 2 | 3 | We recommend to look at the [documentation](https://v3.nuxtjs.org). 4 | 5 | ## Setup 6 | 7 | Make sure to install the dependencies 8 | 9 | ```bash 10 | yarn install 11 | ``` 12 | 13 | ## Development 14 | 15 | Start the development server on http://localhost:3000 16 | 17 | ```bash 18 | yarn dev 19 | ``` 20 | 21 | ## Production 22 | 23 | Build the application for production: 24 | 25 | ```bash 26 | yarn build 27 | ``` 28 | 29 | Checkout the [deployment documentation](https://v3.nuxtjs.org/docs/deployment). -------------------------------------------------------------------------------- /06-NotesApp/components/Auth/Card.vue: -------------------------------------------------------------------------------- 1 | 35 | 36 | 65 | 66 | 101 | -------------------------------------------------------------------------------- /06-NotesApp/components/Nav.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 18 | 19 | 42 | -------------------------------------------------------------------------------- /06-NotesApp/composables/useAuth.ts: -------------------------------------------------------------------------------- 1 | const useAuth = () => { 2 | const user = useState("user", () => null); 3 | const { supabase } = useSupabase(); 4 | 5 | supabase.auth.onAuthStateChange((e, session) => { 6 | user.value = session?.user || null; 7 | }); 8 | 9 | const signUp = async ({ email, password, ...metadata }) => { 10 | const { user: u, error } = await supabase.auth.signUp( 11 | { 12 | email, 13 | password, 14 | }, 15 | { 16 | data: metadata, 17 | redirectTo: `${window.location.origin}/myprofile?source=email`, 18 | } 19 | ); 20 | if (error) throw error; 21 | return u; 22 | }; 23 | 24 | const signIn = async ({ email, password }) => { 25 | const { user: u, error } = await supabase.auth.signIn({ 26 | email, 27 | password, 28 | }); 29 | if (error) throw error; 30 | return u; 31 | }; 32 | 33 | const signOut = async () => { 34 | const { error } = await supabase.auth.signOut(); 35 | if (error) throw error; 36 | }; 37 | 38 | const isLoggedIn = () => { 39 | return !!user.value; 40 | }; 41 | 42 | return { 43 | user, 44 | signUp, 45 | signIn, 46 | signOut, 47 | isLoggedIn, 48 | }; 49 | }; 50 | 51 | export default useAuth; 52 | -------------------------------------------------------------------------------- /06-NotesApp/composables/useSupabase.ts: -------------------------------------------------------------------------------- 1 | import { createClient } from "@supabase/supabase-js"; 2 | 3 | const SUPABASE_KEY = 4 | "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InhyeGVib2NoanFtaXFycnFycXF2Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTY1MDIxMzI1MCwiZXhwIjoxOTY1Nzg5MjUwfQ.w30KrvbS3krHbHvhUsFTX-ag0DX2RgSGaivSE4KPRDA"; 5 | const SUPABASE_URL = "https://xrxebochjqmiqrrqrqqv.supabase.co"; 6 | 7 | const useSupabase = () => { 8 | const supabase = createClient(SUPABASE_URL, SUPABASE_KEY); 9 | 10 | return { 11 | supabase, 12 | }; 13 | }; 14 | 15 | export default useSupabase; 16 | -------------------------------------------------------------------------------- /06-NotesApp/layouts/default.vue: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /06-NotesApp/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | import { defineNuxtConfig } from "nuxt3"; 2 | 3 | // https://v3.nuxtjs.org/docs/directory-structure/nuxt.config 4 | // qehguqoghoqwihfg932hg023gb23ig32 5 | export default defineNuxtConfig({ 6 | modules: ["@nuxt/ui"], 7 | }); 8 | -------------------------------------------------------------------------------- /06-NotesApp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "nuxi dev", 5 | "build": "nuxi build", 6 | "start": "node .output/server/index.mjs" 7 | }, 8 | "devDependencies": { 9 | "nuxt3": "latest" 10 | }, 11 | "dependencies": { 12 | "@nuxt/ui": "^0.0.0-alpha.5", 13 | "@supabase/supabase-js": "^1.34.1" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /06-NotesApp/pages/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 13 | 23 | -------------------------------------------------------------------------------- /06-NotesApp/pages/myprofile.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /06-NotesApp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://v3.nuxtjs.org/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | --------------------------------------------------------------------------------