@react-email/tailwind 1.2.2 → 2.0.0-canary.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-email/tailwind",
3
- "version": "1.2.2",
3
+ "version": "2.0.0-canary.1",
4
4
  "description": "A React component to wrap emails with Tailwind CSS",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -36,20 +36,61 @@
36
36
  "node": ">=18.0.0"
37
37
  },
38
38
  "peerDependencies": {
39
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
39
+ "react": "^18.0 || ^19.0 || ^19.0.0-rc",
40
+ "@react-email/code-block": "0.1.0",
41
+ "@react-email/body": "0.1.0",
42
+ "@react-email/button": "0.2.0",
43
+ "@react-email/code-inline": "0.0.5",
44
+ "@react-email/heading": "0.0.15",
45
+ "@react-email/container": "0.0.15",
46
+ "@react-email/hr": "0.0.11",
47
+ "@react-email/img": "0.0.11",
48
+ "@react-email/link": "0.0.12",
49
+ "@react-email/preview": "0.0.13",
50
+ "@react-email/text": "0.1.5"
51
+ },
52
+ "peerDependenciesMeta": {
53
+ "@react-email/button": {
54
+ "optional": true
55
+ },
56
+ "@react-email/body": {
57
+ "optional": true
58
+ },
59
+ "@react-email/code-block": {
60
+ "optional": true
61
+ },
62
+ "@react-email/code-inline": {
63
+ "optional": true
64
+ },
65
+ "@react-email/container": {
66
+ "optional": true
67
+ },
68
+ "@react-email/heading": {
69
+ "optional": true
70
+ },
71
+ "@react-email/hr": {
72
+ "optional": true
73
+ },
74
+ "@react-email/img": {
75
+ "optional": true
76
+ },
77
+ "@react-email/link": {
78
+ "optional": true
79
+ },
80
+ "@react-email/preview": {
81
+ "optional": true
82
+ }
40
83
  },
41
84
  "devDependencies": {
42
85
  "@responsive-email/react-email": "0.0.4",
86
+ "@types/css-tree": "2.3.10",
43
87
  "@types/shelljs": "0.8.15",
44
88
  "@vitejs/plugin-react": "4.4.1",
45
- "postcss": "8.5.3",
46
- "postcss-selector-parser": "7.1.0",
89
+ "css-tree": "3.1.0",
47
90
  "react-dom": "^19",
48
91
  "shelljs": "0.9.2",
49
- "tailwindcss": "3.4.10",
50
- "tsup": "8.4.0",
51
92
  "typescript": "5.8.3",
52
- "vite": "6.3.4",
93
+ "vite": "6.3.6",
53
94
  "vite-plugin-dts": "4.5.3",
54
95
  "yalc": "1.0.0-pre.53",
55
96
  "@react-email/button": "^0.2.0",
@@ -58,15 +99,18 @@
58
99
  "@react-email/hr": "0.0.11",
59
100
  "@react-email/html": "0.0.11",
60
101
  "@react-email/link": "0.0.12",
61
- "@react-email/render": "1.1.3",
102
+ "@react-email/render": "1.4.0",
62
103
  "tsconfig": "0.0.0"
63
104
  },
64
105
  "publishConfig": {
65
106
  "access": "public"
66
107
  },
