@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.
Files changed (96) hide show
  1. package/README.md +215 -0
  2. package/dist/assets/fonts/GoogleSansFlex-VariableFont.woff2 +0 -0
  3. package/dist/assets/fonts/MaterialSymbolsOutlined-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  4. package/dist/assets/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  5. package/dist/assets/fonts/MaterialSymbolsSharp-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  6. package/dist/assets/loading-indicator.svg +19 -0
  7. package/dist/assets/material-symbols-cdn.css +65 -0
  8. package/dist/assets/material-symbols-self-hosted.css +109 -0
  9. package/dist/hooks/index.d.ts +3 -0
  10. package/dist/hooks/useMediaQuery.d.ts +11 -0
  11. package/dist/hooks/useRipple.d.ts +26 -0
  12. package/dist/index.d.ts +65 -0
  13. package/dist/index.js +9059 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/index.mjs +8929 -0
  16. package/dist/index.mjs.map +1 -0
  17. package/dist/lib/material-symbols-preconnect.d.ts +42 -0
  18. package/dist/lib/theme-utils.d.ts +63 -0
  19. package/dist/lib/utils.d.ts +2 -0
  20. package/dist/material-symbols-cdn.css +65 -0
  21. package/dist/material-symbols-self-hosted.css +109 -0
  22. package/dist/types/index.d.ts +1 -0
  23. package/dist/types/md3.d.ts +14 -0
  24. package/dist/typography.css +22 -0
  25. package/dist/ui/badge.d.ts +125 -0
  26. package/dist/ui/button-group.d.ts +59 -0
  27. package/dist/ui/button.d.ts +148 -0
  28. package/dist/ui/card.d.ts +62 -0
  29. package/dist/ui/checkbox.d.ts +82 -0
  30. package/dist/ui/chip.d.ts +110 -0
  31. package/dist/ui/code-block.d.ts +14 -0
  32. package/dist/ui/dialog.d.ts +111 -0
  33. package/dist/ui/divider.d.ts +164 -0
  34. package/dist/ui/drawer.d.ts +39 -0
  35. package/dist/ui/dropdown.d.ts +29 -0
  36. package/dist/ui/fab-menu.d.ts +204 -0
  37. package/dist/ui/fab.d.ts +162 -0
  38. package/dist/ui/icon-button.d.ts +131 -0
  39. package/dist/ui/icon.d.ts +88 -0
  40. package/dist/ui/loading-indicator.d.ts +42 -0
  41. package/dist/ui/navigation-rail.d.ts +29 -0
  42. package/dist/ui/progress-indicator/circular.d.ts +3 -0
  43. package/dist/ui/progress-indicator/hooks.d.ts +3 -0
  44. package/dist/ui/progress-indicator/index.d.ts +21 -0
  45. package/dist/ui/progress-indicator/linear-flat.d.ts +10 -0
  46. package/dist/ui/progress-indicator/linear-wavy.d.ts +18 -0
  47. package/dist/ui/progress-indicator/linear.d.ts +3 -0
  48. package/dist/ui/progress-indicator/types.d.ts +151 -0
  49. package/dist/ui/progress-indicator/utils.d.ts +3 -0
  50. package/dist/ui/radio-button.d.ts +106 -0
  51. package/dist/ui/ripple.d.ts +126 -0
  52. package/dist/ui/scroll-area.d.ts +27 -0
  53. package/dist/ui/shared/constants.d.ts +86 -0
  54. package/dist/ui/shared/touch-target.d.ts +38 -0
  55. package/dist/ui/snackbar/index.d.ts +6 -0
  56. package/dist/ui/snackbar/snackbar.d.ts +196 -0
  57. package/dist/ui/switch/index.d.ts +7 -0
  58. package/dist/ui/switch/switch.d.ts +30 -0
  59. package/dist/ui/switch/switch.stories.d.ts +48 -0
  60. package/dist/ui/switch/switch.tokens.d.ts +67 -0
  61. package/dist/ui/switch/switch.types.d.ts +59 -0
  62. package/dist/ui/tabs/index.d.ts +10 -0
  63. package/dist/ui/tabs/tab.d.ts +43 -0
  64. package/dist/ui/tabs/tabs-content.d.ts +36 -0
  65. package/dist/ui/tabs/tabs-list.d.ts +40 -0
  66. package/dist/ui/tabs/tabs.d.ts +60 -0
  67. package/dist/ui/tabs/tabs.tokens.d.ts +94 -0
  68. package/dist/ui/tabs/tabs.types.d.ts +172 -0
  69. package/dist/ui/text-field/index.d.ts +11 -0
  70. package/dist/ui/text-field/subcomponents/active-indicator.d.ts +24 -0
  71. package/dist/ui/text-field/subcomponents/floating-label.d.ts +43 -0
  72. package/dist/ui/text-field/subcomponents/leading-icon.d.ts +23 -0
  73. package/dist/ui/text-field/subcomponents/outline-container.d.ts +42 -0
  74. package/dist/ui/text-field/subcomponents/prefix-suffix.d.ts +24 -0
  75. package/dist/ui/text-field/subcomponents/supporting-text.d.ts +37 -0
  76. package/dist/ui/text-field/subcomponents/trailing-icon.d.ts +41 -0
  77. package/dist/ui/text-field/text-field.d.ts +49 -0
  78. package/dist/ui/text-field/text-field.tokens.d.ts +76 -0
  79. package/dist/ui/text-field/text-field.types.d.ts +126 -0
  80. package/dist/ui/theme-provider/index.d.ts +18 -0
  81. package/dist/ui/toc.d.ts +74 -0
  82. package/dist/ui/tooltip/index.d.ts +8 -0
  83. package/dist/ui/tooltip/plain-tooltip.d.ts +2 -0
  84. package/dist/ui/tooltip/rich-tooltip.d.ts +2 -0
  85. package/dist/ui/tooltip/tooltip-box.d.ts +2 -0
  86. package/dist/ui/tooltip/tooltip-caret-shape.d.ts +9 -0
  87. package/dist/ui/tooltip/tooltip.tokens.d.ts +26 -0
  88. package/dist/ui/tooltip/tooltip.types.d.ts +56 -0
  89. package/dist/ui/tooltip/use-tooltip-position.d.ts +8 -0
  90. package/dist/ui/tooltip/use-tooltip-state.d.ts +2 -0
  91. package/dist/ui/typography/index.d.ts +16 -0
  92. package/dist/ui/typography/type-scale-tokens.d.ts +162 -0
  93. package/dist/ui/typography/typography-key-tokens.d.ts +40 -0
  94. package/dist/ui/typography/typography-tokens.d.ts +220 -0
  95. package/dist/ui/typography/typography.d.ts +265 -0
  96. 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
+ }