Dmitry Sharabin

Dmitry Sharabin

@d12n.me

Front-end Developer working with @lea.verou.me on open-source web projects • Teacher • Microsoft Certified Expert & Trainer

44 followers63 following129 posts

Dmitry Sharabin reposted

🔥 New blog post: The best way to use icons in Web UIs What if I told you, you could use CSS to *insert* and *tweak* icons without touching any HTML? And that you can manage them alongside your other design tokens? lea.verou.me/blog/2026/ic...

lea.verou.meThe best way to use icons in Web UIs • Lea VerouWhat if I told you, you could use CSS to insert and tweak icons without touching any HTML? And that it could be more flexible and maintainable than what you’ve been using?

Dmitry Sharabin reposted

Wow, style-observer is featured very prominently on today’s issue of #JavascriptWeekly! javascriptweekly.com/issues/723 Thanks for the shoutout folks (for Color.js too!), @d12n.me and I are very humbled!

Lea Verou, PhD@lea.verou.me

🚀 🆕 style-observer: A robust solution for observing CSS property changes in JS. Developed with @d12n.me’s help over the last month. Made possible by the pioneering work of @bram.us, Artem Godin, @janeori.propjockey.io and many others! Blog post: lea.verou.me/blog/2025/st... Docs: observe.style

Dmitry Sharabin reposted

Brilliant talk by @wwwalkerrun. Can't recommend it more for those who are interested in development apps for iOS and Android with @NativeScript! Nathan, all NativeScript community would appreciate if you can give us more such tasty content. Thank you! 🙏🏻

📣 A couple of days ago @karger challenged me to build the Wordle Game with @mavoweb. Since I like challenges, now we have another app showcasing awesome Mavo features. 😅 It takes ~70 lines of HTML. Play with it and tell us what you think: #MadeWithMavo

Wow! That was an amazing journey. Thank you, @twostraws, from the bottom of my heart for the incredible work you did by developing this course: it's exceptionally thought, professionally designed, and remarkably delivered. You are THE Teacher! #100DaysOfSwiftUI is officially ✅!

On day 98 of #100DaysOfSwiftUI, we finished building the wonderful SnowSeeker app. I learned a ton! Here are some highlights: ✓ with .horizontalSizeClass and .dynamicTypeSize we can make our app look good on every device regardless of its size 👇🧵

On day 97 of #100DaysOfSwiftUI, we started building our app. I solidified the knowledge I already had and also learned how to force the stacked navigation view style on iPhones. The declarative nature of SwiftUI plus elements of functional programming really shines together.😍

