mirror of
https://github.com/zhigang1992/react-native-web.git
synced 2026-04-26 05:25:23 +08:00
@@ -31,6 +31,17 @@ var styles = StyleSheet.create({
|
|||||||
borderColor: '#000033',
|
borderColor: '#000033',
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
},
|
},
|
||||||
|
shadowBox: {
|
||||||
|
width: 100,
|
||||||
|
height: 100,
|
||||||
|
borderWidth: 2,
|
||||||
|
},
|
||||||
|
shadow: {
|
||||||
|
shadowOpacity: 0.5,
|
||||||
|
shadowColor: 'red',
|
||||||
|
shadowRadius: 3,
|
||||||
|
shadowOffset: { width: 3, height: 3 },
|
||||||
|
},
|
||||||
zIndex: {
|
zIndex: {
|
||||||
justifyContent: 'space-around',
|
justifyContent: 'space-around',
|
||||||
width: 100,
|
width: 100,
|
||||||
@@ -242,6 +253,19 @@ const examples = [
|
|||||||
return <ZIndexExample />;
|
return <ZIndexExample />;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'Basic shadow',
|
||||||
|
render() {
|
||||||
|
return <View style={[ styles.shadowBox, styles.shadow ]} />;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Shaped shadow',
|
||||||
|
description: 'borderRadius: 50',
|
||||||
|
render() {
|
||||||
|
return <View style={[ styles.shadowBox, styles.shadow, {borderRadius: 50} ]} />;
|
||||||
|
}
|
||||||
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
examples.forEach((example) => {
|
examples.forEach((example) => {
|
||||||
|
|||||||
47
src/apis/StyleSheet/__tests__/processBoxShadow-test.js
Normal file
47
src/apis/StyleSheet/__tests__/processBoxShadow-test.js
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/* eslint-env jasmine, jest */
|
||||||
|
|
||||||
|
import processBoxShadow from '../processBoxShadow';
|
||||||
|
|
||||||
|
describe('apis/StyleSheet/processBoxShadow', () => {
|
||||||
|
test('missing shadowColor', () => {
|
||||||
|
const style = {
|
||||||
|
shadowOffset: { width: 1, height: 2 }
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(processBoxShadow(style)).toEqual({});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('shadowColor only', () => {
|
||||||
|
const style = {
|
||||||
|
shadowColor: 'red'
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(processBoxShadow(style)).toEqual({
|
||||||
|
boxShadow: '0px 0px 0px rgba(255,0,0,1)'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('shadowColor and shadowOpacity only', () => {
|
||||||
|
const style = {
|
||||||
|
shadowColor: 'red',
|
||||||
|
shadowOpacity: 0.5
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(processBoxShadow(style)).toEqual({
|
||||||
|
boxShadow: '0px 0px 0px rgba(255,0,0,0.5)'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('shadowOffset, shadowRadius, shadowSpread', () => {
|
||||||
|
const style = {
|
||||||
|
shadowColor: 'rgba(50,60,70,0.5)',
|
||||||
|
shadowOffset: { width: 1, height: 2 },
|
||||||
|
shadowOpacity: 0.5,
|
||||||
|
shadowRadius: 3
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(processBoxShadow(style)).toEqual({
|
||||||
|
boxShadow: '2px 1px 3px rgba(50,60,70,0.25)'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
import expandStyle from './expandStyle';
|
import expandStyle from './expandStyle';
|
||||||
import flattenStyle from '../../modules/flattenStyle';
|
import flattenStyle from '../../modules/flattenStyle';
|
||||||
import i18nStyle from './i18nStyle';
|
import i18nStyle from './i18nStyle';
|
||||||
|
import processBoxShadow from './processBoxShadow';
|
||||||
import processTextShadow from './processTextShadow';
|
import processTextShadow from './processTextShadow';
|
||||||
import processTransform from './processTransform';
|
import processTransform from './processTransform';
|
||||||
import processVendorPrefixes from './processVendorPrefixes';
|
import processVendorPrefixes from './processVendorPrefixes';
|
||||||
|
|
||||||
const processors = [
|
const processors = [
|
||||||
|
processBoxShadow,
|
||||||
processTextShadow,
|
processTextShadow,
|
||||||
processTransform,
|
processTransform,
|
||||||
processVendorPrefixes
|
processVendorPrefixes
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ const unitlessNumbers = {
|
|||||||
scale: true,
|
scale: true,
|
||||||
scaleX: true,
|
scaleX: true,
|
||||||
scaleY: true,
|
scaleY: true,
|
||||||
scaleZ: true
|
scaleZ: true,
|
||||||
|
// RN properties
|
||||||
|
shadowOpacity: true
|
||||||
};
|
};
|
||||||
|
|
||||||
const normalizeValue = (property, value) => {
|
const normalizeValue = (property, value) => {
|
||||||
|
|||||||
33
src/apis/StyleSheet/processBoxShadow.js
Normal file
33
src/apis/StyleSheet/processBoxShadow.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import normalizeColor from '../../modules/normalizeColor';
|
||||||
|
import normalizeValue from './normalizeValue';
|
||||||
|
|
||||||
|
const applyOpacity = (color, opacity) => {
|
||||||
|
const normalizedColor = normalizeColor(color);
|
||||||
|
const colorNumber = normalizedColor === null ? 0x00000000 : normalizedColor;
|
||||||
|
const r = (colorNumber & 0xff000000) >>> 24;
|
||||||
|
const g = (colorNumber & 0x00ff0000) >>> 16;
|
||||||
|
const b = (colorNumber & 0x0000ff00) >>> 8;
|
||||||
|
const a = (((colorNumber & 0x000000ff) >>> 0) / 255).toFixed(2);
|
||||||
|
return `rgba(${r},${g},${b},${a * opacity})`;
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: add inset and spread support
|
||||||
|
const processBoxShadow = (style) => {
|
||||||
|
if (style && style.shadowColor) {
|
||||||
|
const { height, width } = style.shadowOffset || {};
|
||||||
|
const opacity = style.shadowOpacity != null ? style.shadowOpacity : 1;
|
||||||
|
const color = applyOpacity(style.shadowColor, opacity);
|
||||||
|
const blurRadius = normalizeValue(null, style.shadowRadius || 0);
|
||||||
|
const offsetX = normalizeValue(null, height || 0);
|
||||||
|
const offsetY = normalizeValue(null, width || 0);
|
||||||
|
const boxShadow = `${offsetX} ${offsetY} ${blurRadius} ${color}`;
|
||||||
|
style.boxShadow = style.boxShadow ? `${style.boxShadow}, ${boxShadow}` : boxShadow;
|
||||||
|
}
|
||||||
|
delete style.shadowColor;
|
||||||
|
delete style.shadowOffset;
|
||||||
|
delete style.shadowOpacity;
|
||||||
|
delete style.shadowRadius;
|
||||||
|
return style;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = processBoxShadow;
|
||||||
@@ -2,6 +2,7 @@ import BorderPropTypes from '../../propTypes/BorderPropTypes';
|
|||||||
import ColorPropType from '../../propTypes/ColorPropType';
|
import ColorPropType from '../../propTypes/ColorPropType';
|
||||||
import LayoutPropTypes from '../../propTypes/LayoutPropTypes';
|
import LayoutPropTypes from '../../propTypes/LayoutPropTypes';
|
||||||
import { PropTypes } from 'react';
|
import { PropTypes } from 'react';
|
||||||
|
import ShadowPropTypes from '../../propTypes/ShadowPropTypes';
|
||||||
import TransformPropTypes from '../../propTypes/TransformPropTypes';
|
import TransformPropTypes from '../../propTypes/TransformPropTypes';
|
||||||
|
|
||||||
const { number, oneOf, string } = PropTypes;
|
const { number, oneOf, string } = PropTypes;
|
||||||
@@ -11,6 +12,7 @@ const hiddenOrVisible = oneOf([ 'hidden', 'visible' ]);
|
|||||||
module.exports = process.env.NODE_ENV !== 'production' ? {
|
module.exports = process.env.NODE_ENV !== 'production' ? {
|
||||||
...BorderPropTypes,
|
...BorderPropTypes,
|
||||||
...LayoutPropTypes,
|
...LayoutPropTypes,
|
||||||
|
...ShadowPropTypes,
|
||||||
...TransformPropTypes,
|
...TransformPropTypes,
|
||||||
backfaceVisibility: hiddenOrVisible,
|
backfaceVisibility: hiddenOrVisible,
|
||||||
backgroundColor: ColorPropType,
|
backgroundColor: ColorPropType,
|
||||||
|
|||||||
18
src/propTypes/ShadowPropTypes.js
Normal file
18
src/propTypes/ShadowPropTypes.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import ColorPropType from './ColorPropType';
|
||||||
|
import { PropTypes } from 'react';
|
||||||
|
|
||||||
|
const { number, oneOfType, shape, string } = PropTypes;
|
||||||
|
const numberOrString = oneOfType([ number, string ]);
|
||||||
|
|
||||||
|
const ShadowPropTypes = {
|
||||||
|
shadowColor: ColorPropType,
|
||||||
|
shadowOffset: shape({
|
||||||
|
width: numberOrString,
|
||||||
|
height: numberOrString
|
||||||
|
}),
|
||||||
|
shadowOpacity: number,
|
||||||
|
shadowRadius: numberOrString,
|
||||||
|
shadowSpread: numberOrString
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = ShadowPropTypes;
|
||||||
Reference in New Issue
Block a user