যদিও ম্যাটেরিয়াল আমাদের প্রস্তাবিত ডিজাইন সিস্টেম এবং জেটপ্যাক কম্পোজ ম্যাটেরিয়ালের একটি বাস্তবায়ন সরবরাহ করে, আপনাকে এটি ব্যবহার করতে বাধ্য করা হয় না। ম্যাটেরিয়াল সম্পূর্ণরূপে পাবলিক এপিআই-এর উপর নির্মিত, তাই একই পদ্ধতিতে আপনার নিজস্ব ডিজাইন সিস্টেম তৈরি করা সম্ভব।
আপনি বেশ কয়েকটি পদ্ধতি গ্রহণ করতে পারেন:
-  অতিরিক্ত থিমিং মান সহ MaterialThemeপ্রসারিত করুন ।
-  এক বা একাধিক ম্যাটেরিয়াল সিস্টেম — Colors,Typography, অথবাShapes— কাস্টম বাস্তবায়ন দিয়ে প্রতিস্থাপন করুন এবং অন্যগুলি রাখুন।
-  MaterialThemeপ্রতিস্থাপনের জন্য একটি সম্পূর্ণ কাস্টম ডিজাইন সিস্টেম বাস্তবায়ন করুন ।
আপনি একটি কাস্টম ডিজাইন সিস্টেমের সাথে ম্যাটেরিয়াল কম্পোনেন্ট ব্যবহার চালিয়ে যেতে চাইতে পারেন। এটি করা সম্ভব তবে আপনার নেওয়া পদ্ধতির সাথে মানানসই কিছু বিষয় মনে রাখতে হবে।
 MaterialTheme এবং কাস্টম ডিজাইন সিস্টেম দ্বারা ব্যবহৃত নিম্ন-স্তরের গঠন এবং API সম্পর্কে আরও জানতে, "Anatomy of a theme in Compose" গাইডটি দেখুন।
ম্যাটেরিয়াল থিমিং প্রসারিত করুন
কম্পোজ ম্যাটেরিয়াল ম্যাটেরিয়াল থিমিং-এর মডেলগুলিকে ঘনিষ্ঠভাবে মডেল করে যাতে ম্যাটেরিয়াল নির্দেশিকা অনুসরণ করা সহজ এবং টাইপ-নিরাপদ হয়। তবে, অতিরিক্ত মান সহ রঙ, টাইপোগ্রাফি এবং আকৃতি সেটগুলি প্রসারিত করা সম্ভব। সবচেয়ে সহজ পদ্ধতি হল এক্সটেনশন বৈশিষ্ট্য যোগ করা:
// Use with MaterialTheme.colorScheme.snackbarAction val ColorScheme.snackbarAction: Color @Composable get() = if (isSystemInDarkTheme()) Red300 else Red700 // Use with MaterialTheme.typography.textFieldInput val Typography.textFieldInput: TextStyle get() = TextStyle(/* ... */) // Use with MaterialTheme.shapes.card val Shapes.card: Shape get() = RoundedCornerShape(size = 20.dp)
 এটি MaterialTheme ব্যবহারের API গুলির সাথে সামঞ্জস্য প্রদান করে। কম্পোজ নিজেই এর একটি উদাহরণ হল surfaceColorAtElevation , যা উচ্চতার উপর নির্ভর করে পৃষ্ঠের রঙ নির্ধারণ করে যা ব্যবহার করা উচিত।
 আরেকটি পদ্ধতি হল একটি বর্ধিত থিম সংজ্ঞায়িত করা যা MaterialTheme এবং এর মানগুলিকে "মোড়ানো" করে।
 ধরুন আপনি দুটি অতিরিক্ত রঙ যোগ করতে চান - caution এবং onCaution , একটি হলুদ রঙ যা আধা-বিপজ্জনক কাজের জন্য ব্যবহৃত হয় - এবং বিদ্যমান উপাদানের রঙগুলি বজায় রেখে: 