After taking some time to reflect a bit on projects 16–18 (day 95 of #100DaysOfSwiftUI), I'm back on track On day 96 we began working on our last big project. While getting ready for it: ✓ I learned how to work with side by side views in SwiftUI 👇🧵

On day 93 of #100DaysOfSwiftUI, ✓ we learned how to position SwiftUI views, either absolutely or relatively, and recalled why the order of modifiers matters. ✓ We deep-dived into different coordinates the GeometryReader provides (global, local, and named). 👇

On day 92 of #100DaysOfSwiftUI, I learned: ✓ how layout and alignment work in SwiftUI ✓ how to work with alignment guides and create a custom one. I'm glad we have technique projects in this course—they help understand the “magic” of SwiftUI. 🤫 It's not magic. 😉

On day 90 of #100DaysOfSwiftUI, we finished building the Flashzilla app. We added haptics to some actions, improved the app's a11ty, fixed some bugs, and let users add/remove and load/save their deck of flashcards. I'm looking forward to some more challenges to solve tomorrow.

On day 89 of #100DaysOfSwiftUI, we colored our cards as user swipes and made the UI accessible for users with color blindness, added a counting down timer that stops when the app is inactive, improved the app logic and UX. I'm gaining a lot of crucial knowledge building the app!

On day 88 of #100DaysOfSwiftUI, we began building the UI of our app: we designed a stack of cards that can be dragged by a user. While being dragged, cards are being rotated, offset, and disappear (or move back to the stack). I'm impressed with how little code it demands! 😍

On day 87 of #100DaysOfSwiftUI, I learned how to: ✓ work with timer: create, connect to it, receive values it publishes with .onRecive, and react to them ✓ react to an app's state changes: when it's active, inactive, or in the background 👇

On days 86 of #100DaysOfSwiftUI, I learned: ✓ what gestures SwiftUI supports and how to work with them (perform actions depending on a state of a gesture, prioritize gestures, tell SwiftUI that gestures trigger simultaneously or in sequence) 👇

On day 84 of #100DaysOfSwiftUI, we added: ✓ the ability to store and load data with UserDefaults and performed small refactoring to make the code more professional and error-proof ✓ a context menu to a QR code and learned how to show, update, and save it effectively. 👇

On day 83 of #100DaysOfSwiftUI, I learned how to: ✓ generate a QR code using the CoreImage framework (specifically the qrCodeGenerator() filter). I was surprised to know that, in case of an error, we can fall back to an empty image simply by writing UIImage(). 🤯 👇

On day 82 of #100DaysOfSwiftUI, we began putting the new techniques into action. We built the tab bar that shares the same data across all its tabs using EnvironmentObject. TIL how to dynamically filter a SwiftUI list using the filter() method and a computed property. FP 🚀

On day 81 of #100DaysOfSwiftUI, I learned how to: ✓ create context menus (what limitations they have and why) ✓ work with local notifications: request permission and schedule notification ✓ add packages (dependencies) in Xcode. All the required techniques for the project ✅.

Since I'm a bit off track (and luckily have some free time), I decided to complete days 79 & 80 of #100DaysOfSwiftUI in one shot. TIL: ✓ how to create tabs with TabView and tabItem() and programmatically control them 1/3

On day 76 of #100DaysOfSwiftUI, I worked heavily with VoiceOver on iPhone to make the Cupcake Corner, iExpense, and Moonshot apps fully accessible. A valuable experience, I must say. That was the last day tagged with “New.” So I can take a break and work on my project. 😊

On day 75 of #100DaysOfSwiftUI, I fixed some accessibility issues in the previously built projects: Guess the Flag, Word Scramble, and Bookworm. It's amazing how little we should do to make our apps accessible to a much bigger number of people!

Day 74 of #100DaysOfSwiftUI. New technique project dedicated to a11y. From my pov, the toughest topic. I'm amazed how much effort Apple does in this direction (it's enough to look at the API they provide). Hats off. I also understand why so many folks fail with it. It is hard!

Because of my business trip, I could work through the challenges for the Bucket List app, not yesterday but today. And now I can confirm that day 73 of #100DaysOfSwiftUI is officially closed: all the challenges are done and the final test is passed. 🥳

I was hoping Paul would explain to us the MVVM design pattern. And he did. And of course, in an easy-to-follow and approachable way. It happened on day 72 of #100DaysOfSwiftUI. Yay! That was a wonderful last day when we work on the BucketList project. The challenges are to come.

On day 71 of #100DaysOfSwiftUI, I learned how to fetch data from Wikipedia and present them to a user in a friendly way. I was surprised to know that we can use “+” to add text views together to apply different kinds of formatting to them, for example. 🤯 Awesome! 😎

My main takeaways from day 70 of #100DaysOfSwiftUI: — add a static example property with sample data to custom types; — write your optimized comparison functions in Equatable structs if needed; 1/3

Day 69 of #100DaysOfSwiftUI was quite brief. However, it was full of new concepts (like other days). It introduced two new iOS frameworks: MapKit and LocalAuthentication. I was waiting for a day when Paul teach us to use Touch ID and Face ID with SwiftUI. And it happened. Yay! 🥳

As Paul said, day 68 of #100DaysOfSwiftUI was easy.🥳 I learned how to: – make custom types conform to the Comparable protocol; – write data to the documents directory (I also wrote an extension for FileManager to be able to load and decode data); – switch view states with enums.

On day 65 of #100DaysOfSwiftUI, we began to bring the Instafilter app to live by putting into practice all the technical aspects we covered in the previous days: – we built our basic UI, – let the user pick an image from their photo library, – and applied the sepia filter to it.

Even though the stuff introduced on day 64 of #100DaysOfSwiftUI was tough, @twostraws did an incredible job to make it understandable. 👏🏻 I learned how to bridge UIKit and SwiftUI via coordinators and delegates and to save images to the user's photo library (with permission).

Day 63 of #100DaysOfSwiftUI was exciting and full of new concepts I've never heard about. And I loved it! 😍 I learned about the different types of images we can use in our SwiftUI apps: UIImage, CGImage, and CIImage. 1/2

Day 62 of #100DaysOfSwiftUI. A new project. And it promises to be a tough one. We are to go beyond SwiftUI and learn to connect Apple's other frameworks to SwiftUI. TIL about the confirmationDialog() modifier, how to use the onChange() modifier to respond to state changes.

Day 59 of #100DaysOfSwiftUI (project 12 & test) is ✅. It was beneficial to challenge my understanding of Core Data. I could manage it with honor (at least I feel this way). Yay! 🥳 Here is my solution (I worked with the generic version of FilteredList):

Day 58 of #100DaysOfSwiftUI brought much new Core Data stuff to the table. Not elementary stuff, I must admit. But Paul does a great job cushioning the blow. I learned how to (dynamically) filter FetchRequest using NSPredicate and how to establish relationships between entities.

On day 57 of #100DaysOfSwiftUI, I continued my deep dive into Core Data to explore how it works under the hood. And thanks to @twostraws, for now, everything looks manageable. Will see how it goes. 😜 I also learned about the Hashable protocol and how it's related to \.self.

On day 55 of #100DaysOfSwiftUI, I learned how to: — sort fetch requests with SortDescriptor and delete from a Core Data fetch request — pop a NavigationLink programmatically. I also added a view for book details where a book's rating can't be changed (thanks to constant binding).

On day 54 of #100DaysOfSwiftUI, I — built my own Core Data model, — learned how to develop a reusable and customizable rating component, — solidified the skills I've learned so far and put into practice the new ones. Views composition in SwiftUI is a breeze. I love it! 😍

Day 53 of #100DaysOfSwiftUI—an overview day. There was a ton to get familiar with: — @.Binding to expose properties — TextEditor for multi-line text input — CoreData (🤯) with entities & attributes, NSPersistentContainer, @.FetchRequest, FetchedResults, and \.managedObjectContext

Day 52 of #100DaysOfSwiftUI — the Cupcake Corner project and all the proposed challenges are done. 🥳 I really enjoyed refactoring the Order class into a wrapper around the Order struct (a called it Model). It was such a useful experience to have. Thank you @twostraws. 🙏🏻

On day 51 of #100DaysOfSwiftUI, I added logic to the Cupcake Corner app & learned: — that to make async func work inside a button action closure we need to wrap it with Task { }; — how to send encoded codable data over the internet; — about useful service .

Today is a halfway day of this amazing journey called #100DaysOfSwiftUI. 🥳 I'm so grateful to @twostraws for every piece of it. 🙏🏻 Today I finished building the UI for the Cupcake Corner app (project 10). Looking forward to adding some logic to it tomorrow.

On day 49 of #100DaysOfSwiftUI, there was a lot to study. I learned how to: — make classes with published properties conform to Codable; — receive codable data from the internet with URLSession; — work with AsyncImage and handle its phases; — validate and disable forms.

✅Day 44 of #100DaysOfSwiftUI. I learned: – stride(from:to:by:), CGAffineTransform; – the easy way to enable “even-odd rule” with FillStyle struct; – the way to get fancy borders and fills with ImagePaint; – how to pass heavy lifting drawing operations to Metal with drawingGroup.

Day 43 of #100DaysOfSwiftUI kicked off another technique project. Specifically, today's topic was about Core Graphics (CG) in SwiftUI. Computer graphics, in general, is my life-long love. It's funny how one can be passionate about something they could hardly ever master. 😅

On day 40 of #100DaysOfSwiftUI, I learned: 💡 how generics help make code reusable; 💡 how correctly decode dates in Codable data using dateDecodingStrategy; 💡 why it could be useful to extend the ShapeStyle protocol; 💡 and how to force dark mode inside an app.

On day 39 of #100DaysOfSwiftUI I – learned about lazy stacks and grids; – got to know GeometryReader, ScrollView, and NavigationLink; – found out how to work with hierarchical Codable data. Can't wait to apply this new knowledge to the Moonshot project.

Day 37 of #100DaysOfSwiftUI is ✅. What a great experience I'm gaining by taking part in this splendid course by @twostraws! Another app is built with such little code but with lots of useful techniques. We worked with ObservedObject, Published, sheet, UserDefaults, and more. 😍

There was a lot to learn on day 36 of #100DaysOfSwiftUI: sharing SwiftUI state, showing and hiding views, deleting list items, storing user settings with UserDefaults, and archiving Swift objects with Codable. Project 7 is expected to be very interesting. I'm excited! 🤩