📌 शाळेच्या पद्धतीने UI शिका

लोक प्रत्यक्षात काय पाहतात, ते शाळेच्या सूचना फलकाच्या रूपात शिकवलेले: रचना, दिसणे, आणि कोणी स्पर्श केल्यावर काय घडते. प्रत्येक धडा म्हणजे क्रमांकित आकृती असलेली शाळेची गोष्ट — आणि फलक रेपोच्या आतच आहे: तीन साध्या फाइल्समधले खरे web ॲप (HTML, CSS, JavaScript — framework नाही, build पायरी नाही) आणि बोलण्यासाठी एक छोटे काउंटर, जे प्रत्येक धडा वाचतो, मोडतो आणि सुधारतो.

🧱 HTML🎨 CSS⚡ JavaScript🧠 state♿ a11y🎽 tokens🚀 performance🧪 testing

🧱 भाग 1 — फलक (1–6)

  • लोक जे पाहतात तेच उत्पादन 📌
  • अर्थ असलेली रचना, वाकणारा layout 🧱🎨
  • फलक जिवंत होतो: events, fetch ⚡
  • सत्याचा एकच स्रोत; प्रत्येकजण वाचू शकतो 🧠♿

🚚 भाग 2 — पाठवणे (7–12)

  • frameworks, आणि साधे JavaScript कधी पुरते 🧰
  • गणवेश: tokens आणि dark mode 🎽
  • वेगवान, तपासलेला, काउंटरशी सुरक्षित संवाद 🚀🧪📨
  • भिंतीवर लावलेला: build, deploy, निरीक्षण 🚚
# the 60-second wow — a real web app, live:
git clone https://github.com/BaluRaut/learn-ui-school.git && cd learn-ui-school
python3 ui/mock_api.py             # serves the board + its tiny counter on http://127.0.0.1:8000
python3 ui/smoke_test.py           # does the board stand? 10 checks (second terminal)

तुम्हाला काय दिसायला हवे (छाटलेले — यश असे दिसते):

✅ lang attribute on <html>
✅ one <h1>
✅ every input has a label
✅ images have alt
✅ skip link + live region
✅ design tokens defined
✅ dark theme via tokens
✅ focus is visible
✅ API returns students
✅ API rejects a bad form (400)

🎉 the board stands
🎒 धडा 01 आधी: तुम्हाला ब्राउझर आणि Python 3 लागतो (फक्त फलक ज्याच्याशी बोलतो त्या छोट्या काउंटरसाठी) — Node नाही, npm नाही, framework नाही. चांगले शेजारी: API शाळा (हा फलक ज्यासाठी चिठ्ठ्या भरतो ते काउंटर) आणि CI/CD शाळा (फलक भिंतीवर कसा लागतो). हे काय नाही: React चा कोर्स — धडे 04–05 मध्ये हाताने केल्यानंतर frameworks काय automate करतात ते धडा 07 दाखवतो.

🗺️ संपूर्ण चित्र — एक आकृती, पूर्ण कोर्स

संपूर्ण कोर्स एका कॅनव्हासवर. 4K आवृत्तीसाठी क्लिक करा.

The big picture: the board (HTML, CSS, JavaScript, state, accessibility) and shipping it (frameworks, tokens, performance, testing, backends, deploy)

🧱 भाग 1 — फलक (धडे 1–6)

एक git ब्रँच = एक कल्पना; ब्रँच 04 मध्ये धडे 01–04 आहेत. लॅबसाठी ब्राउझर आणि Python 3 लागतो (छोट्या काउंटरसाठी).

1

📌 UI का

सूचना फलक — लोक जे पाहतात तेच उत्पादन; ब्राउझर, DOM, एक HTML फाइल.lesson-01-why-uiधडा वाचा →आकृती पहा ↗
2

🧱 HTML ची रचना

फलकाचा सांगाडा — semantic elements, forms, labels, alt मजकूर.lesson-02-html-structureधडा वाचा →आकृती पहा ↗
3

🎨 CSS layout

फलकाची मांडणी — box model, flexbox, grid; एकच फलक फोनवर आणि भिंतीवर.lesson-03-css-layoutधडा वाचा →आकृती पहा ↗
4

⚡ JavaScript & events

फलक जिवंत होतो — events, DOM बदल, काउंटरकडे fetch.lesson-04-javascript-eventsधडा वाचा →आकृती पहा ↗
5

🧠 State & components

सत्याचा एकच स्रोत — state → render, data चे functions म्हणून components.lesson-05-state-componentsधडा वाचा →आकृती पहा ↗
6

♿ सुलभता (Accessibility)

प्रत्येकजण फलक वाचू शकतो — keyboard, labels, contrast, focus, ARIA, screen readers.lesson-06-accessibilityधडा वाचा →आकृती पहा ↗

🚚 भाग 2 — फलक पाठवणे (धडे 7–12)

production front end ला लागणारे सगळे, प्रत्येक गोष्ट त्याच छोट्या सूचना फलकावर दाखवलेली.

7

🧰 Frameworks

एका धड्यात React, Vue, Svelte — ते काय automate करतात, साधे JavaScript कधी पुरते.lesson-07-frameworksधडा वाचा →आकृती पहा ↗
8

🎽 Design systems & tokens

शाळेचा गणवेश — एका token पत्रकातून रंग, अंतर, अक्षरे आणि dark mode.lesson-08-design-tokensधडा वाचा →आकृती पहा ↗
9

🚀 कामगिरी (Performance)

फलक पटकन उघडतो — bundles, lazy प्रतिमा, caching, Core Web Vitals.lesson-09-performanceधडा वाचा →आकृती पहा ↗
10

🧪 UI ची चाचणी

फलक अजून उभा आहे का? — unit, component, end-to-end, visual, आणि smoke test.lesson-10-testingधडा वाचा →आकृती पहा ↗
11

📨 Backends शी बोलणे

काउंटरच्या चिठ्ठ्या भरणे — CORS, ब्राउझरमधले tokens, loading आणि error स्थिती, XSS.lesson-11-talking-to-backendsधडा वाचा →आकृती पहा ↗
12

🚚 Build, deploy & निरीक्षण

फलक भिंतीवर लावणे — static hosting, CDN, cache busting, निरीक्षण; कळस-प्रकल्प.lesson-12-build-deploy-observeधडा वाचा →आकृती पहा ↗
🗣️ मोठ्याने समजावा — धडा 12 नंतर: (1) <div onclick> पेक्षा <button> का बरा — फुकट मिळणाऱ्या तीन गोष्टी सांगा? (2) पान तुमच्या लॅपटॉपवर चालते आणि फोनवर मोडते — कोणत्या दोन CSS सवयी हे टाळतात? (3) "UI = render(state)": तुम्ही DOM हातानेही बदलले तर काय बिघडते? (4) screen reader वापरणारा विद्यार्थी नोंदवू शकत नाही — तुम्ही काय तपासाल, क्रमाने? (5) फलकाने आधीच तपासलेले काउंटरने पुन्हा का तपासावे? (6) hash केलेली फाइलनावे आणि मोठा max-age यांचा एकमेकांशी काय संबंध?
🎓 याच शाळेतून: API · Database · CI/CD · AWS — तेच उपमांचे विश्व, तीच ब्रँच-मागून-ब्रँच पद्धत.

