جاوااسکریپت | JavaScript
520 subscribers
690 photos
150 videos
4 files
551 links
کانال @IR_javascript حاوی اطلاعات مفید در حوزه برنامه نویس فرانت که بصورت روزانه بروز می‌شود.
در این کانال شما به:
[1] مطالب تازه
[2] تحلیل‌های عمیق
[3] نکات آموزشی
[4] چالش
[5] ابزار و راهنمایی‌های کاربردی
دسترسی خواهید داشت.

🆔@IR_javascript
Download Telegram
چطور می‌توان یک عنصر را وادار کرد تا عرض خود را پله‌پله تغییر دهد**؟

فرض کنید می‌خواهید یک صفحه‌ی شطرنجی داشته باشید که در هر شرایطی یکپارچه باقی بماند.

امروز چند روش برای رسیدن به این هدف داریم:

**۱. از آنا تودور:
([https://twitter.com/anatudor](https://twitter.com/anatudor))
نمونه در CodePen: [https://codepen.io/thebabydino/pen/zYbZpBq](https://codepen.io/thebabydino/pen/zYbZpBq)

در این روش از تابع mod() استفاده می‌شود:

width: calc(95vmin + -1 * mod(95vmin, 15px));


اما مشکل این‌جاست که مرورگر Chrome هنوز از تابع mod پشتیبانی نمی‌کند... ولی ناامید نشوید!
دو روش دیگر هم از تمانی عفیف (Temani Afif) معروف به CSS Challenges داریم: ([https://twitter.com/ChallengesCss](https://twitter.com/ChallengesCss))

۲. روش دوم:
در واقع، نتیجه‌ی تابع بالا همان گرد کردن (rounding) است. و خوشبختانه، چنین تابعی هم در CSS وجود دارد! مثلاً:

min-width: round(95vmin, 15px);


نمونه: [https://codepen.io/alinaki/pen/VwRMpPY](https://codepen.io/alinaki/pen/VwRMpPY)

این ویژگی پیش‌تر در Chrome کار نمی‌کرد — تا نسخه‌ی صد و بیست و پنجم.
چرا؟ چون تیم Chrome تصمیم گرفت اول مثلثات را اضافه کند و ریاضیات ساده را بعداً :)

۳. و در نهایت روش سوم:
طبیعتاً با CSS Grid هم می‌شود:
[https://codepen.io/t_afif/pen/KKEXwmR](https://codepen.io/t_afif/pen/KKEXwmR)

و راز کار در این خط است:

grid-template-columns: repeat(auto-fill, 15px);





#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
👍1
هفت مدیاکوئری برتر که در پروژه‌ها به کارتان می‌آیند 👍

---

✔️ width / height (ابعاد نمای دید – با سینتکس جدید بازه‌ای)

این مورد کلاسیک برای طراحی واکنش‌گراست، اما اکنون سینتکس بازه‌ای جدیدی دارد (مثل >، <، >=، <= و حتی 900px < width < 1200px) که باعث خوانایی بیشتر نسبت به حالت‌های min-/max- می‌شود.

از آن برای تنظیم شبکه (grid) یا کامپوننت‌ها در عرض‌های مختلف پنجره استفاده کنید.

@media (width > 900px) { /* دسکتاپ */ }
@media (900px < width < 1200px) { /* حالت میانی */ }


---

✔️ hover / pointer / any-hover / any-pointer (بررسی توانایی‌های ورودی دستگاه)

به جای حدس زدن اینکه کاربر با «تلفن، تبلت یا رایانه» است، مستقیماً قابلیت‌های ورودی دستگاه را بررسی کنید: آیا از اثر هاور پشتیبانی می‌کند؟ دقت اشاره‌گر چقدر است؟

/* ورودی اصلی — ماوس */
@media (hover: hover) and (pointer: fine) { ... }

/* صفحات لمسی (نقاط تماس درشت‌تر) */
@media (hover: none) and (pointer: coarse) { ... }


---

✔️ prefers-reduced-motion (کاهش یا حذف انیمیشن‌ها برای کاربران حساس به حرکت)

این ویژگی برای دسترس‌پذیری اهمیت زیادی دارد — به کمک آن می‌توان انیمیشن‌ها را برای افرادی با مشکلات تعادلی حذف یا ملایم کرد.

@media (prefers-reduced-motion: reduce) {
.carousel { animation: none; }
}


---

✔️ prefers-color-scheme و forced-colors (حالت روشن/تاریک و حالت‌های کنتراست بالا)

⏺️ prefers-color-scheme — روش استاندارد برای هماهنگ شدن با حالت تاریک یا روشن.


⏺️ forced-colors — برای برطرف کردن مشکلات در حالت‌های کنتراست بالا (مثل Windows High Contrast) مفید است.
می‌توانید آن را با forced-color-adjust ترکیب کنید.

@media (prefers-color-scheme: dark) { ... }
@media (forced-colors: active) { /* اصلاحات برای کنتراست بالا */ }


---

✔️ resolution (برای بارگذاری تصاویر یا گرافیک با وضوح بالا)

کاربردی برای انتخاب تصاویر پس‌زمینه یا منابع گرافیکی با رزولوشن‌های مختلف (یک‌برابر، دوبرابر و غیره).

background-image: url(image-1x.jpg);

@media (resolution > 1x) {
background-image: url(image-2x.jpg);
}


---

✔️ orientation (جهت‌گیری — عمودی یا افقی)

ویژگی‌ای ساده اما گاهی حیاتی: اگر چیدمان صفحه در حالت افقی یا عمودی تفاوت زیادی دارد، از این ویژگی استفاده کنید.
اما برای تشخیص نوع دستگاه به آن تکیه نکنید — برخی کاربران مانیتور عمودی دارند و موارد مشابه.

@media (orientation: portrait) { ... }


---

✔️ inverted-colors (رنگ‌های معکوس) / جایگزین: prefers-contrast

inverted-colors زمانی مفید است که سیستم‌عامل یا مرورگر رنگ‌ها را معکوس می‌کند؛ این ویژگی به اصلاح نمایش سایه‌ها و رسانه‌ها کمک می‌کند.


#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
👍3
جای‌گذاری تولتیپ‌ها و پنجره‌های کشویی.

در حال حاضر برای این کار از کتابخانه‌های جاوااسکریپتی نه‌چندان ساده مانند floating-ui استفاده می‌شود؛ کتابخانه‌هایی که به‌دلیل داشتن چنین قابلیت‌هایی هم حجم قابل‌توجهی دارند و هم بر کارایی اثر می‌گذارند.

اما راه‌حل بومی CSS اینجاست: CSS Anchor Positioning
(مستندات: developer.mozilla.org)

پشتیبانی آن در مرورگرهای دسکتاپ مدت‌هاست فراهم شده و در مرورگرهای موبایل نیز از پاییز امسال به‌طور گسترده فعال شده است.
و البته فایرفاکس همچنان مسخره بازی همیشگی خود را ادامه می‌دهد

#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
😁2
arkregexDemo.webm
2.5 MB
احتمالاً بسیاری از شما با مشکل نوشتن و نگهداری صحیح عبارات منظم (Regular Expressions) مواجه شده‌اید.

به‌ویژه مسئله‌ی درک و خوانایی همیشه مطرح است — آیا گروه‌های گیرنده را به‌درستی در توالی شرایط قرار داده‌اید؟ خروجی مورد انتظار چیست؟ و اصلاً آیا در عبارت منظم فعلی خطایی وجود دارد یا نه؟

بله، می‌توان از سرویس‌هایی مانند regex101.com استفاده کرد، اما گاهی دوست داریم همه‌چیز را بدون ترک محیط توسعه انجام دهیم.

به‌تازگی راه‌حل بسیار خوبی برای این مشکل معرفی شده است — ArkRegex، که نوعی انتزاع (abstraction) بر پایه‌ی new RegExp() است و علاوه بر آن، اطلاعات توضیحی و اعتبارسنجی در سطح تایپ‌های TypeScript ارائه می‌دهد.

🔗https://arktype.io/docs/blog/arkregex
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
افزونه‌ی PT Application Inspector آسیب‌پذیری‌ها و ویژگی‌های مستندسازی‌نشده را در کد منبع برنامه شناسایی می‌کند. افزون بر تحلیل کد، ماژول‌های داخلی آن خطاها را در فایل‌های پیکربندی و همچنین آسیب‌پذیری‌ها را در مؤلفه‌ها و کتابخانه‌های شخص‌ ثالثی که در توسعه‌ی برنامه استفاده شده‌اند، تشخیص می‌دهند.
حالا الگوریتم هوشمند فقط فهرستی از مشکلات ارائه نمی‌دهد، بلکه پیشنهاد می‌کند از کجا بررسی را آغاز کنید: کدام آسیب‌پذیری‌ها را باید ابتدا تأیید کرد و کدام را رد نمود. علاوه‌براین، موارد مشابه را گروه‌بندی می‌کند تا بتوانید آن‌ها را به‌صورت دسته‌جمعی پردازش کنید، نه جداگانه.

● مدیریت گروهی آسیب‌پذیری‌ها. در افزونه‌ی مخصوص IntelliJ IDEA سرانجام قابلیت موردانتظار مدیریت گروهی اضافه شده است. کافی است چند آسیب‌پذیری را در زبانه‌ی Detected Vulnerabilities (آسیب‌پذیری‌های شناسایی‌شده) تیک بزنید و وضعیت همه را یک‌جا تغییر دهید. برای کاربران VSCode وعده داده‌اند که این قابلیت تا پایان سال عرضه شود.

● کوپایلت مبتنی بر LLM (مدل زبانی بزرگ) — قابلیتی آزمایشی که فعلاً فقط برای کاربران IntelliJ فعال است. در این افزونه، یک دستیار هوش مصنوعی مبتنی بر YandexGPT برای تولید اصلاحات مستقیم در محیط IDE ادغام شده است. این سیستم در رفع خودکار کد کمک می‌کند: نه‌تنها آسیب‌پذیری را پیدا می‌کند، بلکه وصله‌ای آماده با پیش‌نمایش تغییرات ارائه می‌دهد. همچنین منطق اصلاح را توضیح می‌دهد — می‌توانید از آن بپرسید چرا این تغییر به این شکل انجام شده است. همه‌ی پیشنهادهای تولیدشده نیز در زبانه‌ی جدیدی با عنوان «How to Fix» (چگونه اصلاح کنیم) ذخیره می‌شوند.

این قابلیت به‌صورت پیش‌فرض غیرفعال است (باید از بخش تنظیمات فعال شود) و برای تمام آسیب‌پذیری‌ها به‌جز موارد ردشده یا مستثناشده عمل می‌کند.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
ظر شما درباره‌ی اشکال‌زدایی (Debugging) در دستگاه‌های همراه چیست؟ صادقانه بگویید. به نظر من که یک شکنجه است.

بله، می‌توانید تلفن را با کابل به کامپیوتر وصل کنید و از کنسول مرورگر دسکتاپ استفاده نمایید. یا از مرورگر کیوی (Kiwi Browser) درتلفن همراه استفاده کنیم
ولی در وب ویو ها چه کنیم

ارودا (Eruda) یک کنسول تعبیه‌شدنی (Embeddable) برای مرورگرهای موبایل: https://github.com/liriliri/eruda

نمونه‌ی نمایشی: https://eruda.liriliri.io/

در اصل، شبیه به یک کپی بسیار ساده شده از ابزارهای توسعه وب کروم به نظر می‌رسد و کاملاً می‌تواند در اشکال‌زدایی به شما کمک کند، به خصوص با توجه به تعداد افزونه‌های رسمی و غیر رسمی مختلف، از نمایش بصری لمس‌ها گرفته تا پس‌زمینه‌ی پیکسل-پرفکت.


🔗https://eruda.liriliri.io
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
اسپلاید (Splide) با تایپ‌اسکریپت (TypeScript) نوشته شده است. سبک، سریع، و دارای انبوهی از قابلیت‌های یکپارچه‌سازی است. ده‌ها مثال استفاده بلافاصله در صفحه‌ی اصلی موجود است. به سئوی صفحات آسیبی نمی‌زند. امتیاز لایت‌هاوس (Lighthouse) نیز بسیار سبز است.

هیچ وابستگی‌ای ندارد و از IEده (Internet Explorer 10) به بعد پشتیبانی می‌کند.


🔗https://splidejs.com/#example=rendering--jelly-slider
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
👍1
وقتی فناوری‌ها پیر می‌شوند، معمولاً این فرسودگی به‌سادگی قابل‌تشخیص نیست — تا وقتی که دیگر خیلی دیر شده باشد. همه‌چیز ظاهراً درست کار می‌کند، اما به‌روزرسانی‌های امنیتی متوقف می‌شوند، وابستگی‌های قدیمی دیگر قابل ساخت نیستند، و نسخه‌های جدید کتابخانه‌ها سازگاری را از بین می‌برند. به این ترتیب، پروژه به‌آرامی به یک بمب ساعتی تبدیل می‌شود.

برای جلوگیری از چنین موقعیت‌هایی، پروژه‌ای وجود دارد به نام endoflife.date (https://endoflife.date/
).
این سایت نشان می‌دهد پشتیبانی از زبان‌ها، کتابخانه‌ها، فریم‌ورک‌ها و سیستم‌ها چه زمانی پایان می‌یابد. کافی است مثلاً «Node.js» یا «Ubuntu» را جست‌وجو کنید تا فوراً ببینید کدام نسخه‌ها هنوز فعال‌اند و کدام را باید به‌روزرسانی کرد. حتی یک API عمومی هم دارد (https://endoflife.date/docs/api/v1/
) تا بتوانید بررسی نسخه‌ها را مستقیماً در CI خود بگنجانید و اعلان‌های خودکار دریافت کنید.

البته باید با درایت به‌روزرسانی کرد. گاهی نسخه‌ی جدید تغییرات ناسازگار و دردسرهای زیادی به‌همراه می‌آورد. برای همین، نسخه‌های LTS ایجاد شده‌اند — شاخه‌های پایداری که مدت طولانی‌تری پشتیبانی می‌شوند و تغییراتشان تدریجی‌تر است. این نسخه‌ها برای زمانی مناسب‌اند که پایداری و پیش‌بینی‌پذیری برایتان اهمیت دارد.

ایده‌ای ساده، اما در بلندمدت صرفه‌جویی بزرگی در زمان و اعصاب شما خواهد بود.

#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
This media is not supported in your browser
VIEW IN TELEGRAM
نکته‌ی CSS

لازم نیست برای تم روشن و تیره نسخه‌های جداگانه‌ای از لوگو در مقیاس خاکستری آماده کنید.

این کار به راحتی با استفاده از CSS Filters انجام می‌شود:

/* برای تم روشن */
.logos-container img {
filter: brightness(0);
opacity: 0.6;
}

/* برای تم تیره */
.logos-container img {
filter: invert(1) saturate(0) brightness(4);
opacity: 0.6;
}


به این ترتیب می‌توانید با یک تصویر واحد، لوگو را برای هر دو تم به درستی نمایش دهید و نیازی به فایل‌های اضافی نیست.


#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
2👍2
👀 Umami ۳.۰: جایگزین خودمیزبان گوگل آنالیتیکس

یک ابزار مشابه Plausible یا Google Analytics است، اما با Node.js ساخته شده و آماده است تا خودتان آن را روی سرور خود میزبانی کنید.

ویژگی‌ها:

جمع‌آوری آمار وب بدون ردگیری شخصی کاربران

داشبورد ساده و قابل فهم

پشتیبانی از چندین سایت و کاربر

MIT License، یعنی کاملاً متن‌باز

همچنین امکان استفاده از سرویس میزبانی‌شده پولی وجود دارد

لینک‌ها:

نسخه ۳.۰: GitHub

سرویس میزبانی‌شده: Umami.is

توسعه‌دهنده: Umami Software, Inc.

#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
1
شما HTML را نمی‌شناسید:time و data
در HTML دو عنصر نسبتاً نادر وجود دارد: ‎<time> و ‎<data>. عنصر ‎<time> گاهی در صفحاتی دیده می‌شود که به معناشناسی توجه دارند، اما ‎<data> تقریباً هیچ‌گاه در طبیعت وب مشاهده نمی‌شود. ویژگی مشترک هر دو عنصر، قابلیت افزودن داده‌های machine-readable است.

عنصر ‎<time> برای نشانه‌گذاری تاریخ، زمان، منطقهٔ زمانی و مدت‌زمان بر اساس استاندارد بین‌المللی ISO 8601 طراحی شده است؛ استانداردی که بسیاری از سیستم‌ها و سرویس‌ها می‌توانند آن را مستقیماً پردازش کنند. برای مثال:
<!-- تاریخ با سال -->
<time>2025-11-14</time>

<!-- ماه و روز بدون سال -->
<time>11-14</time>

<!-- زمان بدون ثانیه -->
<time>17:03</time>

<!-- تاریخ و زمان با ثانیه -->
<time>2025-11-14T17:03</time>

<!-- منطقهٔ زمانی -->
<time>+0300</time>

<!-- مدت‌زمان -->
<time>2h 13m 42s</time>


استاندارد HTML تصریح می‌کند که محتوای داخل ‎<time> باید مطابق فرمت معتبر (در اصل مطابق ISO 8601) باشد. اگر متن قابل‌نمایش این فرمت را رعایت نکند، مقدار معتبر باید در ویژگی datetime درج شود تا امکان پردازش ماشینی فراهم شود:
<!-- رشتهٔ معتبر مطابق ISO 8601 -->
<time>2025-11-14 17:03</time>

<!-- رشتهٔ نامعتبر، اما مقدار صحیح در ویژگی datetime -->
<time datetime="2025-11-14 17:03">
پنج‌شنبه، چهاردهم نوامبر، ساعت هفده و سه دقیقه
</time>

ویژگی datetime این امکان را می‌دهد که دادهٔ دقیق و قابل‌خواندن برای ماشین ذخیره شود (برای موتورهای جست‌وجو، هوش مصنوعی، پردازشگرها و …)، در حالی‌که به کاربر یک نسخهٔ کاملاً انسان‌خوان مانند «دیروز»، «پنج دقیقه پیش» یا «هفتهٔ گذشته» نمایش داده شود.

عنصر ‎<data> کاربردی مشابه دارد: ارائهٔ یک مقدار انسان‌خوان همراه با یک مقدار machine-readable. تفاوت مهم این است که ‎<data> برخلاف ‎<time> به هیچ استاندارد خاصی مانند ISO 8601 وابسته نیست و می‌تواند هر داده‌ای را بپذیرد.

مقدار قابل‌نمایش داخل عنصر قرار می‌گیرد و نسخهٔ ماشینی در ویژگی value نوشته می‌شود:

<!-- تاریخ ممکن است، اما برای تاریخ‌ها بهتر است از <time> استفاده شود -->
<p>
تاریخ انتشار:
<data value="2025-11-14">
پنج‌شنبه، چهاردهم نوامبر 2025
</data>
</p>

<!-- شناسه، مدل، SKU، کد کالا یا URL handle -->
<h2>
<data value="GA-B419SWGL">
یخچال LG GA-B419SQGL
</data>
</h2>

<!-- کد ارز (ISO 4217) و قیمت بدون قالب‌بندی -->
<p>
Price:
<data value="USD">$</data>
<data value="119999">1.199,99</data>
</p>

شاید در آینده پشتیبانی فناوری‌های کمکی از عناصر معناشناختی سطح متن (Text-level semantics) بهبود یابد و ‎<time> و ‎<data> بتوانند زمینهٔ معنایی بیشتری منتقل کنند.

اما اکنون، فایدهٔ آن‌ها بیشتر تئوریک است. با این حال:

برای پردازش سمت‌کلاینت در JavaScript

برای هوش مصنوعی و پارسرها

برای موتورهای جست‌وجو

این عناصر می‌توانند داده‌ها را کمی شفاف‌تر و قابل‌تشخیص‌تر کنند—و این دقیقاً همان چیزی است که باعث می‌شود ارزش استفاده داشته باشند.

#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
1
یک کتابخانهٔ متن‌باز از کامپوننت‌های Vue ۳ برای بصری‌سازی داده که کاربران را توانمند می‌کند و برای روایت بیانی، روان و مؤثرِ داده‌ها طراحی شده است.

🔗https://vue-data-ui.graphieros.com/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
1🔥1👏1
یک ماژول برای برنامه‌های Nuxt.
وظیفهٔ آن این است که به توسعه‌دهنده کمک کند تا نکات و هشدارهای مرتبط با عملکرد، دسترس‌پذیری (A11Y)، امنیت و دیگر جنبه‌های مهم برنامه را مشاهده کند.
این ماژول در DevTools مربوط به Nuxt ادغام می‌شود و یک پنل بصری ارائه می‌دهد که در آن می‌توان دید چه چیزی ضعیف عمل می‌کند، کجا کندی وجود دارد، بار روی کدام بخش است و موارد مشابه.


🔗https://github.com/nuxt/hints
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
یک چیز پیدا کردم که واقعاً شگفت‌انگیز است. باز هم یک شاهکار دیگر با Shadow DOM — این بار یک فرازبانی برای توصیف الگوها.

خلاصه اینکه می‌توان پس‌زمینه‌های فوق‌العاده ساخت، بدون آنکه خود را به قابلیت‌های گرادیانت‌های معمول محدود کنید.

اسم این ابزار <css-doodle/> است.

در آن می‌توانید الگوی دلخواه‌تان را با استفاده از قوانین CSS و یک‌سری توابع ساده مثل flip، reverse، shape، random و غیره توصیف کنید؛ یک زبان کاملاً اعلامی و قدرتمند.

نمونه‌های بسیار زیاد، جامعهٔ بزرگ. مثلاً خود نویسنده توضیح داده چطور می‌توان یک نقش کلاسیک چینی را فقط با توابع flip–invert–reverse ساخت.

در کل، ابزار واقعاً شگفت‌انگیزی است.


🔗https://css-doodle.com/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript