- Clay C में बनी Flexbox-स्टाइल ऑटो UI लेआउट लाइब्रेरी है, जिसका लक्ष्य custom engine या low-level environments में भी declarative UI composition उपलब्ध कराना है
- यह एकल header file के रूप में दी जाती है, C/C++ में इस्तेमाल की जा सकती है, और लगभग 2,000 लाइनों के C99 code तथा 15KB
.wasmcompile output को हाइलाइट करती है - C standard library तक सहित इसमें कोई dependency नहीं है, और इसे Raylib, WebGL Canvas, HTML जैसे rendering तरीकों से अलग रखकर इस्तेमाल किया जा सकता है
- यह इतनी तेज है कि पूरी UI को हर frame में फिर से calculate कर सकती है, और default 3.5MB memory तथा static allocation और reuse तरीके से
malloc/freeके बिना काम करती है - C code के loops, conditionals और functions को UI hierarchy के साथ मिलाकर इस्तेमाल किया जा सकता है, और built-in debug tools से layout state को real time में देखा जा सकता है
C99 single header और memory model
- Clay C-based Flexbox-स्टाइल auto layout library है
- यह declarative syntax का इस्तेमाल करती है
- microsecond-level performance को प्रमुखता देती है
- मौजूदा webpage खुद भी Clay से layout किया गया है
- यह एकल header file के रूप में उपलब्ध है
- C/C++ में इस्तेमाल की जा सकती है
- इसे
#include clay.hतरीके से include किया जाता है - यह लगभग 2,000 लाइनों के C99 code से बनी है
- C standard library सहित इसकी कोई dependency नहीं है
.wasmमें compile करने पर इसका आकार 15KB है
- Performance और memory usage का तरीका real-time UI updates को ध्यान में रखता है
- यह इतनी तेज है कि पूरी UI को हर frame में फिर से calculate किया जा सकता है
- default memory usage 3.5MB है
- static allocation और reuse का इस्तेमाल करती है
mallocऔरfreeका इस्तेमाल नहीं करती- सामान्य performance-avoidance techniques के बिना animations और responsive UI design को सरल बना सकती है
Declarative UI और renderer separation
- Declarative syntax nested UI element hierarchy को पढ़ने में आसान तरीके से बनाने पर केंद्रित है
- UI elements को C के loops, conditionals और functions के साथ मिलाकर इस्तेमाल किया जा सकता है
- text, image, rectangle जैसे UI primitives से reusable component library बनाई जा सकती है
- Clay renderer और platform पर dependent नहीं है
- layout Clay संभालता है और rendering Raylib, WebGL Canvas, HTML आदि से की जा सकती है
- output
RECTANGLE,TEXT,IMAGEजैसे primitive render commands की ordered array है - कुछ सौ लाइनों के code में अपना renderer लिखा जा सकता है या दिए गए examples इस्तेमाल किए जा सकते हैं
- HTML renderer भी उपलब्ध है, और मौजूदा page उसका example है
- इसमें built-in debug tools शामिल हैं
- Chrome Inspector-style debugging tool उपलब्ध कराता है
- layout hierarchy और settings को real time में देखा जा सकता है
- page पर
dkey दबाकर debug tool आज़माया जा सकता है
1 टिप्पणियां
Hacker News की राय
दिखने में अच्छा है, और डेवलपर ने खुद जो YouTube वीडियो में समझाया है वह भी शानदार था: https://www.youtube.com/watch?v=DYWTw19_8r4
इसका आधुनिक रूप 1970 के दशक में Xerox द्वारा बनाया गया mouse-based GUI है, जो बाद में Xerox Star के रूप में commercialize हुआ, और इसी धारा से Jobs ने Apple Lisa में और Gates ने MS Windows में प्रेरणा ली
GUI framework platform का look and feel तय करते हैं और यह निर्धारित करते हैं कि डेवलपर ऐप कितनी आसानी से बना सकते हैं, इसलिए वे operating system, browser, graphics engine जैसी कई platform प्रतिस्पर्धाओं के केंद्र में रहे हैं
कुछ हजार lines में ऐसा बन पाना काफी शानदार है
हालांकि मैं Flex की बजाय CSS Grid को पसंद करता हूं, इसलिए मैंने pure Nim में CSS Grid layout library बनाई और उस पर मुझे कुछ हद तक गर्व है: https://github.com/elcritch/cssgrid
Clay को भी देखकर layout algorithms की तुलना करना चाहूंगा, और अपने बनाए algorithm से boxes को खुद अपना size बदलते देखना मजेदार होता है
यह भी उत्सुकता है कि क्या C interface expose किया जा सकता है
यह Flexbox और Block layout भी support करता है, और दोनों की licenses MIT जैसी दिखती हैं, इसलिए जरूरत के हिस्से ले सकते हैं। बस LICENSE file जोड़ दें तो ढूंढना आसान होगा
लक्ष्य full web compatibility है, लेकिन अभी पूरी तरह वहां तक नहीं पहुंचा है; खास तौर पर दिलचस्प चीज इसकी काफी बड़ी test suite हो सकती है
Tests HTML snippets के रूप में define किए जाते हैं, Chrome को webdriver से चलाकर सही assertions scrape किए जाते हैं, फिर उन्हें pure code unit tests में convert किया जाता है। चाहें तो अपना test generator लिखकर हमारे snippets reuse कर सकते हैं
यह test infrastructure React Native को चलाने वाले C++ Flexbox implementation Yoga के साथ भी आंशिक रूप से share किया जाता है: https://github.com/facebook/yoga
Flexbox की तरह cells के span न करने वाले simple cases में यह अपेक्षाकृत आसानी से हो सकता है, लेकिन वरना यह सरल नहीं है, इसलिए simplex solver या Cassowary जैसे approach की जरूरत पड़ती है: https://constraints.cs.washington.edu/solvers/cassowary-tochi.pdf
अंत में HTML और Canvas के बीच switch करने वाला button है, और आम तौर पर फर्क लगभग नहीं दिखता, यह अच्छा है
लेकिन iOS Safari और Dark Reader के combination में HTML page dark mode में बदल जाता है, जबकि Canvas page नहीं बदलता, इसलिए निजी तौर पर मेरा wow moment टूट गया
फिर भी देखने में अच्छा है
Canvas भी काफी तेज है, लेकिन “High performance” animation या scroll करते समय फर्क महसूस होता है
Animation के पीछे का कोई भी text select नहीं किया जा सकता
लगता है कुछ focus छीन रहा है, और text select करने की कोशिश करते ही selection तुरंत हट जाता है
दिलचस्प बात यह है कि Firefox इस page को render करते समय कहीं ज्यादा खराब है: https://imgur.com/a/DNYe2WN
यह एक UI style की मजेदार व्याख्या है जिसे मैं सचमुच पसंद करता हूं
UI logic और drawing को drawing commands के set में अलग करने का तरीका शानदार और बहुत versatile है। मैंने इसे पहली बार microui में देखा था, और इसी separation की वजह से WASM और Canvas2D के साथ browser में library को आसानी से इस्तेमाल कर पाया: https://rxi.github.io/microui_v2_an_implementation_overview.html
साथ ही WASM में layout calculate करके HTML में render करने का विचार भी अच्छा है; समझ नहीं आता पहले यह क्यों नहीं सोचा
शुरुआत में लगा कि C में करने की जरूरत है क्या, Haskell या OCaml में ज्यादा safely बनाया जा सकता है
लेकिन अगर यह C की 2000 lines और zero dependencies है, तो काफी शानदार है
Rust में बना taffy भी है, और C bindings पर काम चल रहा है: https://crates.io/crates/taffy
पहले draft के लिए अच्छा है
हालांकि HTML output में सिर्फ div elements होना थोड़ा खलता है, और accessibility पर थोड़ा ध्यान देने से यह काफी बेहतर हो सकता है
कई जगह text select करने की कोशिश करने पर re-render होकर control-c दबाने से पहले selection हट जाना भी समस्या है
गंभीरता से पूछें तो, इस तरह वेबपेज लिखना—कॉन्सेप्ट भले ही शानदार हो—कुछ ज़्यादा नहीं लगता?
LandingPageDesktop()के अंदरCLAY(...),CLAY_TEXT(...),LandingPageBlob(...)जैसी calls गहराई तक nested रूप में हैं, और example source यहां है: https://github.com/nicbarker/clay/blob/35d72e5fba6872be48d15ed9d84269a86cd72b4e/examples/clay-official-website/main.c#L50C1-L67C2AWT, SWT, Swing, Qt, Fyne आदि सब काफ़ी मिलते-जुलते हैं
https://docs.oracle.com/javase/7/docs/api/java/awt/GridLayout.html
https://github.com/eclipse-platform/eclipse.platform.swt/blob/master/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet75.java
https://stackoverflow.com/a/12867862/243613
https://stackoverflow.com/questions/37304684/qwidgetsetlayout-attempting-to-set-qlayout-on-mainwindow-which-already
Qt में वास्तव में XML-based दिखने वाला layout system है, लेकिन इसे code से भी लिखा जा सकता है और आम तौर पर यह recommended नहीं होता
https://gist.github.com/ledongthuc/9686787fe51bbe763fa1e50389d63351
हर हिस्से को नाम वाली functions में बांट दें तो
LandingPageDesktop(...),LandingPage(...),LeftText()जैसी ज़्यादा पढ़ने लायक structure बनाई जा सकती हैअसली समस्या graphical objects और उनके relationships को text में व्यक्त करने की कोशिश में है। graphical builder या RAD tools साफ़ समाधान जैसे लगते हैं, लेकिन ऐसे approaches को कुल मिलाकर छोड़ दिया गया है
शानदार काम है। browser में मुझे लगता है selectable text ज़रूरी है
जिन clients और apps को ऐसी functionality की ज़रूरत नहीं है, या जो इसे खुद provide कर सकते हैं, उनके लिए यह बहुत छोटा और अच्छा solution लगता है
बार-बार वही बात कहनी पड़ती है, लेकिन हाल के वर्षों में UI changes में clipboard universality का पीछे जाना, linkability और embedding के पीछे जाने के साथ, सबसे कम आंके गए नुकसानों में से एक लगता है