📐 धड्यांच्या आकृत्या — क्रमांक अनुसरा

प्रत्येक धडा एका क्रमांकित बॉक्स-आणि-बाण आकृतीत — स्वतंत्र पानावरही.

1 📌 UI का

सूचना फलक — लोक जे पाहतात तेच उत्पादन; ब्राउझर, DOM, एक HTML फाइल.

🧒 सोप्या शब्दांत

शाळेचे office records अचूक ठेवू शकते आणि प्रत्येक slip ला उत्तर देऊ शकते, तरीही बाहेर उभ्या पालकाला काहीच दिसत नाही. Notice board वरच हे सगळे शेवटी दिसू लागते. Web page पण असेच चालते: HTML म्हणजे board वर काय लावले आहे, CSS म्हणजे ते कसे दिसते, आणि JavaScript म्हणजे कोणी हात लावला की काय घडते.

📖 नवे शब्दUI — app चा तो भाग जो लोक पाहतात आणि वापरतातHTML — मजकूर आणि रचना: headings, याद्या, formsCSS — दिसणे: रंग, अंतर आणि मांडणीJavaScript — वागणे: click केले किंवा type केले की काय घडतेDOM — browser मधले page चे जिवंत रूप, जे code बदलू शकतो
1🗄️📨 खोली आणि counter — अजून काहीच दिसले नाहीschool.dbAPI200 OK{"name":"Katrina"}👀?एक माणूसकाहीच पाहत नाहीपुढचा भाग नसलेले परिपूर्ण back office — JSON म्हणजे product नव्हेDatabase शाळा सत्य ठेवते · API शाळा चिठ्ठ्यांना उत्तरे देतेUI मध्येच बाकीच्या दोन शाळा शेवटी दिसू लागतात2📌 सूचना फलक — तीन थर, एक पानlocalhost:8000📌 सूचना फलकclass ▾Aishwarya3A · AKatrina3A · ADipika3A · Afooter · 5 विद्यार्थी1 HTMLकाय लावले आहे: रचना, अर्थ2 CSSकसे दिसते: layout, गणवेश3 JSकोणी हात लावला की काय होतेएक HTML फाइल, एक stylesheet, एक script — ui/index.html · styles.css · app.jsलोक जे पाहतात तेच product 👀3🌳 मजकूर → झाड → pixels: browser फाइलचे DOM बनवतो आणि रंगवतो<html lang="en"><body> <header>…</header> <main id="main"> <ul id="student-list"> <footer>index.html (मजकूर)htmlbodyheadermainfootersectionul#student-listDOM: nodes चे झाडlocalhost:8000📌 सूचना फलकclass ▾Aishwarya3A · AKatrina3A · ADipika3A · Afooter · 5 विद्यार्थीरंगवलेले pixels — फलकCSS चे नियम झाडातल्याnodes ना जुळून style देतातJS झाड वाचते आणि बदलते;browser पुन्हा रंगवतोप्रत्येक element एक node;प्रत्येक node शोधता, styleकरता, ऐकता येतो
⏪ आधी

उत्तम database आणि API असूनही माणसाला काहीच दिसत नव्हते, कारण कोणी पाहू शकत नाही तोपर्यंत JSON हे product नसते.

💡 काय

UI म्हणजे सूचना फलक: HTML म्हणजे काय लावले आहे, CSS म्हणजे ते कसे दिसते, आणि JS म्हणजे कोणी स्पर्श केल्यावर काय होते.

⚙️ कसे

localhost:8000 वरचा browser एक HTML file, एक stylesheet आणि एक script load करतो, आणि API ने पाठवलेले विद्यार्थी काढतो.

🎯 का

लोकांना जे दिसते तेच product आहे: UI मध्येच Database आणि API schools शेवटी डोळ्यांना दिसतात.

🚀 पुढे

पुढे फलकाला semantic HTML चा सांगाडा मिळतो (lesson 2), मग layout, events, state, आणि शेवटी खरा deploy.

🧪 Try it here — फलक सोला: आधी फक्त HTML, मग CSS, मग JS

संपूर्ण धडा 01 वाचा →

2 🧱 HTML ची रचना

फलकाचा सांगाडा — semantic elements, forms, labels, alt मजकूर.

🧒 सोप्या शब्दांत

चांगल्या notice board वर स्पष्ट विभाग असतात: वर शीर्षक, मध्ये विद्यार्थ्यांची यादी, खाली footer. HTML प्रत्येक भागाला तो जे आहे त्या नावाने ओळखते, म्हणजे screen reader वापरणारा विद्यार्थी अनुक्रमणिकेसारखा एका विभागातून दुसऱ्यात जाऊ शकतो. Form च्या प्रत्येक box ला label मिळते, आणि प्रत्येक चित्राला त्याचे वर्णन करणारे वाक्य.

📖 नवे शब्दsemantic element — एखादा भाग काय आहे ते सांगणारा tag, जसे <header> किंवा <nav>landmark — page चा मुख्य भाग, जिथे screen reader थेट जाऊ शकतोlabel — input box शी जोडलेला मजकूर, काय लिहायचे ते सांगणाराalt text — चित्र न पाहू शकणाऱ्यांसाठी शब्दांत केलेले त्याचे वर्णन
1🧱 सांगाडा — landmarks सांगतात प्रत्येक भाग काय आहे<header> <h1>The notice board</h1> <nav>…</nav><main id="main"><section aria-labelledby="students-h"> <h2>Students</h2> <ul id="student-list"> <li>…<section aria-labelledby="enrol-h"> <h2>Enrol a student</h2> <form id="enrol-form"><footer>Learn UI School · 5 pupils</footer>screen reader हे भागअनुक्रमणिकेसारखेवाचून दाखवतो;Tab आणि search enginesतोच नकाशा वापरतातएकच <h1> · headingsक्रमाने · <html lang>ui/index.html: ~80 ओळी, प्रत्येक element त्याच्या अर्थासाठी निवडलेला — शैली नंतर2📝 अर्थपूर्ण फॉर्म — labels inputs ना जोडलेली<label for="name">Name</label><input id="name" required minlength="2"><label for="class">Class</label><select id="class"> 3A · 3B<label for="grade">Grade</label><select id="grade"> C … A+<button type="submit">Enrol</button>for= → id: label वर click, field वर focus<img src="avatar.svg" alt="Katrina, class 3A"> · <p role="status" aria-live="polite">required · minlength: JS चालण्याआधीच browser नकार देतो · alt: शब्दांत चित्रrole=status: focus न चोरता फलक "5 pupils shown" जाहीर करतो3🧠 semantics = browser, search engines आणि screen readers सगळ्यांना समजणारा अर्थelementfocus होते?keyboardअसे जाहीर<button>Enrol</button>✓ फुकटEnter / Space ✓"Enrol, button"<div onclick="…">Enrol</div>✗✗"Enrol" (फक्त मजकूर)5 <li> चा <ul>——"list, 5 items"बटणासारखा दिसणारा <div> तुम्हालाtabindex, role, key handlers आणि एक bug देतो— खऱ्या element ची किंमत शून्यsmoke test (L10) lang, h1, labels, alt तपासते
⏪ आधी

