Blog
Mert Özen's blog posts on software development, backend, frontend, and DevOps.
Animation and Scroll APIs in JavaScript: element.animate, getAnimations, the finished Promise, scrollIntoView and scrollend
In JavaScript you start an animation with element.animate, control it through the returned Animation object and wait for its end with the finished promise; for scrolling you reach the target with scrollIntoView and scrollBy and do the work once scrolling ends with scrollend. We show it in Bookstore with a cover flying to the cart, jumping to the invalid checkout field and the book strip's arrows, with real browser output.
Localization with JavaScript Intl: Turkish Sorting with Collator, PluralRules, ListFormat, Segmenter, DisplayNames and DurationFormat
Use Intl.Collator("tr") for Turkish sorting, PluralRules for singular/plural text, ListFormat for "Dune, Emma, and The Hobbit", Segmenter for character limits in reviews with emoji and DurationFormat for reading time. With Bookstore examples we show each one, the browser differences and why caching instances matters, with real output.
Global Attributes, Link Types and Inline SVG in HTML: data-*, hidden, contenteditable, spellcheck, translate, download, mailto/tel and Accessible Icons
contenteditable is not a form control: plaintext-only turns rich text into plain text, but the note never reaches the server with the form, so the right element is a textarea. In this post we measure data-*, hidden="until-found", spellcheck, autocapitalize and translate in Chromium and WebKit, and show tel:, mailto:, download's same-origin limit, accessible SVG icons and the <svg hidden> pitfall on Bookstore.
Animation in Angular: animate.enter, animate.leave, CSS Transitions and Moving Off @angular/animations
animate.enter and animate.leave, added in Angular 20.2, put a CSS class on an element as it enters or leaves the DOM and wait for the animation, with no need for @angular/animations. We animate Bookstore cart lines and toasts and cover prefers-reduced-motion, @starting-style, withViewTransitions and migrating old trigger code.
i18n in Angular: $localize, the i18n Attribute, ICU Messages, ng extract-i18n and Per-Locale Builds
Angular's build-time i18n marks text with the i18n attribute and $localize, extracts it to an XLIFF file with ng extract-i18n and builds a separate app per language. We make the Bookstore UI Turkish and English and cover ICU plural/select, LOCALE_ID, /tr and /en routing in ASP.NET Core and catching missing translations at build time.
Writing Your Own Form Control in Angular: FormValueControl, FormCheckboxControl and ControlValueAccessor in Existing Code
In Angular 22 a value = model() is all a component needs to be a form control: we write a quantity stepper and a gift wrap switch with FormValueControl and FormCheckboxControl, use the same control with Reactive Forms and ngModel, and read and migrate old ControlValueAccessor code.
Angular Signal Forms in Practice: form(), Schemas, Built-in and Custom Validators, Async Validation and submit()
In Signal Forms the data lives in a model signal and form() builds a typed FieldTree on top of it. We build the Bookstore checkout form with a schema, built-in and custom validators, applyWhen/applyEach, a debounced validateHttp coupon check and submit() that maps server errors to fields.
What Changed in Flutter 3 and Dart 3: Impeller, Patterns, Widget Previews, material_ui and What's Next
Dart 3.0 made null safety mandatory and brought records, patterns and sealed classes; 3.6 to 3.13 took small steps that change everyday code, from digit separators to primary constructors. On the Flutter side there are Impeller, SwiftPM, UIScene, Widget Previews and, between 3.44 and 3.50, Material moving into the material_ui package; we show with real output that the language version comes from the pubspec, and how to upgrade.
Publishing a Flutter App: Google Play and the App Store, Signing, Versioning, Flavors and CI
A Flutter app takes the same road in both stores: release build, signing, a test channel, review and a gradual release. For Bookstore we cover version numbers, environments with --dart-define-from-file (and why they cannot carry secrets), the Android upload key and Play App Signing, iOS signing and TestFlight, the 2026 store rules and a signed App Bundle build in GitHub Actions.
Testing in Flutter: Unit, Widget and Integration Tests, Fake Repositories and Golden Tests
The backbone of Flutter testing is unit and widget tests written with fake repositories; mocks only for "was this call made?", integration_test for critical flows and golden tests for catching visual changes on a single platform. With Bookstore's 86 tests, a checkout flow through provider and go_router, mocktail's registerFallbackValue trap and the platform differences of goldens.
Local Storage and Offline in Flutter: shared_preferences, flutter_secure_storage, SQLite/drift and Caching Strategy
In Flutter, small non-secret settings go to shared_preferences, tokens to flutter_secure_storage (iOS Keychain, Android Keystore) and data you query to SQLite through drift. We move Bookstore's cart to drift, try a migration and a reactive query, and show the catalog without internet in the order fresh cache, network, stale cache, all without changing the ViewModels.
API Integration in Flutter: http/dio, JSON Serialization, Repositories and Connecting to the ASP.NET Core Bookstore API
The solid way to connect a Flutter app to an ASP.NET Core API is to keep HTTP in one ApiClient (timeout, retry only for GET, a single refresh on 401), to turn JSON into the domain model in one place and to swap the repository without touching the ViewModel. With real responses from a SQLite copy of the Bookstore API, ProblemDetails mapping, and the 10.0.2.2, cleartext and CORS traps.