├── web
├── step-01
│ ├── images
│ │ ├── img-1.png
│ │ └── img-2.png
│ └── README.md
├── step-02
│ ├── images
│ │ ├── img-1.png
│ │ ├── img-2.png
│ │ ├── img-3.png
│ │ ├── img-4.png
│ │ ├── img-5.png
│ │ ├── img-6.png
│ │ ├── img-7.png
│ │ ├── img-8.png
│ │ ├── img-9.png
│ │ ├── counter.gif
│ │ ├── img-10.png
│ │ ├── img-11.png
│ │ ├── img-12.png
│ │ └── css-declaration-1.png
│ ├── src
│ │ ├── counter.js
│ │ ├── counter.html
│ │ └── counter.css
│ └── README.md
├── step-03
│ ├── images
│ │ ├── img-1.png
│ │ ├── img-2.png
│ │ ├── img-3.png
│ │ ├── img-4.png
│ │ ├── img-5.png
│ │ ├── img-6.png
│ │ ├── img-7.png
│ │ ├── img-8.png
│ │ ├── img-9.png
│ │ ├── counter.gif
│ │ ├── img-10.png
│ │ ├── img-11.png
│ │ └── img-12.png
│ ├── src
│ │ ├── SimpleBlazorCounter
│ │ │ ├── Pages
│ │ │ │ ├── Counter.razor.cs
│ │ │ │ ├── Counter.razor
│ │ │ │ └── Counter.razor.css
│ │ │ ├── App.razor
│ │ │ ├── _Imports.razor
│ │ │ ├── wwwroot
│ │ │ │ └── index.html
│ │ │ ├── Properties
│ │ │ │ └── launchSettings.json
│ │ │ ├── SimpleBlazorCounter.csproj
│ │ │ └── Program.cs
│ │ └── SimpleBlazorCounter.sln
│ └── README.md
├── step-04
│ ├── images
│ │ ├── img-1.png
│ │ ├── img-2.png
│ │ ├── img-3.png
│ │ ├── img-4.png
│ │ ├── img-5.png
│ │ ├── img-6.png
│ │ ├── img-7.png
│ │ ├── img-9.png
│ │ ├── img-11.png
│ │ └── calculator.gif
│ ├── src
│ │ ├── SimpleBlazorCalculator
│ │ │ ├── App.razor
│ │ │ ├── _Imports.razor
│ │ │ ├── wwwroot
│ │ │ │ └── index.html
│ │ │ ├── Properties
│ │ │ │ └── launchSettings.json
│ │ │ ├── SimpleBlazorCalculator.csproj
│ │ │ ├── Program.cs
│ │ │ └── Pages
│ │ │ │ ├── Calculator.razor
│ │ │ │ ├── Calculator.razor.cs
│ │ │ │ └── Calculator.razor.scss
│ │ └── SimpleBlazorCalculator.sln
│ └── README.md
├── step-05
│ ├── images
│ │ ├── img-4.png
│ │ ├── img-5.png
│ │ ├── img-6.png
│ │ ├── img-7.png
│ │ ├── img-9.png
│ │ ├── img-1-1.png
│ │ ├── img-10.png
│ │ ├── img-12.png
│ │ ├── img-13-1.png
│ │ ├── img-13.png
│ │ ├── img-14.png
│ │ ├── img-15-2.png
│ │ ├── img-2-2.png
│ │ ├── img-3-1.png
│ │ ├── img-3-3.png
│ │ ├── img-5-1.png
│ │ ├── img-8-2.png
│ │ └── responsive.png
│ ├── src
│ │ ├── ToDoApp
│ │ │ ├── wwwroot
│ │ │ │ ├── images
│ │ │ │ │ ├── logo.png
│ │ │ │ │ ├── logo-small.png
│ │ │ │ │ └── background-image.png
│ │ │ │ ├── main.css
│ │ │ │ └── index.html
│ │ │ ├── App.razor
│ │ │ ├── _Imports.razor
│ │ │ ├── Pages
│ │ │ │ ├── Login.razor.cs
│ │ │ │ ├── Login.razor
│ │ │ │ └── Login.razor.scss
│ │ │ ├── Properties
│ │ │ │ └── launchSettings.json
│ │ │ ├── ToDoApp.csproj
│ │ │ └── Program.cs
│ │ └── ToDoApp.sln
│ └── README.md
└── step-06
│ ├── images
│ ├── img-2.png
│ ├── img-3.png
│ ├── img-4.png
│ ├── img-5.png
│ ├── img-6.png
│ ├── img-7.png
│ ├── img-8.png
│ ├── img-9.png
│ ├── img-1-1.png
│ └── img-10.png
│ ├── src
│ ├── ToDoApp
│ │ ├── wwwroot
│ │ │ ├── images
│ │ │ │ ├── logo.png
│ │ │ │ ├── logo-small.png
│ │ │ │ └── background-image.png
│ │ │ ├── main.css
│ │ │ └── index.html
│ │ ├── compilerconfig.json
│ │ ├── TodoItem.cs
│ │ ├── App.razor
│ │ ├── _Imports.razor
│ │ ├── Pages
│ │ │ ├── Login.razor.cs
│ │ │ ├── Login.razor
│ │ │ ├── TodoPage.razor.scss
│ │ │ ├── Login.razor.scss
│ │ │ ├── TodoPage.razor
│ │ │ └── TodoPage.razor.cs
│ │ ├── Properties
│ │ │ └── launchSettings.json
│ │ ├── Program.cs
│ │ ├── ToDoApp.csproj
│ │ └── compilerconfig.json.defaults
│ └── ToDoApp.sln
│ └── README.md
├── markdown-styles.css
├── README.md
├── LICENSE
└── .gitignore
/web/step-01/images/img-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-01/images/img-1.png
--------------------------------------------------------------------------------
/web/step-01/images/img-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-01/images/img-2.png
--------------------------------------------------------------------------------
/web/step-02/images/img-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-1.png
--------------------------------------------------------------------------------
/web/step-02/images/img-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-2.png
--------------------------------------------------------------------------------
/web/step-02/images/img-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-3.png
--------------------------------------------------------------------------------
/web/step-02/images/img-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-4.png
--------------------------------------------------------------------------------
/web/step-02/images/img-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-5.png
--------------------------------------------------------------------------------
/web/step-02/images/img-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-6.png
--------------------------------------------------------------------------------
/web/step-02/images/img-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-7.png
--------------------------------------------------------------------------------
/web/step-02/images/img-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-8.png
--------------------------------------------------------------------------------
/web/step-02/images/img-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-9.png
--------------------------------------------------------------------------------
/web/step-03/images/img-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-1.png
--------------------------------------------------------------------------------
/web/step-03/images/img-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-2.png
--------------------------------------------------------------------------------
/web/step-03/images/img-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-3.png
--------------------------------------------------------------------------------
/web/step-03/images/img-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-4.png
--------------------------------------------------------------------------------
/web/step-03/images/img-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-5.png
--------------------------------------------------------------------------------
/web/step-03/images/img-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-6.png
--------------------------------------------------------------------------------
/web/step-03/images/img-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-7.png
--------------------------------------------------------------------------------
/web/step-03/images/img-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-8.png
--------------------------------------------------------------------------------
/web/step-03/images/img-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-9.png
--------------------------------------------------------------------------------
/web/step-04/images/img-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-04/images/img-1.png
--------------------------------------------------------------------------------
/web/step-04/images/img-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-04/images/img-2.png
--------------------------------------------------------------------------------
/web/step-04/images/img-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-04/images/img-3.png
--------------------------------------------------------------------------------
/web/step-04/images/img-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-04/images/img-4.png
--------------------------------------------------------------------------------
/web/step-04/images/img-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-04/images/img-5.png
--------------------------------------------------------------------------------
/web/step-04/images/img-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-04/images/img-6.png
--------------------------------------------------------------------------------
/web/step-04/images/img-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-04/images/img-7.png
--------------------------------------------------------------------------------
/web/step-04/images/img-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-04/images/img-9.png
--------------------------------------------------------------------------------
/web/step-05/images/img-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-4.png
--------------------------------------------------------------------------------
/web/step-05/images/img-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-5.png
--------------------------------------------------------------------------------
/web/step-05/images/img-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-6.png
--------------------------------------------------------------------------------
/web/step-05/images/img-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-7.png
--------------------------------------------------------------------------------
/web/step-05/images/img-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-9.png
--------------------------------------------------------------------------------
/web/step-06/images/img-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/images/img-2.png
--------------------------------------------------------------------------------
/web/step-06/images/img-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/images/img-3.png
--------------------------------------------------------------------------------
/web/step-06/images/img-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/images/img-4.png
--------------------------------------------------------------------------------
/web/step-06/images/img-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/images/img-5.png
--------------------------------------------------------------------------------
/web/step-06/images/img-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/images/img-6.png
--------------------------------------------------------------------------------
/web/step-06/images/img-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/images/img-7.png
--------------------------------------------------------------------------------
/web/step-06/images/img-8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/images/img-8.png
--------------------------------------------------------------------------------
/web/step-06/images/img-9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/images/img-9.png
--------------------------------------------------------------------------------
/web/step-02/images/counter.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/counter.gif
--------------------------------------------------------------------------------
/web/step-02/images/img-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-10.png
--------------------------------------------------------------------------------
/web/step-02/images/img-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-11.png
--------------------------------------------------------------------------------
/web/step-02/images/img-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/img-12.png
--------------------------------------------------------------------------------
/web/step-03/images/counter.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/counter.gif
--------------------------------------------------------------------------------
/web/step-03/images/img-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-10.png
--------------------------------------------------------------------------------
/web/step-03/images/img-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-11.png
--------------------------------------------------------------------------------
/web/step-03/images/img-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-03/images/img-12.png
--------------------------------------------------------------------------------
/web/step-04/images/img-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-04/images/img-11.png
--------------------------------------------------------------------------------
/web/step-05/images/img-1-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-1-1.png
--------------------------------------------------------------------------------
/web/step-05/images/img-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-10.png
--------------------------------------------------------------------------------
/web/step-05/images/img-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-12.png
--------------------------------------------------------------------------------
/web/step-05/images/img-13-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-13-1.png
--------------------------------------------------------------------------------
/web/step-05/images/img-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-13.png
--------------------------------------------------------------------------------
/web/step-05/images/img-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-14.png
--------------------------------------------------------------------------------
/web/step-05/images/img-15-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-15-2.png
--------------------------------------------------------------------------------
/web/step-05/images/img-2-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-2-2.png
--------------------------------------------------------------------------------
/web/step-05/images/img-3-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-3-1.png
--------------------------------------------------------------------------------
/web/step-05/images/img-3-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-3-3.png
--------------------------------------------------------------------------------
/web/step-05/images/img-5-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-5-1.png
--------------------------------------------------------------------------------
/web/step-05/images/img-8-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/img-8-2.png
--------------------------------------------------------------------------------
/web/step-06/images/img-1-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/images/img-1-1.png
--------------------------------------------------------------------------------
/web/step-06/images/img-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/images/img-10.png
--------------------------------------------------------------------------------
/web/step-04/images/calculator.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-04/images/calculator.gif
--------------------------------------------------------------------------------
/web/step-05/images/responsive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/images/responsive.png
--------------------------------------------------------------------------------
/web/step-02/images/css-declaration-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-02/images/css-declaration-1.png
--------------------------------------------------------------------------------
/web/step-05/src/ToDoApp/wwwroot/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/src/ToDoApp/wwwroot/images/logo.png
--------------------------------------------------------------------------------
/web/step-06/src/ToDoApp/wwwroot/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/src/ToDoApp/wwwroot/images/logo.png
--------------------------------------------------------------------------------
/web/step-05/src/ToDoApp/wwwroot/images/logo-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/src/ToDoApp/wwwroot/images/logo-small.png
--------------------------------------------------------------------------------
/web/step-06/src/ToDoApp/compilerconfig.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "outputFile": "Pages/TodoPage.razor.css",
4 | "inputFile": "Pages/TodoPage.razor.scss"
5 | }
6 | ]
--------------------------------------------------------------------------------
/web/step-06/src/ToDoApp/wwwroot/images/logo-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/src/ToDoApp/wwwroot/images/logo-small.png
--------------------------------------------------------------------------------
/web/step-05/src/ToDoApp/wwwroot/images/background-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-05/src/ToDoApp/wwwroot/images/background-image.png
--------------------------------------------------------------------------------
/web/step-06/src/ToDoApp/wwwroot/images/background-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bitfoundation/bit-academy/HEAD/web/step-06/src/ToDoApp/wwwroot/images/background-image.png
--------------------------------------------------------------------------------
/web/step-02/src/counter.js:
--------------------------------------------------------------------------------
1 | let counter = document.getElementById("count");
2 |
3 | function increase() {
4 | counter.textContent++;
5 | }
6 |
7 | function decrease() {
8 | counter.textContent--;
9 | }
10 |
--------------------------------------------------------------------------------
/markdown-styles.css:
--------------------------------------------------------------------------------
1 | .markdown-body {
2 | font-family: "Segoe UI";
3 | }
4 |
5 | .markdown-body p {
6 | font-size: 16px;
7 | line-height: 1.5;
8 | text-align: justify;
9 | text-align-last: right;
10 | }
11 |
--------------------------------------------------------------------------------
/web/step-06/src/ToDoApp/TodoItem.cs:
--------------------------------------------------------------------------------
1 | namespace ToDoApp;
2 |
3 | public class TodoItem
4 | {
5 | public int Id { get; set; }
6 |
7 | public string Title { get; set; }
8 |
9 | public bool IsDone { get; set; }
10 |
11 | public bool IsEdit { get; set; } = false;
12 | }
13 |
14 |
--------------------------------------------------------------------------------
/web/step-05/src/ToDoApp/wwwroot/main.css:
--------------------------------------------------------------------------------
1 | * {
2 | padding: 0;
3 | margin: 0;
4 | }
5 |
6 | body {
7 | font-family: "Segoe UI", "Segoe UI Web (West European)", "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif;
8 | }
9 |
10 | .text-field {
11 | width: 300px;
12 | margin-bottom: 10px;
13 | }
14 |
--------------------------------------------------------------------------------
/web/step-03/src/SimpleBlazorCounter/Pages/Counter.razor.cs:
--------------------------------------------------------------------------------
1 | namespace SimpleBlazorCounter.Pages;
2 |
3 | public partial class Counter
4 | {
5 | public int CurrentCount { get; set; }
6 |
7 | public void Increase()
8 | {
9 | CurrentCount++;
10 | }
11 |
12 | public void Decrease()
13 | {
14 | CurrentCount--;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/web/step-05/src/ToDoApp/App.razor:
--------------------------------------------------------------------------------
1 | Sorry, there's nothing at this address. Sorry, there's nothing at this address. Sorry, there's nothing at this address. Sorry, there's nothing at this address.
18 |
19 | فایل دانلود شده را باز و سپس از بین Workloadهای مختلف که برای نوشتن بازی، برنامه های Android / iOS و... است، مطابق عکس فقط تیک ASP.NET and web development را میزنیم و از بین گزینههای سمت راست، تیک همه موارد را حذف میکنیم و سپس Install را میزنیم. این پروسه نیاز به دانلود حدودا یک گیگ فایل دارد.
20 |
21 |
22 |
23 | در پایان کار، Visual Studio شما آماده است.
24 |
25 |
6 | 7 | The ToDoApp lets you write, organize, and prioritize your tasks. 8 | This way you can be more productive by registering your tasks in the ToDo App 9 |
10 |
13 |
7 | 8 | The ToDoApp lets you write, organize, and prioritize your tasks. 9 | This way you can be more productive by registering your tasks in the ToDo App 10 |
11 |
14 |
18 |
19 | در مرحله بعد مطابق تصویر زیر از لیست ارایه شده Blazor WebAssembly App را انتخاب و با کلیک بر روی دکمه Next به مرحله بعدی میرویم.
20 |
21 |
22 |
23 | همان طور که در تصویر زیر میبینید در قسمت Project name میتوانیم اسم پروژه را تعیین کنیم (در این قسمت اسم پروژه را SimpleBlazorCounter میگذاریم) و در قسمت Location محل قرار گیری پروژه را مشخص کنیم. مجددا برای رفتن به مرحله بعد بر روی دکمه Next کلیک میکنیم.
24 |
25 |
26 |
27 | مطابق تصویر زیر، در این مرحله دقت کنید که Framework حتما روی **NET 7.0** قرار گرفته باشد.
28 |
29 |
30 |
31 | با کلیک بر روی دکمه Create پروژه SimpleBlazorCounter ایجاد میشود.
32 |
33 | همان طور که می بینید در سمت راست محیط Visual Studio ما بخش Solution Explorer را داریم. با توجه با این نکته که ما Blazor WebAssembly App را انتخاب کردیم ساختار فایلی که اینجا میبینیم مربوط به ساختار پیش فرض Blazor میباشد. در ابتدا ما توضیحی کوتاه و مختصر در مورد این ساختار داده و سپس بنا بر نیاز تمرین فعلی این ساختار را تغییر میدهیم.
34 |
35 |
36 |
37 |
38 | همانطور که در تصویر بالا میبینید ما داخل پروژه SimpleBlazorCounter به ترتیب پوشههای زیر را داریم.
39 |
40 | پوشه Properties، داخل این پوشه یک فایل به نام launchSettings.json قرار گرفته که تنظیمات مربوط به راه اندازی برنامه در آن است، برای مثال در برنامه ای که چندین صفحه دارد، کدام صفحه پیشفرض باز شود.
41 |
42 |
43 | پوشه wwwroot، در این پوشه فایل های استاتیک مانند فایل های css ,font ,image و… قرار دارند.
44 |
45 | پوشه Pages، در این پوشه صفحات پروژه با پسوند razor قرار گرفتهاند. فایل razor، شبیه به فایل html قسمت قبل است، با این تفاوت که امکاناتی از #C به آن اضافه شده است.
46 |
47 | پوشه Shared، با این پوشه، فعلا کاری نداریم، بنابراین روی آن راست کلیک کرده و با گزینه Delete آن را حذف میکنیم. در آینده به طور کامل در مورد این پوشه توضیح میدهیم.
48 |
49 | توضیحات در مورد ساختار فایلهای پروژه برای این جلسه کافی است. همان طور که گفتیم طبق نیاز تمرین این جلسه ساختار فعلی را تغییر می دهیم.
50 |
51 | هر زمان خواستید برنامه را اجرا کنید از ترکیب Ctrl + F5 استفاده کنید
52 |
53 | سپس از پوشه wwwroot پوشه های css ،sample-data و فایل favicon.ico رو حذف کرده به این صورت که روی نام فایل کلیک راست و از منوی باز شده گزینه Delete را انتخاب میکنیم.
54 |
55 | در ادامه کدهای مربوط به فایل index.html رو به صورت زیر تغییر میدهیم.
56 |
57 |
58 | Sorry, there's nothing at this address.
104 |
116 |
117 |
118 | ## افزودن کد های HTML
119 | برای ایجاد شمارندهای مطابق جلسه پیش، اما این بار با استفاده از Blazor به این صورت عمل میکنیم.
120 |
121 | ابتدا از پوشه Pages فایل Counter.razor را انتخاب میکنیم. ساختار کلی Blazor به این صورت است که کدهای Blazor با @ مشخص میشوند. و بلاک های کد با code@ نوشته میشوند.
122 |
123 | کدهای HTML جلسه گذشته را به صورت زیر، جایگزین کدهای HTML این فایل میکنیم.
124 |
125 |
126 |
162 |
163 | ## افزودن کد های CSS
164 |
165 | برای افزودن کدهای css، روی پوشه pages کلیک راست کرده، گزینه Add را انتخاب و سپس گزینه NewItem را انتخاب مینماییم.
166 |
167 |
168 |
169 | مطابق تصویر زیر از لیست ارائه شده Style Sheet را انتخاب و در قسمت Name نامی مشابه نام Component که در اینجا Counter.razor نام دارد با پسوند css. انتخاب می کنیم.
170 | اسم فایل Counter.razor.css میباشد. سپس روی دکمه Add کلیک نمایید.
171 |
172 |
173 |
174 | فایل Counter.razor.css مشابه تصویر زیر به پروژه اضافه میشود.
175 |
176 |
177 |
178 | کدهای CSS را از فایل CSS جلسه گذشته کپی و در فایل Counter.razor.css وارد میکنیم.
179 |
180 |
181 |
238 |
239 |
240 | ## افزودن رفتار تعاملی با استفاده از #C
241 |
242 | در ادامه به جای افزودن کدهای Javascript برای تعیین عملکرد دکمهها، از کدهای #C استفاده میکنیم.
243 | کدهای #C را میتوانیم داخل بلاک code@، فایل Counter.razor بنویسیم. اما بهتر است بلاک code@ را از این فایل حذف کرده و یک فایل جدید به نام Counter.razor.cs از طریق Add > New Item < راست کلیک روی پوشه Pages، ایجاد و کدهای زیر را وارد این فایل کنیم.
244 |
245 |
299 |
8 |
9 | ## لیست موضوعات
10 | 1. [ایجاد پروژه در Visual Studio](#CreateProject)
11 | 2. [ایجاد ساختار اصلی](#CreateMainStructure)
12 | 3. [افزودن استایل بااستفاده از SCSS](#AddSCSS)
13 | 4. [افزودن رفتار تعاملی با استفاده از #C](#AddFunctionality)
14 |
15 | ## ایجاد پروژه در Visual Studio
16 | همانند جلسه گذشته پروژه جدیدی به نام SimpleBlazorCalculator ایجاد کرده و مجددا فایلها و پوشههای اضافی را مطابق جلسه گذشته حذف کنید. با دو تفاوت:
17 | همه صفحات موجود در پوشه Pages را پاک کنید.
18 | اگر از کدهای جلسه قبل استفاده میکنید، SimpleBlazorCounter را در هر جایی که کد را کپی کردید، با SimpleBlazorCalculator جایگزین کنید.
19 |
20 |
21 | داخل پوشه Pages راست کلیک نموده و از منوی Add، گزینه New Item و نام آن را
22 |
23 | `Calculator.razor, Calculator.razor.cs, Calculator.razor.scss`
24 |
25 | بگذارید، با این کار در یک حرکت هر سه فایل لازم برای کار شما به پروژه اضافه میشود.
26 |
27 |
28 | وارد فایل Calculator.razor شده و در ابتدای این فایل کد زیر را برای تعیین مسیر این صفحه در مرورگر وارد کنید و در launchSettings.json نیز مقدار launchUrl را برابر با calculator قرار دهید.
29 |
30 |
40 |
41 |
42 | ## ایجاد ساختار اصلی
43 | برای ایجاد ساختار اولیه ماشین حساب کد زیر را در فایل Calculator.razor وارد کنید.
44 |
45 |
97 |
98 | ## افزودن استایل بااستفاده از SCSS
99 | از این جلسه به بعد برای افزودن استایلها از SCSS به جای CSS استفاده میکنیم. SCSS علاوه بر داشتن تمامی ویژگی های موجود در CSS شامل تعدادی ویژگی قدرتمندتر نیز نسبت به CSS میباشد، که با استفاده از این ویژگیها نوشتن استایلها آسانتر، سریعتر و خواناتر میشود.
100 |
101 | سعی ما بر این است که به مرور زمان از این جلسه تا جلسه آخر این دوره، به توضیح کامل این ویژگیها با مثالهای متعدد بپردازیم.
102 |
103 | زمانی که از فایلها با پسوند SCSS استفاده میکنیم باید آنها را به فایل با پسوند CSS تبدیل کنیم تا برای مرورگر قابل فهم باشد. در واقع زمان استفاده از SCSS احتیاج به یک کامپایلر داریم تا فایلهای SCSS پروژه را به CSS کامپایل کند. برای انجام این کار، ابزار و روشهای متفاوتی وجود دارد که در ادامه به بررسی یکی از این ابزارها میپردازیم.
104 |
105 | در ابتدا مطابق تصویر زیر از بخش Solution Explorer بر روی Dependencies کلیک راست کرده و از منوی باز شده گزینه Manage NuGet Packages را انتخاب میکنیم.
106 |
107 |
108 |
109 | در فایل باز شده تب Browse را انتخاب و در قسمت سرچ باکس `DartSassBuilder` را جستجو میکنیم.
110 |
111 |
112 |
113 | و سپس از لیست ارائه شده `DartSassBuilder` را انتخاب و از سمت راست بر روی دکمه Install کلیک میکنیم.
114 |
115 |
116 | در نهایت بر روی دکمه Ok کلیک میکنیم تا این Package نصب شود.
117 |
118 |
119 | با هر بار اجرای برنامه، فایل Calculator.razor.css از روی Calculator.razor.css ساخته میشود.
120 |
121 |
122 |
123 |
124 |
125 | هدف ما از بخش استایلها در این جلسه، آشنایی شما با ویژگی Variable در SCSS میباشد.
126 |
127 | فرض نمایید در فایل مربوط به استایلها ما چندین بار از رنگ آبی استفاده کردیم، بعد از مدتی تصمیم میگیریم این رنگ آبی، به عنوان مثال به رنگ آبی روشن تر تغییر کند. اگر از Variableها استفاده نکنیم مجبوریم تمامی رنگهای آبی موجود در فایلها را به صورت دستی تغییر دهیم اما با استفاده از Variable ها ما تنها مقدار متغیر مربوط به رنگ آبی را تغییر میدهیم، بدین ترتیب تمامی پراپرتیها که متغیر مربوط به رنگ آبی را به عنوان مقدار داشتهاند، رنگ جدیدی را که به متغیر نسبت داده ایم به خود میگیرند.
128 |
129 | به منظور تعریف متغیرها در SCSS از کاراکتر $ قبل از نام متغیر استفاده میکنیم. بدیهی است که نام متغیر میتواند هر آنچه که شما میخواهید باشد.
130 |
131 | کد زیر را copy و در فایل paste ،Calculator.razor.scss نمایید.
132 |
133 |
134 |
200 |
201 |
202 | ## افزودن رفتار تعاملی با استفاده از #C
203 | سپس فایل جدیدی به نام Calculator.razor.cs به منظور نوشتن متدها، برای چهار عمل اصلی (جمع، تفریق، ضرب، تقسیم) ایجاد میکنیم و کدهای زیر را وارد این فایل میکنیم.
204 |
205 |
269 |
270 | به منظور استفاده از ساختار شرطی از کلمه کلیدی if استفاده میکنیم. در داخل پرانتز شرط مورد نظر را نوشته، در صورت صحت شرط تعیین شده، مجموعهای از دستورات در بلاک کد اول، اجرا و در غیر این صورت بعد از کلمه کلیدی else مجموعه دستورات در بلاک کد دوم، اجرا میشوند.
271 |
272 | در مرحله بعد باید هر متد را بر روی رویداد onclick دکمه مربوطه فراخوانی کنیم.
273 | بدین ترتیب مجددا وارد فایل Calculator.razor شده و تغییرات زیر را بر روی کد اعمال میکنیم.
274 |
275 |
344 |
345 |
8 |
9 | ## لیست موضوعات
10 | 1. [ایجاد پروژه در Visual Studio](#CreateProject)
11 | 2. [ایجاد ساختار اصلی با HTML](#CreateMainStructure)
12 | 3. [افزودن استایل با استفاده از CSS](#AddStyle)
13 | 4. [افزودن رفتار تعاملی با استفاده از JavaScript](#AddFunctionality)
14 |
15 |
16 | ## ایجاد پروژه در Visual Studio
17 |
18 | در ابتدا پوشه ای (یا همان فولدر) به نام SimpleCounter در مسیر دلخواه ایجاد میکنیم. از همین ابتدا به اسامی دقت کنید، بزرگ و کوچکی حروف، داشتن یا نداشتن Space و... تاثیرگذار است.
19 |
20 | سپس وارد Visual Studio شده و از قسمت Get Started مطابق تصویر زیر روی گزینه Open a local folder کلیک کرده و فولدر مورد نظر را انتخاب می کنیم.
21 |
22 |
23 |
24 |
25 | مطابق تصویر زیر بعد از وارد شدن به محیط اصلی Visual Studio در قسمت Solution Explorer روی اسم فولدر کلیک راست و روی گزینه Add کلیک کرده و در ادامه گزینه NewFile را انتخاب میکنیم تا یک فایل جدید ایجاد شود سپس نام فایل را به counter.html تغییر می دهیم.
26 |
27 |
28 |
29 | ## ایجاد ساختار اصلی با HTML
30 |
31 | فایل های HTML معمولا با پسوند html و یا htm مشخص می شوند. با استفاده از کدهای HTML ساختار اصلی صفحات وب را ایجاد میکنیم. صفحات HTML شامل انواع element ها یا عناصر هستند به عنوان مثال یک صفحه HTML می تواند شامل element های text, image, table و…. باشد.
32 | هر عنصر HTML توسط یک تگ شروع و یک تگ پایان به صورت زیر تعریف می شود.
33 |
34 |
114 |
115 |
116 | همانطور که مشاهده میکنید دستورات CSS از سه بخش Selector، Property، Property value تشکیل شده است.
117 |
118 | Selector: به منظور اضافه نمودن استایل به یک element باید آن element را انتخاب کنیم. یکی از روش های انتخاب element در CSS، استفاده از نام خود element میباشد. برای مثال در تصویر بالا ما از نام تگ button به عنوان سلکتور استفاده کردهایم، به این معنا که میخواهیم استایلی را برای تمامی button های موجود در صفحه تعیین کنیم.
119 |
120 | Property: با استفاده از Property ها، ویژگیهای نمایش یک element در HTML را تعیین میکنیم. به عنوان مثال اگر بنویسیم background-color: red به این معناست که رنگ پس زمینه تمامی button های موجود در صفحه قرمز باشد.
121 |
122 | Property value: برای هر Property یا ویژگی در CSS باید یک مقدار در نظر گرفته شود. به عنوان مثال در این تصویر، رنگ قرمز را برای پراپرتی background-color element یا تگ button در نظر گرفتیم.
123 |
124 | برای نوشتن کدهای CSS وارد فایل counter.css میشویم.
125 |
126 | در ابتدا برای تعیین رنگ پس زمینه صفحه به صورت زیر عمل میکنیم.
127 |
128 |
189 |
190 | هر کدام از پراپرتیهای padding و margin حداکثر چهار عدد را میتوانند به عنوان مقدار بگیرند که این چهار عدد به ترتیب نشان دهنده فاصله از بالا، راست، پایین و چپ میباشند. اگر فقط یک مقدار به هر کدام از این property ها اختصاص دهیم به این معنی است که هر چهار طرف فاصلهای یکسان را نسبت به محتوای بیرون از element و یا محتوای درون element را دارند و اگر دو مقدار اختصاص دهیم به این معنی است که عدد اول مربوط به فاصله از بالا و پایین element، و عدد دوم مربوط به فاصله از چپ و راست element میباشد.
191 | اختصاص دادن مقدار auto به جای عدد دوم به پراپرتی margin به این معنی است که element ما از سمت چپ و راست در قسمت وسط قرار میگیرد.
192 |
193 | پراپرتی box-shaow در این قسمت از استایلها، همان طور که میبینید دارای پنج مقدار است که به ترتیب، عدد اول، فاصله سایه با باکس در راستای محور افقی، عدد دوم، فاصله سایه با باکس در راستای محور عمودی، عدد سوم، میزان مات شدن یا محو شدن سایه که هر چه این مقدار بیشتر شود لبه سایه مات تر و محوتر میشود. عدد چهارم اندازه سایه را مشخص میکند و آخرین مقدار در این جا رنگ سایه را تعیین میکند.
194 |
195 |
196 |
197 |
221 |
222 |
236 |
237 |
238 |
267 |
268 |
269 | ## افزودن رفتار تعاملی با استفاده از JavaScript
270 |
271 | به منظور این که به صفحات وب عملکردی را اضافه کنیم، مثلا در این تمرین، زمانی که روی دکمه increase کلیک کردیم یه واحد به عدد اضافه و زمانی که روی دکمه decrease کلیک کردیم یک واحد از عدد کم شود، از کدهای JavaScript استفاده میکنیم.
272 | بدین ترتیب فایل جدیدی به نام counter.js ایجاد میکنیم.
273 | در ادامه ابتدا باید فایل counter.js را به فایل counter.html اضافه کنیم. به فایل counter.html رفته و در انتهای تگ body یک تگ script اضافه می کنیم. با استفاده از ویژگی src این تگ آدرس فایل counter.js را مشخص میکنیم.
274 |
275 | قبل از ورود به فایل counter.js در همین فایل counter.html برای عنصری که میخواهیم محتوای درونش با هر کلیک کاربر، بر روی دکمهها آپدیت شود، یک شناسه منحصر به فرد یا همان ویژگی id را به صورت کد زیر تعیین میکنیم.
276 |
277 |
278 |
344 |
345 | صفحه مرورگر خود را در همین حالت نگه داشته و مجددا به فایل counter.js رفته و خط زیر را به این فایل اضافه نمایید.
346 |
347 |
348 |
361 |
362 |
363 | از (console.log (counter صرفا برای متوجه شدن مقدار داخل متغیر counter استفاده کردیم و در ادامه کار احتیاجی به آن نداریم بنابراین این خط از کد را پاک میکنیم.
364 |
365 | در ادامه باید دو تابع یا function برای اضافه کردن و کم کردن از عدد بنویسیم.
366 |
367 |
411 |
412 |
11 |
12 | ## لیست موضوعات
13 | 1. [آشنایی با Figma](#Figma)
14 | 2. [استفاده از فریم ورک Bit برای ایجاد المنت ها](#BitComponents)
15 | 3. [نمایش صحیح المنت ها در سایز تبلت و موبایل](#TabletAndMobile)
16 | 4. [پردازش ورودی ها و نمایش پیغام مناسب](#ProcessInput)
17 |
18 | ## آشنایی با Figma
19 |
20 | قبل از شروع به پیاده سازی صفحه Login میخواهیم به بررسی طرح این صفحه، که از قبل، توسط تیم طراحی به وسیله ابزاری به نام Figma ایجاد شده است بپردازیم.
21 |
22 | همانطور که در تصویر زیر میبینید، این صفحه در سه سایز Tablet ،Desktop و Mobile طراحی شده است.
23 |
24 | در سایز دسکتاپ، بخش مربوط به Login کاربر، از دو بخش تشکیل شده است، که در یک بخش، فرم Login قرار گرفته و در بخش بعدی، لوگوی محصول به اضافه توضیح کوتاهی در مورد محصول قرار گرفته است.
25 |
26 | در سایز تبلت و موبایل به دلیل کمبود فضا بخش اصلی، که همان فرم Login است نگه داشته شده است و همچنین لوگوی مربوط به پروژه هم به قسمت بالای فرم Login با رنگی متفاوت از لوگو، در سایز دسکتاپ قرار گرفته است.
27 |
28 | زمانی که طراح، طرح صفحه موجود را داخل Figma به شما میدهد، شما میتوانید با کلیک بر روی هر المنت و یا کلیک بر روی لایه المنت مورد نظر، به مشخصات المنت، در سمت راست صفحه، که شامل رنگ، سایز و موقعیت المنت در صفحه است، دسترسی داشته باشید.
29 |
30 | لازم به ذکر است بیشترین استفاده ما از این مشخصات مربوط به سایز المنت، رنگ، فونت و فاصله المنت مورد نظر از بقیه اجزای صفحه میباشد. لذا، لطفا از کپی کردن کدهای CSS موجود در Figma اجتناب کرده و فقط برای راهنمایی گرفتن و بالا بردن دقت در پیادهسازی طرح، از این کدها استفاده کنید.
31 |
32 |
34 |
40 |
41 | از طریق لینک زیر میتوانید به طرح بالا در فیگما دسترسی داشته باشید.
42 |
43 | https://www.figma.com/file/q0ldEdrilGhZMs7Nj2vZe3/ToDoApp
44 |
45 | ## استفاده از Bit BlazorUI Components برای ایجاد المنت ها
46 |
47 | در ادامه پروژهای به نام TodoApp ایجاد کرده و همانند [جلسات گذشته](https://github.com/bitfoundation/virtual-academy/tree/main/web/step-03) پوشهها، فایلها و کدهای اضافی را حذف میکنیم.
48 |
49 | از این جلسه به بعد میخواهیم از کامپوننتهای Bit برای ایجاد سریعتر و آسانتر المنتها استفاده کنیم.
50 |
51 | برای نصب Bit، همانند [نصب DartSassBuilder در جلسه گذشته](https://github.com/bitfoundation/virtual-academy/tree/main/web/step-04#%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86-%D8%A7%D8%B3%D8%AA%D8%A7%DB%8C%D9%84-%D8%A8%D8%A7%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-scss-) از بخش Solution Explorer بر روی Dependencies کلیک راست کرده و از منوی باز شده گزینه Manage NuGet Packages را انتخاب و در تب Browse در قسمت سرچ باکس Bit.BlazorUI را جستجو و نصب کنید.
52 |
53 |
54 |
55 | سپس خط زیر را که مربوط به کدهای CSS این کامپوننتها میباشد به تگ head داخل فایل index.html در پوشه wwwroot اضافه میکنیم.
56 |
57 |
132 | 133 | The TodoApp lets you write, organize, and prioritize your tasks. 134 | This way you can be more productive by registering your tasks in the Todo App 135 |
136 |
139 |
162 |
185 |
192 |
193 | تا این جای کار ما ساختار صفحه Login را ایجاد کردهایم.
194 |
195 | در ادامه و قبل از شروع به نوشتن کدهای CSS میخواهیم یک CSS RESET به پروژه اضافه کنیم.
196 |
197 | قضیه از این قرار است که مرورگرها مجموعهای از استایلهای پیشفرض را برای تگهای HTML در نظر میگیرند، این استایلهای پیش فرض میتوانند با استایلهایی که ما مینویسم تداخل پیدا کنند به همین دلیل بهتر است قبل از شروع به کار بر روی کدهای CSS، استایلهای پیشفرض را پاک کنیم و با یک صفحه خالی شروع کنیم.
198 |
199 | به این منظور یک فایل SCSS جدید به نام main.scss خارج از سطح کامپوننتها و داخل پوشه wwwroot ایجاد میکنیم و آن را به عنوان فایل SCSS اصلی در نظر میگیریم، این که کدهای مربوط به CSS RESET را داخل این فایل و خارج از سطح کامپوننتها قرار میدهیم به این دلیل است که میخواهیم این کدها نه تنها بر روی یک کامپوننت، بلکه بر روی تمامی المنتها در صفحه تاثیر بگذارد.
200 |
201 |
202 |
203 | در این مرحله، صفر کردن padding ها و margin های مربوط به تمامی المنتها برای ما کافیست.
204 |
205 |
297 |
298 | با استفاده از پراپرتی justify-content در FlexBox محل قرار گرفتن المنتهای فرزند در محور اصلی یا طول المنت والد، مشخص می کنیم.
299 |
300 | با استفاده از پراپرتی align-items در FlexBox محل قرار گرفتن المنتهای فرزند در محور عمودی یا عرض المنت والد، مشخص می کنیم.
301 |
302 | برای درک بهتر، تصویر زیر تفاوت بین پراپرتی justify-content و align-items را در FlexBox نشان میدهد.
303 |
304 |
305 |
306 | بدیهی است که چون ما هر دو این پراپرتیها را، center مقداردهی کردهایم، المنتهای فرزند در مرکز المنت والد قرار میگیرند.
307 |
308 | همانطور که در کد بالا میبینید ما برای تعیین عرض این المنت با کلاس container از واحد vw و برای تعیین ارتفاع از واحد vh استفاده کردهایم. به این واحدها، واحدهای Viewport میگویند. واحدهای Viewport به نسبت اندازه نمایشگر کار میکنند.
309 | وقتی میگوییم 100vw یعنی عرض المنت به اندازه 100% عرض نمایشگر و وقتی می گوییم 100vh یعنی ارتفاع المنت به اندازه 100% ارتفاع صفحه نمایش باشد.
310 |
311 | از پراپرتی background-image برای تعیین تصویر پس زمینه المنت استفاده میکنیم.
312 |
313 | پراپرتی background-size با مقدار cover باعث میشود، تصویر پسزمینه به اندازهای که تمام پس زمینه المنت را بتواند بپوشاند تغییر اندازه دهد.
314 |
315 | پراپرتی background-repeat با مقدار no-repeat از تکرار شدن تصویر پس زمینه، زمانی که سایز تصویر کوچکتر از سایز المنت هست جلوگیری میکند.
316 |
317 | قبل از نوشتن ادامه استایلها، می خواهیم به معرفی ویژگی پرکاربرد Nesting در Sass بپردازیم و در ادامه از این ویژگی استفاده کنیم.
318 |
319 | با استفاده از این ویژگی شما می توانید به جای تکرار مجدد همان سلکتورها، یک سلکتور را داخل سلکتور دیگر، به صورت تو در تو بنویسید.
320 |
321 | برای درک بهتر این ویژگی به مقایسه دو کد، در تصویر زیر توجه نمایید.
322 |
325 |
326 |
330 |
331 | با استفاده از" & " می توانید این انتخاب را در ویژگی Nesting مربوط به Sass ، به صورت زیر انجام دهید.
332 |
333 |
334 |
335 | در ادامه، کدهای زیر را به انتهای کدهای قبلی اضافه کنید.
336 |
337 |
436 |
445 |
492 | 493 | The TodoApp lets you write, organize, and prioritize your tasks. 494 | This way you can be more productive by registering your tasks in the ToDo App 495 |
496 |
499 |
531 |
8 |
9 | ابتدا فایل جدیدی به نام TodoPage.razor, TodoPage.razor.scss, TodoPage.razor.cs در پوشه pages ایجاد کرده و کد زیر را به منظور تعیین آدرس این صفحه در ابتدای فایل TodoPage.razor قرار می دهیم.
10 |
11 |
106 |
107 | در این فایل قرار است کلاسی به نام TodoItem داشته باشیم که این کلاس شامل فیلدهای مربوط به یک مورد todo میباشد.
108 |
109 |
164 |
165 | در مثالی که در تصویر بالا آمده ، یک لیستی را داریم که اعضای آن ثابت و یا به اصطلاح static است. به این معنا که ما از قبل تعداد اعضای داخل لیست و محتوای آن را در نظر گرفتهایم، اما در TodoList ، ما اطلاعی از این که کاربر چه تعداد آیتم میخواهد به لیستمان (TodoList) اضافه و یا از لیست کم کند و یا این که اصلا محتوای آیتمهای آن چه باشد نداریم، پس در واقع ما یک لیستی داریم که به صورت پویا و به اصطلاح dynamic تعداد اعضای آن اضافه و کم میشود و محتوای آیتم های آن تغییر میکند.
166 |
167 | در این جور مواقع ما باید از دستوری استفاده کنیم که لیست موجود را گرفته و شروع کند آیتم به آیتم اعضای لیست را پیمایش کردن، حالا در حین این پیمایش ما میتوانیم دستوری اضافه کنیم که اگر به فلان آیتم رسیدی به عنوان مثال نامش را تغییر بده و یا اصلا آیتم را حذف کن و یا اینکه به هر آیتمی که رسیدی محتوای آن آیتم را به کاربر نشان بده.
168 |
169 | ما میتوانیم از دستور foreach برای پیمایش اعضای یک لیست به صورت زیراستفاده کنیم.
170 |
171 |
172 |
173 |
228 |
229 | هر input با "type="checkbox تنها میتواند شامل دو مقدار checked و یا unchecked از نوع boolean باشد.
230 |
231 | همانطور که میبینید کنار تگ input از یک تگ label هم استفاده شده است. با وجود تگ label شما می توانید برای checkbox مربوطه عنوانی را تعیین نمایید، همچین منطقه بیشتری برای checked کردن یا unchecked کردن checkbox دارید چرا که حتی اگر روی مقداری که برای label در نظر گرفتهاید هم کلیک کنید، checkbox شما تغییر وضعیت میدهد.
232 |
233 | توجه فرمایید که در مثال بالا مقداری که برای ویژگی id تگ input در نظر گرفته شده است با مقداری که برای ویژگی for تگ label در نظر گرفته شده یکی میباشد. بدین صورت ما می توانیم مشخص کنیم که کدام Label مربوط به کدام input است.
234 |
235 | ما در کامپوننتهای Bit برای input با تایپ checkbox هم کامپوننتی به نام BitCheckbox را داریم که می توانیم از آن به صورت زیر در کد استفاده کنیم.
236 |
237 |
446 |
447 | همانطور که در تصویر بالا میبینید کامپوننت BitIconButton تشکیل شده است از یک تگ button که داخل آن یک تگ span قرار گرفته و داخل تگ span هم یک تگ i برای نمایش icon مورد نظر قرار گرفته است که به هر کدام از آنها یک فونت آیکن میگویند. فونت آیکونها فونت هایی هستند که به جای حروف یا اعداد ، دارای نمادها و آیکنها هستند. با فونت آیکنها میتوانید مانند متن معمولی رفتار کنید به این صورت که هر پراپرتی CSS که به متن اختصاص میدهید مثل font-size، color میتوانید به آنها هم اختصاص دهید.
448 |
449 | شما میتوانید لیست کامل این فونت آیکنها را در لینک زیر ببینید.
450 |
451 | https://components.bitplatform.dev/iconography
452 |
453 | اگر نام هر کدام از فونت آیکنهای موجود در این لیست را به پارامتر IconName کامپوننت BitIconButton اختصاص دهید، button شما شکل آن آیکن را به خود میگیرد.
454 |
455 | برخی از این فونت آیکنها در تصویر زیر آمده است.
456 |
457 |
458 |
459 | پارامتر بعدی که در استفاده از کامپوننت BitIconButton به کار بردیم پارامتر OnClick میباشد به این معنا که وقتی روی این دکمه کلیک کردیم یک اتفاقی بیفتد. مقداری که به این پارامتر در BitIconButton اول اختصاص دادهایم عبارت (e => EditTodoItem(TodoItem)) میباشد. به این عبارت در #Lambda expression ،C میگوییم. از یک عبارت lambda برای ایجاد یک anonymous function استفاده می کنیم. از عملگر <= در Lambda برای جدا کردن لیست پارامترهای lambda، از بدنه آن استفاده میکنیم.
460 |
461 | برای ایجاد عبارت lambda، پارامترهای ورودی را در صورت وجود در سمت چپ عملگر lambda و یک عبارت یا یک بلاک دستور را در طرف دیگر مشخص می کنیم.
462 |
463 | با استفاده از این عبارت با هر بار کلیک بر روی این دکمه متد EditTodoItem فراخوانی شده و مقادیر TodoItem جاری به آن اختصاص داده میشود.
464 |
465 | در مرحله بعد میخواهیم متد مربوط به حذف شدن یک Todo از لیست را بنویسیم. بدین منظور به فایل TodoPage.razor.cs رفته و کد مربوط به این متد را به صورت زیر به این فایل اضافه میکنیم.
466 |
467 |
931 |
932 | طبق روال گذشته می توانیم در قسمت DeveloperTools کد کامپایل شده این کامپوننت را ببینیم.
933 |
934 |
935 |
936 | زمانی که میخواهیم مجموعهای از گزینههای مرتبط را کنار هم داشته باشیم، میتوانیم از input با نوع radio و یا checkbox استفاده کنیم با این تفاوت که زمانی که شما از نوع checkbox برای input استفاده میکنید میتوانید به صورت همزمان چندین گزینه را انتخاب کنید اما زمانی که از نوع radio برای input استفاده میکنید در هر لحظه فقط یه گزینه می تواند انتخاب شود.
937 |
938 | در مورد label هم در درسهای گذشته به صورت کامل توضیح دادهایم.
939 |
940 | کامپوننت BitChoiceGroup پارامتری به نام OnValueChange دارد که با تغییر انتخاب بین گزینهها، متدی که به آن اختصاص داده شده را فرا میخواند.
941 |
942 | پس در ادامه نیاز داریم این پارامتر ار به این کامپوننت اضافه و متدی را به آن اختصاص دهیم.
943 |
944 |
1025 |
1026 |
1027 | این دستور به این صورت کار می کند که ابتدا switch expression یکبار ارزیابی میشود و سپس مقدار expression با مقدار هر case مقایسه و در صورت مطابقت بلاک کد مرتبط اجرا میشود. پس از اجرا اگر دستور break وجود داشته باشد اجرای کد در داخل بلاک متوقف شده و کار همین جا تمام میشود. اگر پیشبینی میکنیم که ممکن است مقدار expression با هیچ کدام از مقادیر case ها مطابقت نداشته باشد میتوانیم از دستور default استفاده کنیم، در این صورت (عدم مطابقت مقادیر با هم) بلاک کد مربوط به دستور default اجرا میشود.
1028 |
1029 | در کد بالا ما گفتهایم که اگر FilterValue دارای مقدار Active بود item هایی را برگردان که IsDone آنها false هست یعنی هنوز تکمیل نشدهاند و فعال هستند و اگر FilterValue دارای مقدار Completed بود item هایی را برگردان که IsDone آنها ture هست به این معنی که این item ها تکمیل شدهاند.
1030 |
1031 | در نهایت هر جایی که تغییری در تعداد آیتمهای موجود در لیست میدهیم مانند حذف کردن و یا اضافه شدن آیتمها، باید متد Filter را هم صدا بزنیم.
1032 |
1033 | کدهای موجود در این فایل به صورت زیر تغییر میکند.
1034 |
1035 |
1036 |