SVG से बनाई जाने वाली शानदार चीज़ें
(fuma-nama.vercel.app)- SVG सिर्फ़ icon format से आगे जाकर mask,
path, और CSS animations को मिलाकर line के साथ बहने वाले wire effects और TOC highlights बना सकता है - मुख्य implementation में
lineयाpathसे बनी line को सीधे दिखाने के बजाय, उसे mask area की तरह इस्तेमाल किया जाता है ताकि animated block की visible range सीमित हो - Animated Wires में
rectपरmask="url(#...)"लागू किया जाता है,@keyframesसेtranslateYको move किया जाता है, औरlinearGradientव CSS variables से visual style को expand किया जाता है - Fumadocs का Clerk-style TOC SSR compatibility के कारण outline को server पर render करता है, और active position दिखाने वाला thumb browser position information का उपयोग करके client पर render करता है
- SVG
<path>काdattribute कोई auto-generated string नहीं, बल्कि commands की list है, इसलिए server-rendered TOC outline जैसी shape वाली mask image को client पर फिर से बनाया जा सकता है
SVG mask से बनने वाले Animated Wires
- Example code सामान्य HTML नहीं, बल्कि JSX या React syntax पर आधारित है
- Basic line SVG के
lineयाpathसे बनाई जा सकती है- Example में
viewBox="0 0 50 50"के अंदर एक verticallineरखी गई है
- Example में
- Line को screen पर सीधे draw करने के बजाय
maskके रूप में इस्तेमाल करके यह सीमित किया जाता है कि दूसरा shape कहाँ visible होगाrectपरmask="url(#line)"लागू किया जाता है, औरmaskके अंदर सफ़ेदlineरखी जाती है
- Movement
rectपर CSSanimationलागू करके बनाई जाती है@keyframes to-downtranslateY(-10px)सेtranslateY(50px)तक move करता है
- Visual style को background line, ज़्यादा मोटी mask line,
linearGradient, और CSS variable--heightको मिलाकर expand किया जाता है@keyframes to-down-2calc(var(--height) * -1)से100%तक move करता है
- ज़्यादातर मिलते-जुलते effects animated block को mask से crop करने के तरीके का उपयोग करते हैं
- कुछ designs Figma या किसी दूसरे SVG editor में बनाए जा सकते हैं
- Unkey landing page इस तरीके का example है
Fumadocs का Clerk-style TOC
- Fumadocs में Clerk-style table of contents (TOC) implement किया गया है
- SSR के साथ compatible रहने के लिए client JavaScript के बिना server पर TOC outline render करनी होती है
- Server पर element की exact position पता नहीं चल सकती
- Implementation
absoluteposition का उपयोग करता है, outline को कई components की तरह render करता है और फिर उन्हें जोड़ता है
- Active item या viewport में दिख रहे heading से संबंधित outline का कुछ हिस्सा thumb के रूप में दिखाया जाता है
- Thumb को animated होना चाहिए, इसलिए सिर्फ़ outline component का color बदलना काफ़ी नहीं है
- Interaction target होने वाला thumb client पर render किया जाता है
- Browser से मिली position information के आधार पर client पर mask map बनाया जाता है
- इस mask map को बनाने के लिए SVG का उपयोग किया जाता है
- SVG
<path>काdattribute commands की list है, और points को जोड़ने वाली line render कर सकता है - संबंधित documentation MDN Web Docs के SVG Paths में देखी जा सकती है
- इस तरह बनाया गया SVG server पर पहले से rendered original TOC outline जैसी ही shape बन जाता है
- Animated Wires की तरह CSS
mask-imageमें SVG को data URL के रूप में डालकर, animateddivblock को mask किया जाता है और highlighted thumb render किया जाता है- Inner
divwidth: 1,height: thumb.height,transform: translateY(${thumb.top}px),transition: "all 500ms",backgroundColor: "white"जैसी values इस्तेमाल करता है
- Inner
- React.js implementation toc-clerk.tsx source code में देखा जा सकता है
2 टिप्पणियां
काफ़ी शानदार है, लेकिन अभी सिर्फ़ मौजूदा आइटम को ही साफ़ तौर पर highlight करना ज़्यादा नज़र आता है।
Hacker News की राय
8 साल पुरानी सामग्री होने के बावजूद, Sarah Drasner की मशहूर “SVG Can Do That?” प्रस्तुति आज भी कई लोगों की आंखें खोल देती है
उसके बाद से CSS बहुत mature हो चुका है, और SVG खुद कितना mature हुआ है, यह पक्का नहीं पता, लेकिन फिर भी इसकी जोरदार सिफारिश करता हूं
स्लाइड्स: https://slides.com/sdrasner/svg-can-do-that
वीडियो: https://youtu.be/ADXX4fmWHbo?si=6YPZkopyEDc8PSte
SVG फाइलों से की जा सकने वाली दिलचस्प चीजों में से एक है inline DTD की entities का इस्तेमाल करके ऐसे constants define करना जिन्हें फाइल में कई जगह साझा किया जा सके
David Ellsworth के “Squares in Squares” पेज पर मौजूद SVG में इसका बढ़िया उदाहरण दिखता है
प्रमुख browsers में कोई समस्या नहीं है, लेकिन Inkscape जैसे कुछ tools DTD को parse भी नहीं करते और entities को expand भी नहीं करते
[0] https://kingbird.myphotos.cc/packing/squares_in_squares.html
&refजैसे entity references के जरिए मनमाना syntax content define और reuse करने वाले SGML/XML mechanism का नाम हैSVG में shapes, paths आदि को
defsके नीचे रखकर उन्हेंidदिया जाता है और फिर main SVG में दोबारा इस्तेमाल किया जाता है; linked page भी हर SVG के अंदर यही तरीका इस्तेमाल करता दिखता हैयह कई drawings के बीच squares साझा करना नहीं है, क्योंकि हर एक अलग DOM के रूप में आता है
जिज्ञासा है कि SVG के शुरुआती designers को entity mechanism को अस्थायी रूप से फिर से implement करना क्यों जरूरी लगा
शायद इसका संबंध use point पर rendering properties override करने की क्षमता से हो सकता है, और उस समय SVG W3C के XHTML/XML transition flow में था, इसलिए यह assumption भी शायद स्थापित नहीं था कि browser entity definitions या document prologue/DOCTYPE को ignore करेंगे
!doctypeया!elementनहीं मिलाअगर बात सिर्फ SVG के
defsऔरuseकी है, तो वह DTD नहीं हैhttps://developer.mozilla.org/en-US/docs/Web/SVG/Reference/E...
उदाहरण के लिए Billion laughs attack है
https://en.wikipedia.org/wiki/Billion_laughs_attack
Nanda Syahrasyad का “A Deep Dive Into SVG Path Commands” SVG paths कैसे बनते हैं, यह समझने के लिए वाकई अच्छा है
यह लगभग 2 साल पुराना लेख है, लेकिन इसने मुझे दिखाया कि SVG क्या कर सकता है और ठीक-ठीक कैसे करता है
[0] https://www.nan.fyi/svg-paths
मैंने SVG से इस तरह की मजेदार चीजें करने वाला एक project किया था
इसे React में बनाया था, कई static illustrations में animated elements जोड़े थे, और colors CMS से control होते थे
frontend API call करके सही colors वाली SVG image लेता था, और animation SVG elements को hide/show करके handle किया जाता था
उदाहरण यहां देखा जा सकता है: https://web.archive.org/web/20221020133516im_/https://uncrow...
Macromedia Flash की सच में याद आती है
Flash और SWF format जैसी कोई technology नहीं थी, जिसमें अलग download के बिना, सिर्फ Flash Player होने पर ही ढेरों indie games और animated films का आनंद लिया जा सकता था
entry barrier भी बहुत कम था
SVG में भी SWF वाली सभी चीजें करने की potential है, लेकिन Flash जैसा editor या ActionScript जैसा scene/object-based coding model नहीं है
browsers की अपनी quirks भी हैं, इसलिए केवल simple SVG ही हर जगह ठीक से दिखेगा, इसकी guarantee है
शुरू से ही SVG और Flash की तुलना करना apples और oranges की तुलना जैसा लगता है
SVG format को Flash वाली सारी चीजें सीधे करने की जरूरत नहीं है; वह browser के अंदर दूसरी technologies पर निर्भर रह सकता है
उदाहरण के लिए Unity, Unreal, Godot को browser के लिए काफी आसानी से compile किया जा सकता है
समस्या यह है कि ऐसे apps काफी heavy हो जाते हैं और आम तौर पर single-digit MB नहीं, बल्कि दर्जनों MB की range में चले जाते हैं
complex animated SVG चलाकर देखना मजेदार होता है, लेकिन SMIL की गहराई में जाएं तो Safari floating point के आगे एक zero छूट जाने पर phone को freeze कर देता है या और भी अजीब चीजें होने लगती हैं
अगर आप JavaScript से dynamically creative SVG बना रहे हैं और job ढूंढ रहे हैं, तो DM भेज सकते हैं
सोचता हूं कि क्या SVG का कोई extension है जो line की density allow करता हो
मेरे पास pen up/down कर सकने वाला plotter है, और वह SVG files से चलता है
जैसा handwriting में अक्सर होता है, वैसा line खींचते समय pen को नीचे लाया जा सके तो अच्छा होगा
संदर्भ के लिए, यह Evil Mad Scientist Labs का Axidraw है; शानदार device है और इसे बनाने वाले लोग भी बढ़िया हैं
उदाहरण के लिए मैं multipurpose laser cutter/plotter इस्तेमाल करता हूं, जहां opacity laser power, line thickness movement speed, green channel repeat count, blue channel Z-axis height, और red channel pen down या laser off आदि के लिए इस्तेमाल होता है
इस तरह का काम यहां कर रहा हूं
https://github.com/WillAdams/gcodepreview
खुद icons या logos बनाने से पहले तक मुझे SVG में transform का होना हमेशा अजीब लगता था
curves को ठीक से match करना मुश्किल होता है
दूसरा logo खत्म करने के बाद वह बहुत flat लगा, तो उसे 10° tilt करना चाहा, और उन सारी lines और curves को दोबारा लिखने के बारे में सोचकर rotation कहीं बेहतर विकल्प लगा
शुक्र है कि text के बगल में रखने पर वह अजीब लगा, इसलिए kerning सही लगे इसके लिए angle कुछ बार और बदलना पड़ा
हाल ही में मजे के लिए एक छोटा game बनाया, और rendering के लिए ज्यादातर CSS animation SVG tiles इस्तेमाल किए: https://pipeline-panic.vercel.app/
https://boardgamegeek.com/boardgame/333/waterworks