फक्त साध्या divs ने बनलेले पान screen readers, Tab key आणि search engines ना कोणता भाग काय आहे याचा नकाशाच देत नाही.

💡 काय

Semantic HTML प्रत्येक element त्याच्या अर्थासाठी निवडते: landmarks, क्रमाने headings, labels असलेले forms आणि चित्रांसाठी alt text.

⚙️ कसे

Label चे for= input च्या id कडे निर्देश करते, required आणि minlength कोणताही JS चालण्याआधी चुकीचे input नाकारतात, आणि role=status घोषणा करते.

🎯 का

ui/index.html च्या सुमारे 80 ओळी screen readers, keyboards आणि search engines ना एकच स्पष्ट अनुक्रमणिका देतात.

🚀 पुढे

पुढे CSS layout ने style येते (lesson 3), आणि हाच अर्थ accessibility lesson चा पाया बनतो (lesson 6).

🧪 Try it here — खऱ्या <button> च्या जागी सजवलेला <div> ठेवा आणि box मध्ये Tab दाबा

संपूर्ण धडा 02 वाचा →

3 🎨 CSS layout

फलकाची मांडणी — box model, flexbox, grid; एकच फलक फोनवर आणि भिंतीवर.

🧒 सोप्या शब्दांत

Board वरची प्रत्येक notice जागा घेते: स्वतः कागद, border च्या आतली थोडी जागा, border, आणि पुढच्या notice पर्यंतचे अंतर. CSS हे boxes मांडते, एकाच ओळीत (flexbox) किंवा cards च्या नीटनेटक्या जाळीत (grid), म्हणजे तोच board छोट्या phone वर आणि भिंतीवरच्या मोठ्या screen वर बसतो.

📖 नवे शब्दbox model — प्रत्येक element म्हणजे content, padding, border आणि margin, एकात एक frames सारखेpadding — border च्या आतली जागाmargin — border च्या बाहेरची जागा, शेजाऱ्यांना दूर ढकलणारीflexbox — items एका ओळीत किंवा एका स्तंभात मांडतेgrid — items वेळापत्रकासारखे ओळी आणि स्तंभांत ठेवते
1📦 box model — प्रत्येक element म्हणजे चार आयतmargin 20border 2padding 12मजकूरwidth: 140px म्हणजे…content-box: 140 + 24 + 4 = 168border-box: 140, बस्स* { box-sizing: border-box }— नेहमी, CSS ची पहिली ओळmargin शेजाऱ्यांना दूर ढकलते · padding border च्या आत · gap (flex/grid मध्ये) बहुतेक margins ची जागा घेते2↔️ एका ओळीसाठी flexbox · ▦ पानासाठी griddisplay: flex · align-items: center · gap: 12pxlogolinklink🌙 Darkmargin-left: autodisplay: grid · grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)) · gapAishwarya3A · AKatrina3A · ADipika3A · Agrid-template-columns: 2fr 1frmain (2fr)aside (1fr)3📱🖥️ एक फलक, प्रत्येक आकार — आधी mobile, मग media query📌 फलकclass ▾Aishwarya3A · Afooter · 5 विद्यार्थी360px: एक स्तंभ≥ 720px📌 सूचना फलकclass ▾Aishwarya3A · AKatrina3A · ADipika3A · Afooter · 5 विद्यार्थीdesktop: ओळीला तीन cards.cards { display: grid; grid-template-columns: 1fr; }@media (min-width: 720px) { .cards { grid-template-columns: repeat(3, 1fr); } }img { max-width: 100%; } .wrap { max-width: 1100px; }सापेक्ष एकके (rem, %, fr) · फोनपेक्षा रुंद fixed width कधीच नाही · ui/styles.css सुमारे पन्नास ओळी
⏪ आधी

Padding आणि border मुळे अचानक वाढणाऱ्या widths आणि float hacks मुळे फलक phone वर किंवा मोठ्या screen वर बिघडायचा.

💡 काय

CSS layout म्हणजे box model, एका ओळीसाठी flexbox आणि पानासाठी grid, म्हणजे एकच फलक phone आणि भिंत दोन्हीवर बसतो.

⚙️ कसे

box-sizing: border-box width 140px वरच ठेवते, gap सह flex header एका रांगेत लावतो, आणि minmax(120px, 1fr) सह grid auto-fill cards गुंडाळतो.

🎯 का

थोडेच layout नियम pixel दुरुस्त्यांची पाने बदलतात, आणि वेगळ्या versions शिवाय फलक कोणत्याही screen ला जुळवून घेतो.

🚀 पुढे

पुढे JavaScript फलकाला जिवंत करते (lesson 4), आणि नंतर design tokens layout ला सामायिक गणवेश देतात (lesson 8).

🧪 Try it here — box-model चे dials फिरवा आणि फलक फोनच्या रुंदीत दाबा

संपूर्ण धडा 03 वाचा →

4 ⚡ JavaScript & events

फलक जिवंत होतो — events, DOM बदल, काउंटरकडे fetch.

🧒 सोप्या शब्दांत

विद्यार्थ्याने class menu मधून '3B' निवडले की board वर फक्त 3B चे विद्यार्थी दिसायला हवेत. JavaScript ती निवड (event) ऐकते, page ला जे लक्षात आहे ते बदलते, आणि board पुन्हा काढते. ती office counter ला slip पण पाठवू शकते (fetch) आणि उत्तर आले की ते board वर लावते.

📖 नवे शब्दevent — user ने केलेली कृती, जसे click, type किंवा निवडevent handler — तो event घडला की चालणारा codefetch — API कडून data मागण्याची browser ची पद्धतrender — सध्याच्या data वरून board पुन्हा काढणे
1👆 event → handler → state → render#class-filter → "3B""change" eventhandlerstate.filter = "3B"render()फलकlist.replaceChildren(...rows.map(StudentCard))फॉर्मवर e.preventDefault() — पान reload होता कामा नयेtextContent, data सह innerHTML कधीच नाही (L11)ui/app.js: प्रत्येक event ला एक addEventListener, एक render(), framework नाही2📨 fetch — फलक काउंटरची चिठ्ठी भरतोapp.jsAPIloading = true · render() → fetch(API, {signal: timeout 5 s})200 · {"items": [...]}r.ok ? await r.json() : throwstate.students = items · state.loading = falsefinally { render() }503 / timeout → catch → state.error = "Could not load: 503"async / await + try / finally: loading → झाले किंवा error — फलक प्रत्येक चेहरा दाखवतो (L11)3🧩 code चा आकार — तीन functions अख्खा फलक वाहतात$("#class-filter").addEventListener("change", (e) => { state.filter = e.target.value; render();});$("#enrol-form").addEventListener("submit", async (e) => { e.preventDefault(); await enrol(new FormData(e.target)); });event म्हणजे घडलेली गोष्ट ("user ने filter बदलला")handler state बदलतो, DOM कधीच नाहीrender() state वरून पुन्हा रंगवते — पहिल्यारंगासाठी आणि प्रत्येक बदलासाठी तेच functionmock API (ui/mock_api.py) :8001 वर उत्तर देते;?slow=1 आणि ?fail=1 ने बाकीचे चेहरे दिसतात
⏪ आधी

Static पान प्रतिसाद देऊ शकत नाही: class निवडले किंवा form पाठवला तर एकतर काहीच होत नाही किंवा पूर्ण पान reload होते.

💡 काय

JavaScript events ऐकते, state बदलते, फलक पुन्हा काढते, आणि fetch ने counter ची slip भरते.

⚙️ कसे

#class-filter वरचा change event state.filter 3B करतो आणि render() बोलवतो; fetch 5 s timeout सह API बोलवतो आणि items काढतो.

🎯 का

फलक ताजे data दाखवतो, आणि मंद किंवा अयशस्वी request वर गोठलेल्या पानाऐवजी स्पष्ट error संदेश दाखवतो.

🚀 पुढे

Lesson 5 हे सत्याचा एकच स्रोत बनवतो, आधी state मग render, आणि components म्हणजे data चे functions.

🧪 Try it here — जिवंत फलक वापरा: filter बदला, विद्यार्थी नोंदवा — event log वाचा

संपूर्ण धडा 04 वाचा →

5 🧠 State & components

सत्याचा एकच स्रोत — state → render, data चे functions म्हणून components.

🧒 सोप्या शब्दांत

वर्गशिक्षक एकच हजेरीपट ठेवतात: कोणते विद्यार्थी आहेत, कोणता class दाखवला आहे, यादी अजून load होते आहे का, आणि काही चुकले का. Board म्हणजे त्या हजेरीपटावरून काढलेली फक्त एक प्रत. Board बदलायचा असेल तर हजेरीपट बदला आणि पुन्हा काढा; board वर थेट खाडाखोड कधीच नाही. प्रत्येक विद्यार्थ्याचे card एकाच छोट्या कृतीने काढले जाते.

📖 नवे शब्दstate — page ला सध्या जे माहीत आहे त्याचा एकच हजेरीपटcomponent — data पासून page चा एक तुकडा बनवणारी छोटी, पुन्हा वापरता येणारी कृतीrender — state वरून page पुन्हा काढणेsingle source of truth — खरी माहिती एकाच ठिकाणी; बाकी सगळे तिथूनच घेतले जाते
1🧠 सत्याचा एकच स्रोत — state objectstate = {students: [5 विद्यार्थी], filter: "3A", loading: false, error: null }renderlocalhost:8000📌 सूचना फलकclass ▾Aishwarya3A · AKatrina3A · ADipika3A · Afooter · 5 विद्यार्थीफक्त 3A चे विद्यार्थी काढलेstate बदला → render() बोलवा · DOM हाताने कधीच बदलू नकाDOM म्हणजे state चे चित्र; state म्हणजे सत्यloading आणि error सुद्धा state — म्हणून तेही काढले जातातui/app.js ओळ 8: एक object, चार fields2🧩 components म्हणजे data ची functionsStudentCard(s){name: "Aishwarya", class: "3A"}Aishwarya3A · A{name: "Katrina", class: "3A"}Katrina3A · A+{name: "Dipika", class: "3A"}Dipika3A · B+शुद्ध: globals वाचत नाही, DOM ला हात लावत नाही — element परत देतेrender() state.students त्यातून नेते आणि यादी एका दमात बदलतेस्वतःची लपलेली state असलेला component म्हणजे सत्याचा दुसरा स्रोत: L07 पर्यंत टाळा3🔁 UI = render(state) — प्रत्येक framework automate करते ती कल्पनाstaterender()DOMevent state बदलतो → पुन्हा renderहाताने (हा repo)render() यादी पुन्हा बांधते — 5 cards ना ठीक, 5,000 ना उधळपट्टीframework सह (L07)React, Vue, Svelte जुने आणि नवे झाड तुलना करून फक्त बदललेल्याला हात लावतात— तेच state object, तेच StudentCard, render() फुकटDOM हाताने बदलणे ✗: दोन जागा विसंगत होतात; पुन्हा न घडवता येणारा bug · ui/app.js render(state) शंभर ओळींच्या आत करते
⏪ आधी

अनेक ठिकाणांहून DOM हाताने बदलला की screen data पासून दूर जाते, आणि त्या फटींमध्ये bugs लपतात.

💡 काय

एक state object हेच सत्य, आणि DOM म्हणजे त्याचे चित्र; StudentCard(s) सारखे components म्हणजे data चे functions.

⚙️ कसे

State मध्ये students, filter, loading आणि error असतात; ते बदला, render() बोलवा, आणि फक्त 3A चे विद्यार्थी काढले जातात.

🎯 का

एकच सत्य असल्याने screen नेहमी data शी जुळते, आणि loading व error सुद्धा state असल्याने ते दाखवणे सोपे जाते.

🚀 पुढे

React, Vue आणि Svelte सारखे frameworks नेमके हेच state आणि render चक्र automate करतात, हे lesson 7 दाखवतो.

🧪 Try it here — state object बदला आणि render(state) फलक पुन्हा काढताना पहा

संपूर्ण धडा 05 वाचा →

6 ♿ सुलभता

प्रत्येकजण फलक वाचू शकतो — keyboard, labels, contrast, focus, ARIA, screen readers.

🧒 सोप्या शब्दांत

काही विद्यार्थी mouse वापरू शकत नाहीत, काहींना screen नीट दिसत नाही, आणि काहींना हलणारी चित्रे त्रासदायक वाटतात. Accessible board सगळ्यांसाठी चालतो: Tab क्रमाने प्रत्येक button पर्यंत पोहोचतो, प्रत्येक box ला label असते, मजकूर वाचता येईल इतका गडद असतो, आणि screen reader '5 pupils shown' असे सांगतो. एकाही विद्यार्थ्याला वापरता येत नसेल, तर board अजून पूर्ण नाही.

