Skip to content

Commit 271f1e4

Browse files
committed
Handle number theme values
Internal utilities assumed theme values would always be `string` typed, but in some cases they may be `number`s.
1 parent 9d8b80c commit 271f1e4

File tree

4 files changed

+75
-10
lines changed

4 files changed

+75
-10
lines changed

.changeset/free-geckos-decide.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'tailwindcss-capsize': patch
3+
---
4+
5+
Handle `number` theme values
6+
7+
Internal utilities assumed theme values would always be `string` typed, but in some cases they may be `number`s.

__tests__/plugin.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ describe('Plugin', () => {
328328
},
329329
lineHeight: {
330330
sm: '100%',
331-
md: '1.5',
331+
md: 1.5,
332332
},
333333
},
334334
}).then((result) =>

__tests__/utilities.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { describe, expect, it } from 'vitest'
2+
3+
import { getRelativeValue, isRelativeValue, normalizeValue } from '../src/utilities.js'
4+
5+
describe('isRelativeValue', () => {
6+
it('returns true for a percentage value', () => {
7+
expect(isRelativeValue('0%')).toBe(true)
8+
expect(isRelativeValue('100%')).toBe(true)
9+
expect(isRelativeValue('150%')).toBe(true)
10+
expect(isRelativeValue('20px')).toBe(false)
11+
expect(isRelativeValue('1.5rem')).toBe(false)
12+
})
13+
it('returns true for a unitless value', () => {
14+
expect(isRelativeValue('')).toBe(false)
15+
expect(isRelativeValue('0')).toBe(true)
16+
expect(isRelativeValue('1.5')).toBe(true)
17+
expect(isRelativeValue(0)).toBe(true)
18+
expect(isRelativeValue(1.5)).toBe(true)
19+
})
20+
})
21+
22+
describe('getRelativeValue', () => {
23+
it('returns a floating point number from a percentage value', () => {
24+
expect(getRelativeValue('0%')).toBe(0)
25+
expect(getRelativeValue('100%')).toBe(1)
26+
expect(getRelativeValue('150%')).toBe(1.5)
27+
expect(getRelativeValue('20px')).toBe(20)
28+
expect(getRelativeValue('1.5rem')).toBe(1.5)
29+
})
30+
it('returns a floating point number from a unitless value', () => {
31+
expect(getRelativeValue('0')).toBe(0)
32+
expect(getRelativeValue('1')).toBe(1)
33+
expect(getRelativeValue('1.5')).toBe(1.5)
34+
expect(getRelativeValue('150')).toBe(150)
35+
expect(getRelativeValue(0)).toBe(0)
36+
expect(getRelativeValue(1)).toBe(1)
37+
expect(getRelativeValue(1.5)).toBe(1.5)
38+
expect(getRelativeValue(150)).toBe(150)
39+
expect(getRelativeValue('20px')).toBe(20)
40+
expect(getRelativeValue('1.5rem')).toBe(1.5)
41+
})
42+
})
43+
44+
describe('normalizeValue', () => {
45+
it('returns a number from a pixel value', () => {
46+
expect(normalizeValue('0px', 16)).toBe(0)
47+
expect(normalizeValue('20px', 16)).toBe(20)
48+
})
49+
it('returns a number from a rem value', () => {
50+
expect(normalizeValue('0rem', 16)).toBe(0)
51+
expect(normalizeValue('1rem', 16)).toBe(16)
52+
expect(normalizeValue('1.5rem', 16)).toBe(24)
53+
})
54+
it('returns a number from a number value', () => {
55+
expect(normalizeValue(0, 16)).toBe(0)
56+
expect(normalizeValue(20, 16)).toBe(20)
57+
})
58+
})

src/utilities.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
type FontSizeValue = [string, Record<'lineHeight', string>]
1+
type FontSizeValue = string | number | [string | number, Record<'lineHeight', string | number>]
2+
3+
export function isRelativeValue(value: string | number) {
4+
value = String(value)
25

3-
export function isRelativeValue(value: string) {
46
let isPercentValue = value.endsWith('%')
57
let isUnitlessValue = /\d$/.test(value)
68

79
return isPercentValue || isUnitlessValue
810
}
911

10-
export function getRelativeValue(value: string) {
12+
export function getRelativeValue(value: string | number) {
13+
value = String(value)
14+
1115
let isPercentValue = value.endsWith('%')
1216

1317
return isPercentValue
1418
? Number.parseInt(value.replace('%', ''), 10) / 100
1519
: Number.parseFloat(value)
1620
}
1721

18-
export function normalizeValue(value: string | FontSizeValue, root: number, fs?: number): number {
19-
value = Array.isArray(value) ? value[0] : value
22+
export function normalizeValue(value: FontSizeValue, root: number): number {
23+
value = Array.isArray(value) ? String(value[0]) : String(value)
2024

2125
if (value.endsWith('px')) return Number.parseFloat(value.replace('px', ''))
2226
if (value.endsWith('rem')) return root * Number.parseFloat(value.replace('rem', ''))
2327

24-
if (isRelativeValue(value) && fs !== undefined) {
25-
return fs * getRelativeValue(value)
26-
}
27-
2828
return Number.parseInt(value, 10)
2929
}
3030

0 commit comments

Comments
 (0)