Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Jetpack Compose + design systems
Search
François Blavoet
May 03, 2022
Programming
450
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Jetpack Compose + design systems
François Blavoet
May 03, 2022
More Decks by François Blavoet
See All by François Blavoet
Accessibility made Easy
francois_blavoet
0
130
Vectorial Victories - Android Makers 2018 - Paris
francois_blavoet
0
840
New York Accessibility Hackathon - Accessibility on Android
francois_blavoet
1
130
SVG
francois_blavoet
0
130
And then my phone became smarter - A journey into the Awareness API - MobileEra 2016
francois_blavoet
0
730
And then my phone became smarter - A journey into the Awareness API
francois_blavoet
2
1.5k
Let's Sprinkle some #PerfMatters on your ViewGroups - Droidcon Turin 2016
francois_blavoet
10
1.6k
Let's Sprinkle some #PerfMatters on your ViewGroups - Droidcon Paris 2015
francois_blavoet
13
1.7k
Other Decks in Programming
See All in Programming
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
190
typoなんかねぇよ
raspython3
0
640
PyO3 で既存 Python 評価器を Rust core 化する ー wasm-bindgen でブラウザにも配るための設計
kdash
1
120
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
660
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
340
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
120
MySQLとPostgreSQLって何が違うの?
akagami
0
150
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
870
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
160
初めての模倣学習とVLA
natsutan
0
400
Flow は今どうなっているか
mizdra
PRO
0
820
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
270
Featured
See All Featured
The browser strikes back
jonoalderson
0
1.6k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
370
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
550
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
230
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
490
Rails Girls Zürich Keynote
gr2m
96
14k
Faster Mobile Websites
deanohume
310
32k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Transcript
Jetpack Compose + Design Systems François Blavoet
Jetpack Compose • Compose is the future of Android UI
development • When is the best time to start adopting it ?
Design systems What is a Design system ? -> it
is a complete set of standards intended to manage design at scale using reusable components and patterns.
Design systems @GET("/addresses") fun getAddresses(): Single<GetAddressesResponse> @PUT("/addresses/{address_id}") fun updateAddress(@Path("address_id") id:
String, @Body body: Map<String, Any>): Single<AddressResponse>
Let’s have a look at one component
Let’s have a look at one component
Let’s have a look at one component
Let’s have a look at one component
Let’s have a look at one component Row.Content { leading(
label = "Order Changes Preferences", label2 = "Suggest replacements ...", ) trailing( label = "Edit", option = Row.TrailingOption.Clickable(onPreferenceClick) ) }
Let’s have a look at one component Row.Content { leading(
label = "Tue Jun 2, 4–5pm", option = LeadingOption.Icon(Icon.Time), ) }
One design system
Material Design
Material Design Button( onClick: () -> Unit, modifier: Modifier =
Modifier, enabled: Boolean = true, interactionSource: MutableInteractionSource = remember {..}, elevation: ButtonElevation? = ButtonDefaults.elevation(), shape: Shape = MaterialTheme.shapes.small, border: BorderStroke? = null, colors: ButtonColors = ButtonDefaults.buttonColors(), contentPadding: PaddingValues = ButtonDefaults.ContentPadding, content: @Composable RowScope.() -> Unit, )
Material Design?
Material Design? ?
None
Let’s implement our own system
Atoms
Atoms Requirements: • Day/night • Customizable for white label apps
• As easy to use as possible • Have an abstract representation outside of the composition
Atoms interface ColorSpec { @Composable fun value(): Color }
Atoms interface ColorSpec { @Composable fun value(): Color companion object
{ val SystemGrayscale70: ColorSpec = … val SystemGrayscale50: ColorSpec = … … } }
Atoms interface ColorSpec { @Composable fun value(): Color companion object
{ val SystemGrayscale70: ColorSpec = … val SystemGrayscale50: ColorSpec = … … fun fromColor(color: Color): ColorSpec { return StaticColor(color) } } }
Atoms @Composable fun DesignTheme( configuration: ThemeConfig? = null, content: @Composable
() -> Unit, ) { … } object DesignTheme { val colors: Colors @Composable @ReadOnlyComposable get() = LocalColors.current }
Atoms
Atoms interface IconSlot { @Composable fun Content(contentColor: Color) }
Atoms interface IconSlot { @Composable fun Content(contentColor: Color) companion object
{ fun fromResource( @DrawableRes res: Int, contentDescription: TextSpec?, ): IconSlot { return ResIcon(res, contentDescription) } } }
Atoms enum class Icons(@DrawableRes internal val resId: Int) : IconSlot
{ Accessibility(R.drawable.cp_accessibility), Account(R.drawable.cp_account), Add(R.drawable.cp_add), … }
Molecules
Molecules data class PillSpec( val label: TextSpec, val onClick: (()
-> Unit)?, val selected: Boolean = false, ) @Composable fun Pill( spec: PillSpec, modifier: Modifier = Modifier, )
Molecules data class PillSpec( val label: TextSpec, val onClick: (()
-> Unit)?, val selected: Boolean = false, ) @Composable fun Pill( spec: PillSpec, modifier: Modifier = Modifier, ) @Composable fun BasePill( selected: Boolean, onClick: (() -> Unit)?, modifier: Modifier = Modifier, … content: @Composable BoxScope.(contentColor: Color) -> Unit, )
Going Further import androidx.compose.material.Text @Composable fun Text( text: AnnotatedString, modifier:
Modifier = Modifier, style: TextStyle = LocalTextStyle.current, … ) {
Going Further import com.instacart.compote.foundation.Text @Composable fun Text( text: RichTextSpec, modifier:
Modifier = Modifier, style: TextStyle = TextStyleSpec.Default, … )
33
Thank you! François Blavoet