📖 नवे शब्दaccessibility — अपंगत्व असलेल्यांसह सगळ्यांना page वापरता येईल असे बनवणेscreen reader — page मोठ्याने वाचून दाखवणारे softwarecontrast — मजकूर पार्श्वभूमीपासून किती उठून दिसतो; किमान 4.5:1focus — keyboard सध्या ज्या control वर आहे तोARIA — साध्या HTML ला सांगता येत नाही तेव्हा screen readers साठी जादा labels
1⌨️ keyboard — Tab सगळ्यापर्यंत पोहोचते, क्रमाने, दिसेल असेlocalhost:8000skip link → #main1🌙 Dark2class ▾3Name4Class ▾5Enrol6← :focus-visible ची कडा1 आधी skip link2–6 प्रत्येक controlवाचनाच्या क्रमानेtabindex > 0 नाहीfocus सापळे नाहीतEnter / Space चालतातEsc बंद करतेफक्त keyboard वापरणारे, switch वापरणारे आणि तुमच्या चाचण्या सगळे याच मार्गाने चालतात2🏷️ नावे · 🎨 contrast · 🎞️ हालचाल · 📣 live regions<label for="name">Name</label><input id="name">एक नाव<img alt="Katrina, class 3A">चित्र, शब्दांत · सजावटीचे असेल तर alt=""Aa 15.6:1✓Aa 2.9:1✗मजकुरासाठी 4.5:1 · फक्त रंगावर नाही@media (prefers-reduced-motion)→ animation: none — पाळलेले<p role="status" aria-live="polite">"5 pupils shown" — जाहीर, focus चोरला नाहीaria-label फक्त दिसणारा मजकूर नसेल तिथे · loading वेळी aria-busy · एक h13♿ accessible = सगळ्यांना आणि प्रत्येक साधनाला वापरता येणारे — a11y म्हणजे बरोबर लिहिलेले HTML🗣️screen reader⌨️फक्त keyboard🎙️आवाजाने नियंत्रण🔍search engine🧪तुमच्या चाचण्यातेच semantics: landmarks, labels, roles, नावे, क्रम$ python3 ui/smoke_test.py✓ html lang · ✓ एक h1 · ✓ प्रत्येक input ला label✓ प्रत्येक img ला alt · ✓ skip link · ✓ role=status✓ tokens · ✓ focus-visible · ✓ API · 10/10 🎉शेवटी जोडलेला थर नव्हे — आजवरच्या प्रत्येक धड्याने ते केलेच: semantic elements (L02), labels (L02), state जाहीर (L05), keyboard (L04)
⏪ आधी

फक्त mouse आणि उत्तम दृष्टी असल्यावरच चालणारा फलक keyboard users, screen reader users आणि इतर अनेकांना बाहेर ठेवतो.

💡 काय

Accessibility म्हणजे प्रत्येकाला फलक वाचता येणे: keyboard, labels, contrast, focus, ARIA आणि screen readers सगळे चालतात.

⚙️ कसे

Tab skip link आणि प्रत्येक control क्रमाने :focus-visible ring सह गाठतो, text ला 4.5:1 contrast लागतो, आणि reduced motion पाळले जाते.

🎯 का

जास्त लोक फलक वापरू शकतात, आणि फक्त keyboard वापरणारे, switch users आणि तुमचे स्वतःचे tests सगळे एकाच वाटेने जातात.

🚀 पुढे

Lesson 10 मधला smoke test प्रत्येक वेळी labels, alt text, skip link आणि :focus-visible तपासतो.

🧪 Try it here — फलक मुद्दाम मोडा आणि checks चालवा; रंगांची जोडी तपासा

संपूर्ण धडा 06 वाचा →

7 🧰 Frameworks

एका धड्यात React, Vue, Svelte — ते काय automate करतात, साधे JavaScript कधी पुरते.

🧒 सोप्या शब्दांत

विद्यार्थ्याचे card हाताने बनवता येते, किंवा तयार संच वापरून. React, Vue आणि Svelte असे संच आहेत: data बदलला की ते तुमच्यासाठी page पुन्हा काढतात. सगळ्यांमागची कल्पना एकच आहे, तुकडे अधिक data म्हणजे page, म्हणून छोट्या board साठी साधी JavaScript पुरेशी आहे; board आणि team मोठी झाली की संच निवडा.

