{"id":"07f9e345-dce4-42e5-ba96-f96e161a537c","shortId":"aKcxuz","kind":"skill","title":"material3","tagline":"27 Android skills for AI agents (Claude Code, Codex, Cursor). Fixes Supabase auth, Hilt errors, design inconsistency, kapt→ksp, missing UiState states. Reduced my token bills 5×. FitGenZ AI shipped in 18 days.","description":"# Material 3 Expressive — Complete Component Reference\r\n\r\nM3 Expressive (Compose material3 1.4+) brings physics-based motion, shape morphing,\r\nand a MotionScheme. These rules cover every component correctly.\r\n\r\n## TopAppBar variants — correct scroll behavior\r\n\r\n```kotlin\r\n// ✅ Standard TopAppBar — pinned, for screens with minimal scroll\r\n@OptIn(ExperimentalMaterial3Api::class)\r\nScaffold(\r\n    topBar = {\r\n        TopAppBar(\r\n            title = { Text(\"Home\") },\r\n            navigationIcon = {\r\n                if (canGoBack) IconButton(onClick = onBack) {\r\n                    Icon(Icons.AutoMirrored.Filled.ArrowBack, \"Back\")\r\n                }\r\n            },\r\n            actions = {\r\n                IconButton(onSearch)  { Icon(Icons.Default.Search,   \"Search\") }\r\n                IconButton(onMenu)    { Icon(Icons.Default.MoreVert, \"More\") }\r\n            },\r\n            colors = TopAppBarDefaults.topAppBarColors(\r\n                containerColor         = MaterialTheme.colorScheme.surface,\r\n                scrolledContainerColor = MaterialTheme.colorScheme.surfaceContainer,\r\n                titleContentColor      = MaterialTheme.colorScheme.onSurface,\r\n            )\r\n        )\r\n    }\r\n) { innerPadding -> Content(Modifier.padding(innerPadding)) }\r\n\r\n// ✅ LargeTopAppBar — collapses on scroll, for detail/article screens\r\n@OptIn(ExperimentalMaterial3Api::class)\r\n@Composable\r\nfun ArticleScreen() {\r\n    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()\r\n    Scaffold(\r\n        topBar = {\r\n            LargeTopAppBar(\r\n                title = { Text(\"Article title\") },\r\n                navigationIcon = { IconButton(onBack) { Icon(Icons.AutoMirrored.Filled.ArrowBack, \"Back\") } },\r\n                scrollBehavior = scrollBehavior,\r\n                colors = TopAppBarDefaults.largeTopAppBarColors(\r\n                    containerColor         = MaterialTheme.colorScheme.surface,\r\n                    scrolledContainerColor = MaterialTheme.colorScheme.surfaceContainer,\r\n                )\r\n            )\r\n        },\r\n        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection)   // REQUIRED\r\n    ) { innerPadding ->\r\n        LazyColumn(contentPadding = innerPadding) { /* ... */ }\r\n    }\r\n}\r\n\r\n// ✅ CenterAlignedTopAppBar — home screens, feeds\r\nCenterAlignedTopAppBar(title = { Text(\"App name\") }, actions = { /* ... */ })\r\n```\r\n\r\n## FAB variants — choose by context\r\n\r\n```kotlin\r\n// ✅ Standard FAB — primary action on most screens\r\nFloatingActionButton(\r\n    onClick = onCreate,\r\n    containerColor = MaterialTheme.colorScheme.primaryContainer,\r\n    contentColor   = MaterialTheme.colorScheme.onPrimaryContainer,\r\n    shape = MaterialTheme.shapes.large   // 16dp — M3 default\r\n) { Icon(Icons.Default.Add, \"Create\") }\r\n\r\n// ✅ ExtendedFAB — expands/shrinks on scroll for more clarity\r\nval isScrollingDown by remember { derivedStateOf { listState.lastScrolledForward } }\r\n\r\nExtendedFloatingActionButton(\r\n    text     = { Text(\"New post\") },\r\n    icon     = { Icon(Icons.Default.Add, null) },\r\n    onClick  = onCreate,\r\n    expanded = !isScrollingDown,\r\n    containerColor = MaterialTheme.colorScheme.primaryContainer\r\n)\r\n\r\n// ✅ LargeFAB — prominent primary action on empty states\r\nLargeFloatingActionButton(onClick = onCreate) {\r\n    Icon(Icons.Default.Add, \"Create\", Modifier.size(36.dp))\r\n}\r\n\r\n// ✅ SmallFAB — secondary or supporting action\r\nSmallFloatingActionButton(onClick = onShare) {\r\n    Icon(Icons.Default.Share, \"Share\")\r\n}\r\n```\r\n\r\n## Chips — correct variant for each use case\r\n\r\n```kotlin\r\n// ✅ FilterChip — toggle state (categories, tags, filters)\r\nFilterChip(\r\n    selected = isActive,\r\n    onClick  = onToggle,\r\n    label    = { Text(\"Active\") },\r\n    leadingIcon = if (isActive) {\r\n        { Icon(Icons.Default.Check, null, Modifier.size(FilterChipDefaults.IconSize)) }\r\n    } else null\r\n)\r\n\r\n// ✅ AssistChip — smart suggestions, quick actions\r\nAssistChip(\r\n    onClick = onAutoFill,\r\n    label   = { Text(\"Auto-fill address\") },\r\n    leadingIcon = { Icon(Icons.Default.Lightbulb, null, Modifier.size(AssistChipDefaults.IconSize)) }\r\n)\r\n\r\n// ✅ InputChip — user-added tags/tokens, removable\r\nInputChip(\r\n    selected = false,\r\n    onClick  = { },\r\n    label    = { Text(tag) },\r\n    trailingIcon = {\r\n        IconButton(onClick = { onRemove(tag) }, modifier = Modifier.size(InputChipDefaults.IconSize)) {\r\n            Icon(Icons.Default.Close, \"Remove $tag\", Modifier.size(InputChipDefaults.IconSize))\r\n        }\r\n    }\r\n)\r\n\r\n// ✅ SuggestionChip — read-only recommendations\r\nSuggestionChip(onClick = { onApply(suggestion) }, label = { Text(suggestion) })\r\n```\r\n\r\n## SegmentedButton — replaces RadioButton for 2-5 options\r\n\r\n```kotlin\r\n// ✅ Single-select — period, view mode, sort order\r\nval options = listOf(\"Day\", \"Week\", \"Month\")\r\nvar selected by rememberSaveable { mutableStateOf(0) }\r\n\r\nSingleChoiceSegmentedButtonRow(modifier = Modifier.fillMaxWidth()) {\r\n    options.forEachIndexed { index, option ->\r\n        SegmentedButton(\r\n            selected = selected == index,\r\n            onClick  = { selected = index },\r\n            shape    = SegmentedButtonDefaults.itemShape(index, options.size),\r\n            icon     = { SegmentedButtonDefaults.Icon(selected == index) },\r\n            label    = { Text(option) }\r\n        )\r\n    }\r\n}\r\n\r\n// ✅ Multi-select — filter checkboxes\r\nval selected = remember { mutableStateSetOf<String>() }\r\nMultiChoiceSegmentedButtonRow(modifier = Modifier.fillMaxWidth()) {\r\n    filters.forEachIndexed { index, filter ->\r\n        SegmentedButton(\r\n            checked  = filter in selected,\r\n            onCheckedChange = { if (it) selected.add(filter) else selected.remove(filter) },\r\n            shape    = SegmentedButtonDefaults.itemShape(index, filters.size),\r\n            label    = { Text(filter) }\r\n        )\r\n    }\r\n}\r\n```\r\n\r\n## SearchBar — M3 expandable search\r\n\r\n```kotlin\r\n// ✅ SearchBar with suggestions and history\r\nvar query  by rememberSaveable { mutableStateOf(\"\") }\r\nvar active by rememberSaveable { mutableStateOf(false) }\r\n\r\nSearchBar(\r\n    inputField = {\r\n        SearchBarDefaults.InputField(\r\n            query        = query,\r\n            onQueryChange = { query = it },\r\n            onSearch     = { onSearch(it); active = false },\r\n            expanded     = active,\r\n            onExpandedChange = { active = it },\r\n            placeholder  = { Text(\"Search...\") },\r\n            leadingIcon  = { Icon(Icons.Default.Search, null) },\r\n            trailingIcon = {\r\n                if (query.isNotEmpty()) {\r\n                    IconButton({ query = \"\" }) { Icon(Icons.Default.Clear, \"Clear\") }\r\n                }\r\n            }\r\n        )\r\n    },\r\n    expanded = active,\r\n    onExpandedChange = { active = it },\r\n    modifier = Modifier.fillMaxWidth()\r\n) {\r\n    // Suggestions when expanded\r\n    searchSuggestions.forEach { suggestion ->\r\n        ListItem(\r\n            headlineContent = { Text(suggestion) },\r\n            leadingContent  = { Icon(Icons.Default.History, null) },\r\n            modifier = Modifier.clickable { query = suggestion; onSearch(suggestion); active = false }\r\n        )\r\n        HorizontalDivider()\r\n    }\r\n}\r\n```\r\n\r\n## ListItem — consistent list rows\r\n\r\n```kotlin\r\n// ✅ ListItem — correct for all list content\r\nListItem(\r\n    headlineContent   = { Text(item.title, style = MaterialTheme.typography.bodyLarge) },\r\n    supportingContent = { Text(item.subtitle, style = MaterialTheme.typography.bodyMedium,\r\n        color = MaterialTheme.colorScheme.onSurfaceVariant) },\r\n    leadingContent    = {\r\n        AsyncImage(model = item.imageUrl, contentDescription = null,\r\n            modifier = Modifier.size(56.dp).clip(MaterialTheme.shapes.small))\r\n    },\r\n    trailingContent   = {\r\n        IconButton(onClick = { onMore(item.id) }) {\r\n            Icon(Icons.Default.MoreVert, \"More options\")\r\n        }\r\n    },\r\n    tonalElevation = 0.dp,\r\n    modifier = Modifier.clickable { onItemClick(item.id) }\r\n)\r\n```\r\n\r\n## DatePicker and TimePicker\r\n\r\n```kotlin\r\n// ✅ Modal DatePicker\r\n@OptIn(ExperimentalMaterial3Api::class)\r\n@Composable\r\nfun AppDatePicker(\r\n    onDateSelected: (LocalDate?) -> Unit,\r\n    onDismiss: () -> Unit\r\n) {\r\n    val state = rememberDatePickerState()\r\n    DatePickerDialog(\r\n        onDismissRequest = onDismiss,\r\n        confirmButton = {\r\n            TextButton({\r\n                val ms = state.selectedDateMillis\r\n                onDateSelected(ms?.let { Instant.fromEpochMilliseconds(it).toLocalDateTime(TimeZone.currentSystemDefault()).date })\r\n                onDismiss()\r\n            }) { Text(\"OK\") }\r\n        },\r\n        dismissButton = { TextButton(onDismiss) { Text(\"Cancel\") } }\r\n    ) { DatePicker(state) }\r\n}\r\n```\r\n\r\n## PullToRefreshBox — M3 1.3+\r\n\r\n```kotlin\r\n// ✅ Pull to refresh with PullToRefreshBox\r\n@OptIn(ExperimentalMaterial3Api::class)\r\n@Composable\r\nfun RefreshableScreen(isRefreshing: Boolean, onRefresh: () -> Unit) {\r\n    val pullState = rememberPullToRefreshState()\r\n    PullToRefreshBox(\r\n        isRefreshing = isRefreshing,\r\n        onRefresh    = onRefresh,\r\n        state        = pullState\r\n    ) {\r\n        LazyColumn { /* content */ }\r\n    }\r\n}\r\n```\r\n\r\n## Snackbar with action\r\n\r\n```kotlin\r\n// ✅ SnackbarHost in Scaffold + show from ViewModel event\r\nval snackbarHostState = remember { SnackbarHostState() }\r\n\r\nScaffold(snackbarHost = { SnackbarHost(snackbarHostState) }) { innerPadding ->\r\n    Content(Modifier.padding(innerPadding))\r\n}\r\n\r\n// Collect SnackbarEvent from ViewModel\r\nLaunchedEffect(Unit) {\r\n    viewModel.events.collect { event ->\r\n        if (event is AppEvent.ShowSnackbar) {\r\n            val result = snackbarHostState.showSnackbar(\r\n                message    = event.message,\r\n                actionLabel = event.actionLabel,\r\n                duration    = SnackbarDuration.Short\r\n            )\r\n            if (result == SnackbarResult.ActionPerformed) event.onAction()\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n## Badge — notification counts\r\n\r\n```kotlin\r\n// ✅ BadgedBox on nav items\r\nBadgedBox(\r\n    badge = {\r\n        if (count > 0) Badge(containerColor = MaterialTheme.colorScheme.error) {\r\n            Text(\"${if (count > 99) \"99+\" else count}\",\r\n                color = MaterialTheme.colorScheme.onError,\r\n                style = MaterialTheme.typography.labelSmall)\r\n        }\r\n    }\r\n) { Icon(Icons.Default.Notifications, \"Notifications\") }\r\n```\r\n\r\n## Tonal elevation — surface color, no shadows\r\n\r\n```kotlin\r\n// ✅ Use surfaceContainerX for layered depth — no drop shadows in M3\r\n// Level 0: background\r\n// Level 1: surfaceContainerLowest — cards floating on white bg\r\n// Level 2: surfaceContainer — standard card\r\n// Level 3: surfaceContainerHigh — active/selected state\r\n// Level 4: surfaceContainerHighest — top-most surface (modal header)\r\n\r\nCard(colors = CardDefaults.cardColors(\r\n    containerColor = MaterialTheme.colorScheme.surfaceContainer\r\n))\r\n\r\n// ✅ tonalElevation on Surface adds color tint automatically\r\nSurface(tonalElevation = 3.dp) { /* slightly elevated */ }\r\n// DO NOT use elevation + shadow in M3 — use tonal surface colors instead\r\n```\r\n\r\n## ExposedDropdownMenuBox — combobox / select\r\n\r\n```kotlin\r\n// ✅ Dropdown select field\r\nvar expanded by remember { mutableStateOf(false) }\r\nvar selected by rememberSaveable { mutableStateOf(options.first()) }\r\n\r\nExposedDropdownMenuBox(expanded = expanded, onExpandedChange = { expanded = it }) {\r\n    OutlinedTextField(\r\n        value = selected,\r\n        onValueChange = {},\r\n        readOnly = true,\r\n        label = { Text(\"Category\") },\r\n        trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded) },\r\n        modifier = Modifier.menuAnchor(ExposedDropdownMenuAnchorType.PrimaryNotEditable).fillMaxWidth()\r\n    )\r\n    ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {\r\n        options.forEach { option ->\r\n            DropdownMenuItem(\r\n                text    = { Text(option) },\r\n                onClick = { selected = option; expanded = false },\r\n                leadingIcon = if (option == selected) { { Icon(Icons.Default.Check, null) } } else null\r\n            )\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n## Common Mistakes\r\n\r\n❌ M2 components (`androidx.compose.material`) mixed with M3 — causes visual inconsistency\r\n❌ `nestedScroll` missing with `LargeTopAppBar` — scroll behavior won't work\r\n❌ Using `RadioButton` for 2-4 options — use `SegmentedButton`\r\n❌ Drop shadows on cards (`elevation = 4.dp`) — use `surfaceContainer` colors instead\r\n❌ No `contentDescription` on icon-only buttons — accessibility violation\r\n❌ `FilterChip` leading icon not sized with `FilterChipDefaults.IconSize` — renders too large\r\n❌ `SegmentedButton` without `SegmentedButtonDefaults.itemShape()` — corners wrong\r\n❌ `SearchBar` in older API style — use new `inputField` parameter (M3 1.3+)","tags":["material3","android","agent","skills","piyushverma0","agent-skills","ai-agent","antigravity","claude-code","codex","cursor","gemini-cli"],"capabilities":["skill","source-piyushverma0","skill-material3","topic-agent-skills","topic-ai-agent","topic-android","topic-antigravity","topic-claude-code","topic-codex","topic-cursor","topic-gemini-cli","topic-hilt","topic-jetpack-compose","topic-kotlin","topic-material3"],"categories":["android-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/piyushverma0/android-agent-skills/material3","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add piyushverma0/android-agent-skills","source_repo":"https://github.com/piyushverma0/android-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (12,800 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:09:10.163Z","embedding":null,"createdAt":"2026-05-18T13:14:49.782Z","updatedAt":"2026-05-18T19:09:10.163Z","lastSeenAt":"2026-05-18T19:09:10.163Z","tsv":"'-4':887 '-5':350 '0':372,702,738 '0.dp':560 '1':741 '1.3':613,935 '1.4':45 '16dp':194 '18':33 '2':349,749,886 '27':2 '3':36,754 '3.dp':781 '36.dp':242 '4':759 '4.dp':896 '5':28 '56.dp':547 '99':709,710 'access':908 'action':94,171,181,231,247,290,644 'actionlabel':682 'activ':275,448,464,467,469,487,489,512 'active/selected':756 'ad':309 'add':775 'address':299 'agent':7 'ai':6,30 'android':3 'androidx.compose.material':867 'api':928 'app':169 'appdatepick':576 'appevent.showsnackbar':676 'articl':138 'articlescreen':129 'assistchip':286,291 'assistchipdefaults.iconsize':305 'asyncimag':540 'auth':14 'auto':297 'auto-fil':296 'automat':778 'back':93,145 'background':739 'badg':690,699,703 'badgedbox':694,698 'base':49 'behavior':66,879 'bg':747 'bill':27 'boolean':627 'bring':46 'button':907 'cancel':608 'cangoback':87 'card':743,752,767,894 'carddefaults.cardcolors':769 'case':260 'categori':265,829 'caus':871 'centeralignedtopappbar':162,166 'check':413 'checkbox':401 'chip':254 'choos':174 'clariti':206 'class':78,126,573,622 'claud':8 'clear':485 'clip':548 'code':9 'codex':10 'collaps':118 'collect':665 'color':105,148,537,713,723,768,776,794,899 'combobox':797 'common':863 'complet':38 'compon':39,60,866 'compos':43,127,574,623 'confirmbutton':588 'consist':516 'containercolor':107,150,188,226,704,770 'content':114,525,641,662 'contentcolor':190 'contentdescript':543,902 'contentpad':160 'context':176 'corner':923 'correct':61,64,255,521 'count':692,701,708,712 'cover':58 'creat':199,240 'cursor':11 'date':600 'datepick':565,570,609 'datepickerdialog':585 'day':34,364 'default':196 'depth':731 'derivedstateof':211 'design':17 'detail/article':122 'dismissbutton':604 'drop':733,891 'dropdown':800 'dropdownmenuitem':845 'durat':684 'elev':721,783,787,895 'els':284,422,711,861 'empti':233 'error':16 'event':652,672,674 'event.actionlabel':683 'event.message':681 'event.onaction':689 'everi':59 'expand':224,434,466,486,495,804,816,817,819,832,838,839,841,852 'expands/shrinks':201 'experimentalmaterial3api':77,125,572,621 'exposeddropdownmenu':837 'exposeddropdownmenuanchortype.primarynoteditable':835 'exposeddropdownmenubox':796,815 'exposeddropdownmenudefaults.trailingicon':831 'express':37,42 'extendedfab':200 'extendedfloatingactionbutton':213 'fab':172,179 'fals':314,452,465,513,808,842,853 'feed':165 'field':802 'fill':298 'fillmaxwidth':836 'filter':267,400,411,414,421,424,431 'filterchip':262,268,910 'filterchipdefaults.iconsize':283,916 'filters.foreachindexed':409 'filters.size':428 'fitgenz':29 'fix':12 'float':744 'floatingactionbutton':185 'fun':128,575,624 'header':766 'headlinecont':499,527 'hilt':15 'histori':441 'home':84,163 'horizontaldivid':514 'icon':91,97,102,143,197,218,219,238,251,279,301,327,390,475,483,503,555,717,858,905,912 'icon-on':904 'iconbutton':88,95,100,141,320,481,551 'icons.automirrored.filled.arrowback':92,144 'icons.default.add':198,220,239 'icons.default.check':280,859 'icons.default.clear':484 'icons.default.close':328 'icons.default.history':504 'icons.default.lightbulb':302 'icons.default.morevert':103,556 'icons.default.notifications':718 'icons.default.search':98,476 'icons.default.share':252 'inconsist':18,873 'index':377,382,385,388,393,410,427 'innerpad':113,116,158,161,661,664 'inputchip':306,312 'inputchipdefaults.iconsize':326,332 'inputfield':454,932 'instant.fromepochmilliseconds':596 'instead':795,900 'isact':270,278 'isrefresh':626,634,635 'isscrollingdown':208,225 'item':697 'item.id':554,564 'item.imageurl':542 'item.subtitle':534 'item.title':529 'kapt':19 'kotlin':67,177,261,352,436,519,568,614,645,693,726,799 'ksp':20 'label':273,294,316,342,394,429,827 'larg':919 'largefab':228 'largefloatingactionbutton':235 'largetopappbar':117,135,877 'launchedeffect':669 'layer':730 'lazycolumn':159,640 'lead':911 'leadingcont':502,539 'leadingicon':276,300,474,854 'let':595 'level':737,740,748,753,758 'list':517,524 'listitem':498,515,520,526 'listof':363 'liststate.lastscrolledforward':212 'locald':578 'm2':865 'm3':41,195,433,612,736,790,870,934 'materi':35 'material3':1,44 'materialtheme.colorscheme.error':705 'materialtheme.colorscheme.onerror':714 'materialtheme.colorscheme.onprimarycontainer':191 'materialtheme.colorscheme.onsurface':112 'materialtheme.colorscheme.onsurfacevariant':538 'materialtheme.colorscheme.primarycontainer':189,227 'materialtheme.colorscheme.surface':108,151 'materialtheme.colorscheme.surfacecontainer':110,153,771 'materialtheme.shapes.large':193 'materialtheme.shapes.small':549 'materialtheme.typography.bodylarge':531 'materialtheme.typography.bodymedium':536 'materialtheme.typography.labelsmall':716 'messag':680 'minim':74 'miss':21,875 'mistak':864 'mix':868 'modal':569,765 'mode':358 'model':541 'modifi':154,324,374,407,491,506,545,561,833 'modifier.clickable':507,562 'modifier.fillmaxwidth':375,408,492 'modifier.menuanchor':834 'modifier.nestedscroll':155 'modifier.padding':115,663 'modifier.size':241,282,304,325,331,546 'month':366 'morph':52 'motion':50 'motionschem':55 'ms':591,594 'multi':398 'multi-select':397 'multichoicesegmentedbuttonrow':406 'mutablestateof':371,446,451,807,813 'mutablestatesetof':405 'name':170 'nav':696 'navigationicon':85,140 'nestedscrol':874 'new':216,931 'notif':691,719 'null':221,281,285,303,477,505,544,860,862 'ok':603 'older':927 'onappli':340 'onautofil':293 'onback':90,142 'oncheckedchang':417 'onclick':89,186,222,236,249,271,292,315,321,339,383,552,849 'oncreat':187,223,237 'ondateselect':577,593 'ondismiss':580,587,601,606 'ondismissrequest':586,840 'onexpandedchang':468,488,818 'onitemclick':563 'onmenu':101 'onmor':553 'onquerychang':458 'onrefresh':628,636,637 'onremov':322 'onsearch':96,461,462,510 'onshar':250 'ontoggl':272 'onvaluechang':824 'optin':76,124,571,620 'option':351,362,378,396,558,844,848,851,856,888 'options.first':814 'options.foreach':843 'options.foreachindexed':376 'options.size':389 'order':360 'outlinedtextfield':821 'paramet':933 'period':356 'physic':48 'physics-bas':47 'pin':70 'placehold':471 'post':217 'primari':180,230 'promin':229 'pull':615 'pullstat':631,639 'pulltorefreshbox':611,619,633 'queri':443,456,457,459,482,508 'query.isnotempty':480 'quick':289 'radiobutton':347,884 'read':335 'read-on':334 'readon':825 'recommend':337 'reduc':24 'refer':40 'refresh':617 'refreshablescreen':625 'rememb':210,404,655,806 'rememberdatepickerst':584 'rememberpulltorefreshst':632 'remembersav':370,445,450,812 'remov':311,329 'render':917 'replac':346 'requir':157 'result':678,687 'row':518 'rule':57 'scaffold':79,133,648,657 'screen':72,123,164,184 'scroll':65,75,120,203,878 'scrollbehavior':131,146,147 'scrollbehavior.nestedscrollconnection':156 'scrolledcontainercolor':109,152 'search':99,435,473 'searchbar':432,437,453,925 'searchbardefaults.inputfield':455 'searchsuggestions.foreach':496 'secondari':244 'segmentedbutton':345,379,412,890,920 'segmentedbuttondefaults.icon':391 'segmentedbuttondefaults.itemshape':387,426,922 'select':269,313,355,368,380,381,384,392,399,403,416,798,801,810,823,850,857 'selected.add':420 'selected.remove':423 'shadow':725,734,788,892 'shape':51,192,386,425 'share':253 'ship':31 'show':649 'singl':354 'single-select':353 'singlechoicesegmentedbuttonrow':373 'size':914 'skill':4 'skill-material3' 'slight':782 'smallfab':243 'smallfloatingactionbutton':248 'smart':287 'snackbar':642 'snackbarduration.short':685 'snackbarev':666 'snackbarhost':646,658,659 'snackbarhostst':654,656,660 'snackbarhoststate.showsnackbar':679 'snackbarresult.actionperformed':688 'sort':359 'source-piyushverma0' 'standard':68,178,751 'state':23,234,264,583,610,638,757 'state.selecteddatemillis':592 'style':530,535,715,929 'suggest':288,341,344,439,493,497,501,509,511 'suggestionchip':333,338 'supabas':13 'support':246 'supportingcont':532 'surfac':722,764,774,779,793 'surfacecontain':750,898 'surfacecontainerhigh':755 'surfacecontainerhighest':760 'surfacecontainerlowest':742 'surfacecontainerx':728 'tag':266,318,323,330 'tags/tokens':310 'text':83,137,168,214,215,274,295,317,343,395,430,472,500,528,533,602,607,706,828,846,847 'textbutton':589,605 'timepick':567 'timezone.currentsystemdefault':599 'tint':777 'titl':82,136,139,167 'titlecontentcolor':111 'toggl':263 'token':26 'tolocaldatetim':598 'tonal':720,792 'tonalelev':559,772,780 'top':762 'top-most':761 'topappbar':62,69,81 'topappbardefaults.exituntilcollapsedscrollbehavior':132 'topappbardefaults.largetopappbarcolors':149 'topappbardefaults.topappbarcolors':106 'topbar':80,134 'topic-agent-skills' 'topic-ai-agent' 'topic-android' 'topic-antigravity' 'topic-claude-code' 'topic-codex' 'topic-cursor' 'topic-gemini-cli' 'topic-hilt' 'topic-jetpack-compose' 'topic-kotlin' 'topic-material3' 'trailingcont':550 'trailingicon':319,478,830 'true':826 'uistat':22 'unit':579,581,629,670 'use':259,727,786,791,883,889,897,930 'user':308 'user-ad':307 'val':130,207,361,402,582,590,630,653,677 'valu':822 'var':367,442,447,803,809 'variant':63,173,256 'view':357 'viewmodel':651,668 'viewmodel.events.collect':671 'violat':909 'visual':872 'week':365 'white':746 'without':921 'won':880 'work':882 'wrong':924","prices":[{"id":"99793e3e-487c-4f86-80f8-dd29787690c9","listingId":"07f9e345-dce4-42e5-ba96-f96e161a537c","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"piyushverma0","category":"android-agent-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:14:49.782Z"}],"sources":[{"listingId":"07f9e345-dce4-42e5-ba96-f96e161a537c","source":"github","sourceId":"piyushverma0/android-agent-skills/material3","sourceUrl":"https://github.com/piyushverma0/android-agent-skills/tree/main/skills/material3","isPrimary":false,"firstSeenAt":"2026-05-18T13:14:49.782Z","lastSeenAt":"2026-05-18T19:09:10.163Z"}],"details":{"listingId":"07f9e345-dce4-42e5-ba96-f96e161a537c","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"piyushverma0","slug":"material3","github":{"repo":"piyushverma0/android-agent-skills","stars":8,"topics":["agent-skills","ai-agent","android","antigravity","claude-code","codex","cursor","gemini-cli","hilt","jetpack-compose","kotlin","material3","open-source","skills","supabase"],"license":"mit","html_url":"https://github.com/piyushverma0/android-agent-skills","pushed_at":"2026-04-27T09:15:31Z","description":"27 Android skills for AI agents (Claude Code, Codex, Cursor). Fixes Supabase auth, Hilt errors, design inconsistency, kapt→ksp, missing UiState states. Reduced my token bills 5×. FitGenZ AI shipped in 18 days.","skill_md_sha":"edb8944cb534ecd68242b1597de20647b754d23f","skill_md_path":"skills/material3/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/piyushverma0/android-agent-skills/tree/main/skills/material3"},"layout":"multi","source":"github","category":"android-agent-skills","frontmatter":{},"skills_sh_url":"https://skills.sh/piyushverma0/android-agent-skills/material3"},"updatedAt":"2026-05-18T19:09:10.163Z"}}