@Immutable data class ExtendedColors( val caution: Color, val onCaution: Color ) val LocalExtendedColors = staticCompositionLocalOf { ExtendedColors( caution = Color.Unspecified, onCaution = Color.Unspecified ) } @Composable fun ExtendedTheme( /* ... */ content: @Composable () -> Unit ) { val extendedColors = ExtendedColors( caution = Color(0xFFFFCC02), onCaution = Color(0xFF2C2D30) ) CompositionLocalProvider(LocalExtendedColors provides extendedColors) { MaterialTheme( /* colors = ..., typography = ..., shapes = ... */ content = content ) } } // Use with eg. ExtendedTheme.colors.caution object ExtendedTheme { val colors: ExtendedColors @Composable get() = LocalExtendedColors.current }
 এটি MaterialTheme ব্যবহারের API-এর অনুরূপ। এটি একাধিক থিম সমর্থন করে কারণ আপনি MaterialTheme মতোই ExtendedTheme গুলি নেস্ট করতে পারেন।
উপাদান উপাদান ব্যবহার করুন
 ম্যাটেরিয়াল থিমিং প্রসারিত করার সময়, বিদ্যমান MaterialTheme মানগুলি বজায় রাখা হয় এবং ম্যাটেরিয়াল উপাদানগুলিতে এখনও যুক্তিসঙ্গত ডিফল্ট থাকে।
যদি আপনি কম্পোনেন্টগুলিতে বর্ধিত মান ব্যবহার করতে চান, তাহলে সেগুলিকে আপনার নিজস্ব কম্পোজেবল ফাংশনে মুড়ে নিন, আপনি যে মানগুলি পরিবর্তন করতে চান তা সরাসরি সেট করুন এবং অন্যান্য মানগুলিকে কনটেনিং কম্পোজেবলের প্যারামিটার হিসাবে প্রকাশ করুন:
@Composable fun ExtendedButton( onClick: () -> Unit, modifier: Modifier = Modifier, content: @Composable RowScope.() -> Unit ) { Button( colors = ButtonDefaults.buttonColors( containerColor = ExtendedTheme.colors.caution, contentColor = ExtendedTheme.colors.onCaution /* Other colors use values from MaterialTheme */ ), onClick = onClick, modifier = modifier, content = content ) }
 এরপর আপনি যেখানে প্রয়োজনে Button এর ব্যবহার ExtendedButton দিয়ে প্রতিস্থাপন করবেন। 
@Composable fun ExtendedApp() { ExtendedTheme { /*...*/ ExtendedButton(onClick = { /* ... */ }) { /* ... */ } } }
উপাদান সাবসিস্টেম প্রতিস্থাপন করুন
 ম্যাটেরিয়াল থিমিঙ সম্প্রসারণের পরিবর্তে, আপনি এক বা একাধিক সিস্টেম — Colors , Typography , অথবা Shapes — কে একটি কাস্টম বাস্তবায়ন দিয়ে প্রতিস্থাপন করতে চাইতে পারেন, অন্যগুলি বজায় রেখে।
ধরুন আপনি রঙ সিস্টেম রেখে টাইপ এবং শেপ সিস্টেমগুলি প্রতিস্থাপন করতে চান:
@Immutable data class ReplacementTypography( val body: TextStyle, val title: TextStyle ) @Immutable data class ReplacementShapes( val component: Shape, val surface: Shape ) val LocalReplacementTypography = staticCompositionLocalOf { ReplacementTypography( body = TextStyle.Default, title = TextStyle.Default ) } val LocalReplacementShapes = staticCompositionLocalOf { ReplacementShapes( component = RoundedCornerShape(ZeroCornerSize), surface = RoundedCornerShape(ZeroCornerSize) ) } @Composable fun ReplacementTheme( /* ... */ content: @Composable () -> Unit ) { val replacementTypography = ReplacementTypography( body = TextStyle(fontSize = 16.sp), title = TextStyle(fontSize = 32.sp) ) val replacementShapes = ReplacementShapes( component = RoundedCornerShape(percent = 50), surface = RoundedCornerShape(size = 40.dp) ) CompositionLocalProvider( LocalReplacementTypography provides replacementTypography, LocalReplacementShapes provides replacementShapes ) { MaterialTheme( /* colors = ... */ content = content ) } } // Use with eg. ReplacementTheme.typography.body object ReplacementTheme { val typography: ReplacementTypography @Composable get() = LocalReplacementTypography.current val shapes: ReplacementShapes @Composable get() = LocalReplacementShapes.current }
উপাদান উপাদান ব্যবহার করুন
 যখন MaterialTheme এর এক বা একাধিক সিস্টেম প্রতিস্থাপন করা হয়, তখন Material উপাদানগুলিকে যেমন আছে তেমন ব্যবহার করার ফলে অবাঞ্ছিত উপাদানের রঙ, ধরণ বা আকৃতির মান দেখা দিতে পারে।