📖 नवे शब्दframework — तुमच्यासाठी page पुन्हा काढण्याचे काम सांभाळणारा तयार संचReact · Vue · Svelte — components आणि data पासून page बनवणारे तीन लोकप्रिय संचuseState — component ला एखादी किंमत लक्षात ठेवू देण्याची React ची पद्धतvanilla JS — कोणताही संच नसलेली साधी JavaScript
1🧰 तेच StudentCard, चार प्रकारे — बदलते ते plumbing, कल्पना नाही⚛️ Reactfunction Card({s}) { const [open,setOpen]=useState(false) return <li>{s.name}</li> }JSX · hooks · सगळ्यात मोठे ecosystemcomponents + state → view🟢 Vue<script setup>const open = ref(false)</script> <li>{{ s.name }}</li>templates · reactive state · सौम्यcomponents + state → view🧡 Svelte<script> let open = false </script><li>{s.name}</li><!-- compiled away at build -->compile होऊन नाहीसे · छोटे bundlescomponents + state → view🍦 साधे JavaScriptfunction StudentCard(s) { const li = tpl.content.cloneNode(true) li.querySelector("b").textContent = s.nameui/app.js · छोट्या फलकांना पुरेसेcomponents + state → viewटीम आणि ecosystem नुसार निवडा, benchmark नुसार नाही · तिसरा component state वाटेपर्यंत vanilla · कोणत्याही framework च्या API आधी L04–L05 शिका2🔁 प्रत्येक framework हे automate करते: state → view, diff सह म्हणजे render() स्वस्तजुने झाडulAishwaryaKatrinaDipikaMeeraनवे झाडulAishwaryaKatrina KDipikaMeerarender1 node ला हात, 5 नाही+ events, components, routing,dev tools, एक build पायरी− एक bundle, एक build, आवृत्त्यांचापट्टा, विचारांची एक पद्धतReact मधला फलक: तीच state,तेच StudentCard, render() फुकटdiffing = तुम्ही काढणार ते झाड आणि पडद्यावरचे झाड यांची तुलना; फक्त फरक बदला · हा repo ते वगळतो: 5 cards वर replaceChildren ठीक
⏪ आधी

छोटा फलक अनेक screens असलेले मोठे app बनला की state आणि DOM updates साठी हाताने लिहिलेले plumbing गोंधळाचे होते.

💡 काय

React, Vue आणि Svelte एकच कल्पना automate करतात, components आणि state मिळून view बनतो, आणि छोट्या फलकांसाठी vanilla JS पुरेसे.

⚙️ कसे

तोच StudentCard चार प्रकारे लिहिला आहे: JSX आणि useState सह React, ref सह Vue, compile होऊन नाहीसा होणारा Svelte, आणि vanilla template.

🎯 का

खालची कल्पना समजली की team आणि ecosystem पाहून निवड करता येते, आणि कोणताही नवीन framework पटकन शिकता येतो.

🚀 पुढे

Frameworks सोबत design tokens वर बांधलेल्या component libraries येतात (lesson 8) आणि मोठे bundles ज्यांचे वजन तपासावे लागते (lesson 9).

🧪 Try it here — तेच card चार बोलींत — आणि एका बदलाने किती DOM nodes ना हात लागतो ते मोजा

संपूर्ण धडा 07 वाचा →

8 🎽 Design systems & tokens

शाळेचा गणवेश — एका token पत्रकातून रंग, अंतर, अक्षरे आणि dark mode.

🧒 सोप्या शब्दांत

शाळेचा गणवेश म्हणजे कोणीही शिवला तरी सगळ्यांचे रंग सारखेच. Design tokens म्हणजे page चा गणवेश: एक कागद रंग आणि अंतरांना नावे देतो, जसे --accent किंवा --space-2, आणि प्रत्येक भाग आकड्यांऐवजी तीच नावे वापरतो. Accent एकदा बदला की पूर्ण board बदलतो; dark mode म्हणजे फक्त किमतींचा दुसरा संच.

📖 नवे शब्दdesign token — नाव दिलेली किंमत, जसे --space-2 = 12px, आकड्याऐवजी सगळीकडे वापरली जाणारीdesign system — प्रत्येक page सारखे दिसावे म्हणून सामायिक tokens आणि भागCSS variable — CSS मधले किंमत धरणारे नाव, var(--name) असे वापरले जातेdark mode — फक्त token किमती बदलून बनवलेली गडद रंगांची theme
1🎽 tokens — नावाची मूल्ये, जादूचे आकडे नाहीत:root { --bg: #f8fafc; --ink: #0f172a; --accent: #db2777; --space-1: 6px; --space-2: 12px; --space-3: 20px; --radius: 12px;}रंगसंगती--space-1 = 6px--space-2 = 12px--space-3 = 20pxअंतरांचा मापदंड.card { padding: var(--space-2); border-radius: var(--radius); }components कधीच 12px म्हणत नाहीत — ते --space-2 म्हणतात--accent बदला आणि अख्खा फलक बदलतो: हीच अख्खी कल्पना2🌙 dark mode = tokens ची अदलाबदल — components कधीच बदलत नाहीतlocalhost:8000📌 सूचना फलकclass ▾Aishwarya3A · AKatrina3A · ADipika3A · Afooter · 5 विद्यार्थीlight: --bg #f8fafc · --ink #0f172alocalhost:8000📌 सूचना फलकclass ▾Aishwarya3A · AKatrina3A · ADipika3A · Afooter · 5 विद्यार्थीdark: --bg #0b1220 · --ink #e2e8f0@media (prefers-color-scheme: dark) { :root { --bg: #0b1220; … } }[data-theme="dark"] { --bg: #0b1220; … } /* the 🌙 button */3📚 design system = tokens + components + नियम — एक गणवेश, प्रत्येक पानtokensरंग · अंतर · type · radius · shadow · motion — एकदाच ठरवलेलेcomponentsbutton · card · form field · status — फक्त tokens पासून बांधलेलेनियमकधी कोणते वापरायचे · contrast एकदा तपासलेला · एक h1 · मापदंडावरची अंतरेtype चा मापदंडh1 — सूचना फलकh2 — सूचना फलकbody — सूचना फलकsmall — सूचना फलकसुसंगतता हेच वैशिष्ट्य: 6/12/20 अंतरांचा मापदंड, contrast एकदा तपासलेली रंगसंगती, एक radius — आणि प्रत्येक नवे पान इथलेच वाटते
⏪ आधी

12px आणि एकच गुलाबी hex code सगळीकडे copy केल्याने एक रंग बदलणे किंवा dark mode आणणे म्हणजे प्रत्येक file बदलणे.

💡 काय

Design tokens म्हणजे शाळेचा गणवेश: :root वरच्या --accent आणि --space-2 सारख्या नावाच्या किमती, ज्या प्रत्येक component वापरतो.

⚙️ कसे

.card padding: var(--space-2) आणि border-radius: var(--radius) वापरतो; dark mode फक्त tokens च्या किमती बदलतो, components कधीच नाही.

🎯 का

--accent एकदा बदला आणि संपूर्ण फलक बदलतो, म्हणून design एकसारखे राहते आणि नवीन theme जवळजवळ फुकट मिळते.

🚀 पुढे

Tokens वाढून अनेक apps मध्ये वापरली जाणारी design system बनतात, आणि smoke test tokens styles.css मध्ये आहेत का ते तपासतो.

🧪 Try it here — तीन tokens बदला आणि theme पलटा — components कधीच बदलत नाहीत

संपूर्ण धडा 08 वाचा →

9 🚀 कामगिरी

फलक पटकन उघडतो — bundles, lazy प्रतिमा, caching, Core Web Vitals.

🧒 सोप्या शब्दांत

दिसायला खूप वेळ लागणारा notice board वाचक गमावतो. Phone जी प्रत्येक file download करतो तिला वेळ लागतो: आपला पूर्ण board 12 KB आहे, तर एका framework चा bundle 300 KB असू शकतो, हळू 3G phone वर सुमारे 2 सेकंद. म्हणून कमी पाठवा, चित्रे लहान करा, खालची चित्रे गरज असेल तेव्हाच load करा, आणि आधी आणलेल्या files phone ला जपून ठेवू द्या.

📖 नवे शब्दbundle — download साठी एकत्र बांधलेल्या सगळ्या code fileslazy loading — चित्राजवळ scroll केल्यावरच ते load करणेcache — जपून ठेवलेली प्रत, म्हणजे phone ला ती पुन्हा download करावी लागत नाहीCore Web Vitals — वेगाचे तीन गुण: मुख्य मजकूर दिसणे, tap ला प्रतिसाद, काही न उडी मारणेCLS — load होताना page किती उड्या मारतो
1⚖️ वजन — रंगवण्याआधी फोन काय download करतोindex.html4 KBstyles.css3 KBapp.js5 KBफलक: 12 KB12 KBएक framework bundle300 KBminify · bundle · tree-shake · compress (gzip / br) — आणि कमी पाठवा: तीन फाइल्ससाठी framework नको3G वर 300 KB चे bundle म्हणजे पहिल्या रंगाआधी 2 s2🖼️ चित्रे आणि 🧊 caching — दोन सगळ्यात स्वस्त विजय<img src="katrina.webp" width="96" height="96" loading="lazy" alt="Katrina">width + height राखीव → काहीच उडत नाही (CLS) · loading=lazy → खालचे थांबतेwebp / avif → अर्धे bytes · योग्य आकार, 4000px चा फोटो लहान केलेला नाहीapp.3f2a9c.jsCache-Control: max-age=1yhash असलेले नाव कधीच अर्थ बदलत नाही → कायम cache करा; नवा build = नवे नावindex.html: max-age=0 म्हणजे नवी नावे दिसतात · CDN वाचकाजवळ प्रत ठेवते (Networking L11)फलक 3 फाइल्स आणि inline SVG avatars पाठवतो — load करायला थोडे असल्याने चांगले गुण3📏 Core Web Vitals — माणसाला "जलद" म्हणजे काय0 s0.5 s1.0 s1.5 s2.0 sLCP 1.2 s — सगळ्यात मोठी गोष्ट रंगवली✓ 2.5 s च्या आतINP 80 mstap → प्रतिसाद · ✓ < 200 msCLS 0.02काहीच उडत नाही · ✓ < 0.1← height नसलेले चित्र: मजकूर उडतो (CLS ✗)DevTools / Lighthouse ने हळू फोनवर मोजा, laptop वर नाही · जलद फलक म्हणजे बहुतेक हलका फलक: कमी bytes, कमी requests, आकार सांगितलेले
⏪ आधी

3G वर 300 KB framework bundle म्हणजे पहिल्या paint आधी 2 s, आणि आकार राखून न ठेवलेल्या images मुळे पान उडी मारते.

💡 काय

Performance म्हणजे फलक जलद load करणे: कमी bytes पाठवा, images शहाणपणाने load करा, चांगले cache करा आणि Core Web Vitals पाहा.

⚙️ कसे

संपूर्ण फलक 12 KB आहे; images ना width, height आणि loading=lazy मिळते, आणि app.3f2a9c.js सारखी hashed file वर्षभर cache होते.

🎯 का

जलद पाने वाचकांना टिकवतात, विशेषतः मंद phones वर, आणि चांगले Core Web Vitals म्हणजे कमी उड्या आणि जलद प्रतिसाद.

🚀 पुढे

Lesson 12 मधला deploy cache busting साठी hashed नावांवर अवलंबून असतो आणि खऱ्या वाचकांकडून LCP, INP आणि CLS मोजतो.

🧪 Try it here — फलक काय पाठवतो ते निवडा आणि bytes, 3G वरचे सेकंद, आणि उडी वाचा

संपूर्ण धडा 09 वाचा →

10 🧪 UI ची चाचणी

फलक अजून उभा आहे का? — unit, component, end-to-end, visual, आणि smoke test.

🧒 सोप्या शब्दांत

वादळानंतर तुम्ही पाहता की notice board अजून उभा आहे का: प्रत्येक notice आहे का, प्रत्येक box ला label आहे का? अनेक छोट्या, जलद तपासण्या प्रत्येक तुकडा वेगळा तपासतात; काही हळू तपासण्या खरा browser वापरून माणसासारखा form भरतात. आपला smoke test code बदलला की प्रत्येक वेळी काही सेकंदात 10 तपासण्या करतो.

📖 नवे शब्दunit test — एक छोटे function वेगळे तपासतो; जलद, म्हणून खूप लिहाcomponent test — नमुना data वापरून एक तुकडा काढतो आणि निकाल तपासतोend-to-end test — robot browser खऱ्या माणसासारखा page वापरतोvisual test — कोणीही न ठरवलेले दिसण्यातले बदल पकडण्यासाठी screenshots ची तुलनाsmoke test — मूलभूत गोष्टी जागेवर आहेत याची जलद तपासणी
1🧪 पिरॅमिड — अनेक unit, थोडे end-to-end🧭 end-to-end · थोडेखरा browser फॉर्म भरतो (Playwright)🧩 component · काहीtest data सह एक तुकडा render करा, DOM तपासा🔬 unit · अनेकशुद्ध functions: StudentCard(s) बरोबर मजकूर देते📸 visualscreenshot ची तुलनाकोणीच बदलू न इच्छिलेलेCSS पकडतातवर हळू आणि अमूल्य; खाली जलद आणि अनेक · प्रत्येक थर CI मध्ये चालतो (CI/CD शाळा)2🔥 smoke test — 10 checks, ~25 ओळी$ python3 ui/smoke_test.py✓ <html lang> ✓ नेमका एक <h1>✓ प्रत्येक input ला label ✓ प्रत्येक img ला alt✓ आधी skip link ✓ role=status live region✓ styles.css मध्ये tokens ✓ :focus-visible ला style✓ mock API उत्तर देते ✓ data सह innerHTML नाही10 / 10 🎉 exit 0खऱ्या फाइल्स वाचते; label किंवा alt गायब झाल्या क्षणी build नापास3👀 users जे पाहतात ते तपासा, class ची नावे नाही// ui/tests/board.spec.js (Playwright)await page.getByLabel("Name").fill("Zoya");await page.getByRole("button", { name: "Enrol" }).click();await expect(page.getByRole("status")).toHaveText(/enrolled/);page.locator(".btn-primary") ✗ CSS चे नाव बदलले की मोडतेgetByRole("button", { name: "Enrol" }) ✓ माणसाला जे दिसते तेscreen reader वापरतो तीच नावे (L06) — accessible HTML चाचण्या सोप्या करतेविद्यार्थी नोंदवणारी एक e2e class आहे का तपासणाऱ्या पन्नास इतकी मोलाचीकळस-नियम: दुरुस्त केलेल्या प्रत्येक bug ला, तो पकडू शकणाऱ्या सगळ्यात खालच्या थरात, एक चाचणी
⏪ आधी

CSS किंवा HTML मधला छोटा बदल फलक शांतपणे मोडू शकायचा, आणि खऱ्या user ला दिसेपर्यंत कोणाच्याच लक्षात यायचे नाही.

💡 काय

UI testing म्हणजे pyramid: खूप unit tests, काही component tests, थोडे end-to-end tests, आणि visual screenshot diffs.

⚙️ कसे

python3 ui/smoke_test.py सुमारे 25 ओळींत 10 तपासण्या चालवतो, जसे प्रत्येक input ला label आणि प्रत्येक img ला alt text आहे का.

🎯 का

तळाचे जलद tests बहुतेक bugs स्वस्तात पकडतात, आणि वरचे मंद end-to-end tests खरा प्रवाह अजून चालतो हे सिद्ध करतात.

🚀 पुढे

प्रत्येक थर CI मध्ये चालतो (CI/CD school), आणि smoke test lesson 12 मधल्या deploy वर पहारा देतो.

🧪 Try it here — जिवंत फलकावर दहा smoke checks चालवा — काहीतरी मोडल्यानंतर

संपूर्ण धडा 10 वाचा →

11 📨 Backends शी बोलणे

काउंटरच्या चिठ्ठ्या भरणे — CORS, ब्राउझरमधले tokens, loading आणि error स्थिती, XSS.

🧒 सोप्या शब्दांत

Board office counter कडून विद्यार्थ्यांची माहिती आणतो, पण कोणते boards आपली उत्तरे वाचू शकतात ते counter ठरवतो; त्या नियमाला CORS म्हणतात. प्रत्येक fetch चे तीन चेहरे काढावे लागतात: 'Loading…', निकाल, किंवा स्पष्ट error. आणि उत्तर कधीच थेट HTML म्हणून चिकटवू नका, नाहीतर एखादे लबाड नाव तुमच्या board वर code चालवू शकते; या हल्ल्याला XSS म्हणतात.

📖 नवे शब्दCORS — कोणत्या websites त्याची उत्तरे वाचू शकतात ते server सांगतोorigin — scheme + host + port, जसे https://board.school.orgloading state — उत्तराची वाट पाहताना page काय दाखवतेXSS — असा हल्ला जिथे कोणाचा तरी मजकूर तुमच्या page वर code म्हणून चालतोtoken — user कोण आहे हे सिद्ध करण्यासाठी page पाठवतो तो pass
1🚧 CORS — counter सांगतो कोणते फलक त्याला बोलावू शकतातboard.school.org📌 सूचना फलकAishwarya3A · AKatrina3A · Afooter · 5 विद्यार्थीorigin Aapi.school.orgorigin BOPTIONS /api/students (preflight)Access-Control-Allow-Origin: https://board.school.orgGET /api/students ✓header नाही, किंवा चुकीचा origin → BROWSER उत्तर अडवतोrequest counter पर्यंत पोहोचली; पानाला उत्तर वाचायची परवानगी नाहीsame origin = तोच scheme + host + port · mock API header पाठवते (ui/mock_api.py)cookies सोबत Allow-Origin: * कधीच नाही2⏳ प्रत्येक request ला तीन चेहरे — तिन्ही काढाloadingaria-busy="true"Loading…▒▒▒▒ ▒▒▒▒यश5 pupils shownAishwarya · Katrina · DipikaMeera · RohanerrorCould not load: 503[ Retry ]role="alert"mock API वर ?slow=1 आणि ?fail=1 ने प्रत्येक चेहरा हवा तेव्हा दिसतोकधीच न संपणारा spinner आणि रिकामी यादी हे दोन नेहमीचे bugs — state.loading आणि state.error काढले जातातफलकावर दयेसाठी तपासा (minlength), counter वर सत्यासाठी (API चा problems सह 400)3🪪 browser मधले tokens · 🛡️ XSS — फलक सुरक्षित ठेवणारे दोन नियमconst KEY = "hall-pass-123" ✗JS मधले काहीही सार्वजनिक — view sourceअल्पायुषी user token ✓किंवा session साठी httpOnly cookie; refresh, expire, scopeel.innerHTML = s.name ✗नाव म्हणून "<img onerror=…>" code चालवतेel.textContent = s.name ✓मजकूर मजकूरच राहतो · शिवाय CSP headerXSS = data ला HTML मानल्याने फलक अनोळखी script चालवतो · फलकावरचा प्रत्येक data textContent मधून गेला (grep करा)CSP: Content-Security-Policy: default-src 'self' — browser inline scripts आणि परके origins नाकारतो
⏪ आधी

कोणालाच न समजणाऱ्या CORS error ने fetch अयशस्वी व्हायचा, आणि API मंद झाला की पान गोठायचे किंवा कोरे व्हायचे.

💡 काय

Backends शी बोलणे म्हणजे CORS, browser मधले tokens, loading आणि error states, आणि XSS सुरक्षितपणे हाताळणे.

⚙️ कसे

Browser आधी OPTIONS preflight पाठवू शकतो, आणि Access-Control-Allow-Origin मध्ये फलकाचे नाव असेल तरच पान उत्तर वाचू शकते.

🎯 का

फलक वेगवेगळ्या origins मध्ये चालतो, loading, error आणि यश स्पष्ट दाखवतो, आणि API data ला कधीच script म्हणून चालू देत नाही.

🚀 पुढे

पुढे capstone मध्ये फलक build होतो, CDN वर deploy होतो आणि खऱ्या वाचकांकडून त्यावर लक्ष ठेवले जाते (lesson 12).

🧪 Try it here — CORS साठी origin आणि header निवडा; मग वाईट नाव चिकटवा आणि textContent विरुद्ध innerHTML पहा

संपूर्ण धडा 11 वाचा →

12 🚚 Build, deploy & निरीक्षण

फलक भिंतीवर लावणे — static hosting, CDN, cache busting, निरीक्षण; कळस-प्रकल्प.

🧒 सोप्या शब्दांत

Board तयार झाला की तुम्ही त्याच्या प्रती प्रत्येक गावात लावता, म्हणजे जवळच्या वाचकांना तो लवकर दिसतो; याला CDN म्हणतात. प्रत्येक push वर tests चालतात, मग files प्रकाशित होतात, आणि नवीन files ना नवीन नावे मिळतात, म्हणजे कोणीही जुन्या प्रतीत अडकत नाही. मग लक्ष ठेवत राहा: खऱ्या वाचकांचे phones errors आणि board किती लवकर load झाला ते कळवतात.

📖 नवे शब्दdeploy — नवीन version लोकांना वापरता येईल अशा ठिकाणी ठेवणेstatic hosting — चालू ठेवायला server program नसताना साध्या files देणेCDN — वाचकांच्या जवळ, अनेक शहरांत तुमच्या files च्या प्रतीcache busting — नवीन versions ना नवीन file नावे, म्हणजे जुन्या प्रती वापरल्या जात नाहीतmonitoring — errors आणि मंदपणासाठी खऱ्या वापरावर लक्ष ठेवणे
1🏗️🚚 build आणि static deploy — फलक म्हणजे फक्त फाइल्सindex.htmlstyles.cssapp.jsgit push⚙️ CIsmoke_test.py ✓Pages/ S3CDN — प्रत्येक शहरात एक प्रतवाचकतीन फाइल्ससाठी bundler नको; मोठा फलक bundle + hash जोडतो (L09)GitHub Pages / S3 + CloudFront / कोणताही CDN — static म्हणजे जिवंत ठेवायचा server नाहीcommit ने cache-bust: नव्या फाइल्सना नवी नावे, index.html कधीच जास्त वेळ cache नाही2👀 निरीक्षण — खऱ्या वाचकांकडून errors आणि vitalsवाचकाचा फोन📌 सूचना फलकAishwarya3A · AKatrina3A · Afooter · 5 विद्यार्थीbeaconJS errors: render() मध्ये TypeErrorLCP 1.2 s · INP 80 ms · CLS 0.02प्रत्येक API call ला request id → tracedashboarderrors / 1k views14p75 LCP (s)4.8API 5xx %6वाचकांना जाणवते त्यावर alert (errors, LCP), CPU वर नाही · फलक, दार आणि counter वर तोच request id3🧭 अख्खा मार्ग — आणि हीच site नेमकी अशीच deploy होतेHTMLCSSJSstatea11ytokensजलदतपासलेलेbackendलावले 📌शाळेचे प्रत्येक पान: static फाइल्स, GitHub Pages, commit ने cache-bust — CI/CD शाळेची मेलरूम पोहोचवतेकळस-प्रकल्प: फलकावर गृहपाठाची यादी जोडा — स्वतःचे state, component, a11y तपासणी, smoke तपासण्या आणि deploy सहL01 → L12 एका वाक्यात: browser मजकुराचे झाड करतो, CSS ते सजवते, JS ते state चे चित्र ठेवते, सगळे वाचू शकतात, आणि ते फाइल्स म्हणून जाते
⏪ आधी

फक्त तुमच्या laptop वर चालणारा फलक कोणाच्याच कामाचा नाही, आणि live झाल्यावर वाचकांच्या phones वरचे errors दिसत नाहीत.

💡 काय

Deploy static files GitHub Pages किंवा S3 वर CDN मागे ठेवतो, आणि observe करणे खऱ्या वाचकांकडून errors आणि vitals गोळा करते.

⚙️ कसे

git push CI मध्ये smoke_test.py चालवतो, CDN सह Pages किंवा S3 वर publish करतो, आणि beacon JS errors सह LCP, INP आणि CLS कळवतो.

🎯 का

Static hosting म्हणजे चालू ठेवायला server नाही, आणि खऱ्या वाचकांचे data पुढे नेमके काय दुरुस्त करायचे ते सांगते.

🚀 पुढे

हा capstone Database, API आणि UI schools ला एका live product मध्ये जोडतो, जे CI/CD सुरक्षितपणे पुढे पाठवत राहू शकते.

🧪 Try it here — एक commit मेलरूममधून CDN पर्यंत ढकला — आणि फाइलचे नाव का बदलते ते पहा

संपूर्ण धडा 12 वाचा →

धडा 01 सुरू करा → 🗓️ अभ्यास योजना (4 आठवडे) 📐 सर्व 12 धड्यांच्या आकृत्या 🧪 प्रश्नमंजुषा (15 प्रश्न) ⏮️ आधी काय होते & फायदे-तोटे