108
+ "dependencies": {
109
+ "tailwindcss": "4.1.12"
110
+ },
67
111
  "scripts": {
68
- "build": "tsc && NODE_ENV=production vite build --mode production && node ./copy-tailwind-types.mjs",
69
- "build:watch": "vite build --watch",
112
+ "build": "tsdown",
113
+ "build:watch": "tsdown --watch",
70
114
  "clean": "rm -rf dist",
71
115
  "test": "vitest run",
72
116
  "test:watch": "vitest"
@@ -1,376 +0,0 @@
1
- import type { CorePluginList } from './generated/corePluginList'
2
- import type { DefaultColors } from './generated/colors'
3
-
4
- // Helpers
5
- type Expand<T> = T extends object
6
- ? T extends infer O
7
- ? { [K in keyof O]: Expand<O[K]> }
8
- : never
9
- : T
10
- type KeyValuePair<K extends keyof any = string, V = string> = Record<K, V>
11
- interface RecursiveKeyValuePair<K extends keyof any = string, V = string> {
12
- [key: string]: V | RecursiveKeyValuePair<K, V>
13
- }
14
- export type ResolvableTo<T> = T | ((utils: PluginUtils) => T)
15
- type CSSRuleObject = RecursiveKeyValuePair<string, null | string | string[]>
16
-
17
- interface PluginUtils {
18
- colors: DefaultColors
19
- theme(path: string, defaultValue?: unknown): any
20
- breakpoints<I = Record<string, unknown>, O = I>(arg: I): O
21
- rgb(arg: string): (arg: Partial<{ opacityVariable: string; opacityValue: number }>) => string
22
- hsl(arg: string): (arg: Partial<{ opacityVariable: string; opacityValue: number }>) => string
23
- }
24
-
25
- // Content related config
26
- type FilePath = string
27
- type RawFile = { raw: string; extension?: string }
28
- type ExtractorFn = (content: string) => string[]
29
- type TransformerFn = (content: string) => string
30
- type ContentConfig =
31
- | (FilePath | RawFile)[]
32
- | {
33
- files: (FilePath | RawFile)[]
34
- relative?: boolean
35
- extract?: ExtractorFn | { [extension: string]: ExtractorFn }
36
- transform?: TransformerFn | { [extension: string]: TransformerFn }
37
- }
38
-
39
- // Important related config
40
- type ImportantConfig = boolean | string
41
-
42
- // Prefix related config
43
- type PrefixConfig = string
44
-
45
- // Separator related config
46
- type SeparatorConfig = string
47
-
48
- // Safelist related config
49
- type SafelistConfig = string | { pattern: RegExp; variants?: string[] }
50
-
51
- // Blocklist related config
52
- type BlocklistConfig = string
53
-
54
- // Presets related config
55
- type PresetsConfig = Partial<Config>
56
-
57
- // Future related config
58
- type FutureConfigValues =
59
- | 'hoverOnlyWhenSupported'
60
- | 'respectDefaultRingColorOpacity'
61
- | 'disableColorOpacityUtilitiesByDefault'
62
- | 'relativeContentPathsByDefault'
63
- type FutureConfig = Expand<'all' | Partial<Record<FutureConfigValues, boolean>>> | []
64
-
65
- // Experimental related config
66
- type ExperimentalConfigValues = 'optimizeUniversalDefaults' | 'matchVariant'
67
- type ExperimentalConfig = Expand<'all' | Partial<Record<ExperimentalConfigValues, boolean>>> | []
68
-
69
- // DarkMode related config
70
- type DarkModeConfig =
71
- // Use the `media` query strategy.
72
- | 'media'
73
- // Use the `class` strategy, which requires a `.dark` class on the `html`.
74
- | 'class'
75
- // Use the `class` strategy with a custom class instead of `.dark`.
76
- | ['class', string]
77
- // Use the `selector` strategy — same as `class` but uses `:where()` for more predicable behavior
78
- | 'selector'
79
- // Use the `selector` strategy with a custom selector instead of `.dark`.
80
- | ['selector', string]
81
- // Use the `variant` strategy, which allows you to completely customize the selector
82
- // It takes a string or an array of strings, which are passed directly to `addVariant()`
83
- | ['variant', string | string[]]
84
-
85
- type Screen = { raw: string } | { min: string } | { max: string } | { min: string; max: string }
86
- type ScreensConfig = string[] | KeyValuePair<string, string | Screen | Screen[]>
87
-
88
- // Theme related config
89
- export interface ThemeConfig {
90
- // Responsiveness
91
- screens: ResolvableTo<ScreensConfig>
92
- supports: ResolvableTo<Record<string, string>>
93
- data: ResolvableTo<Record<string, string>>
94
-
95
- // Reusable base configs
96
- colors: ResolvableTo<RecursiveKeyValuePair>
97
- spacing: ResolvableTo<KeyValuePair>
98
-
99
- // Components
100
- container: ResolvableTo<
101
- Partial<{
102
- screens: ScreensConfig
103
- center: boolean
104
- padding: string | Record<string, string>
105
- }>
106
- >
107
-
108
- // Utilities
109
- inset: ThemeConfig['spacing']
110
- zIndex: ResolvableTo<KeyValuePair>
111
- order: ResolvableTo<KeyValuePair>
112
- gridColumn: ResolvableTo<KeyValuePair>
113
- gridColumnStart: ResolvableTo<KeyValuePair>
114
- gridColumnEnd: ResolvableTo<KeyValuePair>
115
- gridRow: ResolvableTo<KeyValuePair>
116
- gridRowStart: ResolvableTo<KeyValuePair>
117
- gridRowEnd: ResolvableTo<KeyValuePair>
118
- margin: ThemeConfig['spacing']
119
- aspectRatio: ResolvableTo<KeyValuePair>
120
- height: ThemeConfig['spacing']
121
- maxHeight: ThemeConfig['spacing']
122
- minHeight: ResolvableTo<KeyValuePair>
123
- width: ThemeConfig['spacing']
124
- maxWidth: ResolvableTo<KeyValuePair>
125
- minWidth: ResolvableTo<KeyValuePair>
126
- flex: ResolvableTo<KeyValuePair>
127
- flexShrink: ResolvableTo<KeyValuePair>
128
- flexGrow: ResolvableTo<KeyValuePair>
129
- flexBasis: ThemeConfig['spacing']
130
- borderSpacing: ThemeConfig['spacing']
131
- transformOrigin: ResolvableTo<KeyValuePair>
132
- translate: ThemeConfig['spacing']
133
- rotate: ResolvableTo<KeyValuePair>
134
- skew: ResolvableTo<KeyValuePair>
135
- scale: ResolvableTo<KeyValuePair>
136
- animation: ResolvableTo<KeyValuePair>
137
- keyframes: ResolvableTo<KeyValuePair<string, KeyValuePair<string, KeyValuePair>>>
138
- cursor: ResolvableTo<KeyValuePair>
139
- scrollMargin: ThemeConfig['spacing']
140
- scrollPadding: ThemeConfig['spacing']
141
- listStyleType: ResolvableTo<KeyValuePair>
142
- columns: ResolvableTo<KeyValuePair>
143
- gridAutoColumns: ResolvableTo<KeyValuePair>
144
- gridAutoRows: ResolvableTo<KeyValuePair>
145
- gridTemplateColumns: ResolvableTo<KeyValuePair>
146
- gridTemplateRows: ResolvableTo<KeyValuePair>
147
- gap: ThemeConfig['spacing']
148
- space: ThemeConfig['spacing']
149
- divideWidth: ThemeConfig['borderWidth']
150
- divideColor: ThemeConfig['borderColor']
151
- divideOpacity: ThemeConfig['borderOpacity']
152
- borderRadius: ResolvableTo<KeyValuePair>
153
- borderWidth: ResolvableTo<KeyValuePair>
154
- borderColor: ThemeConfig['colors']
155
- borderOpacity: ThemeConfig['opacity']
156
- backgroundColor: ThemeConfig['colors']
157
- backgroundOpacity: ThemeConfig['opacity']
158
- backgroundImage: ResolvableTo<KeyValuePair>
159
- gradientColorStops: ThemeConfig['colors']
160
- backgroundSize: ResolvableTo<KeyValuePair>
161
- backgroundPosition: ResolvableTo<KeyValuePair>
162
- fill: ThemeConfig['colors']
163
- stroke: ThemeConfig['colors']
164
- strokeWidth: ResolvableTo<KeyValuePair>
165
- objectPosition: ResolvableTo<KeyValuePair>
166
- padding: ThemeConfig['spacing']
167
- textIndent: ThemeConfig['spacing']
168
- fontFamily: ResolvableTo<
169
- KeyValuePair<
170
- string,
171
- | string
172
- | string[]
173
- | [
174
- fontFamily: string | string[],
175
- configuration: Partial<{
176
- fontFeatureSettings: string
177
- fontVariationSettings: string
178
- }>
179
- ]
180
- >
181
- >
182
- fontSize: ResolvableTo<
183
- KeyValuePair<
184
- string,
185
- | string
186
- | [fontSize: string, lineHeight: string]
187
- | [
188
- fontSize: string,
189
- configuration: Partial<{
190
- lineHeight: string
191
- letterSpacing: string
192
- fontWeight: string | number
193
- }>
194
- ]
195
- >
196
- >
197
- fontWeight: ResolvableTo<KeyValuePair>
198
- lineHeight: ResolvableTo<KeyValuePair>
199
- letterSpacing: ResolvableTo<KeyValuePair>
200
- textColor: ThemeConfig['colors']
201
- textOpacity: ThemeConfig['opacity']
202
- textDecorationColor: ThemeConfig['colors']
203
- textDecorationThickness: ResolvableTo<KeyValuePair>
204
- textUnderlineOffset: ResolvableTo<KeyValuePair>
205
- placeholderColor: ThemeConfig['colors']
206
- placeholderOpacity: ThemeConfig['opacity']
207
- caretColor: ThemeConfig['colors']
208
- accentColor: ThemeConfig['colors']
209
- opacity: ResolvableTo<KeyValuePair>
210
- boxShadow: ResolvableTo<KeyValuePair>
211
- boxShadowColor: ThemeConfig['colors']
212
- outlineWidth: ResolvableTo<KeyValuePair>
213
- outlineOffset: ResolvableTo<KeyValuePair>
214
- outlineColor: ThemeConfig['colors']
215
- ringWidth: ResolvableTo<KeyValuePair>
216
- ringColor: ThemeConfig['colors']
217
- ringOpacity: ThemeConfig['opacity']
218
- ringOffsetWidth: ResolvableTo<KeyValuePair>
219
- ringOffsetColor: ThemeConfig['colors']
220
- blur: ResolvableTo<KeyValuePair>
221
- brightness: ResolvableTo<KeyValuePair>
222
- contrast: ResolvableTo<KeyValuePair>
223
- dropShadow: ResolvableTo<KeyValuePair<string, string | string[]>>
224
- grayscale: ResolvableTo<KeyValuePair>
225
- hueRotate: ResolvableTo<KeyValuePair>
226
- invert: ResolvableTo<KeyValuePair>
227
- saturate: ResolvableTo<KeyValuePair>
228
- sepia: ResolvableTo<KeyValuePair>
229
- backdropBlur: ThemeConfig['blur']
230
- backdropBrightness: ThemeConfig['brightness']
231
- backdropContrast: ThemeConfig['contrast']
232
- backdropGrayscale: ThemeConfig['grayscale']
233
- backdropHueRotate: ThemeConfig['hueRotate']
234
- backdropInvert: ThemeConfig['invert']
235
- backdropOpacity: ThemeConfig['opacity']
236
- backdropSaturate: ThemeConfig['saturate']
237
- backdropSepia: ThemeConfig['sepia']
238
- transitionProperty: ResolvableTo<KeyValuePair>
239
- transitionTimingFunction: ResolvableTo<KeyValuePair>
240
- transitionDelay: ResolvableTo<KeyValuePair>
241
- transitionDuration: ResolvableTo<KeyValuePair>
242
- willChange: ResolvableTo<KeyValuePair>
243
- content: ResolvableTo<KeyValuePair>
244
- }
245
-
246
- interface CustomThemeConfig extends ThemeConfig {
247
- [key: string]: any
248
- }
249
-
250
- // Core plugins related config
251
- type CorePluginsConfig = CorePluginList[] | Expand<Partial<Record<CorePluginList, boolean>>>
252
-
253
- // Plugins related config
254
- type ValueType =
255
- | 'any'
256
- | 'color'
257
- | 'url'
258
- | 'image'
259
- | 'length'
260
- | 'percentage'
261
- | 'position'
262
- | 'lookup'
263
- | 'generic-name'
264
- | 'family-name'
265
- | 'number'
266
- | 'line-width'
267
- | 'absolute-size'
268
- | 'relative-size'
269
- | 'shadow'
270
- export interface PluginAPI {
271
- // for registering new static utility styles
272
- addUtilities(
273
- utilities: CSSRuleObject | CSSRuleObject[],
274
- options?: Partial<{
275
- respectPrefix: boolean
276
- respectImportant: boolean
277
- }>
278
- ): void
279
- // for registering new dynamic utility styles
280
- matchUtilities<T = string, U = string>(
281
- utilities: KeyValuePair<
282
- string,
283
- (value: T | string, extra: { modifier: U | string | null }) => CSSRuleObject | null
284
- >,
285
- options?: Partial<{
286
- respectPrefix: boolean
287
- respectImportant: boolean
288
- type: ValueType | ValueType[]
289
- values: KeyValuePair<string, T>
290
- modifiers: 'any' | KeyValuePair<string, U>
291
- supportsNegativeValues: boolean
292
- }>
293
- ): void
294
- // for registering new static component styles
295
- addComponents(
296
- components: CSSRuleObject | CSSRuleObject[],
297
- options?: Partial<{
298
- respectPrefix: boolean
299
- respectImportant: boolean
300
- }>
301
- ): void
302
- // for registering new dynamic component styles
303
- matchComponents<T = string, U = string>(
304
- components: KeyValuePair<
305
- string,
306
- (value: T | string, extra: { modifier: U | string | null }) => CSSRuleObject | null
307
- >,
308
- options?: Partial<{
309
- respectPrefix: boolean
310
- respectImportant: boolean
311
- type: ValueType | ValueType[]
312
- values: KeyValuePair<string, T>
313
- modifiers: 'any' | KeyValuePair<string, U>
314
- supportsNegativeValues: boolean
315
- }>
316
- ): void
317
- // for registering new base styles
318
- addBase(base: CSSRuleObject | CSSRuleObject[]): void
319
- // for registering custom variants
320
- addVariant(name: string, definition: string | string[] | (() => string) | (() => string)[]): void
321
- matchVariant<T = string>(
322
- name: string,
323
- cb: (value: T | string, extra: { modifier: string | null }) => string | string[],
324
- options?: {
325
- values?: KeyValuePair<string, T>
326
- sort?(
327
- a: { value: T | string; modifier: string | null },
328
- b: { value: T | string; modifier: string | null }
329
- ): number
330
- }
331
- ): void
332
- // for looking up values in the user’s theme configuration
333
- theme: <TDefaultValue = Config['theme']>(
334
- path?: string,
335
- defaultValue?: TDefaultValue
336
- ) => TDefaultValue
337
- // for looking up values in the user’s Tailwind configuration
338
- config: <TDefaultValue = Config>(path?: string, defaultValue?: TDefaultValue) => TDefaultValue
339
- // for checking if a core plugin is enabled
340
- corePlugins(path: string): boolean
341
- // for manually escaping strings meant to be used in class names
342
- e: (className: string) => string
343
- }
344
- export type PluginCreator = (api: PluginAPI) => void
345
- export type PluginsConfig = (
346
- | PluginCreator
347
- | { handler: PluginCreator; config?: Partial<Config> }
348
- | {
349
- (options: any): { handler: PluginCreator; config?: Partial<Config> }
350
- __isOptionsFunction: true
351
- }
352
- )[]
353
-
354
- // Top level config related
355
- interface RequiredConfig {
356
- content: ContentConfig
357
- }
358
-
359
- interface OptionalConfig {
360
- important: Partial<ImportantConfig>
361
- prefix: Partial<PrefixConfig>
362
- separator: Partial<SeparatorConfig>
363
- safelist: Array<SafelistConfig>
364
- blocklist: Array<BlocklistConfig>
365
- presets: Array<PresetsConfig>
366
- future: Partial<FutureConfig>
367
- experimental: Partial<ExperimentalConfig>
368
- darkMode: Partial<DarkModeConfig>
369
- theme: Partial<CustomThemeConfig & { extend: Partial<CustomThemeConfig> }>
370
- corePlugins: Partial<CorePluginsConfig>
371
- plugins: Partial<PluginsConfig>
372
- // Custom
373
- [key: string]: any
374
- }
375
-
376
- export type Config = RequiredConfig & Partial<OptionalConfig>
File without changes