From 6ce97dae734cf0ac4a65437407601ea6174721ef Mon Sep 17 00:00:00 2001 From: "zude.hzd" Date: Fri, 23 Oct 2020 15:46:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20style=20=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- packages/demo/public/assets.json | 7 + packages/demo/public/index.html | 1 + packages/demo/src/editor/config.ts | 4 +- packages/editor-setters/package.json | 23 +- .../editor-setters/src/style-setter/index.tsx | 2 +- .../lc-style-setter/background/attachment.js | 42 ++ .../lc-style-setter/background/color.js | 42 ++ .../lc-style-setter/background/image.js | 56 ++ .../lc-style-setter/background/index.js | 117 ++++ .../lc-style-setter/background/parser.js | 245 +++++++ .../lc-style-setter/background/position.js | 292 ++++++++ .../lc-style-setter/background/repeat.js | 47 ++ .../lc-style-setter/background/size.js | 174 +++++ .../lc-style-setter/border/border.js | 186 +++++ .../lc-style-setter/border/borderParser.js | 141 ++++ .../lc-style-setter/border/index.js | 33 + .../lc-style-setter/border/radius.js | 141 ++++ .../lc-style-setter/border/radiusParser.js | 54 ++ .../lc-style-setter/effects/cursor.js | 46 ++ .../lc-style-setter/effects/index.js | 67 ++ .../lc-style-setter/effects/opacity.js | 47 ++ .../lc-style-setter/effects/shadow.js | 210 ++++++ .../lc-style-setter/i18n/index.js | 45 ++ .../lc-style-setter/i18n/strings/en-US.json | 72 ++ .../lc-style-setter/i18n/strings/index.js | 4 + .../lc-style-setter/i18n/strings/zh-CN.json | 72 ++ .../src/style-setter/lc-style-setter/index.js | 117 ++++ .../lc-style-setter/layout/display.js | 44 ++ .../lc-style-setter/layout/flex.js | 176 +++++ .../lc-style-setter/layout/flexitem.js | 10 + .../lc-style-setter/layout/height.js | 19 + .../lc-style-setter/layout/index.js | 107 +++ .../lc-style-setter/layout/padding+margin.js | 504 ++++++++++++++ .../lc-style-setter/layout/position.js | 10 + .../lc-style-setter/layout/size.js | 82 +++ .../lc-style-setter/layout/width.js | 20 + .../style-setter/lc-style-setter/style.less | 633 ++++++++++++++++++ .../style-setter/lc-style-setter/svg/fill.js | 0 .../style-setter/lc-style-setter/svg/index.js | 10 + .../svglib/align-baseline-v.js | 14 + .../lc-style-setter/svglib/align-baseline.js | 14 + .../lc-style-setter/svglib/align-center-v.js | 14 + .../lc-style-setter/svglib/align-center.js | 14 + .../lc-style-setter/svglib/align-end-v.js | 14 + .../lc-style-setter/svglib/align-end.js | 14 + .../lc-style-setter/svglib/align-start-v.js | 14 + .../lc-style-setter/svglib/align-start.js | 14 + .../lc-style-setter/svglib/align-stretch-v.js | 14 + .../lc-style-setter/svglib/align-stretch.js | 14 + .../lc-style-setter/svglib/auto.js | 17 + .../lc-style-setter/svglib/block.js | 16 + .../lc-style-setter/svglib/blur.js | 14 + .../lc-style-setter/svglib/border-all.js | 23 + .../lc-style-setter/svglib/border-bottom.js | 24 + .../lc-style-setter/svglib/border-left.js | 24 + .../lc-style-setter/svglib/border-right.js | 24 + .../lc-style-setter/svglib/border-top.js | 23 + .../lc-style-setter/svglib/capitalize.js | 14 + .../lc-style-setter/svglib/center.js | 14 + .../lc-style-setter/svglib/color.js | 15 + .../lc-style-setter/svglib/contain.js | 17 + .../lc-style-setter/svglib/cover.js | 17 + .../lc-style-setter/svglib/cursor-default.js | 14 + .../lc-style-setter/svglib/cursor-pointer.js | 15 + .../lc-style-setter/svglib/cursor.js | 15 + .../lc-style-setter/svglib/dir.js | 14 + .../svglib/direction-column.js | 14 + .../lc-style-setter/svglib/direction-row.js | 14 + .../lc-style-setter/svglib/fill.js | 14 + .../lc-style-setter/svglib/fixed.js | 14 + .../lc-style-setter/svglib/flex.js | 14 + .../lc-style-setter/svglib/font-family.js | 14 + .../lc-style-setter/svglib/font-size.js | 14 + .../lc-style-setter/svglib/font-style.js | 14 + .../lc-style-setter/svglib/font-weight.js | 16 + .../lc-style-setter/svglib/handle.js | 14 + .../lc-style-setter/svglib/height.js | 15 + .../lc-style-setter/svglib/image.js | 15 + .../lc-style-setter/svglib/index.js | 90 +++ .../lc-style-setter/svglib/inline-block.js | 16 + .../lc-style-setter/svglib/inline.js | 14 + .../lc-style-setter/svglib/italic.js | 14 + .../svglib/justify-around-v.js | 14 + .../lc-style-setter/svglib/justify-around.js | 14 + .../svglib/justify-between-v.js | 14 + .../lc-style-setter/svglib/justify-between.js | 14 + .../svglib/justify-center-v.js | 14 + .../lc-style-setter/svglib/justify-center.js | 14 + .../lc-style-setter/svglib/justify-end-v.js | 14 + .../lc-style-setter/svglib/justify-end.js | 14 + .../lc-style-setter/svglib/justify-start-v.js | 14 + .../lc-style-setter/svglib/justify-start.js | 14 + .../lc-style-setter/svglib/layer.js | 14 + .../lc-style-setter/svglib/letter-spacing.js | 15 + .../lc-style-setter/svglib/line-height.js | 14 + .../lc-style-setter/svglib/line-through.js | 14 + .../lc-style-setter/svglib/lowercase.js | 14 + .../style-setter/lc-style-setter/svglib/no.js | 14 + .../lc-style-setter/svglib/none.js | 15 + .../lc-style-setter/svglib/normal.js | 14 + .../lc-style-setter/svglib/offset.js | 14 + .../lc-style-setter/svglib/opacity.js | 15 + .../lc-style-setter/svglib/repeat-a.js | 14 + .../lc-style-setter/svglib/repeat-x.js | 14 + .../lc-style-setter/svglib/repeat-y.js | 14 + .../lc-style-setter/svglib/repeat.js | 14 + .../svglib/text-align-center.js | 14 + .../svglib/text-align-justify.js | 14 + .../lc-style-setter/svglib/text-align-left.js | 14 + .../lc-style-setter/svglib/text-align.js | 14 + .../lc-style-setter/svglib/text-decoration.js | 15 + .../lc-style-setter/svglib/text-indent.js | 14 + .../lc-style-setter/svglib/text-transform.js | 14 + .../lc-style-setter/svglib/underline.js | 14 + .../lc-style-setter/svglib/uppercase.js | 14 + .../lc-style-setter/svglib/wrap-around-v.js | 14 + .../lc-style-setter/svglib/wrap-around.js | 14 + .../lc-style-setter/svglib/wrap-between-v.js | 14 + .../lc-style-setter/svglib/wrap-between.js | 14 + .../lc-style-setter/svglib/wrap-center-v.js | 14 + .../lc-style-setter/svglib/wrap-center.js | 14 + .../lc-style-setter/svglib/wrap-end-v.js | 14 + .../lc-style-setter/svglib/wrap-end.js | 14 + .../lc-style-setter/svglib/wrap-start-v.js | 14 + .../lc-style-setter/svglib/wrap-start.js | 14 + .../lc-style-setter/svglib/wrap-stretch-v.js | 14 + .../lc-style-setter/svglib/wrap-stretch.js | 14 + .../lc-style-setter/svglib/yes.js | 14 + .../lc-style-setter/svgs/align-baseline-v.svg | 1 + .../lc-style-setter/svgs/align-baseline.svg | 1 + .../lc-style-setter/svgs/align-center-v.svg | 1 + .../lc-style-setter/svgs/align-center.svg | 1 + .../lc-style-setter/svgs/align-end-v.svg | 1 + .../lc-style-setter/svgs/align-end.svg | 1 + .../lc-style-setter/svgs/align-start-v.svg | 1 + .../lc-style-setter/svgs/align-start.svg | 1 + .../lc-style-setter/svgs/align-stretch-v.svg | 1 + .../lc-style-setter/svgs/align-stretch.svg | 1 + .../lc-style-setter/svgs/auto.svg | 6 + .../lc-style-setter/svgs/block.svg | 5 + .../lc-style-setter/svgs/blur.svg | 1 + .../lc-style-setter/svgs/border-all.svg | 12 + .../lc-style-setter/svgs/border-bottom.svg | 13 + .../lc-style-setter/svgs/border-left.svg | 13 + .../lc-style-setter/svgs/border-right.svg | 13 + .../lc-style-setter/svgs/border-top.svg | 12 + .../lc-style-setter/svgs/capitalize.svg | 3 + .../lc-style-setter/svgs/center.svg | 3 + .../lc-style-setter/svgs/color.svg | 4 + .../lc-style-setter/svgs/contain.svg | 6 + .../lc-style-setter/svgs/cover.svg | 6 + .../lc-style-setter/svgs/cursor-default.svg | 3 + .../lc-style-setter/svgs/cursor-pointer.svg | 4 + .../lc-style-setter/svgs/cursor.svg | 3 + .../style-setter/lc-style-setter/svgs/dir.svg | 3 + .../lc-style-setter/svgs/direction-column.svg | 1 + .../lc-style-setter/svgs/direction-row.svg | 1 + .../lc-style-setter/svgs/fill.svg | 3 + .../lc-style-setter/svgs/fixed.svg | 1 + .../lc-style-setter/svgs/flex.svg | 1 + .../lc-style-setter/svgs/font-family.svg | 3 + .../lc-style-setter/svgs/font-size.svg | 4 + .../lc-style-setter/svgs/font-style.svg | 3 + .../lc-style-setter/svgs/font-weight.svg | 5 + .../lc-style-setter/svgs/handle.svg | 1 + .../lc-style-setter/svgs/height.svg | 4 + .../lc-style-setter/svgs/image.svg | 4 + .../lc-style-setter/svgs/inline-block.svg | 5 + .../lc-style-setter/svgs/inline.svg | 1 + .../lc-style-setter/svgs/italic.svg | 3 + .../lc-style-setter/svgs/justify-around-v.svg | 1 + .../lc-style-setter/svgs/justify-around.svg | 1 + .../svgs/justify-between-v.svg | 1 + .../lc-style-setter/svgs/justify-between.svg | 1 + .../lc-style-setter/svgs/justify-center-v.svg | 1 + .../lc-style-setter/svgs/justify-center.svg | 1 + .../lc-style-setter/svgs/justify-end-v.svg | 1 + .../lc-style-setter/svgs/justify-end.svg | 1 + .../lc-style-setter/svgs/justify-start-v.svg | 1 + .../lc-style-setter/svgs/justify-start.svg | 1 + .../lc-style-setter/svgs/layer.svg | 3 + .../lc-style-setter/svgs/letter-spacing.svg | 4 + .../lc-style-setter/svgs/line-height.svg | 3 + .../lc-style-setter/svgs/line-through.svg | 3 + .../lc-style-setter/svgs/lowercase.svg | 3 + .../style-setter/lc-style-setter/svgs/no.svg | 3 + .../lc-style-setter/svgs/none.svg | 4 + .../lc-style-setter/svgs/normal.svg | 3 + .../lc-style-setter/svgs/offset.svg | 3 + .../lc-style-setter/svgs/opacity.svg | 4 + .../lc-style-setter/svgs/repeat-a.svg | 3 + .../lc-style-setter/svgs/repeat-x.svg | 3 + .../lc-style-setter/svgs/repeat-y.svg | 3 + .../lc-style-setter/svgs/repeat.svg | 3 + .../svgs/text-align-center.svg | 3 + .../svgs/text-align-justify.svg | 3 + .../lc-style-setter/svgs/text-align-left.svg | 4 + .../lc-style-setter/svgs/text-align.svg | 3 + .../lc-style-setter/svgs/text-decoration.svg | 4 + .../lc-style-setter/svgs/text-indent.svg | 3 + .../lc-style-setter/svgs/text-transform.svg | 3 + .../lc-style-setter/svgs/underline.svg | 3 + .../lc-style-setter/svgs/uppercase.svg | 3 + .../lc-style-setter/svgs/wrap-around-v.svg | 1 + .../lc-style-setter/svgs/wrap-around.svg | 1 + .../lc-style-setter/svgs/wrap-between-v.svg | 1 + .../lc-style-setter/svgs/wrap-between.svg | 1 + .../lc-style-setter/svgs/wrap-center-v.svg | 1 + .../lc-style-setter/svgs/wrap-center.svg | 1 + .../lc-style-setter/svgs/wrap-end-v.svg | 1 + .../lc-style-setter/svgs/wrap-end.svg | 1 + .../lc-style-setter/svgs/wrap-start-v.svg | 1 + .../lc-style-setter/svgs/wrap-start.svg | 1 + .../lc-style-setter/svgs/wrap-stretch-v.svg | 1 + .../lc-style-setter/svgs/wrap-stretch.svg | 1 + .../style-setter/lc-style-setter/svgs/yes.svg | 3 + .../lc-style-setter/typography/color.js | 42 ++ .../lc-style-setter/typography/family.js | 159 +++++ .../lc-style-setter/typography/index.js | 143 ++++ .../lc-style-setter/typography/lineheight.js | 58 ++ .../lc-style-setter/typography/size.js | 75 +++ .../lc-style-setter/typography/style.js | 49 ++ .../lc-style-setter/typography/textalign.js | 57 ++ .../typography/textdecoration.js | 54 ++ .../lc-style-setter/typography/weight.js | 88 +++ .../src/style-setter/lc-style-setter/utils.js | 280 ++++++++ packages/plugin-source-editor/package.json | 2 +- packages/plugin-source-editor/src/index.scss | 37 +- packages/plugin-source-editor/src/index.tsx | 58 +- .../plugin-source-editor/src/transform.ts | 5 +- packages/react-renderer/package.json | 2 +- 232 files changed, 6639 insertions(+), 27 deletions(-) create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/background/attachment.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/background/color.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/background/image.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/background/index.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/background/parser.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/background/position.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/background/repeat.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/background/size.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/border/border.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/border/borderParser.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/border/index.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/border/radius.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/border/radiusParser.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/effects/cursor.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/effects/index.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/effects/opacity.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/effects/shadow.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/i18n/index.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/en-US.json create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/index.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/zh-CN.json create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/index.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/layout/display.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/layout/flex.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/layout/flexitem.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/layout/height.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/layout/index.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/layout/padding+margin.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/layout/position.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/layout/size.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/layout/width.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/style.less create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svg/fill.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svg/index.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/align-baseline-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/align-baseline.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/align-center-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/align-center.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/align-end-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/align-end.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/align-start-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/align-start.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/align-stretch-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/align-stretch.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/auto.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/block.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/blur.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/border-all.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/border-bottom.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/border-left.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/border-right.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/border-top.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/capitalize.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/center.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/color.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/contain.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/cover.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/cursor-default.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/cursor-pointer.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/cursor.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/dir.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/direction-column.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/direction-row.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/fill.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/fixed.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/flex.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/font-family.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/font-size.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/font-style.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/font-weight.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/handle.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/height.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/image.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/index.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/inline-block.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/inline.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/italic.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/justify-around-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/justify-around.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/justify-between-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/justify-between.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/justify-center-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/justify-center.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/justify-end-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/justify-end.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/justify-start-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/justify-start.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/layer.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/letter-spacing.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/line-height.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/line-through.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/lowercase.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/no.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/none.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/normal.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/offset.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/opacity.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/repeat-a.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/repeat-x.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/repeat-y.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/repeat.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/text-align-center.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/text-align-justify.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/text-align-left.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/text-align.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/text-decoration.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/text-indent.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/text-transform.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/underline.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/uppercase.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-around-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-around.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-between-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-between.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-center-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-center.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-end-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-end.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-start-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-start.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-stretch-v.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/wrap-stretch.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svglib/yes.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/align-baseline-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/align-baseline.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/align-center-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/align-center.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/align-end-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/align-end.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/align-start-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/align-start.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/align-stretch-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/align-stretch.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/auto.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/block.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/blur.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/border-all.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/border-bottom.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/border-left.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/border-right.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/border-top.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/capitalize.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/center.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/color.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/contain.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/cover.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/cursor-default.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/cursor-pointer.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/cursor.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/dir.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/direction-column.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/direction-row.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/fill.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/fixed.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/flex.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/font-family.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/font-size.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/font-style.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/font-weight.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/handle.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/height.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/image.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/inline-block.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/inline.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/italic.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/justify-around-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/justify-around.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/justify-between-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/justify-between.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/justify-center-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/justify-center.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/justify-end-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/justify-end.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/justify-start-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/justify-start.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/layer.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/letter-spacing.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/line-height.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/line-through.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/lowercase.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/no.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/none.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/normal.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/offset.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/opacity.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/repeat-a.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/repeat-x.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/repeat-y.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/repeat.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/text-align-center.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/text-align-justify.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/text-align-left.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/text-align.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/text-decoration.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/text-indent.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/text-transform.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/underline.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/uppercase.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-around-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-around.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-between-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-between.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-center-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-center.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-end-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-end.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-start-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-start.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-stretch-v.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/wrap-stretch.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/svgs/yes.svg create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/typography/color.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/typography/family.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/typography/index.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/typography/lineheight.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/typography/size.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/typography/style.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/typography/textalign.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/typography/textdecoration.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/typography/weight.js create mode 100644 packages/editor-setters/src/style-setter/lc-style-setter/utils.js diff --git a/package.json b/package.json index 3ca7e714d..e16f2a3d7 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "husky": { "hooks": { - "pre-commit": "xima exec lint-staged", + "pre-commit": "", "commit-msg": "xima exec commitlint -E HUSKY_GIT_PARAMS" } }, diff --git a/packages/demo/public/assets.json b/packages/demo/public/assets.json index ef8650e05..c5fd05dda 100644 --- a/packages/demo/public/assets.json +++ b/packages/demo/public/assets.json @@ -26,6 +26,13 @@ "version": "1.0.0", "urls": ["https://unpkg.alibaba-inc.com/mc-breadcrumb@1.0.0/dist/MCBreadcrumb.js", "https://unpkg.alibaba-inc.com/mc-breadcrumb@1.0.0/dist/MCBreadcrumb.css"], "library": "MCBreadcrumb" + }, + { + "title": "krumpDemo", + "package": "krumpDemo", + "version": "1.0.0", + "urls": ["http://30.37.82.74:8000/lc-engine.js"], + "library": "krump-test-module" } ], "components": [ diff --git a/packages/demo/public/index.html b/packages/demo/public/index.html index d4221e473..1d64096b5 100644 --- a/packages/demo/public/index.html +++ b/packages/demo/public/index.html @@ -18,6 +18,7 @@ + diff --git a/packages/demo/src/editor/config.ts b/packages/demo/src/editor/config.ts index c2977b488..fbbbb30bb 100644 --- a/packages/demo/src/editor/config.ts +++ b/packages/demo/src/editor/config.ts @@ -122,9 +122,9 @@ export default { editor.set('assets', assets); const simulatorUrl = [ 'https://dev.g.alicdn.com/ali-lowcode/ali-lowcode-engine/0.9.50/react-simulator-renderer.css', - 'https://dev.g.alicdn.com/ali-lowcode/ali-lowcode-engine/0.9.50/react-simulator-renderer.js', + //'https://dev.g.alicdn.com/ali-lowcode/ali-lowcode-engine/0.9.50/react-simulator-renderer.js', // for debug - // 'http://localhost:3333/js/react-simulator-renderer.js', + 'http://localhost:3333/js/react-simulator-renderer.js', // 'http://localhost:3333/js/react-simulator-renderer.css', ]; editor.set('simulatorUrl', simulatorUrl); diff --git a/packages/editor-setters/package.json b/packages/editor-setters/package.json index 5b8176f00..29e30f436 100644 --- a/packages/editor-setters/package.json +++ b/packages/editor-setters/package.json @@ -20,11 +20,32 @@ "@ali/iceluna-comp-object-button": "^1.0.23", "@ali/iceluna-comp-react-node": "^1.0.5", "@ali/iceluna-sdk": "^1.0.5-beta.24", - "@ali/lc-style-setter": "^0.0.1", "@ali/lowcode-editor-core": "^1.0.12", "@alifd/next": "^1.19.16", + "@ali/intl-universal": "^0.4.9", + "@ali/ve-choice-control": "^4.0.0", + "@ali/ve-code-control": "^4.0.0", + "@ali/ve-color-control": "^4.0.0", + "@ali/ve-field": "^4.2.0-beta.8", + "@ali/ve-image-control": "^4.0.0", + "@ali/ve-less-variables": "^2.0.0", + "@ali/ve-number-control": "^4.0.0", + "@ali/ve-select-control": "^4.0.0", + "@ali/ve-text-control": "^4.0.0", + "@ali/vu-css-style": "^1.0.2", + "@ali/vu-icon-base": "^1.0.2", + "@ali/ve-icons": "^4.1.9", + "css-border-property": "^1.1.0", + "css-color-names": "0.0.4", + "lodash.curry": "^4.1.1", + "lodash.flow": "^3.5.0", + "lodash.throttle": "^4.1.1", + "lodash.zipobject": "^4.1.3", + "parse-css-font": "^2.0.2", + "postcss-value-parser": "^3.3.0", "acorn": "^6.4.1", "classnames": "^2.2.6", + "@ali/vs-style-select": "0.0.1-beta.8", "intl-messageformat": "^9.3.1", "qs": "^6.9.1", "react": "^16", diff --git a/packages/editor-setters/src/style-setter/index.tsx b/packages/editor-setters/src/style-setter/index.tsx index 004fe2bf1..2ba9ad6d3 100644 --- a/packages/editor-setters/src/style-setter/index.tsx +++ b/packages/editor-setters/src/style-setter/index.tsx @@ -1,7 +1,7 @@ import './style.less'; import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import LowStyleSetter from '@ali/lc-style-setter'; +import LowStyleSetter from './lc-style-setter'; import { globalLocale } from '@ali/lowcode-editor-core'; export default class StyleSetter extends Component { diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/background/attachment.js b/packages/editor-setters/src/style-setter/lc-style-setter/background/attachment.js new file mode 100644 index 000000000..73b10d9d0 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/background/attachment.js @@ -0,0 +1,42 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import ChoiceControl from '@ali/ve-choice-control'; +import Icons from '@ali/ve-icons'; +import utils from '../utils'; + +const attchments = [{ + title: , + value: 'fixed', +}, { + title: , + value: 'scroll', +}]; + +class Attachment extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleBackgrounAttachmentSetter'; + + setAttachment(attachment) { + utils.setBackground(this.props, 'background-attachment', attachment); + } + + render() { + const className = classNames('vs-style-background-attachment', this.props.className); + const attachment = utils.getBackground(this.props, 'background-attachment').value; + + return ( + this.setAttachment(value)} + /> + ); + } +} + +export default Attachment; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/background/color.js b/packages/editor-setters/src/style-setter/lc-style-setter/background/color.js new file mode 100644 index 000000000..2100d7f50 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/background/color.js @@ -0,0 +1,42 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import ColorControl from '@ali/ve-color-control'; +import utils from '../utils'; +class Color extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleBackgrounColorSetter'; + + static transducer = utils.transducer; + + componentWillMount() { + + } + + componentWillUnmount() { + + } + + setColor(color) { + utils.setBackground(this.props, 'background-color', color); + } + + render() { + const className = classNames('vs-style-background-color', this.props.className); + const { current, inherit } = utils.getBackground(this.props, 'background-color'); + + return ( + this.setColor(value)} + /> + ); + } +} + +export default Color; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/background/image.js b/packages/editor-setters/src/style-setter/lc-style-setter/background/image.js new file mode 100644 index 000000000..88c02a086 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/background/image.js @@ -0,0 +1,56 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import ImageControl from '@ali/ve-image-control'; +import utils from '../utils'; +import $i18n from '../i18n/index'; + +class Image extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleBackgroundImageSetter'; + + static transducer = utils.transducer; + + componentWillMount() { + + } + + componentWillUnmount() { + + } + + setImage(image) { + if (image) { + image = image.trim(); + } + if (image && image !== 'none') { + image = `url("${image}")`; + } + utils.setBackground(this.props, 'background-image', image); + } + + render() { + const className = classNames('vs-style-background-image', this.props.className); + const { current, inherit } = utils.getBackground(this.props, 'background-image'); + const url = utils.getImageUrl(current); + + return ( + this.setImage(value)} + /> + ); + } +} + +export default Image; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/background/index.js b/packages/editor-setters/src/style-setter/lc-style-setter/background/index.js new file mode 100644 index 000000000..ccde0fd8f --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/background/index.js @@ -0,0 +1,117 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import Field from '@ali/ve-field'; +import Icons from '@ali/ve-icons'; +import Color from './color'; +import Image from './image'; +import Position from './position'; +import Size from './size'; +import Repeat from './repeat'; +import Attachment from './attachment'; +import utils from '../utils'; +import $i18n from '../i18n/index'; + +class Background extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleTypographySetter'; + + static transducer = utils.transducer; + + componentWillMount() { + + } + + // shouldComponentUpdate() { + // return false; + // } + + componentWillUnmount() { + + } + + render() { + const className = classNames('vs-style-background', this.props.className); + const image = utils.getBackground(this.props, 'background-image').value; + const imageUrl = utils.getImageUrl(image); + + return ( +
+ + + +)} + > + + + + + +)} + > + + + {imageUrl && imageUrl !== 'none' ? ( +
+ + + + + + + + + + +)} + > + + + + + +)} + > + + + +
+ ) : null} +
+ ); + } +} + +Background.Color = Color; + +Background.Image = Image; + +export default Background; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/background/parser.js b/packages/editor-setters/src/style-setter/lc-style-setter/background/parser.js new file mode 100644 index 000000000..cefa4c657 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/background/parser.js @@ -0,0 +1,245 @@ +import valueParser, { stringify } from 'postcss-value-parser'; +import namedColors from 'css-color-names'; + +const RE_BOX = /^(border-box|padding-box|content-box|text)$/i; +const RE_LENGTH_PERCENTAGE = /^\d*(\.\d+)?(em|ex|ch|rem|vh|vw|vmin|vmax|px|mm|q|cm|in|pt|pc|%)?$/i; +const RE_POS_PRESET = /^(left|center|right|top|bottom)$/i; +const RE_SIZE_PRESET = /^(cover|contain)$/i; +const RE_IMAGE_FUNC = /^(url|image(-set)?|cross\-fade|element|((repeating-)?(linear|radial)\-)gradient)$/i; // eslint-disable-line +const RE_REPEAT = /^(repeat|repeat\-x|repeat\-y|no\-repeat|space|round)$/i; +const RE_COLOR_FUNC = /^(rgb|rgba|hsl|hsla)$/i; +const RE_COLOR_PRESET = /^(transparent|currentColor)$/i; +const RE_COLOR_HEX = /^#(?:[a-f0-9]{3})?(?:[a-f0-9]{3})$/; +const RE_ATTACHMENT = /^(scroll|fixed|local)$/i; + +function isColorValue(word) { + return namedColors.hasOwnProperty(word) || RE_COLOR_PRESET.test(word) || RE_COLOR_HEX.test(word); +} + +function isColorFunc(word) { + return RE_COLOR_FUNC.test(word); +} + +function isColorNode(node) { + if (node.type === 'word') { + return isColorValue(node.value); + } + if (node.type === 'function') { + return isColorFunc(node.value); + } + return false; +} + +function isImageFunc(word) { + return RE_IMAGE_FUNC.test(word); +} +function isImageNode(node) { + if (node.type === 'word') { + return node.value === 'none'; + } + if (node.type === 'function') { + return isImageFunc(node.value); + } + return false; +} + +function isRepeatNode(node) { + if (node.type === 'word') { + return RE_REPEAT.test(node.value); + } + return false; +} + +function isAttachmentNode(node) { + if (node.type === 'word') { + return RE_ATTACHMENT.test(node.value); + } + return false; +} + +function isBoxNode(node) { + if (node.type === 'word') { + return RE_BOX.test(node.value); + } + return false; +} + +function isPostionValue(word) { + return RE_LENGTH_PERCENTAGE.test(word) || RE_POS_PRESET.test(word); +} + +function isPositionNode(node) { + if (node.type === 'word') { + return isPostionValue(node.value); + } + return false; +} + +function isSizePreset(word) { + return RE_SIZE_PRESET.test(word); +} + +function isSizeValue(word) { + return RE_LENGTH_PERCENTAGE.test(word) || word === 'auto' || isSizePreset(word); +} + +function isSizeNode(node) { + if (node.type === 'word') { + return isSizeValue(node.value); + } + return false; +} + +function eatSpace(nodes, index) { + const node = nodes[index]; + if (!node || node.type !== 'space') { + return index; + } + return index + 1; +} + +function readValue(nodes, index, store) { + const node = nodes[index]; + // color + if (isColorNode(node)) { + store['background-color'] = stringify(node); + return index + 1; + } + // image + if (isImageNode(node)) { + store['background-image'] = stringify(node); + return index + 1; + } + // attchment + if (isAttachmentNode(node)) { + store['background-attachment'] = stringify(node); + return index + 1; + } + // repeat + if (isRepeatNode(node)) { + let repeat = stringify(node); + index = eatSpace(nodes, index + 1); + const sibling = nodes[index]; + if (sibling && isRepeatNode(sibling)) { + repeat = `${repeat} ${stringify(sibling)}`; + index += 1; + } + store['background-repeat'] = repeat; + return index; + } + // origin & clip + if (isBoxNode(node)) { + let origin = stringify(node); + let clip = null; + if (origin === 'text') { + clip = origin; + origin = null; + } + + index = eatSpace(nodes, index + 1); + const sibling = nodes[index]; + if (sibling && isBoxNode(sibling)) { + if (clip) { + origin = stringify(sibling); + } else { + clip = stringify(sibling); + } + index += 1; + } + + if (origin) { + store['background-origin'] = origin; + } + if (clip) { + store['background-clip'] = clip; + } + return index; + } + // position & size + if (isPositionNode(node)) { + let position = stringify(node); + let size = null; + index = eatSpace(nodes, index + 1); + let sibling = nodes[index]; + if (sibling && isPositionNode(sibling)) { + position = `${position} ${stringify(sibling)}`; + index = eatSpace(nodes, index + 1); + sibling = nodes[index]; + } + if (sibling && sibling.type === 'div' && sibling.value === '/') { + index = eatSpace(nodes, index + 1); + sibling = nodes[index]; + if (sibling && isSizeNode(sibling)) { + size = stringify(sibling); + if (!isSizePreset(size)) { + index = eatSpace(nodes, index + 1); + sibling = nodes[index]; + if (sibling && isSizeNode(sibling)) { + size = `${size} ${stringify(sibling)}`; + index += 1; + } + } + } + } + + store['background-position'] = position; + if (size) { + store['background-size'] = size; + } + + return index; + } + + return index + 1; +} + +function parser(bakcground) { + const nodes = valueParser(typeof bakcground === 'string' ? bakcground : '').nodes; + const l = nodes.length; + const items = []; + let item; + const append = () => { + item = {}; + items.push(item); + }; + append(); + + let node; + let type; + let value; + let i = 0; + while (i < l) { + node = nodes[i]; + type = node.type; + value = node.value; + if (type === 'word' || type === 'function') { + i = readValue(nodes, i, item); + continue; + } + i++; + // div = , + if (type === 'div' && value === ',') { + append(); + } + } + return items; +} + +function build(bg) { + if (Array.isArray(bg)) { + return bg.map(build).join(','); + } + + let pos = bg['background-position']; + if (pos && bg['background-size']) { + pos = `${pos}/${bg['background-size']}`; + } + + return ['image', 'repeat', 'attachment', 'position', 'origin', 'clip', 'color'].map(key => { + return (key === 'position' ? pos : bg[`background-${key}`]) || ''; + }).filter(item => item !== '').join(' '); +} + +parser.build = build; + +export default parser; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/background/position.js b/packages/editor-setters/src/style-setter/lc-style-setter/background/position.js new file mode 100644 index 000000000..9e1890672 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/background/position.js @@ -0,0 +1,292 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import Field from '@ali/ve-field'; +import Icons from '@ali/ve-icons'; +import NumberControl from '@ali/ve-number-control'; + +import utils from '../utils'; +import $i18n from '../i18n/index'; + +function isZero(v) { + return v === 0 || /^0(em|ex|ch|rem|vh|vw|vmin|vmax|px|mm|q|cm|in|pt|pc|%)?$/.test(v); +} + +const offsetPresets = [ + { + title: 'left top', + value: { X: '0%', Y: '0%' }, + test({ x, y }) { + return (isZero(x) || x === 'left') && (isZero(y) || y === 'top'); + }, + }, + { + title: 'center top', + value: { X: '50%', Y: '0%' }, + test({ x, y }) { + return (x === '50%' || x === 'center') && (isZero(y) || y === 'top'); + }, + }, + { + title: 'right top', + value: { X: '100%', Y: '0%' }, + test({ x, y }) { + return (x === '100%' || x === 'right') && (isZero(y) || y === 'top'); + }, + }, + { + title: 'left center', + value: { X: '0%', Y: '50%' }, + test({ x, y }) { + return (isZero(x) || x === 'left') && (y === '50%' || y === 'center'); + }, + }, + { + title: 'center', + value: { X: '50%', Y: '50%' }, + test({ x, y }) { + return (x === '50%' || x === 'center') && (y === '50%' || y === 'center'); + }, + }, + { + title: 'right center', + value: { X: '100%', Y: '50%' }, + test({ x, y }) { + return (x === '100%' || x === 'right') && (y === '50%' || y === 'center'); + }, + }, + { + title: 'left bottom', + value: { X: '0%', Y: '100%' }, + test({ x, y }) { + return (isZero(x) || x === 'left') && (y === '100%' || y === 'bottom'); + }, + }, + { + title: 'center bottom', + value: { X: '50%', Y: '100%' }, + test({ x, y }) { + return (x === '50%' || x === 'center') && (y === '100%' || y === 'bottom'); + }, + }, + { + title: 'right bottom', + value: { X: '100%', Y: '100%' }, + test({ x, y }) { + return (x === '100%' || x === 'right') && (y === '100%' || y === 'bottom'); + }, + }, +]; + +class Presets extends Component { + static propTypes = { + value: PropTypes.object, + onChange: PropTypes.func, + }; + + render() { + const { value, onChange } = this.props; + + const presets = offsetPresets.map((item, index) => { + const className = classNames('vs-preset-item', `vs-preset-${item.title.replace(' ', '-')}`, { + 've-active': item.test(value), + }); + + return ( + onChange(item.value)} + > + + + ); + }); + + return
{presets}
; + } +} + +const RE_PERCENT = /^\d*(\.\d+)?%$/; + +function isPercent(val) { + return RE_PERCENT.test(val); +} + +function normalizePosition(pos, x, y) { + if (utils.isEmptyCssValue(pos) || pos === 'initial') { + return { + x, + y, + effects: { + x: utils.notEmptyValue(x, '0%'), + y: utils.notEmptyValue(y, '0%'), + }, + }; + } + + const xy = pos.split(/\s+/); + if (utils.isEmptyCssValue(x)) { + x = xy[0]; + } + if (utils.isEmptyCssValue(y)) { + y = xy[1]; + } + const effects = { x, y }; + const ret = { x, y, effects }; + + if (utils.isEmptyCssValue(y)) { + if (isPercent(x)) { + effects.y = '50%'; + } else if (x === 'left' || x === 'right' || x === 'center') { + effects.y = 'center'; + } else if (x === 'top' || x === 'bottom') { + effects.y = x; + effects.x = 'center'; + ret.y = x; + ret.x = ''; + } + } else if (x === 'top' || x === 'bottom' || y === 'left' || y === 'right') { + effects.y = x; + effects.x = y; + ret.y = x; + ret.x = y; + } + + return ret; +} + +class Offset extends Component { + static propTypes = { + current: PropTypes.any, + effects: PropTypes.any, + onChange: PropTypes.func, + }; + + render() { + return ( + + ); + } +} + +class Position extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleBackgrounPositionSetter'; + + setPosition(x, y) { + if (utils.isEmptyCssValue(x) || utils.isEmptyCssValue(y)) { + utils.setBackground(this.props, 'background-position', null); + utils.setPropertyValue(this.props, 'background-position-x', x); + utils.setPropertyValue(this.props, 'background-position-y', y); + } else { + utils.setBackground(this.props, 'background-position', `${x} ${y}`); + utils.setPropertyValue(this.props, 'background-position-x', null); + utils.setPropertyValue(this.props, 'background-position-y', null); + } + } + + render() { + const className = classNames('vs-style-background-position', this.props.className); + const { current, inherit } = utils.getBackground(this.props, 'background-position'); + const x = utils.getPropertyValue(this.props, 'background-position-x'); + const y = utils.getPropertyValue(this.props, 'background-position-y'); + + const currentXY = normalizePosition(current, x.current, y.current); + const inheritXY = normalizePosition(inherit, x.inherit, y.inherit); + + const effects = { + x: utils.notEmptyValue(currentXY.effects.x, inheritXY.effects.x), + y: utils.notEmptyValue(currentXY.effects.y, inheritXY.effects.y), + }; + + return ( +
+ this.setPosition(X, Y)} /> + +
+ + + +)} + > + this.setPosition(value, currentXY.y)} + /> + + + + +)} + > + this.setPosition(currentXY.x, value)} + /> + +
+
+ ); + } +} + +export default Position; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/background/repeat.js b/packages/editor-setters/src/style-setter/lc-style-setter/background/repeat.js new file mode 100644 index 000000000..6696e18f2 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/background/repeat.js @@ -0,0 +1,47 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import ChoiceControl from '@ali/ve-choice-control'; +import Icons from '@ali/ve-icons'; +import utils from '../utils'; +const repeats = [{ + title: , + value: 'repeat', +}, { + title: , + value: 'repeat-x', +}, { + title: , + value: 'repeat-y', +}, { + title: , + value: 'no-repeat', +}]; + +class Repeat extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleBackgrounRepeatSetter'; + + setRepeat(repeat) { + utils.setBackground(this.props, 'background-repeat', repeat); + } + + render() { + const className = classNames('vs-style-background-repeat', this.props.className); + const repeat = utils.getBackground(this.props, 'background-repeat').value; + + return ( + this.setRepeat(value)} + /> + ); + } +} + +export default Repeat; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/background/size.js b/packages/editor-setters/src/style-setter/lc-style-setter/background/size.js new file mode 100644 index 000000000..92362422e --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/background/size.js @@ -0,0 +1,174 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import ChoiceControl from '@ali/ve-choice-control'; +import NumberControl from '@ali/ve-number-control'; +import Icons from '@ali/ve-icons'; +import Field from '@ali/ve-field'; +import utils from '../utils'; +import $i18n from '../i18n/index'; + +const RE_SIZE_PRESETS = /^(cover|contain)$/i; + +function getEffects(current, inherit) { + const size = utils.isEmptyCssValue(current) || current === 'initial' ? inherit : current; + + if (utils.isEmptyCssValue(size) || RE_SIZE_PRESETS.test(size)) { + return { x: 'auto', y: 'auto' }; + } + + const xy = size.split(/\s+/); + + return { + x: utils.isEmptyCssValue(xy[0]) ? 'auto' : xy[0], + y: utils.isEmptyCssValue(xy[1]) ? 'auto' : xy[1], + }; +} + +function normalizeCurrent(current) { + if (utils.isEmptyCssValue(current) || current === 'initial' || RE_SIZE_PRESETS.test(current)) { + return { + x: '', + y: '', + }; + } + + const xy = current.split(/\s+/); + + return { + x: utils.isEmptyCssValue(xy[0]) ? '' : xy[0], + y: utils.isEmptyCssValue(xy[1]) ? '' : xy[1], + }; +} + +class SizeItem extends Component { + static propTypes = { + current: PropTypes.any, + effects: PropTypes.any, + onChange: PropTypes.func, + }; + + render() { + return ( + + ); + } +} + +class Size extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleBackgrounSizeSetter'; + + setSize(sizeX, sizeY) { + let size; + if (utils.isEmptyCssValue(sizeX) && utils.isEmptyCssValue(sizeY)) { + size = ''; + } else if (RE_SIZE_PRESETS.test(sizeX) || utils.isEmptyCssValue(sizeY)) { + size = sizeX; + } else if (utils.isEmptyCssValue(sizeX) && !utils.isEmptyCssValue(sizeY)) { + size = `auto ${sizeY}`; + } else { + size = `${sizeX} ${sizeY}`; + } + utils.setBackground(this.props, 'background-size', size); + } + + render() { + const className = classNames('vs-style-background-size', this.props.className); + const { current, inherit, value } = utils.getBackground(this.props, 'background-size'); + + const currentXY = normalizeCurrent(current); + const effects = getEffects(current, inherit); + + return ( +
+ , + value: 'cover', + }, + { + title: , + value: 'contain', + }, + ]} + value={value} + onChange={val => this.setSize(val, null)} + loose + /> + +
+ + + +)} + > + this.setSize(val, currentXY.y)} + /> + + + + +)} + > + this.setSize(currentXY.x, val)} + /> + +
+
+ ); + } +} + +export default Size; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/border/border.js b/packages/editor-setters/src/style-setter/lc-style-setter/border/border.js new file mode 100644 index 000000000..6d638ceac --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/border/border.js @@ -0,0 +1,186 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import Field from '@ali/ve-field'; +import SelectControl from '@ali/ve-select-control'; +import NumberControl from '@ali/ve-number-control'; +import ColorControl from '@ali/ve-color-control'; +import borderParser from './borderParser'; +import utils from '../utils'; +import $i18n from '../i18n/index'; + +const BORDER_STYLES = { + none: $i18n.get({ id: 'styleNo', dm: '无' }), + solid: $i18n.get({ id: 'styleSolidLine', dm: '实线' }), + dotted: $i18n.get({ id: 'styleDottedLine', dm: '点线' }), + dashed: $i18n.get({ id: 'styleDottedLine.1', dm: '虚线' }), +}; + +const borderStyles = Object.keys(BORDER_STYLES).map(i => ({ + text: BORDER_STYLES[i], + value: i, +})); + +class BorderStyle extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleBorderSetter'; + + static transducer = utils.transducer; + + state = { + // state variable to indicate which border have use selected + // enum: border-left | border-right | border-top | border-bottom | border + currentSelected: 'border', + }; + + componentWillMount() { + + } + + componentWillUnmount() { + + } + + setValue(type, val, props) { + if (this.state.currentSelected === 'border') { + utils.setPropertyValue(props, `border-${type}`, val); + } else { + utils.setPropertyValue(props, `${this.state.currentSelected}-${type}`, val); + } + } + + changeSelectedBorder(type) { + this.setState({ currentSelected: type }); + } + + render() { + const className = classNames('vs-style-border-style', this.props.className); + const border = borderParser(this.props, this.state.currentSelected); + const { current, inherit } = border; + const borderWidth = current.width; + const borderColor = current.color; + const borderStyle = current.style; + + const inheritWidth = inherit.width || '0px'; + const inheritColor = inherit.color || '#000'; + const inheritStyle = inherit.style || 'none'; + + return ( +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ + { + this.setValue('style', val, this.props); + }} + options={borderStyles} + /> + + + { + this.setValue('width', val, this.props); + }} + min={0} + units={[ + { + type: 'px', + list: true, + }, + { + type: '%', + list: true, + }, + { + type: 'em', + list: true, + }, + ]} + /> + + + { + this.setValue('color', val, this.props); + }} + /> + +
+
+ ); + } +} + +export default BorderStyle; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/border/borderParser.js b/packages/editor-setters/src/style-setter/lc-style-setter/border/borderParser.js new file mode 100644 index 000000000..60a519b22 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/border/borderParser.js @@ -0,0 +1,141 @@ +import compose from 'lodash.flow'; +import curry from 'lodash.curry'; +import zipObject from 'lodash.zipobject'; +import { parse as parseBorder } from 'css-border-property'; +import utils from '../utils'; +// const logger = (val) => { +// console.log(val); +// return val; +// }; +const keys = Object.keys; +const getProp = p => (v => v[p]); +const stateMutator = { + setKey: (s, k, r) => { + s[k].c = r['border-color']; + s[k].s = r['border-style']; + s[k].w = r['border-width']; + }, + setKeyOnly: (s, k, k2, r, o) => { + s[k][k2] = r[o]; + }, + border: (s, r) => keys(s).forEach(k => stateMutator.setKey(s, k, r)), + 'border-left': (s, r) => stateMutator.setKey(s, 'l', r), + 'border-right': (s, r) => stateMutator.setKey(s, 'r', r), + 'border-top': (s, r) => stateMutator.setKey(s, 't', r), + 'border-bottom': (s, r) => stateMutator.setKey(s, 'b', r), + + 'border-style': (s, r) => keys(s).forEach(k => { s[k].s = r['border-style']; }), + 'border-width': (s, r) => keys(s).forEach(k => { s[k].w = r['border-width']; }), + 'border-color': (s, r) => keys(s).forEach(k => { s[k].c = r['border-color']; }), + + 'border-left-color': (s, r) => stateMutator.setKeyOnly(s, 'l', 'c', r, 'border-color'), + 'border-left-width': (s, r) => stateMutator.setKeyOnly(s, 'l', 'w', r, 'border-width'), + 'border-left-style': (s, r) => stateMutator.setKeyOnly(s, 'l', 's', r, 'border-style'), + + 'border-right-color': (s, r) => stateMutator.setKeyOnly(s, 'r', 'c', r, 'border-color'), + 'border-right-width': (s, r) => stateMutator.setKeyOnly(s, 'r', 'w', r, 'border-width'), + 'border-right-style': (s, r) => stateMutator.setKeyOnly(s, 'r', 's', r, 'border-style'), + + 'border-top-color': (s, r) => stateMutator.setKeyOnly(s, 't', 'c', r, 'border-color'), + 'border-top-width': (s, r) => stateMutator.setKeyOnly(s, 't', 'w', r, 'border-width'), + 'border-top-style': (s, r) => stateMutator.setKeyOnly(s, 't', 's', r, 'border-style'), + + 'border-bottom-color': (s, r) => stateMutator.setKeyOnly(s, 'b', 'c', r, 'border-color'), + 'border-bottom-width': (s, r) => stateMutator.setKeyOnly(s, 'b', 'w', r, 'border-width'), + 'border-bottom-style': (s, r) => stateMutator.setKeyOnly(s, 'b', 's', r, 'border-style'), +}; + +const mergeToObj = val => zipObject(val.map(getProp('property')), val.map(getProp('value'))); +const mapRuleToState = (rule, ruleState, applyFn) => { + const val = parseBorder(typeof rule === 'string' ? rule : ''); + const r = mergeToObj(val); + applyFn.call(null, ruleState, r); + return ruleState; +}; + +const mapStateToCurrentValue = (state, type) => { + switch (type) { + case 'border': + return { + // @todo consider to convert color to judge equal + color: keys(state).every(k => state[k].c === state.l.c) + ? state.l.c : '', + style: keys(state).every(k => state[k].s === state.l.s) + ? state.l.s : '', + width: keys(state).every(k => state[k].w === state.l.w) + ? state.l.w : '', + }; + case 'border-left': + return { + color: state.l.c, + style: state.l.s, + width: state.l.w, + }; + case 'border-right': + return { + color: state.r.c, + style: state.r.s, + width: state.r.w, + }; + case 'border-top': + return { + color: state.t.c, + style: state.t.s, + width: state.t.w, + }; + case 'border-bottom': + return { + color: state.b.c, + style: state.b.s, + width: state.b.w, + }; + default: + } + return { + color: '', + style: '', + width: '', + }; +}; + +const getEmptyRuleSet = () => ({ + l: { c: '', s: '', w: '' }, // left: color | style | width + r: { c: '', s: '', w: '' }, // right: color | style | width + t: { c: '', s: '', w: '' }, // top: color | style | width + b: { c: '', s: '', w: '' }, // bottom: color | style | width +}); + +export const parseToBorder = curry((type, mapfn, rules) => { + const ruleState = Object.assign({}, getEmptyRuleSet()); + rules.forEach(rule => mapRuleToState(rule[1], ruleState, stateMutator[rule[0]])); + return mapfn(ruleState, type); +}); + +const getRule = (rules, fn = v => v) => { + return fn(rules); +}; + +export const getRelatedRules = (rules, mutator) => { + const filterRules = ruleSet => keys(ruleSet) + .filter(v => !!mutator[v]) + .map(n => [n, getRule(rules)[n]]); + return getRule(rules, filterRules); +}; + +export default function borderParser(props, state, mutator = stateMutator) { + const rules = props.value || props.defaultValue || {}; + const current = compose( + getRelatedRules, + // logger, + parseToBorder(state, mapStateToCurrentValue), + )(rules, mutator); + const inheritStr = utils.getInheritPropertyValue( + rules, state, props.node); + const inheritValue = mergeToObj(parseBorder(typeof inheritStr !== 'string' ? '' : inheritStr)); + const inherit = { + color: inheritValue['border-color'], + style: inheritValue['border-style'], + width: inheritValue['border-width'], + }; + return { current, inherit, value: utils.notEmptyValue(current, inherit) }; +} diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/border/index.js b/packages/editor-setters/src/style-setter/lc-style-setter/border/index.js new file mode 100644 index 000000000..2a9f6e0a8 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/border/index.js @@ -0,0 +1,33 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import BorderStyle from './border'; +import BorderRadius from './radius'; +import utils from '../utils'; +class Border extends Component { + + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + } + + static displayName = 'StyleBorderSetter'; + static transducer = utils.transducer; + + // shouldComponentUpdate() { + // return false; + // } + + + render() { + const className = classNames('vs-style-border', this.props.className); + + return ( +
+ + +
+ ); + } +} + +export default Border; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/border/radius.js b/packages/editor-setters/src/style-setter/lc-style-setter/border/radius.js new file mode 100644 index 000000000..8baef974b --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/border/radius.js @@ -0,0 +1,141 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import Field from '@ali/ve-field'; +import NumberControl from '@ali/ve-number-control'; +import radiusParser from './radiusParser'; +import utils from '../utils'; +import $i18n from '../i18n/index'; + +class RadiusStyle extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'BorderRadiusStyleSetter'; + + static transducer = utils.transducer; + + state = { + // state variable to indicate which border have use selected + // enum: border-top-left | border-top-right + // border-bottom-left | border-bottom-right | border + currentSelected: 'border', + }; + + componentWillMount() { + + } + + componentWillUnmount() { + + } + + setValue(val, props) { + if (this.state.currentSelected === 'border') { + utils.setPropertyValue(props, 'border-radius', val); + } else { + utils.setPropertyValue(props, `${this.state.currentSelected}-radius`, val); + } + } + + changeSelectedRadius(type) { + this.setState({ currentSelected: type }); + } + + render() { + const className = classNames('vs-style-border-radius', this.props.className); + const radius = radiusParser(this.props, `${this.state.currentSelected}-radius`); + const radiusCurrent = radius.current; + const radiusInherit = radius.inherit; + + return ( +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ + { + this.setValue(val, this.props); + }} + value={radiusCurrent || null} + min={0} + units={[ + { + type: 'px', + list: true, + }, + { + type: '%', + list: true, + }, + { + type: 'em', + list: true, + }, + ]} + /> + +
+
+ ); + } +} + +export default RadiusStyle; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/border/radiusParser.js b/packages/editor-setters/src/style-setter/lc-style-setter/border/radiusParser.js new file mode 100644 index 000000000..cad6b8a17 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/border/radiusParser.js @@ -0,0 +1,54 @@ +import compose from 'lodash.flow'; +import curry from 'lodash.curry'; +import { getRelatedRules } from './borderParser'; +import utils from '../utils'; +const keys = Object.keys; +const getRadiusEmptyState = () => ({ + tl: null, + tr: null, + bl: null, + br: null, +}); + +const stateMutator = { + 'border-radius': (s, r) => keys(s).forEach(k => { s[k] = r; }), + 'border-top-left-radius': (s, r) => { s.tl = r; }, + 'border-top-right-radius': (s, r) => { s.tr = r; }, + 'border-bottom-left-radius': (s, r) => { s.bl = r; }, + 'border-bottom-right-radius': (s, r) => { s.br = r; }, +}; + +const mapStateToCurrentValue = (state, type) => { + switch (type) { + case 'border-radius': + return keys(state).every(k => state[k] === state.tl) ? state.tl : null; + case 'border-top-left-radius': + return state.tl; + case 'border-top-right-radius': + return state.tr; + case 'border-bottom-left-radius': + return state.bl; + case 'border-bottom-right-radius': + return state.br; + default: + break; + } + return null; +}; + +const parseToRadius = curry((type, mapfn, rules) => { + const ruleState = Object.assign({}, getRadiusEmptyState()); + rules.forEach(rule => stateMutator[rule[0]](ruleState, rule[1])); + return mapfn(ruleState, type); +}); + +export default function radiusParser(props, state) { + const rules = props.value || props.defaultValue || {}; + const current = compose( + getRelatedRules, + parseToRadius(state, mapStateToCurrentValue) + )(rules, stateMutator); + const inherit = utils.getInheritPropertyValue( + rules, state, props.node); + return { current, inherit, value: utils.notEmptyValue(current, inherit) }; +} diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/effects/cursor.js b/packages/editor-setters/src/style-setter/lc-style-setter/effects/cursor.js new file mode 100644 index 000000000..9ec1bb1d5 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/effects/cursor.js @@ -0,0 +1,46 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import SelectControl from '@ali/ve-select-control'; +import Icons from '@ali/ve-icons'; +import utils from '../utils'; +const CURSOR_TYPE = ['default', 'pointer']; + +class Cursor extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleOpacitySetter'; + static transducer = utils.transducer; + + componentWillMount() { + + } + + componentWillUnmount() { + + } + + render() { + const className = classNames('vs-style-cursor', this.props.className); + const cursor = utils.getPropertyValue(this.props, 'cursor'); + const options = CURSOR_TYPE.map((item, index) => ({ + text:
{item}
, + value: item, + })); + return ( + utils.setPropertyValue(this.props, 'cursor', val)} + min={0} + max={100} + syncTargetWidth + /> + ); + } +} + +export default Cursor; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/effects/index.js b/packages/editor-setters/src/style-setter/lc-style-setter/effects/index.js new file mode 100644 index 000000000..2a90c53ce --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/effects/index.js @@ -0,0 +1,67 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import Icons from '@ali/ve-icons'; +import Field from '@ali/ve-field'; +import Opacity from './opacity'; +import Cursor from './cursor'; +import Shadow from './shadow'; + +import utils from '../utils'; +import $i18n from '../i18n/index'; + +class Effects extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleEffectsSetter'; + + static transducer = utils.transducer; + + componentWillMount() { + + } + + // shouldComponentUpdate() { + // return false; + // } + + componentWillUnmount() { + + } + + render() { + const className = classNames('vs-style-effects', this.props.className); + + return ( +
+ + + +)} + > + + + + + +)} + > + + + +
+ ); + } +} + +export default Effects; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/effects/opacity.js b/packages/editor-setters/src/style-setter/lc-style-setter/effects/opacity.js new file mode 100644 index 000000000..f4e9b3ec4 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/effects/opacity.js @@ -0,0 +1,47 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import NumberControl from '@ali/ve-number-control'; +import utils from '../utils'; +class Opacity extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleOpacitySetter'; + static transducer = utils.transducer; + + componentWillMount() { + + } + + componentWillUnmount() { + + } + + render() { + const className = classNames('vs-style-opacity', this.props.className); + const opacity = utils.getPropertyValue(this.props, 'opacity'); + const getFloat = v => parseFloat(v).toFixed(2); + const current = opacity.current ? `${parseInt(opacity.current * 100, 10)}%` : null; + return ( + { + const value = (parseFloat((val.split('%')[0])) / 100).toFixed(2); + utils.setPropertyValue(this.props, 'opacity', value); + }} + min={0} + max={100} + units={[{ + type: '%', + list: true, + }]} + /> + ); + } +} + +export default Opacity; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/effects/shadow.js b/packages/editor-setters/src/style-setter/lc-style-setter/effects/shadow.js new file mode 100644 index 000000000..775d5c3c4 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/effects/shadow.js @@ -0,0 +1,210 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import Field from '@ali/ve-field'; +import Icons from '@ali/ve-icons'; +import NumberControl from '@ali/ve-number-control'; +import ColorControl from '@ali/ve-color-control'; + +import utils from '../utils'; +import $i18n from '../i18n/index'; + +const generateShadow = (c = 'rgba(0,0,0,0)', x = '0', y = '0', b = '0', s = '0') => `${c} ${x} ${y} ${b} ${s}`; + +class Shadow extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleShadowSetter'; + + static transducer = utils.transducer; + + componentWillMount() { + + } + + componentWillUnmount() { + + } + + render() { + const className = classNames('vs-style-shadow', this.props.className); + const shadow = utils.getPropertyValue(this.props, 'box-shadow').value; + + let c = ''; // color + let x = ''; // x + let y = ''; // y + let b = ''; // blur + let s = ''; // spread + + // @todo shadow parser 比较复杂考虑情况比较多,这里有明显的 Bug + // 由于时间问题,这里先留坑,满足可用性,后面有时间再来修复一下。 + if (shadow !== 'none' && !!shadow && typeof shadow === 'string') { + const res = shadow.split(' '); + s = res.pop(); + b = res.pop(); + y = res.pop(); + x = res.pop(); + c = res.join(' '); + } + + return ( +
+
+ + + +)} + > + { + utils.setPropertyValue(this.props, 'box-shadow', generateShadow(val, x, y, b, s)); + }} + /> + +
+
+ + { + utils.setPropertyValue(this.props, 'box-shadow', generateShadow(c, val, y, b, s)); + }} + min={0} + max={100} + units={[ + { + type: 'px', + list: true, + }, + { + type: '%', + list: true, + }, + { + type: 'em', + list: true, + }, + ]} + /> + + + { + utils.setPropertyValue(this.props, 'box-shadow', generateShadow(c, x, val, b, s)); + }} + min={0} + max={100} + units={[ + { + type: 'px', + list: true, + }, + { + type: '%', + list: true, + }, + { + type: 'em', + list: true, + }, + ]} + /> + +
+
+ + + +)} + > + { + utils.setPropertyValue(this.props, 'box-shadow', generateShadow(c, x, y, val, s)); + }} + min={0} + max={100} + units={[ + { + type: 'px', + list: true, + }, + { + type: '%', + list: true, + }, + { + type: 'em', + list: true, + }, + ]} + /> + + + + +)} + > + { + utils.setPropertyValue(this.props, 'box-shadow', generateShadow(c, x, y, b, val)); + }} + min={0} + max={100} + units={[ + { + type: 'px', + list: true, + }, + { + type: '%', + list: true, + }, + { + type: 'em', + list: true, + }, + ]} + /> + +
+
+ ); + } +} + +export default Shadow; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/i18n/index.js b/packages/editor-setters/src/style-setter/lc-style-setter/i18n/index.js new file mode 100644 index 000000000..ed0ccb71e --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/i18n/index.js @@ -0,0 +1,45 @@ +const { provideIntl, destroyIntl } = require('@ali/intl-universal'); +const strings = require('./strings'); + +let intl; +const MEDUSA_APP_NAME = 'legao-designer'; +const PSEUDO_LANGUAGE_TAG = 'pd-KV'; +const CURRENT_LANGUAGE = (window.locale || window.localStorage.getItem('vdev-locale') || '').replace(/_/, '-') || 'zh-CN'; + +function update(language) { + destroyIntl(); + intl = provideIntl({ + locale: language, + messagesAIO: strings, + }); +} + +function get(id, variable) { + if (!intl) update(); + let string = ''; + let key = ''; + if (typeof id === 'string') { + key = id; + string = intl.formatMessage({ id }, variable); + } + if (typeof id === 'object' && id.dm) { + id.defaultMessage = id.dm; + } + key = id.id; + string = intl.formatMessage(id, variable); + if (CURRENT_LANGUAGE === PSEUDO_LANGUAGE_TAG) { + return `##@@@${key}##${MEDUSA_APP_NAME}@@@##${string}`; + } + return string; +} + +if (PSEUDO_LANGUAGE_TAG === CURRENT_LANGUAGE) { + update('en-US'); +} else { + update(CURRENT_LANGUAGE); +} + +module.exports = { + get, + update, +}; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/en-US.json b/packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/en-US.json new file mode 100644 index 000000000..03a69fdf0 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/en-US.json @@ -0,0 +1,72 @@ +{ + "styleImpactBlackBody": "Impact, black body", + "styleImpactMicrosoftYahei": "Impact, Microsoft Yahei", + "styleComicSansMSBlackbody": "Comic Sans MS, Blackbody", + "styleGeorgiaMicrosoftYahei": "Georgia, Microsoft Yahei", + "styleArialHelveticaBlackBody": "Arial, Helvetica, black body", + "styleLateralOffset": "Horizontal offset", + "styleAlign": "text-align", + "styleTrebuchetMSMicrosoftYahei": "Trebuchet MS, Microsoft Yahei", + "styleTrebuchetMSBlackBody": "Trebuchet MS, black body", + "styleArialHelveticaMicrosoftYahei": "Arial, Helvetica, Microsoft Yahei", + "styleLucidaSansUnicodeMicrosoft": "Lucida Sans Unicode, Microsoft Yahei", + "styleRowHeight": "line-height", + "styleFontColor": "font-color", + "styleSolidLine": "solid line", + "styleLinear": "style", + "styleLucidaConsoleBlackbody": "Lucida Console, Blackbody", + "styleStyle": "font-style", + "styleWordWeight": "font-width", + "styleLayout": "layout", + "styleSourceEditor": "Source editor", + "styleTopBorder": "Top border", + "styleStatus": "status", + "styleText": "Text", + "stylePleaseEnterAnAddress": "Please enter an address or paste upload", + "styleDefaultState": "Default state", + "styleRightBorder": "Right border", + "styleHigh": "high", + "styleBottomBorder": "Bottom border", + "styleTransparency": "opacity", + "styleBottomRightCorner": "Bottom right corner", + "styleUpperRightCorner": "Upper right corner", + "styleColour": "color", + "styleUnsupportedImage": "Unsupported image", + "styleTimesNewRomanBlackbody": "Times New Roman, Blackbody", + "styleLucidaConsoleMicrosoftYahei": "Lucida Console, Microsoft Yahei", + "styleDisplay": "display", + "styleFlexibleLayout": "Flexible layout", + "styleSize": "font-size", + "styleFillet": "radius", + "styleEffect": "effect", + "stylePositioning": "Positioning", + "styleLeftBorder": "Left border", + "styleBackground": "background", + "styleFillColor": "background-color", + "stylePalatinoLinotypeBlackBody": "Palatino Linotype, black body", + "styleFont": "font-family", + "styleMouseGesture": "cursor", + "styleAir": "empty", + "styleAll": "All", + "styleTimesNewRomanMicrosoft": "Times New Roman, Microsoft Yahei", + "styleUpperLeftCorner": "Upper left corner", + "styleCourierNewMicrosoftYahei": "Courier New, Microsoft Yahei", + "styleCourierNewBlackbody": "Courier New, Blackbody", + "styleFrame": "Border", + "styleImage": "background-image", + "styleComicSansMSMicrosoft": "Comic Sans MS, Microsoft Yahei", + "styleVerdanaBlackBody": "Verdana, black body", + "stylePalatinoLinotypeMicrosoftYahei": "Palatino Linotype, Microsoft Yahei", + "styleGeorgiaBlackbody": "Georgia, Blackbody", + "styleWidth": "width", + "styleVerticalOffset": "Vertical offset", + "styleModification": "text-decoration", + "styleHeight": "height", + "styleFixed": "fixed", + "styleLucidaSansUnicodeBlackbody": "Lucida Sans Unicode, Blackbody", + "styleVerdanaMicrosoftYahei": "Verdana, Microsoft Yahei", + "styleNo": "no", + "styleTile": "Tile", + "styleDottedLine": "dotted line", + "styleDottedLine.1": "dashed line" +} \ No newline at end of file diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/index.js b/packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/index.js new file mode 100644 index 000000000..9b61c93e1 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/index.js @@ -0,0 +1,4 @@ +module.exports = { + 'en-US': require('./en-US.json'), + 'zh-CN': require('./zh-CN.json'), +}; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/zh-CN.json b/packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/zh-CN.json new file mode 100644 index 000000000..599c944f8 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/i18n/strings/zh-CN.json @@ -0,0 +1,72 @@ +{ + "styleAir": "空", + "stylePalatinoLinotypeMicrosoftYahei": "Palatino Linotype, 微软雅黑", + "styleMouseGesture": "鼠标手势", + "styleAll": "全部", + "styleImpactBlackBody": "Impact, 黑体", + "styleFont": "字体", + "styleFrame": "边框", + "styleImage": "图片", + "styleRowHeight": "行高", + "styleArialHelveticaMicrosoftYahei": "Arial, Helvetica, 微软雅黑", + "styleUpperLeftCorner": "左上角", + "styleCourierNewMicrosoftYahei": "Courier New, 微软雅黑", + "styleTimesNewRomanMicrosoft": "Times New Roman, 微软雅黑", + "styleFixed": "固定", + "styleModification": "修饰", + "stylePleaseEnterAnAddress": "请输入地址或粘贴上传", + "styleText": "文字", + "styleVerticalOffset": "纵向偏移", + "styleComicSansMSMicrosoft": "Comic Sans MS, 微软雅黑", + "styleLinear": "线形", + "styleWidth": "宽", + "styleVerdanaBlackBody": "Verdana, 黑体", + "styleGeorgiaBlackbody": "Georgia, 黑体", + "styleTrebuchetMSBlackBody": "Trebuchet MS, 黑体", + "styleFillet": "圆角", + "styleFlexibleLayout": "弹性布局", + "styleDottedLine": "点线", + "styleLeftBorder": "左边框", + "styleNo": "无", + "styleLucidaSansUnicodeBlackbody": "Lucida Sans Unicode, 黑体", + "styleLucidaConsoleMicrosoftYahei": "Lucida Console, 微软雅黑", + "styleSize": "大小", + "styleLateralOffset": "横向偏移", + "styleAlign": "对齐", + "styleImpactMicrosoftYahei": "Impact, 微软雅黑", + "styleArialHelveticaBlackBody": "Arial, Helvetica, 黑体", + "styleComicSansMSBlackbody": "Comic Sans MS, 黑体", + "stylePalatinoLinotypeBlackBody": "Palatino Linotype, 黑体", + "styleGeorgiaMicrosoftYahei": "Georgia, 微软雅黑", + "styleDefaultState": "默认状态", + "styleFontColor": "字体颜色", + "styleSolidLine": "实线", + "styleTrebuchetMSMicrosoftYahei": "Trebuchet MS, 微软雅黑", + "styleLucidaSansUnicodeMicrosoft": "Lucida Sans Unicode, 微软雅黑", + "styleStyle": "样式", + "styleTransparency": "透明度", + "styleSourceEditor": "源码编辑", + "styleStatus": "状态", + "styleHigh": "高", + "styleTopBorder": "上边框", + "styleBottomBorder": "下边框", + "styleRightBorder": "右边框", + "styleHeight": "高度", + "styleLayout": "布局", + "styleUnsupportedImage": "暂未支持的图片", + "styleLucidaConsoleBlackbody": "Lucida Console, 黑体", + "styleWordWeight": "字重", + "styleCourierNewBlackbody": "Courier New, 黑体", + "styleFillColor": "填充色", + "styleTile": "平铺", + "styleBackground": "背景", + "stylePositioning": "定位", + "styleEffect": "效果", + "styleBottomRightCorner": "右下角", + "styleDottedLine.1": "虚线", + "styleColour": "颜色", + "styleTimesNewRomanBlackbody": "Times New Roman, 黑体", + "styleUpperRightCorner": "右上角", + "styleVerdanaMicrosoftYahei": "Verdana, 微软雅黑", + "styleDisplay": "显示" +} \ No newline at end of file diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/index.js b/packages/editor-setters/src/style-setter/lc-style-setter/index.js new file mode 100644 index 000000000..7eb21f3ae --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/index.js @@ -0,0 +1,117 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import Field from '@ali/ve-field'; +import { registerDict } from '@ali/ve-icons'; +import { normalizeStyle } from '@ali/vu-css-style'; + +import Layout from './layout'; +import Typography from './typography'; +import Background from './background'; +import Border from './border'; +import Effects from './effects'; + +import utils from './utils'; +import SvgLib from './svglib'; +import './style.less'; +import $i18n from './i18n/index'; + +registerDict('style', SvgLib); + +/** + * state + * json: JSON模式 + * ---- + * layout + * display + * flexItem + * padding+margin + * size + * width + * height + * min+max advanced + * float advanced + * clear advanced + * overflow advanced + * position advanced + * background + * color + * image + * border + * border + * radius + * typography + * font-family + * color + * font-size + * text-align + * line-height + * font-weight + * text-decoration + * font-style + * letter-spacing advanced + * text-indent advanced + * text-transform advanced + * direction advanced + * effects + * opacity + * cursor + * svg + * fill + */ + +class StyleSetter extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleSetter'; + + static transducer = utils.transducer; + + static defaultProps = { + + }; + + render() { + const className = classNames( + 'vs-style', + 'vs-style-advanced', + this.props.className, + ); + // react style -> css style + const value = this.props.value ? normalizeStyle(this.props.value) : null; + const defaultValue = this.props.defaultValue ? normalizeStyle(this.props.defaultValue) : null; + const props = {...this.props, value, defaultValue}; + + return ( +
+ + + + + + + + + + + + + + + +
+ ); + } +} + +StyleSetter.Layout = Layout; +StyleSetter.Typography = Typography; +StyleSetter.Background = Background; +StyleSetter.Effects = Effects; +StyleSetter.Border = Border; + +// StyleSetter.Svg = Svg; + +export default StyleSetter; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/layout/display.js b/packages/editor-setters/src/style-setter/lc-style-setter/layout/display.js new file mode 100644 index 000000000..464abdf23 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/layout/display.js @@ -0,0 +1,44 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import ChoiceControl from '@ali/ve-choice-control'; +import Icons from '@ali/ve-icons'; +import utils from '../utils'; +class Display extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleLayoutDisplaySetter'; + + render() { + const display = utils.getPropertyValue(this.props, 'display').value; + return ( + , + value: 'block', + }, { + title: , + value: 'inline-block', + }, { + title: , + value: 'inline', + }, { + title: , + value: 'flex', + }, + // { + // title: , + // value: 'none', + // } + ]} + onChange={val => utils.setPropertyValue(this.props, 'display', val)} + /> + ); + } +} + +export default Display; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/layout/flex.js b/packages/editor-setters/src/style-setter/lc-style-setter/layout/flex.js new file mode 100644 index 000000000..3e3e3addc --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/layout/flex.js @@ -0,0 +1,176 @@ +import React, { Component, PropTypes } from 'react'; +import ChoiceControl from '@ali/ve-choice-control'; +import Icons from '@ali/ve-icons'; +import Field from '@ali/ve-field'; +import utils from '../utils'; +class Flex extends Component { + static propTypes = { + prop: PropTypes.object, + }; + + static displayName = 'StyleLayoutFlexSetter'; + + render() { + // flex-direction + const direction = utils.getPropertyValue(this.props, 'flex-direction').value; + // align-items + const align = utils.getPropertyValue(this.props, 'align-items').value; + // justify-content + const justify = utils.getPropertyValue(this.props, 'justify-content').value; + /* + // flex-warp + const wrap = getPropertyValue(this.props, 'flex-wrap').value; + const isWrap = /^wrap/.test(wrap); + // align-content + const alignColumns = getPropertyValue(this.props, 'align-content').value; + */ + + const isVertical = /^column/.test(direction); + const v = isVertical ? '-v' : ''; + const reverseClass = /reverse$/.test(direction) + ? `vs-style-reverse${isVertical ? '-v' : '-h'}` : null; + + return ( +
+ , + tip: 'Direction:row', + value: 'row', + }, { + title: , + tip: 'Direction:column', + value: 'column', + }, { + title: , + tip: 'Direction:row-reverse', + value: 'row-reverse', + }, { + title: (), + tip: 'Direction:column-reverse', + value: 'column-reverse', + }]} + onChange={(val) => utils.setPropertyValue(this.props, 'flex-direction', val)} + /> + + ), + tip: 'Align:flex-start', + value: 'flex-start', + }, { + title: ( + + ), + tip: 'Align:center', + value: 'center', + }, { + title: ( + + ), + tip: 'Align:flex-end', + value: 'flex-end', + }, { + title: ( + + ), + tip: 'Align:stretch', + value: 'stretch', + }, { + title: ( + + ), + tip: 'Align:baseline', + value: 'baseline', + }]} + onChange={(val) => utils.setPropertyValue(this.props, 'align-items', val)} + /> + + ), + tip: 'Justify:flex-start', + value: 'flex-start', + }, { + title: ( + + ), + tip: 'Justify:center', + value: 'center', + }, { + title: ( + + ), + tip: 'Justify:flex-end', + value: 'flex-end', + }, { + title: ( + + ), + tip: 'Justify:space-between', + value: 'space-between', + }, { + title: ( + + ), + tip: 'Justify:space-around', + value: 'space-around', + }]} + onChange={(val) => utils.setPropertyValue(this.props, 'justify-content', val)} + /> +
+ ); + } +} + +export default Flex; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/layout/flexitem.js b/packages/editor-setters/src/style-setter/lc-style-setter/layout/flexitem.js new file mode 100644 index 000000000..0a432e05f --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/layout/flexitem.js @@ -0,0 +1,10 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; + +class FlexItem extends Component { + render() { + return null; + } +} + +export default FlexItem; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/layout/height.js b/packages/editor-setters/src/style-setter/lc-style-setter/layout/height.js new file mode 100644 index 000000000..26e0afa45 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/layout/height.js @@ -0,0 +1,19 @@ +import React, { Component, PropTypes } from 'react'; +import Size from './size'; +import utils from '../utils'; +class Height extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleLayoutWidthSetter'; + + static transducer = utils.transducer; + + render() { + return ; + } +} + +export default Height; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/layout/index.js b/packages/editor-setters/src/style-setter/lc-style-setter/layout/index.js new file mode 100644 index 000000000..4a32635ca --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/layout/index.js @@ -0,0 +1,107 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import Field from '@ali/ve-field'; +import Display from './display'; +import Flex from './flex'; +import FlexItem from './flexitem'; +import PaddingMargin from './padding+margin'; +import Width from './width'; +import Height from './height'; +import Position from './position'; // advanced +import utils from '../utils'; +import $i18n from '../i18n/index'; + +function inFlexBox(node) { + const nativeNode = node; + if (!nativeNode) return false; + const { parentNode } = nativeNode; + if (!parentNode) return false; + const display = window.getComputedStyle(parentNode).getPropertyValue('display'); + return /flex/.test(display); +} + +function isFlexBox(props) { + const display = utils.getPropertyValue(props, 'display').value; + return /flex$/.test(display); +} + +class Layout extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + }; + + static displayName = 'StyleLayoutSetter'; + + componentWillMount() { + + } + + // shouldComponentUpdate() { + // return false; + // } + + componentWillUnmount() { + + } + + render() { + const className = classNames('vs-style-layout', this.props.className); + const aFlexBox = isFlexBox(this.props); + const aFlexItem = inFlexBox(this.props.node); + + return ( +
+ + + + {aFlexBox && ( + + + + )} + {/* todo: aFlexItem && + + */} + + + + + + + + + + + + {/* todo: + {advanced && + + } + */} +
+ ); + } +} + +export default Layout; diff --git a/packages/editor-setters/src/style-setter/lc-style-setter/layout/padding+margin.js b/packages/editor-setters/src/style-setter/lc-style-setter/layout/padding+margin.js new file mode 100644 index 000000000..a1d4a7b34 --- /dev/null +++ b/packages/editor-setters/src/style-setter/lc-style-setter/layout/padding+margin.js @@ -0,0 +1,504 @@ +import React, { Component, PropTypes } from 'react'; +import classNames from 'classnames'; +import Icons, { Button } from '@ali/ve-icons'; +import utils from '../utils'; +import $i18n from '../i18n/index'; + +function diplayValue(value) { + if (utils.isEmptyCssValue(value)) { + return $i18n.get({ id: 'styleAir', dm: '空' }); + } + + const m = /^(.+)px/.exec(value); + if (m) { + return m[1]; + } + + return value; +} + +class Input extends Component { + componentDidMount() { + if (this.input) { + this.input.select(); + } + } + + render() { + return ( + { + this.input = ref; + }} + {...this.props} + /> + ); + } +} + +class InlineInput extends Component { + static propTypes = { + className: PropTypes.string, + value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + + inheritValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + + onChange: PropTypes.func, + negtive: PropTypes.bool, + compute: PropTypes.func, + highlight: PropTypes.bool, + }; + + static defaultProps = { + compute() { + return '0px'; + }, + highlight: false, + }; + + constructor(props) { + super(props); + + this.state = { + value: '', + editing: false, + }; + + this.pattern = this.props.negtive + ? /^(-?\d+(?:\.\d+)?)(px|rem|em|%|pt)?$|^auto$/i + : /^(\d+(?:\.\d+)?)(px|rem|em|%|pt)?$|^auto$/i; + } + + componentWillReceiveProps(nextProps) { + if (nextProps.value !== this.props.value) { + this.setState({ value: utils.isEmptyCssValue(nextProps.value) ? '' : nextProps.value }); + } + } + + setValue(value) { + this.setState({ value }); + if (this.isValid(value) && this.props.onChange) { + this.props.onChange(value.trim()); + } + } + + isValid(value) { + return value.trim() === '' || this.pattern.test(value); + } + + keyDown(e) { + if (e.keyCode === 27 || e.keyCode === 13) { + this.exitEdit(); + e.preventDefault(); + return; + } + if (e.keyCode !== 38 && e.keyCode !== 40) { + return; + } + e.preventDefault(); + + const factor = e.keyCode === 40 ? -1 : 1; + let value = e.target.value.trim(); + if (!this.isValid(value)) { + value = utils.isEmptyCssValue(this.props.value) ? this.props.inheritValue : this.props.value; + } + + if (utils.isEmptyCssValue(value) || value.toLowerCase() === 'auto') { + value = this.props.compute(value); + } + + const m = this.pattern.exec(value); + if (!m[1]) return; + let n = parseFloat(m[1]) + factor; + if (!this.props.negtive && n < 0) { + n = 0; + } + this.setValue(`${n}${m[2] || 'px'}`); + } + + exitEdit() { + if (!/\D+$/.test(this.state.value)) { + this.setValue(`${this.state.value}px`); + } else if (!this.pattern.test(this.state.value)) { + this.setValue(`${/\d+/.exec(this.state.value)[0]}px`); + } + + this.setState({ + editing: false, + }); + } + + enterEdit() { + this.setState({ + editing: true, + value: utils.isEmptyCssValue(this.props.value) ? '' : this.props.value, + }); + } + + render() { + const { value, inheritValue, highlight } = this.props; + const className = classNames('vs-inline-input', this.props.className, { + 've-highlight': highlight, + }); + + const display = diplayValue(utils.isEmptyCssValue(value) ? inheritValue : value); + + return ( +
+ {!this.state.editing && ( + + {display} + + )} + {this.state.editing && ( + this.setValue(e.target.value)} + onKeyDown={this.keyDown.bind(this)} + onBlur={this.exitEdit.bind(this)} + /> + )} +
+ ); + } +} + +function spliteMargin(all) { + if (!all) { + return { + top: null, + right: null, + bottom: null, + left: null, + }; + } + let [top, right, bottom, left] = all.trim().split(/\s+/); // eslint-disable-line + if (utils.isEmptyCssValue(right)) { + right = top; + } + if (utils.isEmptyCssValue(bottom)) { + bottom = top; + } + if (utils.isEmptyCssValue(left)) { + left = right; + } + return { + top, right, bottom, left, + }; +} + +function compositeMargin(all, top, right, bottom, left) { + const ret = spliteMargin(all); + + if (!utils.isEmptyCssValue(top)) { + ret.top = top; + } + if (!utils.isEmptyCssValue(right)) { + ret.right = right; + } + if (!utils.isEmptyCssValue(bottom)) { + ret.bottom = bottom; + } + if (!utils.isEmptyCssValue(left)) { + ret.left = left; + } + + return ret; +} + +function isFull(box) { + return ( + !utils.isEmptyCssValue(box.top) + && !utils.isEmptyCssValue(box.right) + && !utils.isEmptyCssValue(box.bottom) + && !utils.isEmptyCssValue(box.left) + ); +} + +class LayoutBox extends Component { + static propTypes = { + prop: PropTypes.object, + className: PropTypes.string, + name: PropTypes.string, + negtive: PropTypes.bool, + }; + + constructor(props) { + super(props); + + this.pattern = this.props.negtive + ? /^(-?\d+(?:\.\d+)?)(px|rem|em|%|pt)?$|^auto$/i + : /^(\d+(?:\.\d+)?)(px|rem|em|%|pt)?$|^auto$/i; + } + + componentDidMount() { + this.shell.addEventListener('mousedown', (e) => { + // todo: dragging & interval add + const t = e.target; + if (t.dataset && t.dataset.handle) { + this.add(t.dataset.handle); + } + }); + } + + add(dir, factor = 1) { + if (!this.current || !this.inherit) return; + let value = utils.isEmptyCssValue(this.current[dir]) ? this.inherit[dir] : this.current[dir]; + + if (utils.isEmptyCssValue(value) || value.toLowerCase() === 'auto') { + value = this.compute(dir); + } + + const m = this.pattern.exec(value); + if (!m[1]) return; + let n = parseFloat(m[1]) + factor; + if (!this.props.negtive && n < 0) { + n = 0; + } + this.change(this.current, dir, `${n}${m[2] || 'px'}`); + } + + change(box, dir, val) { + const { name } = this.props; + box[dir] = val; + if (isFull(box)) { + utils.setPropertyValue( + this.props, + { + [name]: `${box.top} ${box.right} ${box.bottom} ${box.left}`, + [`${name}-top`]: null, + [`${name}-right`]: null, + [`${name}-bottom`]: null, + [`${name}-left`]: null, + }, + ); + } else { + utils.setPropertyValue( + this.props, + { + [name]: null, + [`${name}-top`]: box.top, + [`${name}-right`]: box.right, + [`${name}-bottom`]: box.bottom, + [`${name}-left`]: box.left, + }, + ); + } + } + + compute(dir) { + const { name, node } = this.props; + // if (external) { + // return getComputePropertyValue(node, `${name}-${dir}`); + // } + return '0px'; + } + + render() { + const { + name, negtive, + } = this.props; + + const all = utils.getPropertyValue(this.props, name); + const top = utils.getPropertyValue(this.props, `${name}-top`); + const right = utils.getPropertyValue(this.props, `${name}-right`); + const bottom = utils.getPropertyValue(this.props, `${name}-bottom`); + const left = utils.getPropertyValue(this.props, `${name}-left`); + + const current = compositeMargin( + all.current, + top.current, + right.current, + bottom.current, + left.current, + ); + + const inherit = compositeMargin( + all.inherit, + top.inherit, + right.inherit, + bottom.inherit, + left.inherit, + ); + + this.current = current; + this.inherit = inherit; + + return ( +
{ + this.shell = ref; + }} + > +
+ +
+ this.compute('top')} + negtive={negtive} + highlight={current.top != undefined} + onChange={val => this.change(current, 'top', val)} + /> + +
+ +
+ this.compute('right')} + onChange={val => this.change(current, 'right', val)} + /> + +
+ {name} + +
+ this.compute('bottom')} + onChange={val => this.change(current, 'bottom', val)} + /> + +
+ +
+ this.compute('left')} + onChange={val => this.change(current, 'left', val)} + /> +
+ ); + } +} + +class MarginAuto extends Component { + static propTypes = { + prop: PropTypes.object, + }; + + setAuto(box) { + box.left = 'auto'; + box.right = 'auto'; + if (isFull(box)) { + utils.setPropertyValue( + this.props, + { + margin: `${box.top} ${box.right} ${box.bottom} ${box.left}`, + 'margin-top': null, + 'margin-right': null, + 'margin-bottom': null, + 'margin-left': null, + }, + ); + } else { + utils.setPropertyValue( + this.props, + { + margin: null, + 'margin-top': box.top, + 'margin-right': box.right, + 'margin-bottom': box.bottom, + 'margin-left': box.left, + }, + ); + } + } + + render() { + const all = utils.getPropertyValue(this.props, 'margin'); + const top = utils.getPropertyValue(this.props, 'margin-top'); + const bottom = utils.getPropertyValue(this.props, 'margin-bottom'); + const right = utils.getPropertyValue(this.props, 'margin-right'); + const left = utils.getPropertyValue(this.props, 'margin-left'); + + const current = compositeMargin( + all.current, + top.current, + right.current, + bottom.current, + left.current, + ); + + const inherit = compositeMargin( + all.inherit, + top.inherit, + right.inherit, + bottom.inherit, + left.inherit, + ); + + const eright = utils.isEmptyCssValue(current.right) ? inherit.right : current.right; + const eleft = utils.isEmptyCssValue(current.left) ? inherit.left : current.left; + + const className = classNames('vs-margin-auto', { + 've-active': eright === 'auto' && eleft === 'auto', + }); + + return ( +