react-native-unistyles
Version:
Level up your React Native StyleSheet
61 lines (52 loc) • 2.12 kB
text/typescript
import type { UnistylesBreakpoints } from './global'
import { UnistylesRuntime } from './specs'
import type { Nullable } from './types'
type MQValue = keyof UnistylesBreakpoints | number
type MQHandler = {
only: {
width(wMin?: Nullable<MQValue>, wMax?: MQValue): symbol,
height(hMin?: Nullable<MQValue>, hMax?: MQValue): symbol,
},
width(wMin?: Nullable<MQValue>, wMax?: MQValue): {
and: {
height(hMin?: Nullable<MQValue>, hMax?: MQValue): symbol
}
},
height(hMin?: Nullable<MQValue>, hMax?: MQValue): {
and: {
width(wMin?: Nullable<MQValue>, wMax?: MQValue): symbol
}
}
}
const getMQValue = (value: Nullable<MQValue>) => {
if (typeof value === 'number') {
return value
}
if (value === null) {
return 0
}
const breakpoints = UnistylesRuntime.breakpoints
return breakpoints[value] ?? 0
}
/**
* Utility to create cross-platform media queries
* @returns - JavaScript symbol to be used in your stylesheet
*/
export const mq: MQHandler = {
only: {
width: (wMin: Nullable<MQValue> = 0, wMax: MQValue = Number.POSITIVE_INFINITY) => (`:w[${getMQValue(wMin)}, ${getMQValue(wMax)}]` as unknown as symbol),
height: (hMin: Nullable<MQValue> = 0, hMax: MQValue = Number.POSITIVE_INFINITY) => (`:h[${getMQValue(hMin)}, ${getMQValue(hMax)}]` as unknown as symbol)
},
width: (wMin: Nullable<MQValue> = 0, wMax: MQValue = Number.POSITIVE_INFINITY) => ({
and: {
height: (hMin: Nullable<MQValue> = 0, hMax: MQValue = Number.POSITIVE_INFINITY) =>
(`:w[${getMQValue(wMin)}, ${getMQValue(wMax)}]:h[${getMQValue(hMin)}, ${getMQValue(hMax)}]` as unknown as symbol)
}
}),
height: (hMin: Nullable<MQValue> = 0, hMax: MQValue = Number.POSITIVE_INFINITY) => ({
and: {
width: (wMin: Nullable<MQValue> = 0, wMax: MQValue = Number.POSITIVE_INFINITY) =>
(`:w[${getMQValue(wMin)}, ${getMQValue(wMax)}]:h[${getMQValue(hMin)}, ${getMQValue(hMax)}]` as unknown as symbol)
}
})
}