যদি আপনি কম্পোনেন্টগুলিতে প্রতিস্থাপন মান ব্যবহার করতে চান, তাহলে সেগুলিকে আপনার নিজস্ব কম্পোজেবল ফাংশনে মুড়ে নিন, প্রাসঙ্গিক সিস্টেমের জন্য সরাসরি মান সেট করুন এবং অন্যান্যগুলিকে কনটেইনিং কম্পোজেবলের প্যারামিটার হিসাবে প্রকাশ করুন।
@Composable fun ReplacementButton( onClick: () -> Unit, modifier: Modifier = Modifier, content: @Composable RowScope.() -> Unit ) { Button( shape = ReplacementTheme.shapes.component, onClick = onClick, modifier = modifier, content = { ProvideTextStyle( value = ReplacementTheme.typography.body ) { content() } } ) }
 এরপর আপনি যেখানে প্রয়োজনে Button এর ব্যবহার ReplacementButton দিয়ে প্রতিস্থাপন করবেন। 
@Composable fun ReplacementApp() { ReplacementTheme { /*...*/ ReplacementButton(onClick = { /* ... */ }) { /* ... */ } } }
একটি সম্পূর্ণ কাস্টম ডিজাইন সিস্টেম বাস্তবায়ন করুন
 আপনি ম্যাটেরিয়াল থিমিং-এর পরিবর্তে সম্পূর্ণ কাস্টম ডিজাইন সিস্টেম ব্যবহার করতে পারেন। বিবেচনা করুন যে MaterialTheme নিম্নলিখিত সিস্টেমগুলি প্রদান করে:
-  Colors,TypographyএবংShapes: ম্যাটেরিয়াল থিমিং সিস্টেম
-  TextSelectionColors:TextএবংTextFieldদ্বারা টেক্সট নির্বাচনের জন্য ব্যবহৃত রঙ
-  RippleএবংRippleTheme:Indicationউপাদান বাস্তবায়ন
আপনি যদি ম্যাটেরিয়াল কম্পোনেন্ট ব্যবহার চালিয়ে যেতে চান, তাহলে অবাঞ্ছিত আচরণ এড়াতে আপনার কাস্টম থিমে এই সিস্টেমগুলির কিছু প্রতিস্থাপন করতে হবে অথবা আপনার কম্পোনেন্টের সিস্টেমগুলি পরিচালনা করতে হবে।
তবে, নকশা ব্যবস্থাগুলি কেবলমাত্র উপাদানের উপর নির্ভরশীল ধারণাগুলির মধ্যেই সীমাবদ্ধ নয়। আপনি বিদ্যমান সিস্টেমগুলিকে সংশোধন করতে পারেন এবং সম্পূর্ণ নতুন সিস্টেমগুলি প্রবর্তন করতে পারেন - নতুন ক্লাস এবং প্রকার সহ - অন্যান্য ধারণাগুলিকে থিমের সাথে সামঞ্জস্যপূর্ণ করতে।
 নিম্নলিখিত কোডে, আমরা একটি কাস্টম কালার সিস্টেম মডেল করেছি যাতে গ্রেডিয়েন্ট ( List<Color> ) অন্তর্ভুক্ত থাকে, একটি টাইপ সিস্টেম অন্তর্ভুক্ত থাকে, একটি নতুন এলিভেশন সিস্টেম প্রবর্তন করা হয় এবং MaterialTheme দ্বারা প্রদত্ত অন্যান্য সিস্টেম বাদ দেওয়া হয়: 

