56,966 blogs · [ { "id": "01a087db-451d-7148-9f8e-4f04f31c8fc5", "title": "Type-Level Wordle in TypeScript", "url": "https://sandroroth.com/blog/wordle-in-types/", "published_at": "2026-07-08T00:00:00+00:00" }, { "id": "01a087db-451d-7148-9f8e-4f04f39eede7", "title": "Evaluating Schema Validation Libraries", "url": "https://sandroroth.com/blog/schema-validation/", "published_at": "2026-04-15T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0a67e35bb", "title": "Migrating my site from Eleventy to Astro", "url": "https://sandroroth.com/blog/migration-to-astro/", "published_at": "2025-12-21T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0a76c4dee", "title": "Type-Level Hangman in TypeScript", "url": "https://sandroroth.com/blog/hangman-in-types/", "published_at": "2025-08-24T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0a8080cb3", "title": "Evaluating tour libraries for React", "url": "https://sandroroth.com/blog/evaluating-tour-libraries/", "published_at": "2025-08-03T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0a8d8ba09", "title": "The many ways to build a toast component in React", "url": "https://sandroroth.com/blog/react-toast-component/", "published_at": "2025-08-02T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0a946a81d", "title": "(Don't) test your Jotai atoms", "url": "https://sandroroth.com/blog/testing-jotai-atoms/", "published_at": "2024-08-23T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0a9c2f3c6", "title": "The many ways to build a tabs component in React", "url": "https://sandroroth.com/blog/react-tabs-component/", "published_at": "2024-07-23T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0aa5154a8", "title": "Exploring StyleX: A First Look Review", "url": "https://sandroroth.com/blog/stylex/", "published_at": "2024-03-29T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0ab3439b1", "title": "Migrating my site from NextJS to Eleventy", "url": "https://sandroroth.com/blog/migrationl-to-eleventy/", "published_at": "2023-12-17T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0abae7fd4", "title": "Angular 17 + TypeScript: The good and the bad parts", "url": "https://sandroroth.com/blog/angular-typescript/", "published_at": "2023-11-12T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0ac7673b6", "title": "Co-locate state and UI with React Hooks", "url": "https://sandroroth.com/blog/react-hooks-jsx/", "published_at": "2023-08-05T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0ac99f669", "title": "Controlled Components in Storybook", "url": "https://sandroroth.com/blog/storybook-controlled-components/", "published_at": "2023-04-16T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0ad06c161", "title": "Polymorphic React Components are quite tricky", "url": "https://sandroroth.com/blog/react-polymorphic-components/", "published_at": "2023-04-02T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0ad2dcdf7", "title": "Local component state with Redux Toolkit-like reducers", "url": "https://sandroroth.com/blog/react-reducers/", "published_at": "2023-03-11T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0ae0ea8aa", "title": "How to build a styling foundation with vanilla-extract", "url": "https://sandroroth.com/blog/vanilla-extract-approach/", "published_at": "2023-03-03T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0ae82e8be", "title": "Building complex forms with Angular Reactive Forms", "url": "https://sandroroth.com/blog/angular-complex-reactive-forms/", "published_at": "2023-02-19T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0aeddd7a9", "title": "How to structure your React projects", "url": "https://sandroroth.com/blog/project-structure/", "published_at": "2023-02-16T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0afb619f4", "title": "Don't break out of type safety", "url": "https://sandroroth.com/blog/typescript-types/", "published_at": "2023-02-12T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0afc57422", "title": "Improve your VS Code setup", "url": "https://sandroroth.com/blog/vscode-setup/", "published_at": "2023-02-05T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b083272c", "title": "State management in a component-based world", "url": "https://sandroroth.com/blog/state-management/", "published_at": "2022-12-10T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b0e3aaf6", "title": "Building Component Slots in React", "url": "https://sandroroth.com/blog/react-slots/", "published_at": "2022-11-01T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b11b1bb7", "title": "Set up vanilla-extract with create-react-app", "url": "https://sandroroth.com/blog/vanilla-extract-cra/", "published_at": "2022-09-03T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b13dc471", "title": "Handle multiple validation errors with Reactive Forms + Angular Material", "url": "https://sandroroth.com/blog/angular-reactive-forms-errors/", "published_at": "2022-07-10T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b16e3327", "title": "Handling large, typed reactive forms in Angular", "url": "https://sandroroth.com/blog/angular-large-typed-reactive-forms/", "published_at": "2022-06-05T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b20b4f5e", "title": "Validating the HTML of an Eleventy site", "url": "https://sandroroth.com/blog/eleventy-html-validation/", "published_at": "2022-03-30T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b2ca6378", "title": "Building an Angular Library with multiple entry points", "url": "https://sandroroth.com/blog/angular-library/", "published_at": "2022-03-08T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b2fc35db", "title": "React Hooks for Angular", "url": "https://sandroroth.com/blog/angular-hooks/", "published_at": "2022-01-24T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b3981941", "title": "Create dynamic translations with HTML & Components in Angular", "url": "https://sandroroth.com/blog/angular-dynamic-translations/", "published_at": "2021-12-13T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b3c2f200", "title": "Better HTTP Services in Angular with the Repository Pattern", "url": "https://sandroroth.com/blog/angular-repository-pattern/", "published_at": "2021-09-11T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b3ef6def", "title": "SCAM: A better way to share components in Angular", "url": "https://sandroroth.com/blog/angular-shared-scam/", "published_at": "2021-07-11T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b3fc2b00", "title": "Build better responsive components in Angular with Component Variants", "url": "https://sandroroth.com/blog/angular-component-variants/", "published_at": "2021-06-05T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b41b2ad4", "title": "Angular + Stitches: How to use CSS-in-JS in Angular", "url": "https://sandroroth.com/blog/angular-stitches/", "published_at": "2021-05-01T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b48d54e6", "title": "Follow-up: Data handling in Angular Reactive Forms", "url": "https://sandroroth.com/blog/reactive-forms-data-handling/", "published_at": "2021-03-13T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b52c382f", "title": "Chainable class names for CSS Modules in React", "url": "https://sandroroth.com/blog/chainable-class-names/", "published_at": "2021-01-31T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b596ec77", "title": "Handling large reactive forms in Angular", "url": "https://sandroroth.com/blog/large-reactive-forms/", "published_at": "2020-12-31T00:00:00+00:00" }, { "id": "01a087db-451e-7248-a1c4-6ef0b65cc28b", "title": "Two-way Data Binding in React", "url": "https://sandroroth.com/blog/react-two-way-data-binding/", "published_at": "2020-12-29T00:00:00+00:00" } ] posts Claim your blog
Back to sandroroth.com
Blog · corpus.blog/blogs/sandroroth.com/posts

sandroroth.com

sandroroth.com

2026

2025

2024

2023

2022

2021

2020