@bug-on/md3-react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +215 -0
- package/dist/assets/fonts/GoogleSansFlex-VariableFont.woff2 +0 -0
- package/dist/assets/fonts/MaterialSymbolsOutlined-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/fonts/MaterialSymbolsSharp-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/dist/assets/loading-indicator.svg +19 -0
- package/dist/assets/material-symbols-cdn.css +65 -0
- package/dist/assets/material-symbols-self-hosted.css +109 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/useMediaQuery.d.ts +11 -0
- package/dist/hooks/useRipple.d.ts +26 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.js +9059 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +8929 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/material-symbols-preconnect.d.ts +42 -0
- package/dist/lib/theme-utils.d.ts +63 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/material-symbols-cdn.css +65 -0
- package/dist/material-symbols-self-hosted.css +109 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/md3.d.ts +14 -0
- package/dist/typography.css +22 -0
- package/dist/ui/badge.d.ts +125 -0
- package/dist/ui/button-group.d.ts +59 -0
- package/dist/ui/button.d.ts +148 -0
- package/dist/ui/card.d.ts +62 -0
- package/dist/ui/checkbox.d.ts +82 -0
- package/dist/ui/chip.d.ts +110 -0
- package/dist/ui/code-block.d.ts +14 -0
- package/dist/ui/dialog.d.ts +111 -0
- package/dist/ui/divider.d.ts +164 -0
- package/dist/ui/drawer.d.ts +39 -0
- package/dist/ui/dropdown.d.ts +29 -0
- package/dist/ui/fab-menu.d.ts +204 -0
- package/dist/ui/fab.d.ts +162 -0
- package/dist/ui/icon-button.d.ts +131 -0
- package/dist/ui/icon.d.ts +88 -0
- package/dist/ui/loading-indicator.d.ts +42 -0
- package/dist/ui/navigation-rail.d.ts +29 -0
- package/dist/ui/progress-indicator/circular.d.ts +3 -0
- package/dist/ui/progress-indicator/hooks.d.ts +3 -0
- package/dist/ui/progress-indicator/index.d.ts +21 -0
- package/dist/ui/progress-indicator/linear-flat.d.ts +10 -0
- package/dist/ui/progress-indicator/linear-wavy.d.ts +18 -0
- package/dist/ui/progress-indicator/linear.d.ts +3 -0
- package/dist/ui/progress-indicator/types.d.ts +151 -0
- package/dist/ui/progress-indicator/utils.d.ts +3 -0
- package/dist/ui/radio-button.d.ts +106 -0
- package/dist/ui/ripple.d.ts +126 -0
- package/dist/ui/scroll-area.d.ts +27 -0
- package/dist/ui/shared/constants.d.ts +86 -0
- package/dist/ui/shared/touch-target.d.ts +38 -0
- package/dist/ui/snackbar/index.d.ts +6 -0
- package/dist/ui/snackbar/snackbar.d.ts +196 -0
- package/dist/ui/switch/index.d.ts +7 -0
- package/dist/ui/switch/switch.d.ts +30 -0
- package/dist/ui/switch/switch.stories.d.ts +48 -0
- package/dist/ui/switch/switch.tokens.d.ts +67 -0
- package/dist/ui/switch/switch.types.d.ts +59 -0
- package/dist/ui/tabs/index.d.ts +10 -0
- package/dist/ui/tabs/tab.d.ts +43 -0
- package/dist/ui/tabs/tabs-content.d.ts +36 -0
- package/dist/ui/tabs/tabs-list.d.ts +40 -0
- package/dist/ui/tabs/tabs.d.ts +60 -0
- package/dist/ui/tabs/tabs.tokens.d.ts +94 -0
- package/dist/ui/tabs/tabs.types.d.ts +172 -0
- package/dist/ui/text-field/index.d.ts +11 -0
- package/dist/ui/text-field/subcomponents/active-indicator.d.ts +24 -0
- package/dist/ui/text-field/subcomponents/floating-label.d.ts +43 -0
- package/dist/ui/text-field/subcomponents/leading-icon.d.ts +23 -0
- package/dist/ui/text-field/subcomponents/outline-container.d.ts +42 -0
- package/dist/ui/text-field/subcomponents/prefix-suffix.d.ts +24 -0
- package/dist/ui/text-field/subcomponents/supporting-text.d.ts +37 -0
- package/dist/ui/text-field/subcomponents/trailing-icon.d.ts +41 -0
- package/dist/ui/text-field/text-field.d.ts +49 -0
- package/dist/ui/text-field/text-field.tokens.d.ts +76 -0
- package/dist/ui/text-field/text-field.types.d.ts +126 -0
- package/dist/ui/theme-provider/index.d.ts +18 -0
- package/dist/ui/toc.d.ts +74 -0
- package/dist/ui/tooltip/index.d.ts +8 -0
- package/dist/ui/tooltip/plain-tooltip.d.ts +2 -0
- package/dist/ui/tooltip/rich-tooltip.d.ts +2 -0
- package/dist/ui/tooltip/tooltip-box.d.ts +2 -0
- package/dist/ui/tooltip/tooltip-caret-shape.d.ts +9 -0
- package/dist/ui/tooltip/tooltip.tokens.d.ts +26 -0
- package/dist/ui/tooltip/tooltip.types.d.ts +56 -0
- package/dist/ui/tooltip/use-tooltip-position.d.ts +8 -0
- package/dist/ui/tooltip/use-tooltip-state.d.ts +2 -0
- package/dist/ui/typography/index.d.ts +16 -0
- package/dist/ui/typography/type-scale-tokens.d.ts +162 -0
- package/dist/ui/typography/typography-key-tokens.d.ts +40 -0
- package/dist/ui/typography/typography-tokens.d.ts +220 -0
- package/dist/ui/typography/typography.d.ts +265 -0
- package/package.json +80 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file typography-tokens.ts
|
|
3
|
+
* @description MD3 Expressive Typography Token Definitions.
|
|
4
|
+
*
|
|
5
|
+
* Port of `androidx.compose.material3.tokens.TypographyTokens` (Kotlin class).
|
|
6
|
+
*
|
|
7
|
+
* ### Memory Optimization
|
|
8
|
+
* All 30 `TextStyle` properties are implemented as **lazy getters** — they are
|
|
9
|
+
* computed on first access and cached, rather than being computed eagerly at
|
|
10
|
+
* construction time. This reduces the instantiation cost of `TypographyTokens`.
|
|
11
|
+
*
|
|
12
|
+
* ### Variable Font Axes
|
|
13
|
+
* Supports customizable CSS `font-variation-settings` via {@link FontVariationAxes}.
|
|
14
|
+
* - Default `ROND` value is `100` (maximum roundness of Google Sans Flex).
|
|
15
|
+
* - Other axes remain at font defaults unless explicitly overridden.
|
|
16
|
+
*
|
|
17
|
+
* @example Basic usage (default tokens)
|
|
18
|
+
* ```ts
|
|
19
|
+
* const tokens = new TypographyTokens();
|
|
20
|
+
* const style = tokens.BodyLarge; // { fontSize, fontWeight, ... }
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @example Custom font family
|
|
24
|
+
* ```ts
|
|
25
|
+
* const tokens = new TypographyTokens({ fontFamily: "'Inter', sans-serif" });
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @example Custom ROND axis (partial roundness)
|
|
29
|
+
* ```ts
|
|
30
|
+
* const tokens = new TypographyTokens({ fontVariationAxes: { ROND: 50 } });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* Configurable axes for CSS `font-variation-settings`.
|
|
35
|
+
*
|
|
36
|
+
* Each key maps to a named variable font axis. Any axis not specified falls
|
|
37
|
+
* back to the font's own default value.
|
|
38
|
+
*
|
|
39
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-variation-settings
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* const axes: FontVariationAxes = { ROND: 100, wght: 600 };
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export interface FontVariationAxes {
|
|
47
|
+
/**
|
|
48
|
+
* Roundness axis of Google Sans Flex Variable Font.
|
|
49
|
+
* Range: `0` (sharp corners) – `100` (fully rounded).
|
|
50
|
+
* @default 100
|
|
51
|
+
*/
|
|
52
|
+
ROND?: number;
|
|
53
|
+
/**
|
|
54
|
+
* Weight axis. Overrides `font-weight` via variation settings.
|
|
55
|
+
* @default font default
|
|
56
|
+
*/
|
|
57
|
+
wght?: number;
|
|
58
|
+
/**
|
|
59
|
+
* Width axis. Controls glyph condensation/expansion.
|
|
60
|
+
* @default font default
|
|
61
|
+
*/
|
|
62
|
+
wdth?: number;
|
|
63
|
+
/** Any additional named variation axis supported by the font. */
|
|
64
|
+
[axis: string]: number | undefined;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Default font variation axes for MD3 Expressive.
|
|
68
|
+
* Sets `ROND` to `100` for maximum roundness; all other axes use font defaults.
|
|
69
|
+
*/
|
|
70
|
+
export declare const DEFAULT_FONT_VARIATION_AXES: Readonly<FontVariationAxes>;
|
|
71
|
+
/**
|
|
72
|
+
* Serializes a {@link FontVariationAxes} map into a CSS `font-variation-settings` string.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* serializeFontVariationAxes({ ROND: 100, wght: 700 });
|
|
77
|
+
* // → '"ROND" 100, "wght" 700'
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function serializeFontVariationAxes(axes: FontVariationAxes): string;
|
|
81
|
+
/**
|
|
82
|
+
* Pre-computed default `font-variation-settings` string.
|
|
83
|
+
* Equivalent to `'"ROND" 100'`.
|
|
84
|
+
*/
|
|
85
|
+
export declare const MD3_EXPRESSIVE_FONT_VARIATION: string;
|
|
86
|
+
/**
|
|
87
|
+
* Web equivalent of Compose's `TextStyle`.
|
|
88
|
+
*
|
|
89
|
+
* All properties are readonly and map directly to CSS font properties.
|
|
90
|
+
* The `fontVariationSettings` field carries the serialized variable-font axes.
|
|
91
|
+
*/
|
|
92
|
+
export interface TextStyle {
|
|
93
|
+
/** CSS `font-family` value. */
|
|
94
|
+
readonly fontFamily: string;
|
|
95
|
+
/** CSS `font-weight` numeric value (e.g. `400`, `700`). */
|
|
96
|
+
readonly fontWeight: number;
|
|
97
|
+
/** CSS `font-size` in `rem` units. */
|
|
98
|
+
readonly fontSize: string;
|
|
99
|
+
/** CSS `line-height` in `rem` units. */
|
|
100
|
+
readonly lineHeight: string;
|
|
101
|
+
/** CSS `letter-spacing` in `px` units. */
|
|
102
|
+
readonly letterSpacing: string;
|
|
103
|
+
/**
|
|
104
|
+
* CSS `font-variation-settings` string.
|
|
105
|
+
* @example '"ROND" 100'
|
|
106
|
+
* @example '"ROND" 50, "wght" 600'
|
|
107
|
+
*/
|
|
108
|
+
readonly fontVariationSettings: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Constructor options for {@link TypographyTokens}.
|
|
112
|
+
*/
|
|
113
|
+
export interface TypographyTokensOptions {
|
|
114
|
+
/**
|
|
115
|
+
* Custom CSS `font-family` string. When provided, overrides the default
|
|
116
|
+
* Google Sans Flex font for all token styles.
|
|
117
|
+
*
|
|
118
|
+
* @example "'Roboto', sans-serif"
|
|
119
|
+
*/
|
|
120
|
+
fontFamily?: string;
|
|
121
|
+
/**
|
|
122
|
+
* Variable font axes to apply via `font-variation-settings`.
|
|
123
|
+
* Merged on top of {@link DEFAULT_FONT_VARIATION_AXES}.
|
|
124
|
+
* Provide only the axes you want to override.
|
|
125
|
+
*
|
|
126
|
+
* @example { ROND: 0 } // sharp corners
|
|
127
|
+
*/
|
|
128
|
+
fontVariationAxes?: FontVariationAxes;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* MD3 Expressive Typography Token class.
|
|
132
|
+
*
|
|
133
|
+
* Port of `internal class TypographyTokens(val fontFamily: FontFamily? = null)`
|
|
134
|
+
* from `androidx.compose.material3.tokens.TypographyTokens`.
|
|
135
|
+
*
|
|
136
|
+
* Provides 30 pre-defined {@link TextStyle} properties (15 baseline + 15 emphasized),
|
|
137
|
+
* each implemented as a **lazy getter** — computed once on first access, then cached.
|
|
138
|
+
*
|
|
139
|
+
* ### Customization
|
|
140
|
+
* Pass {@link TypographyTokensOptions} to the constructor to override:
|
|
141
|
+
* - `fontFamily` — swap the typeface
|
|
142
|
+
* - `fontVariationAxes` — control variable font axes (e.g., `ROND`)
|
|
143
|
+
*
|
|
144
|
+
* @example Default
|
|
145
|
+
* ```ts
|
|
146
|
+
* const tokens = new TypographyTokens();
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* @example Custom font + half-rounded
|
|
150
|
+
* ```ts
|
|
151
|
+
* const tokens = new TypographyTokens({
|
|
152
|
+
* fontFamily: "'Inter', sans-serif",
|
|
153
|
+
* fontVariationAxes: { ROND: 50 },
|
|
154
|
+
* });
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
export declare class TypographyTokens {
|
|
158
|
+
#private;
|
|
159
|
+
constructor(options?: TypographyTokensOptions | string);
|
|
160
|
+
/** Display Large – `57px`, weight 400 */
|
|
161
|
+
get DisplayLarge(): TextStyle;
|
|
162
|
+
/** Display Medium – `45px`, weight 400 */
|
|
163
|
+
get DisplayMedium(): TextStyle;
|
|
164
|
+
/** Display Small – `36px`, weight 400 */
|
|
165
|
+
get DisplaySmall(): TextStyle;
|
|
166
|
+
/** Headline Large – `32px`, weight 400 */
|
|
167
|
+
get HeadlineLarge(): TextStyle;
|
|
168
|
+
/** Headline Medium – `28px`, weight 400 */
|
|
169
|
+
get HeadlineMedium(): TextStyle;
|
|
170
|
+
/** Headline Small – `24px`, weight 400 */
|
|
171
|
+
get HeadlineSmall(): TextStyle;
|
|
172
|
+
/** Title Large – `22px`, weight 400 */
|
|
173
|
+
get TitleLarge(): TextStyle;
|
|
174
|
+
/** Title Medium – `16px`, weight 500 */
|
|
175
|
+
get TitleMedium(): TextStyle;
|
|
176
|
+
/** Title Small – `14px`, weight 500 */
|
|
177
|
+
get TitleSmall(): TextStyle;
|
|
178
|
+
/** Body Large – `16px`, weight 400 */
|
|
179
|
+
get BodyLarge(): TextStyle;
|
|
180
|
+
/** Body Medium – `14px`, weight 400 */
|
|
181
|
+
get BodyMedium(): TextStyle;
|
|
182
|
+
/** Body Small – `12px`, weight 400 */
|
|
183
|
+
get BodySmall(): TextStyle;
|
|
184
|
+
/** Label Large – `14px`, weight 500 */
|
|
185
|
+
get LabelLarge(): TextStyle;
|
|
186
|
+
/** Label Medium – `12px`, weight 500 */
|
|
187
|
+
get LabelMedium(): TextStyle;
|
|
188
|
+
/** Label Small – `11px`, weight 500 */
|
|
189
|
+
get LabelSmall(): TextStyle;
|
|
190
|
+
/** Display Large Emphasized – `57px`, weight 800 */
|
|
191
|
+
get DisplayLargeEmphasized(): TextStyle;
|
|
192
|
+
/** Display Medium Emphasized – `45px`, weight 800 */
|
|
193
|
+
get DisplayMediumEmphasized(): TextStyle;
|
|
194
|
+
/** Display Small Emphasized – `36px`, weight 800 */
|
|
195
|
+
get DisplaySmallEmphasized(): TextStyle;
|
|
196
|
+
/** Headline Large Emphasized – `32px`, weight 800 */
|
|
197
|
+
get HeadlineLargeEmphasized(): TextStyle;
|
|
198
|
+
/** Headline Medium Emphasized – `28px`, weight 800 */
|
|
199
|
+
get HeadlineMediumEmphasized(): TextStyle;
|
|
200
|
+
/** Headline Small Emphasized – `24px`, weight 800 */
|
|
201
|
+
get HeadlineSmallEmphasized(): TextStyle;
|
|
202
|
+
/** Title Large Emphasized – `22px`, weight 700 */
|
|
203
|
+
get TitleLargeEmphasized(): TextStyle;
|
|
204
|
+
/** Title Medium Emphasized – `16px`, weight 700 */
|
|
205
|
+
get TitleMediumEmphasized(): TextStyle;
|
|
206
|
+
/** Title Small Emphasized – `14px`, weight 700 */
|
|
207
|
+
get TitleSmallEmphasized(): TextStyle;
|
|
208
|
+
/** Body Large Emphasized – `16px`, weight 700 */
|
|
209
|
+
get BodyLargeEmphasized(): TextStyle;
|
|
210
|
+
/** Body Medium Emphasized – `14px`, weight 700 */
|
|
211
|
+
get BodyMediumEmphasized(): TextStyle;
|
|
212
|
+
/** Body Small Emphasized – `12px`, weight 700 */
|
|
213
|
+
get BodySmallEmphasized(): TextStyle;
|
|
214
|
+
/** Label Large Emphasized – `14px`, weight 800 */
|
|
215
|
+
get LabelLargeEmphasized(): TextStyle;
|
|
216
|
+
/** Label Medium Emphasized – `12px`, weight 800 */
|
|
217
|
+
get LabelMediumEmphasized(): TextStyle;
|
|
218
|
+
/** Label Small Emphasized – `11px`, weight 800 */
|
|
219
|
+
get LabelSmallEmphasized(): TextStyle;
|
|
220
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file typography.tsx
|
|
3
|
+
* @description MD3 Expressive Typography System for React.
|
|
4
|
+
*
|
|
5
|
+
* Port of `androidx.compose.material3.Typography` (Kotlin `@Immutable` class).
|
|
6
|
+
*
|
|
7
|
+
* Provides 30 {@link TextStyle} definitions via the React Context API, mirroring
|
|
8
|
+
* the Compose `LocalTypography` / `MaterialTheme.typography` pattern.
|
|
9
|
+
*
|
|
10
|
+
* ### Memory & Performance Optimizations
|
|
11
|
+
* - The `Typography` class delegates all property access to a `TypographyTokens`
|
|
12
|
+
* instance that uses **lazy getters**, so styles are computed only on first use.
|
|
13
|
+
* - `TypographyProvider` memoizes the context value via `useMemo` to prevent
|
|
14
|
+
* unnecessary re-renders downstream.
|
|
15
|
+
*
|
|
16
|
+
* @example Wrap your application
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <TypographyProvider>
|
|
19
|
+
* <App />
|
|
20
|
+
* </TypographyProvider>
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @example Consume in a component
|
|
24
|
+
* ```tsx
|
|
25
|
+
* const typography = useTypography();
|
|
26
|
+
* <p style={typography.bodyLarge}>Hello</p>
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example Via token key
|
|
30
|
+
* ```tsx
|
|
31
|
+
* const style = typography.fromToken(TypographyKeyTokens.BodyLarge);
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @example Custom font + half-rounded corners
|
|
35
|
+
* ```tsx
|
|
36
|
+
* <TypographyProvider
|
|
37
|
+
* fontFamily="'Roboto', sans-serif"
|
|
38
|
+
* fontVariationAxes={{ ROND: 50 }}
|
|
39
|
+
* >
|
|
40
|
+
* <App />
|
|
41
|
+
* </TypographyProvider>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
import { type ReactNode } from "react";
|
|
45
|
+
import { TypographyKeyTokens } from "./typography-key-tokens";
|
|
46
|
+
import { type FontVariationAxes, type TextStyle, TypographyTokens } from "./typography-tokens";
|
|
47
|
+
/**
|
|
48
|
+
* MD3 Expressive Typography — port of Compose's `@Immutable class Typography(...)`.
|
|
49
|
+
*
|
|
50
|
+
* All 30 style properties are **readonly** and lazily resolved from the
|
|
51
|
+
* underlying {@link TypographyTokens} instance. Use {@link Typography.copy}
|
|
52
|
+
* to create a customized variant without mutating the original.
|
|
53
|
+
*
|
|
54
|
+
* @example Default
|
|
55
|
+
* ```ts
|
|
56
|
+
* const typography = new Typography();
|
|
57
|
+
* const style = typography.displayLarge; // lazy — computed on first access
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* @example Custom tokens
|
|
61
|
+
* ```ts
|
|
62
|
+
* const typography = new Typography(
|
|
63
|
+
* new TypographyTokens({ fontFamily: "'Inter', sans-serif", fontVariationAxes: { ROND: 0 } })
|
|
64
|
+
* );
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare class Typography {
|
|
68
|
+
#private;
|
|
69
|
+
constructor(tokens?: TypographyTokens);
|
|
70
|
+
/** Display Large text style (`57px`, weight `400`). */
|
|
71
|
+
get displayLarge(): TextStyle;
|
|
72
|
+
/** Display Medium text style (`45px`, weight `400`). */
|
|
73
|
+
get displayMedium(): TextStyle;
|
|
74
|
+
/** Display Small text style (`36px`, weight `400`). */
|
|
75
|
+
get displaySmall(): TextStyle;
|
|
76
|
+
/** Headline Large text style (`32px`, weight `400`). */
|
|
77
|
+
get headlineLarge(): TextStyle;
|
|
78
|
+
/** Headline Medium text style (`28px`, weight `400`). */
|
|
79
|
+
get headlineMedium(): TextStyle;
|
|
80
|
+
/** Headline Small text style (`24px`, weight `400`). */
|
|
81
|
+
get headlineSmall(): TextStyle;
|
|
82
|
+
/** Title Large text style (`22px`, weight `400`). */
|
|
83
|
+
get titleLarge(): TextStyle;
|
|
84
|
+
/** Title Medium text style (`16px`, weight `500`). */
|
|
85
|
+
get titleMedium(): TextStyle;
|
|
86
|
+
/** Title Small text style (`14px`, weight `500`). */
|
|
87
|
+
get titleSmall(): TextStyle;
|
|
88
|
+
/** Body Large text style (`16px`, weight `400`). */
|
|
89
|
+
get bodyLarge(): TextStyle;
|
|
90
|
+
/** Body Medium text style (`14px`, weight `400`). */
|
|
91
|
+
get bodyMedium(): TextStyle;
|
|
92
|
+
/** Body Small text style (`12px`, weight `400`). */
|
|
93
|
+
get bodySmall(): TextStyle;
|
|
94
|
+
/** Label Large text style (`14px`, weight `500`). */
|
|
95
|
+
get labelLarge(): TextStyle;
|
|
96
|
+
/** Label Medium text style (`12px`, weight `500`). */
|
|
97
|
+
get labelMedium(): TextStyle;
|
|
98
|
+
/** Label Small text style (`11px`, weight `500`). */
|
|
99
|
+
get labelSmall(): TextStyle;
|
|
100
|
+
/** Display Large Emphasized text style (`57px`, weight `800`). */
|
|
101
|
+
get displayLargeEmphasized(): TextStyle;
|
|
102
|
+
/** Display Medium Emphasized text style (`45px`, weight `800`). */
|
|
103
|
+
get displayMediumEmphasized(): TextStyle;
|
|
104
|
+
/** Display Small Emphasized text style (`36px`, weight `800`). */
|
|
105
|
+
get displaySmallEmphasized(): TextStyle;
|
|
106
|
+
/** Headline Large Emphasized text style (`32px`, weight `800`). */
|
|
107
|
+
get headlineLargeEmphasized(): TextStyle;
|
|
108
|
+
/** Headline Medium Emphasized text style (`28px`, weight `800`). */
|
|
109
|
+
get headlineMediumEmphasized(): TextStyle;
|
|
110
|
+
/** Headline Small Emphasized text style (`24px`, weight `800`). */
|
|
111
|
+
get headlineSmallEmphasized(): TextStyle;
|
|
112
|
+
/** Title Large Emphasized text style (`22px`, weight `700`). */
|
|
113
|
+
get titleLargeEmphasized(): TextStyle;
|
|
114
|
+
/** Title Medium Emphasized text style (`16px`, weight `700`). */
|
|
115
|
+
get titleMediumEmphasized(): TextStyle;
|
|
116
|
+
/** Title Small Emphasized text style (`14px`, weight `700`). */
|
|
117
|
+
get titleSmallEmphasized(): TextStyle;
|
|
118
|
+
/** Body Large Emphasized text style (`16px`, weight `700`). */
|
|
119
|
+
get bodyLargeEmphasized(): TextStyle;
|
|
120
|
+
/** Body Medium Emphasized text style (`14px`, weight `700`). */
|
|
121
|
+
get bodyMediumEmphasized(): TextStyle;
|
|
122
|
+
/** Body Small Emphasized text style (`12px`, weight `700`). */
|
|
123
|
+
get bodySmallEmphasized(): TextStyle;
|
|
124
|
+
/** Label Large Emphasized text style (`14px`, weight `800`). */
|
|
125
|
+
get labelLargeEmphasized(): TextStyle;
|
|
126
|
+
/** Label Medium Emphasized text style (`12px`, weight `800`). */
|
|
127
|
+
get labelMediumEmphasized(): TextStyle;
|
|
128
|
+
/** Label Small Emphasized text style (`11px`, weight `800`). */
|
|
129
|
+
get labelSmallEmphasized(): TextStyle;
|
|
130
|
+
/**
|
|
131
|
+
* Returns the `TextStyle` corresponding to the given {@link TypographyKeyTokens}.
|
|
132
|
+
*
|
|
133
|
+
* Port of `internal fun Typography.fromToken(value: TypographyKeyTokens): TextStyle`.
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```ts
|
|
137
|
+
* const style = typography.fromToken(TypographyKeyTokens.BodyLarge);
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
fromToken(value: TypographyKeyTokens): TextStyle;
|
|
141
|
+
/**
|
|
142
|
+
* Creates a new `Typography` instance with the specified property overrides
|
|
143
|
+
* merged on top of the current instance's styles.
|
|
144
|
+
*
|
|
145
|
+
* Port of Compose's `fun Typography.copy(...)`.
|
|
146
|
+
*
|
|
147
|
+
* Unlike a shallow `Object.assign`, this method preserves the lazy-getter
|
|
148
|
+
* architecture — overridden styles are stored separately and looked up first
|
|
149
|
+
* on each property access, while non-overridden styles continue to be
|
|
150
|
+
* resolved from the underlying {@link TypographyTokens}.
|
|
151
|
+
*
|
|
152
|
+
* @param overrides - Map of camelCase property names to partial `TextStyle` overrides.
|
|
153
|
+
* @returns A new `Typography` instance. The original is never mutated.
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```ts
|
|
157
|
+
* const custom = typography.copy({ bodyLarge: { fontSize: "2rem" } });
|
|
158
|
+
* custom.bodyLarge.fontSize; // "2rem"
|
|
159
|
+
* custom.bodySmall.fontSize; // original token value — untouched
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
copy(overrides: Partial<Record<TypographyStyleKey, Partial<TextStyle>>>): Typography;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Union of all camelCase property names on {@link Typography} that return a
|
|
166
|
+
* {@link TextStyle}. Used as the key type for `copy()` overrides and the
|
|
167
|
+
* `OverriddenTypography` resolver.
|
|
168
|
+
*/
|
|
169
|
+
type TypographyStyleKey = {
|
|
170
|
+
[K in keyof Typography]: Typography[K] extends TextStyle ? K : never;
|
|
171
|
+
}[keyof Typography];
|
|
172
|
+
/**
|
|
173
|
+
* React context that holds the current {@link Typography} instance.
|
|
174
|
+
*
|
|
175
|
+
* Port of `internal val LocalTypography = staticCompositionLocalOf { Typography() }`.
|
|
176
|
+
*
|
|
177
|
+
* @internal — Prefer {@link useTypography} and {@link TypographyProvider}.
|
|
178
|
+
*/
|
|
179
|
+
export declare const TypographyContext: import("react").Context<Typography>;
|
|
180
|
+
/**
|
|
181
|
+
* React hook to access the current {@link Typography} from the nearest
|
|
182
|
+
* {@link TypographyProvider} in the tree. Falls back to the default
|
|
183
|
+
* googleapis Typography when no provider is present.
|
|
184
|
+
*
|
|
185
|
+
* @returns The current `Typography` instance.
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```tsx
|
|
189
|
+
* const typography = useTypography();
|
|
190
|
+
* <p style={typography.bodyLarge}>Hello</p>
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
export declare function useTypography(): Typography;
|
|
194
|
+
/**
|
|
195
|
+
* Props for {@link TypographyProvider}.
|
|
196
|
+
*/
|
|
197
|
+
export interface TypographyProviderProps {
|
|
198
|
+
/** The child tree that will have access to the provided typography. */
|
|
199
|
+
children: ReactNode;
|
|
200
|
+
/**
|
|
201
|
+
* A fully custom {@link Typography} instance.
|
|
202
|
+
* When provided, `fontFamily` and `fontVariationAxes` are ignored.
|
|
203
|
+
*/
|
|
204
|
+
typography?: Typography;
|
|
205
|
+
/**
|
|
206
|
+
* Shorthand to override the CSS `font-family` for all typography styles.
|
|
207
|
+
* Ignored when `typography` is provided.
|
|
208
|
+
*
|
|
209
|
+
* @example "'Roboto', sans-serif"
|
|
210
|
+
*/
|
|
211
|
+
fontFamily?: string;
|
|
212
|
+
/**
|
|
213
|
+
* Variable font axes to apply globally via `font-variation-settings`.
|
|
214
|
+
* Merged on top of the defaults (`ROND: 100`). Only the axes you specify
|
|
215
|
+
* will be overridden; unspecified axes retain font defaults.
|
|
216
|
+
* Ignored when `typography` is provided.
|
|
217
|
+
*
|
|
218
|
+
* @example { ROND: 50 } // half-rounded
|
|
219
|
+
* @example { ROND: 0 } // sharp corners
|
|
220
|
+
*/
|
|
221
|
+
fontVariationAxes?: FontVariationAxes;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Typography Provider component.
|
|
225
|
+
*
|
|
226
|
+
* Port of `CompositionLocalProvider(LocalTypography provides typography)`.
|
|
227
|
+
* Wrap your application (or a subtree) to provide MD3 Expressive typography
|
|
228
|
+
* to all descendant components that call {@link useTypography}.
|
|
229
|
+
*
|
|
230
|
+
* The context value is **memoized** — it is only re-computed when `typography`,
|
|
231
|
+
* `fontFamily`, or `fontVariationAxes` change, preventing unnecessary re-renders.
|
|
232
|
+
*
|
|
233
|
+
* @example Default (Google Sans Flex, ROND = 100)
|
|
234
|
+
* ```tsx
|
|
235
|
+
* <TypographyProvider>
|
|
236
|
+
* <App />
|
|
237
|
+
* </TypographyProvider>
|
|
238
|
+
* ```
|
|
239
|
+
*
|
|
240
|
+
* @example Custom font
|
|
241
|
+
* ```tsx
|
|
242
|
+
* <TypographyProvider fontFamily="'Inter', sans-serif">
|
|
243
|
+
* <App />
|
|
244
|
+
* </TypographyProvider>
|
|
245
|
+
* ```
|
|
246
|
+
*
|
|
247
|
+
* @example Partially rounded corners (ROND = 50)
|
|
248
|
+
* ```tsx
|
|
249
|
+
* <TypographyProvider fontVariationAxes={{ ROND: 50 }}>
|
|
250
|
+
* <App />
|
|
251
|
+
* </TypographyProvider>
|
|
252
|
+
* ```
|
|
253
|
+
*
|
|
254
|
+
* @example Fully sharp (ROND = 0) with a custom font
|
|
255
|
+
* ```tsx
|
|
256
|
+
* <TypographyProvider
|
|
257
|
+
* fontFamily="'Outfit', sans-serif"
|
|
258
|
+
* fontVariationAxes={{ ROND: 0 }}
|
|
259
|
+
* >
|
|
260
|
+
* <App />
|
|
261
|
+
* </TypographyProvider>
|
|
262
|
+
* ```
|
|
263
|
+
*/
|
|
264
|
+
export declare function TypographyProvider({ children, typography, fontFamily, fontVariationAxes, }: TypographyProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
265
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bug-on/md3-react",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Material Design 3 Expressive React components",
|
|
5
|
+
"author": "Bug Ổn",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/nguyentruongton/bug-on-md3-expressive.git",
|
|
10
|
+
"directory": "packages/react"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"react",
|
|
14
|
+
"tailwind",
|
|
15
|
+
"material-design-3",
|
|
16
|
+
"md3",
|
|
17
|
+
"ui-library",
|
|
18
|
+
"components",
|
|
19
|
+
"bug-on"
|
|
20
|
+
],
|
|
21
|
+
"main": "./dist/index.js",
|
|
22
|
+
"module": "./dist/index.mjs",
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"import": "./dist/index.mjs",
|
|
28
|
+
"require": "./dist/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./typography.css": "./dist/typography.css",
|
|
31
|
+
"./index.css": "./dist/index.css",
|
|
32
|
+
"./material-symbols-cdn.css": "./dist/material-symbols-cdn.css",
|
|
33
|
+
"./material-symbols-self-hosted.css": "./dist/material-symbols-self-hosted.css"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"README.md"
|
|
38
|
+
],
|
|
39
|
+
"sideEffects": false,
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"motion": ">=12.0.0",
|
|
42
|
+
"react": "^19.0.0",
|
|
43
|
+
"react-dom": "^19.0.0"
|
|
44
|
+
},
|
|
45
|
+
"peerDependenciesMeta": {
|
|
46
|
+
"motion": {
|
|
47
|
+
"optional": true
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@material/material-color-utilities": "^0.3.0",
|
|
52
|
+
"@radix-ui/react-dialog": "^1.1.15",
|
|
53
|
+
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
54
|
+
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
55
|
+
"@radix-ui/react-slot": "^1.2.4",
|
|
56
|
+
"class-variance-authority": "^0.7.1",
|
|
57
|
+
"clsx": "^2.1.1",
|
|
58
|
+
"tailwind-merge": "^3.3.1",
|
|
59
|
+
"@bug-on/md3-tokens": "0.1.0"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
63
|
+
"@testing-library/react": "^16.3.2",
|
|
64
|
+
"@testing-library/user-event": "^14.6.1",
|
|
65
|
+
"@types/react": "^19.0.0",
|
|
66
|
+
"@types/react-dom": "^19.0.0",
|
|
67
|
+
"@vitejs/plugin-react": "^6.0.1",
|
|
68
|
+
"jsdom": "^29.0.0",
|
|
69
|
+
"tsup": "^8.4.0",
|
|
70
|
+
"typescript": "5.8.3",
|
|
71
|
+
"vitest": "^4.1.0"
|
|
72
|
+
},
|
|
73
|
+
"scripts": {
|
|
74
|
+
"build": "tsup && tsc -p tsconfig.build.json",
|
|
75
|
+
"dev": "tsup --watch",
|
|
76
|
+
"test": "vitest run",
|
|
77
|
+
"lint": "tsc --noEmit",
|
|
78
|
+
"clean": "rm -rf dist"
|
|
79
|
+
}
|
|
80
|
+
}
|