[go: nahoru, domu]

blob: 23cd1960ec9103353ff802c0012bf7b4f77b02a5 [file] [log] [blame]
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.ui.material
import androidx.compose.Immutable
import androidx.compose.staticAmbientOf
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp
/**
* Class holding typography definitions as defined by the [Material typography specification](https://material.io/design/typography/the-type-system.html#type-scale).
*
* @property h1 h1 is the largest headline, reserved for short, important text or numerals.
* For headlines, you can choose an expressive font, such as a display, handwritten, or script
* style. These unconventional font designs have details and intricacy that help attract the eye.
* @property h2 h2 is the second largest headline, reserved for short, important text or numerals.
* For headlines, you can choose an expressive font, such as a display, handwritten, or script
* style. These unconventional font designs have details and intricacy that help attract the eye.
* @property h3 h3 is the third largest headline, reserved for short, important text or numerals.
* For headlines, you can choose an expressive font, such as a display, handwritten, or script
* style. These unconventional font designs have details and intricacy that help attract the eye.
* @property h4 h4 is the fourth largest headline, reserved for short, important text or numerals.
* For headlines, you can choose an expressive font, such as a display, handwritten, or script
* style. These unconventional font designs have details and intricacy that help attract the eye.
* @property h5 h5 is the fifth largest headline, reserved for short, important text or numerals.
* For headlines, you can choose an expressive font, such as a display, handwritten, or script
* style. These unconventional font designs have details and intricacy that help attract the eye.
* @property h6 h6 is the sixth largest headline, reserved for short, important text or numerals.
* For headlines, you can choose an expressive font, such as a display, handwritten, or script
* style. These unconventional font designs have details and intricacy that help attract the eye.
* @property subtitle1 subtitle1 is the largest subtitle, and is typically reserved for
* medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
* subtitles.
* @property subtitle2 subtitle2 is the smallest subtitle, and is typically reserved for
* medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
* subtitles.
* @property body1 body1 is the largest body, and is typically used for long-form writing as it
* works well for small text sizes. For longer sections of text, a serif or sans serif typeface
* is recommended.
* @property body2 body2 is the smallest body, and is typically used for long-form writing as it
* works well for small text sizes. For longer sections of text, a serif or sans serif typeface
* is recommended.
* @property button button text is a call to action used in different types of buttons (such as
* text, outlined and contained buttons) and in tabs, dialogs, and cards. Button text is
* typically sans serif, using all caps text.
* @property caption caption is one of the smallest font sizes. It is used sparingly to
* annotate imagery or to introduce a headline.
* @property overline overline is one of the smallest font sizes. It is used sparingly to
* annotate imagery or to introduce a headline.
*/
@Immutable
data class Typography internal constructor(
val h1: TextStyle,
val h2: TextStyle,
val h3: TextStyle,
val h4: TextStyle,
val h5: TextStyle,
val h6: TextStyle,
val subtitle1: TextStyle,
val subtitle2: TextStyle,
val body1: TextStyle,
val body2: TextStyle,
val button: TextStyle,
val caption: TextStyle,
val overline: TextStyle
) {
/**
* Constructor to create a [Typography]. For information on the types of style defined in
* this constructor, see the property documentation for [Typography].
*
* @param defaultFontFamily the default [FontFamily] to be used for [TextStyle]s provided in
* this constructor. This default will be used if the [FontFamily] on the [TextStyle] is `null`.
* @param h1 h1 is the largest headline, reserved for short, important text or numerals.
* @param h2 h2 is the second largest headline, reserved for short, important text or numerals.
* @param h3 h3 is the third largest headline, reserved for short, important text or numerals.
* @param h4 h4 is the fourth largest headline, reserved for short, important text or numerals.
* @param h5 h5 is the fifth largest headline, reserved for short, important text or numerals.
* @param h6 h6 is the sixth largest headline, reserved for short, important text or numerals.
* @param subtitle1 subtitle1 is the largest subtitle, and is typically reserved for
* medium-emphasis text that is shorter in length.
* @param subtitle2 subtitle2 is the smallest subtitle, and is typically reserved for
* medium-emphasis text that is shorter in length.
* @param body1 body1 is the largest body, and is typically used for long-form writing as it
* works well for small text sizes.
* @param body2 body2 is the smallest body, and is typically used for long-form writing as it
* works well for small text sizes.
* @param button button text is a call to action used in different types of buttons (such as
* text, outlined and contained buttons) and in tabs, dialogs, and cards.
* @param caption caption is one of the smallest font sizes. It is used sparingly to annotate
* imagery or to introduce a headline.
* @param overline overline is one of the smallest font sizes. It is used sparingly to annotate
* imagery or to introduce a headline.
*/
constructor(
defaultFontFamily: FontFamily = FontFamily.Default,
h1: TextStyle = TextStyle(
fontWeight = FontWeight.Light,
fontSize = 96.sp,
letterSpacing = (-1.5).sp
),
h2: TextStyle = TextStyle(
fontWeight = FontWeight.Light,
fontSize = 60.sp,
letterSpacing = (-0.5).sp
),
h3: TextStyle = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 48.sp,
letterSpacing = 0.sp
),
h4: TextStyle = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 34.sp,
letterSpacing = 0.25.sp
),
h5: TextStyle = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 24.sp,
letterSpacing = 0.sp
),
h6: TextStyle = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 20.sp,
letterSpacing = 0.15.sp
),
subtitle1: TextStyle = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
letterSpacing = 0.15.sp
),
subtitle2: TextStyle = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 14.sp,
letterSpacing = 0.1.sp
),
body1: TextStyle = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
letterSpacing = 0.5.sp
),
body2: TextStyle = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 14.sp,
letterSpacing = 0.25.sp
),
button: TextStyle = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 14.sp,
letterSpacing = 1.25.sp
),
caption: TextStyle = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 12.sp,
letterSpacing = 0.4.sp
),
overline: TextStyle = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 10.sp,
letterSpacing = 1.5.sp
)
) : this(
h1 = h1.withDefaultFontFamily(defaultFontFamily),
h2 = h2.withDefaultFontFamily(defaultFontFamily),
h3 = h3.withDefaultFontFamily(defaultFontFamily),
h4 = h4.withDefaultFontFamily(defaultFontFamily),
h5 = h5.withDefaultFontFamily(defaultFontFamily),
h6 = h6.withDefaultFontFamily(defaultFontFamily),
subtitle1 = subtitle1.withDefaultFontFamily(defaultFontFamily),
subtitle2 = subtitle2.withDefaultFontFamily(defaultFontFamily),
body1 = body1.withDefaultFontFamily(defaultFontFamily),
body2 = body2.withDefaultFontFamily(defaultFontFamily),
button = button.withDefaultFontFamily(defaultFontFamily),
caption = caption.withDefaultFontFamily(defaultFontFamily),
overline = overline.withDefaultFontFamily(defaultFontFamily)
)
}
/**
* @return [this] if there is a [FontFamily] defined, otherwise copies [this] with [default] as
* the [FontFamily].
*/
private fun TextStyle.withDefaultFontFamily(default: FontFamily): TextStyle {
return if (fontFamily != null) this else copy(fontFamily = default)
}
/**
* This Ambient holds on to the current definition of typography for this application as described
* by the Material spec. You can read the values in it when creating custom components that want
* to use Material types, as well as override the values when you want to re-style a part of your
* hierarchy. Material components related to text such as [Button] will use this Ambient
* to set values with which to style children text components.
*
* To access values within this ambient, use [MaterialTheme.typography].
*/
internal val TypographyAmbient = staticAmbientOf { Typography() }