@Immutable data class CustomColors( val content: Color, val component: Color, val background: List<Color> ) @Immutable data class CustomTypography( val body: TextStyle, val title: TextStyle ) @Immutable data class CustomElevation( val default: Dp, val pressed: Dp ) val LocalCustomColors = staticCompositionLocalOf { CustomColors( content = Color.Unspecified, component = Color.Unspecified, background = emptyList() ) } val LocalCustomTypography = staticCompositionLocalOf { CustomTypography( body = TextStyle.Default, title = TextStyle.Default ) } val LocalCustomElevation = staticCompositionLocalOf { CustomElevation( default = Dp.Unspecified, pressed = Dp.Unspecified ) } @Composable fun CustomTheme( /* ... */ content: @Composable () -> Unit ) { val customColors = CustomColors( content = Color(0xFFDD0D3C), component = Color(0xFFC20029), background = listOf(Color.White, Color(0xFFF8BBD0)) ) val customTypography = CustomTypography( body = TextStyle(fontSize = 16.sp), title = TextStyle(fontSize = 32.sp) ) val customElevation = CustomElevation( default = 4.dp, pressed = 8.dp ) CompositionLocalProvider( LocalCustomColors provides customColors, LocalCustomTypography provides customTypography, LocalCustomElevation provides customElevation, content = content ) } // Use with eg. CustomTheme.elevation.small object CustomTheme { val colors: CustomColors @Composable get() = LocalCustomColors.current val typography: CustomTypography @Composable get() = LocalCustomTypography.current val elevation: CustomElevation @Composable get() = LocalCustomElevation.current }
উপাদান উপাদান ব্যবহার করুন
 যখন কোনও MaterialTheme উপস্থিত না থাকে, তখন Material উপাদানগুলিকে যেমন আছে তেমন ব্যবহার করলে অবাঞ্ছিত Material রঙ, ধরণ এবং আকৃতির মান এবং ইঙ্গিত আচরণ দেখা দেবে।
যদি আপনি কম্পোনেন্টগুলিতে কাস্টম মান ব্যবহার করতে চান, তাহলে সেগুলিকে আপনার নিজস্ব কম্পোজেবল ফাংশনে মুড়ে নিন, প্রাসঙ্গিক সিস্টেমের জন্য সরাসরি মান সেট করুন এবং অন্যান্য মানগুলিকে কনটেইনিং কম্পোজেবলের প্যারামিটার হিসাবে প্রকাশ করুন।
 আমরা সুপারিশ করছি যে আপনি আপনার কাস্টম থিম থেকে সেট করা মানগুলি অ্যাক্সেস করুন। বিকল্পভাবে, যদি আপনার থিম Color , TextStyle , Shape , বা অন্যান্য সিস্টেম সরবরাহ না করে, তাহলে আপনি সেগুলি হার্ডকোড করতে পারেন। 
@Composable fun CustomButton( onClick: () -> Unit, modifier: Modifier = Modifier, content: @Composable RowScope.() -> Unit ) { Button( colors = ButtonDefaults.buttonColors( containerColor = CustomTheme.colors.component, contentColor = CustomTheme.colors.content, disabledContainerColor = CustomTheme.colors.content .copy(alpha = 0.12f) .compositeOver(CustomTheme.colors.component), disabledContentColor = CustomTheme.colors.content .copy(alpha = 0.38f) ), shape = ButtonShape, elevation = ButtonDefaults.elevatedButtonElevation( defaultElevation = CustomTheme.elevation.default, pressedElevation = CustomTheme.elevation.pressed /* disabledElevation = 0.dp */ ), onClick = onClick, modifier = modifier, content = { ProvideTextStyle( value = CustomTheme.typography.body ) { content() } } ) } val ButtonShape = RoundedCornerShape(percent = 50)
 যদি আপনি নতুন ক্লাস টাইপ চালু করে থাকেন — যেমন List<Color> গ্রেডিয়েন্ট উপস্থাপন করার জন্য — তাহলে কম্পোনেন্টগুলিকে মোড়ানোর পরিবর্তে স্ক্র্যাচ থেকে বাস্তবায়ন করা ভালো হতে পারে। উদাহরণস্বরূপ, Jetsnack নমুনা থেকে JetsnackButton দেখুন।
আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলে লিঙ্ক টেক্সট প্রদর্শিত হয়।
- কম্পোজে মেটেরিয়াল ডিজাইন ৩
- কম্পোজে উপাদান 2 থেকে উপাদান 3 এ স্থানান্তর করুন
- কম্পোজে একটি থিমের অ্যানাটমি
