blocks/server-side/features-section/items.tsx (71 lines of code) (raw):
import React, { ReactNode } from 'react';
import DiamondIcon from './diamond.svg';
interface FeatureItem {
id: string;
icon: ImgSrc;
title: string;
description: ReactNode;
}
interface FeatureSlideItem extends FeatureItem {
codeSample: string;
}
export const featureSlideshowItems: FeatureSlideItem[] = [
{
id: 'null-safety',
icon: DiamondIcon,
title: 'Null-safety',
description: 'Switching backend development to Kotlin significantly reduces crashes at runtime.',
codeSample: `val b: String? = "Kotlin"
// reduction of null-pointer exceptions is achieved by
// explicit nullable types (String?) and enforced compile-time checks (?.)
val length: Int? = b?.length
// b.length <-- won't compile, as the length can only be accessed safely
if (b != null && b.length > 0) {
print("String of length \${b.length}")
} else {
print("Empty string")
}
// Kotlin smart-casts b to a non-null value after an != null check.
// It makes code clearer and easier tofor debugging and maintainenance.
`,
},
{
id: 'immutability',
icon: DiamondIcon,
title: 'Immutability',
description: `Immutable data by default:\n
- Immutable collections reduce concurrency issues
- Easier reasoning about application state
- Improved predictability
`,
codeSample: `data class Config(val host: String, val port: Int)
val config = Config(host = "localhost", port = 8080)
// config.port = 8081 <-- won't compile, val cannot be changed
val updatedConfig = config.copy(port = 8081)
// Kotlin's data classes, immutability, and the built-in .copy() function
// simplify safe object updates and state management, directly enhancing code stability.
println(config) //Config(host = "localhost", port = 8080)
println(updatedConfig) //Config(host = "localhost", port = 8081)
`,
},
{
id: 'type-safety',
icon: DiamondIcon,
title: 'Type-safety',
description: `An explicit and expressive type system helps developers catch errors early:\n
- Strong type system clarifies intent, eases refactoring, and safeguards code evolution at scale.
- Reified generics keep type parameters at runtime, eliminating type erasure.
`,
codeSample: `// Features like sealed classes, smart casts, and inline value classes
// enforce exhaustive, compile-time checking of code paths.
@JvmInline value class UserId(val id: String) // explicit type-safety for primitive types
sealed class Result
data class Found(val userId: UserId): Result()
data object NotFound: Result()
fun handle(res: Result): String = when(res) { // exhaustive compile-time check
is Found -> "User: \${res.userId.id}" // smart-cast 'res' automatically
NotFound -> "User not found"
}
`,
},
];