diff --git a/client/packages/lowcoder-design/src/components/Section.tsx b/client/packages/lowcoder-design/src/components/Section.tsx index cad6e8bf0..77ab6fa61 100644 --- a/client/packages/lowcoder-design/src/components/Section.tsx +++ b/client/packages/lowcoder-design/src/components/Section.tsx @@ -146,6 +146,7 @@ export const sectionNames = { layout: trans("prop.layout"), style: trans("prop.style"), labelStyle:trans("prop.labelStyle"), + animationStyle:trans("prop.animationStyle"), data: trans("prop.data"), meetings: trans("prop.meetings"), // added by Falk Wolsky field: trans("prop.field"), diff --git a/client/packages/lowcoder-design/src/i18n/design/locales/en.ts b/client/packages/lowcoder-design/src/i18n/design/locales/en.ts index b15621be1..4ca204e55 100644 --- a/client/packages/lowcoder-design/src/i18n/design/locales/en.ts +++ b/client/packages/lowcoder-design/src/i18n/design/locales/en.ts @@ -23,6 +23,7 @@ export const en = { advanced: "Advanced", validation: "Validation", layout: "Layout", + animationStyle:"Animation Style", labelStyle: "Label Style", style: "Style", meetings: "Meeting Settings", diff --git a/client/packages/lowcoder-design/src/icons/index.ts b/client/packages/lowcoder-design/src/icons/index.ts index bac14e692..fbf2eb143 100644 --- a/client/packages/lowcoder-design/src/icons/index.ts +++ b/client/packages/lowcoder-design/src/icons/index.ts @@ -161,6 +161,10 @@ export { ReactComponent as ResetIcon } from "./icon-style-reset.svg"; export { ReactComponent as EditIcon } from "./icon-edit.svg"; export { ReactComponent as EditableIcon } from "./icon-editable.svg"; export { ReactComponent as LeftStateIcon } from "./remix/node-tree.svg"; +export {ReactComponent as StarSmileIcon} from "./remix/star-smile-line.svg"; +export {ReactComponent as Timer2Icon} from "./remix/timer-2-line.svg"; +export {ReactComponent as TimerFlashIcon} from "./remix/timer-flash-line.svg"; +export {ReactComponent as RefreshLineIcon} from "./remix/refresh-line.svg"; export { ReactComponent as LeftSettingIcon } from "./remix/tools-fill.svg"; export { ReactComponent as LeftLayersIcon } from "./remix/stack-line.svg"; export { ReactComponent as LeftHelpIcon } from "./icon-left-help.svg"; diff --git a/client/packages/lowcoder/package.json b/client/packages/lowcoder/package.json index 62560576b..269e4beef 100644 --- a/client/packages/lowcoder/package.json +++ b/client/packages/lowcoder/package.json @@ -36,6 +36,7 @@ "@types/react-signature-canvas": "^1.0.2", "@types/react-test-renderer": "^18.0.0", "@types/react-virtualized": "^9.21.21", + "animate.css": "^4.1.1", "antd": "5.13.2", "axios": "^1.6.2", "buffer": "^6.0.3", diff --git a/client/packages/lowcoder/src/api/commonSettingApi.ts b/client/packages/lowcoder/src/api/commonSettingApi.ts index 48a17cc2a..135794440 100644 --- a/client/packages/lowcoder/src/api/commonSettingApi.ts +++ b/client/packages/lowcoder/src/api/commonSettingApi.ts @@ -44,10 +44,17 @@ export interface ThemeDetail { primarySurface: string; // comp bg-color borderRadius: string; chart?: string; - margin?: string; + margin?: string; padding?: string; gridColumns?: string; //Added By Aqib Mirza textSize?: string; + animation?: string; + animationDelay?: string; + animationDuration?: string; + opacity?: string; + boxShadow?: string; + boxShadowColor?: string; + animationIterationCount?: string; } export function getThemeDetailName(key: keyof ThemeDetail) { diff --git a/client/packages/lowcoder/src/comps/comps/autoCompleteComp/autoCompleteComp.tsx b/client/packages/lowcoder/src/comps/comps/autoCompleteComp/autoCompleteComp.tsx index ae6fb9457..d639d2fc7 100644 --- a/client/packages/lowcoder/src/comps/comps/autoCompleteComp/autoCompleteComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/autoCompleteComp/autoCompleteComp.tsx @@ -3,6 +3,7 @@ import { Input, Section, sectionNames } from "lowcoder-design"; import { BoolControl } from "comps/controls/boolControl"; import { styleControl } from "comps/controls/styleControl"; import { + AnimationStyle, InputFieldStyle, InputLikeStyle, InputLikeStyleType, @@ -62,6 +63,7 @@ const InputStyle = styled(Input)<{ $style: InputLikeStyleType }>` ${getStyle(props.$style)} input { padding: ${props.style?.padding}; + rotate: ${props?.$style?.rotation}; } .ant-select-single { width: 100% !important; @@ -89,6 +91,7 @@ const childrenMap = { componentSize: dropdownControl(componentSize, "small"), valueInItems: booleanExposingStateControl("valueInItems"), inputFieldStyle: styleControl(InputLikeStyle), + animationStyle: styleControl(AnimationStyle), }; const getValidate = (value: any): "" | "warning" | "error" | undefined => { @@ -283,6 +286,7 @@ let AutoCompleteCompBase = (function () { style: props.style, labelStyle: props.labelStyle, inputFieldStyle:props.inputFieldStyle, + animationStyle: props.animationStyle, ...validateState, }); }) @@ -347,6 +351,9 @@ let AutoCompleteCompBase = (function () {
{children.inputFieldStyle.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
); }) diff --git a/client/packages/lowcoder/src/comps/comps/buttonComp/linkComp.tsx b/client/packages/lowcoder/src/comps/comps/buttonComp/linkComp.tsx index 274a29e13..f4e1d2933 100644 --- a/client/packages/lowcoder/src/comps/comps/buttonComp/linkComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/buttonComp/linkComp.tsx @@ -3,7 +3,7 @@ import { ButtonCompWrapper, buttonRefMethods } from "comps/comps/buttonComp/butt import { BoolCodeControl, StringControl } from "comps/controls/codeControl"; import { ButtonEventHandlerControl } from "comps/controls/eventHandlerControl"; import { styleControl } from "comps/controls/styleControl"; -import { LinkStyle, LinkStyleType } from "comps/controls/styleControlConstants"; +import { AnimationStyle, AnimationStyleType, LinkStyle, LinkStyleType } from "comps/controls/styleControlConstants"; import { withDefault } from "comps/generators"; import { migrateOldData } from "comps/generators/simpleGenerators"; import { UICompBuilder } from "comps/generators/uiCompBuilder"; @@ -23,7 +23,11 @@ import { RefControl } from "comps/controls/refControl"; import { EditorContext } from "comps/editorState"; import React, { useContext } from "react"; -const Link = styled(Button) <{ $style: LinkStyleType }>` +const Link = styled(Button)<{ + $style: LinkStyleType; + $animationStyle: AnimationStyleType; +}>` + ${(props) => props.$animationStyle} ${(props) => ` color: ${props.$style.text}; margin: ${props.$style.margin}; @@ -81,6 +85,7 @@ const LinkTmpComp = (function () { disabled: BoolCodeControl, loading: BoolCodeControl, style: migrateOldData(styleControl(LinkStyle), fixOldData), + animationStyle:styleControl(AnimationStyle), prefixIcon: IconControl, suffixIcon: IconControl, viewRef: RefControl, @@ -91,6 +96,7 @@ const LinkTmpComp = (function () { return (
{children.style.getPropertyView()}
+ <> +
{children.style.getPropertyView()}
+
{children.animationStyle.getPropertyView()}
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/buttonComp/toggleButtonComp.tsx b/client/packages/lowcoder/src/comps/comps/buttonComp/toggleButtonComp.tsx index edfab9222..868e2ebae 100644 --- a/client/packages/lowcoder/src/comps/comps/buttonComp/toggleButtonComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/buttonComp/toggleButtonComp.tsx @@ -15,7 +15,11 @@ import { Button100, ButtonCompWrapper, buttonRefMethods } from "./buttonCompCons import { IconControl } from "comps/controls/iconControl"; import { AlignWithStretchControl, LeftRightControl } from "comps/controls/dropdownControl"; import { booleanExposingStateControl } from "comps/controls/codeStateControl"; -import { ToggleButtonStyle } from "comps/controls/styleControlConstants"; +import { + AnimationStyle, + AnimationStyleType, + ToggleButtonStyle, +} from "comps/controls/styleControlConstants"; import { styleControl } from "comps/controls/styleControl"; import { BoolControl } from "comps/controls/boolControl"; import { RefControl } from "comps/controls/refControl"; @@ -29,7 +33,9 @@ const IconWrapper = styled.div` const ButtonCompWrapperStyled = styled(ButtonCompWrapper)<{ $align: "left" | "center" | "right" | "stretch"; $showBorder: boolean; + $animationStyle: AnimationStyleType; }>` + ${(props) => props.$animationStyle} width: 100%; display: flex; justify-content: ${(props) => props.$align}; @@ -55,7 +61,8 @@ const ToggleTmpComp = (function () { iconPosition: LeftRightControl, alignment: AlignWithStretchControl, style: styleControl(ToggleButtonStyle), - showBorder: withDefault(BoolControl, true), + animationStyle: styleControl(AnimationStyle), + showBorder: withDefault(BoolControl, true), viewRef: RefControl, }; return new UICompBuilder(childrenMap, (props) => { @@ -67,6 +74,7 @@ const ToggleTmpComp = (function () { disabled={props.disabled} $align={props.alignment} $showBorder={props.showBorder} + $animationStyle={props.animationStyle} > )} - {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( - <>
- {children.showBorder.propertyView({ label: trans("toggleButton.showBorder") })} - {children.style.getPropertyView()} -
- )} - + {(useContext(EditorContext).editorModeStatus === "layout" || + useContext(EditorContext).editorModeStatus === "both") && ( + <> +
+ {children.showBorder.propertyView({ + label: trans("toggleButton.showBorder"), + })} + {children.style.getPropertyView()} +
+
+ {children.animationStyle.getPropertyView()} +
+ + )} + )) .setExposeMethodConfigs(buttonRefMethods) diff --git a/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx b/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx index 74857007c..0ec885664 100644 --- a/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx @@ -31,6 +31,7 @@ import { EditorContext } from "comps/editorState"; // Introducing styles import { + AnimationStyle, CommentStyle, heightCalculator, widthCalculator, @@ -100,6 +101,7 @@ const childrenMap = { }), onEvent: eventHandlerControl(EventOptions), style: styleControl(CommentStyle), + animationStyle: styleControl(AnimationStyle), commentList: jsonValueExposingStateControl("commentList", []), deletedItem: jsonValueExposingStateControl("deletedItem", []), submitedItem: jsonValueExposingStateControl("submitedItem", []), @@ -125,6 +127,7 @@ const CommentCompBase = ( userInfo, placeholder, deleteAble, + animationStyle, } = props; type PrefixType = "@" | keyof typeof mentionList; // Used to save the consolidated list of mentions @@ -233,7 +236,11 @@ const CommentCompBase = ( width: widthCalculator(style.margin ?? "3px"), height: heightCalculator(style.margin ?? "3px"), background: style.background, - borderRadius: style.radius, + borderRadius: style.radius, + animation: animationStyle.animation, + animationDelay: animationStyle.animationDelay, + animationDuration: animationStyle.animationDuration, + animationIterationCount:animationStyle.animationIterationCount }}>
+
+
{children.style.getPropertyView()} +
+
+ {children.animationStyle.getPropertyView()}
)} diff --git a/client/packages/lowcoder/src/comps/comps/containerComp/cardComp.tsx b/client/packages/lowcoder/src/comps/comps/containerComp/cardComp.tsx index d8784192c..66991fb83 100644 --- a/client/packages/lowcoder/src/comps/comps/containerComp/cardComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/containerComp/cardComp.tsx @@ -13,7 +13,7 @@ import { useContext, useEffect, useRef, useState } from "react"; import { EditorContext } from "comps/editorState"; import { Card } from "antd"; import styled from "styled-components"; -import { CardHeaderStyle, CardHeaderStyleType, CardStyle, CardStyleType } from "comps/controls/styleControlConstants"; +import { AnimationStyle, AnimationStyleType, CardHeaderStyle, CardHeaderStyleType, CardStyle, CardStyleType } from "comps/controls/styleControlConstants"; import { MultiCompBuilder, withDefault } from "comps/generators"; import { IconControl } from "comps/controls/iconControl"; import { ButtonEventHandlerControl, CardEventHandlerControl, clickEvent, refreshEvent } from "comps/controls/eventHandlerControl"; @@ -22,7 +22,14 @@ import { dropdownControl } from "comps/controls/dropdownControl"; import { styleControl } from "comps/controls/styleControl"; const { Meta } = Card; -const Warpper = styled.div<{ $style: CardStyleType | undefined, $showMate: boolean, $cardType: string, $headerStyle:CardHeaderStyleType, $bodyStyle:CardHeaderStyleType }>` +const Warpper = styled.div<{ + $style: CardStyleType | undefined; + $showMate: boolean; + $cardType: string; + $headerStyle: CardHeaderStyleType; + $bodyStyle: CardHeaderStyleType; + $animationStyle:AnimationStyleType; +}>` height: 100%; width: 100%; .ant-card-small >.ant-card-head { @@ -70,6 +77,7 @@ const Warpper = styled.div<{ $style: CardStyleType | undefined, $showMate: boole border-style: ${props => props.$style?.borderStyle}; border-radius: ${props => props.$style?.radius}; border-width: ${props => props.$style?.borderWidth}; + ${props=>props.$animationStyle} } .ant-card-body { display: ${props => props.$showMate ? '' : 'none'}; @@ -173,6 +181,7 @@ export const ContainerBaseComp = (function () { style: styleControl(CardStyle), headerStyle: styleControl(CardHeaderStyle), bodyStyle: styleControl(CardHeaderStyle), + animationStyle: styleControl(AnimationStyle), }; return new ContainerCompBuilder(childrenMap, (props, dispatch) => { @@ -202,6 +211,7 @@ export const ContainerBaseComp = (function () { {children.bodyStyle.getPropertyView()} +
+ {children.animationStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/containerComp/containerComp.tsx b/client/packages/lowcoder/src/comps/comps/containerComp/containerComp.tsx index d088a51c0..9005d7de2 100644 --- a/client/packages/lowcoder/src/comps/comps/containerComp/containerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/containerComp/containerComp.tsx @@ -16,10 +16,12 @@ import { BoolCodeControl } from "comps/controls/codeControl"; import { DisabledContext } from "comps/generators/uiCompBuilder"; import React, { useContext } from "react"; import { EditorContext } from "comps/editorState"; +import { AnimationStyle, styleControl } from "@lowcoder-ee/index.sdk"; export const ContainerBaseComp = (function () { const childrenMap = { disabled: BoolCodeControl, + animationStyle: styleControl(AnimationStyle), }; return new ContainerCompBuilder(childrenMap, (props, dispatch) => { return ( diff --git a/client/packages/lowcoder/src/comps/comps/containerComp/pageLayoutComp.tsx b/client/packages/lowcoder/src/comps/comps/containerComp/pageLayoutComp.tsx index 489398a94..5164cd7dd 100644 --- a/client/packages/lowcoder/src/comps/comps/containerComp/pageLayoutComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/containerComp/pageLayoutComp.tsx @@ -18,11 +18,12 @@ import { ContainerCompBuilder, } from "../pageLayoutComp/pageLayoutCompBuilder"; import { PageLayout } from "../pageLayoutComp/pageLayout"; - +import { AnimationStyle, styleControl } from "@lowcoder-ee/index.sdk"; export const ContainerBaseComp = (function () { - const childrenMap = { - disabled: BoolCodeControl + const childrenMap = { + disabled: BoolCodeControl, + animationStyle: styleControl(AnimationStyle), }; return new ContainerCompBuilder(childrenMap, (props, dispatch) => { @@ -52,7 +53,10 @@ export const ContainerBaseComp = (function () {
{ children.container.stylePropertyView() } -
+ +
+ {children.animationStyle.getPropertyView()} +
{children.container.children.showHeader.getView() && (
{ children.container.headerStylePropertyView() } diff --git a/client/packages/lowcoder/src/comps/comps/containerComp/textContainerComp.tsx b/client/packages/lowcoder/src/comps/comps/containerComp/textContainerComp.tsx index 6681a9635..1edf9c97b 100644 --- a/client/packages/lowcoder/src/comps/comps/containerComp/textContainerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/containerComp/textContainerComp.tsx @@ -20,7 +20,7 @@ import { TriContainer } from "../triContainerComp/triFloatTextContainer"; import { dropdownControl } from "comps/controls/dropdownControl"; import { withDefault } from "comps/generators/simpleGenerators"; import { styleControl } from "comps/controls/styleControl"; -import { TextStyle } from "comps/controls/styleControlConstants"; +import { AnimationStyle, TextStyle } from "comps/controls/styleControlConstants"; import { useContext } from "react"; import { EditorContext } from "comps/editorState"; import { alignWithJustifyControl } from "comps/controls/alignControl"; @@ -63,6 +63,7 @@ export const ContainerBaseComp = (function () { horizontalAlignment: alignWithJustifyControl(), width: withDefault(StringControl, "40"), style: styleControl(TextStyle), + animationStyle: styleControl(AnimationStyle), }; return new ContainerCompBuilder(childrenMap, (props, dispatch) => { return ; @@ -95,6 +96,9 @@ export const ContainerBaseComp = (function () {
{children.style.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
{children.container.stylePropertyView()}
diff --git a/client/packages/lowcoder/src/comps/comps/dateComp/dateComp.tsx b/client/packages/lowcoder/src/comps/comps/dateComp/dateComp.tsx index f3182b38f..cbe85cd22 100644 --- a/client/packages/lowcoder/src/comps/comps/dateComp/dateComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/dateComp/dateComp.tsx @@ -20,7 +20,7 @@ import { UICompBuilder, withDefault } from "../../generators"; import { CommonNameConfig, depsConfig, withExposingConfigs } from "../../generators/withExposing"; import { formDataChildren, FormDataPropertyView } from "../formComp/formDataConstants"; import { styleControl } from "comps/controls/styleControl"; -import { DateTimeStyle, DateTimeStyleType, InputFieldStyle, LabelStyle } from "comps/controls/styleControlConstants"; +import { AnimationStyle, DateTimeStyle, DateTimeStyleType, InputFieldStyle, LabelStyle } from "comps/controls/styleControlConstants"; import { withMethodExposing } from "../../generators/withMethodExposing"; import { disabledPropertyView, @@ -77,6 +77,7 @@ const commonChildren = { minuteStep: RangeControl.closed(1, 60, 1), secondStep: RangeControl.closed(1, 60, 1), style: styleControl(InputFieldStyle), + animationStyle: styleControl(AnimationStyle), labelStyle: styleControl(LabelStyle.filter((style) => ['accent', 'validate'].includes(style.name) === false)), suffixIcon: withDefault(IconControl, "/icon:regular/calendar"), ...validationChildren, @@ -174,6 +175,7 @@ export const datePickerControl = new UICompBuilder(childrenMap, (props) => { style: props.style, labelStyle: props.labelStyle, inputFieldStyle:props.inputFieldStyle, + animationStyle:props.animationStyle, children: ( {
{children.inputFieldStyle.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/dividerComp.tsx b/client/packages/lowcoder/src/comps/comps/dividerComp.tsx index 338ae6d7f..42f0307ea 100644 --- a/client/packages/lowcoder/src/comps/comps/dividerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/dividerComp.tsx @@ -8,7 +8,7 @@ import { Section, sectionNames } from "lowcoder-design"; import _ from "lodash"; import styled from "styled-components"; import { styleControl } from "comps/controls/styleControl"; -import { DividerStyle, DividerStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; +import { AnimationStyle, AnimationStyleType, DividerStyle, DividerStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; import { migrateOldData } from "comps/generators/simpleGenerators"; import { hiddenPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; @@ -16,7 +16,11 @@ import { trans } from "i18n"; import { useContext } from "react"; import { EditorContext } from "comps/editorState"; -type IProps = DividerProps & { $style: DividerStyleType; dashed: boolean }; +type IProps = DividerProps & { + $style: DividerStyleType; + dashed: boolean; + $animationStyle:AnimationStyleType; +}; // TODO: find out how to set border style when text is active // TODO: enable type "vertical" https://ant.design/components/divider @@ -34,6 +38,7 @@ const StyledDivider = styled(Divider) ` text-decoration:${(props)=>props.$style.textDecoration}; font-style:${(props) => props.$style.fontStyle} } + ${props=>props.$animationStyle} min-width: 0; width: ${(props) => { return widthCalculator(props.$style.margin); @@ -66,6 +71,7 @@ const childrenMap = { dashed: BoolControl, align: alignControl(), style: styleControl(DividerStyle), + animationStyle: styleControl(AnimationStyle), }; function fixOldStyleData(oldData: any) { @@ -87,7 +93,12 @@ function fixOldStyleData(oldData: any) { export const DividerComp = migrateOldData( new UICompBuilder(childrenMap, (props) => { return ( - + {props.title} ); @@ -118,6 +129,9 @@ export const DividerComp = migrateOldData( {children.dashed.propertyView({ label: trans("divider.dashed") })} {children.style.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/formComp/formComp.tsx b/client/packages/lowcoder/src/comps/comps/formComp/formComp.tsx index 9201b4f23..3b231b4b7 100644 --- a/client/packages/lowcoder/src/comps/comps/formComp/formComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/formComp/formComp.tsx @@ -58,6 +58,7 @@ import { DisabledContext } from "comps/generators/uiCompBuilder"; import { default as LoadingOutlined } from "@ant-design/icons/LoadingOutlined"; import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; import { styled } from "styled-components"; +import { AnimationStyle, styleControl } from "@lowcoder-ee/index.sdk"; const FormWrapper = styled.div` height: 100%; @@ -78,6 +79,7 @@ const childrenMap = { disableSubmit: BoolCodeControl, loading: BoolCodeControl, onEvent: eventHandlerControl(eventOptions), + animationStyle:styleControl(AnimationStyle) }; type FormProps = TriContainerViewProps & @@ -235,6 +237,9 @@ const FormBaseComp = (function () {
{children.container.stylePropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
{children.container.children.showHeader.getView() && (
{ children.container.headerStylePropertyView() } diff --git a/client/packages/lowcoder/src/comps/comps/jsonComp/jsonEditorComp.tsx b/client/packages/lowcoder/src/comps/comps/jsonComp/jsonEditorComp.tsx index 6663d527e..33995353c 100644 --- a/client/packages/lowcoder/src/comps/comps/jsonComp/jsonEditorComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/jsonComp/jsonEditorComp.tsx @@ -9,7 +9,7 @@ import { hiddenPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; import { LabelControl } from "comps/controls/labelControl"; import { formDataChildren, FormDataPropertyView } from "../formComp/formDataConstants"; -import { JsonEditorStyle } from "comps/controls/styleControlConstants"; +import { AnimationStyle, JsonEditorStyle } from "comps/controls/styleControlConstants"; import { styleControl } from "comps/controls/styleControl"; import { migrateOldData, withDefault } from "comps/generators/simpleGenerators"; import { useRef, useEffect, useContext } from "react"; @@ -66,6 +66,7 @@ const childrenMap = { onEvent: ChangeEventHandlerControl, label: withDefault(LabelControl, { position: "column" }), style: styleControl(JsonEditorStyle), + animationStyle: styleControl(AnimationStyle), ...formDataChildren, }; @@ -117,6 +118,7 @@ let JsonEditorTmpComp = (function () { } return props.label({ style: props.style, + animationStyle: props.animationStyle, children: (editContent.current = "focus")} />, }); }) @@ -138,7 +140,10 @@ let JsonEditorTmpComp = (function () { {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( children.label.getPropertyView() )} {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( + <>
{children.style.getPropertyView()}
+
{children.animationStyle.getPropertyView()}
+ )} diff --git a/client/packages/lowcoder/src/comps/comps/jsonComp/jsonExplorerComp.tsx b/client/packages/lowcoder/src/comps/comps/jsonComp/jsonExplorerComp.tsx index ee317c13c..c0ed71fae 100644 --- a/client/packages/lowcoder/src/comps/comps/jsonComp/jsonExplorerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/jsonComp/jsonExplorerComp.tsx @@ -11,6 +11,7 @@ import { hiddenPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; import { EditorContext } from "comps/editorState"; import { useContext } from "react"; +import { AnimationStyle, AnimationStyleType, styleControl } from "@lowcoder-ee/index.sdk"; /** * JsonExplorer Comp @@ -34,7 +35,11 @@ const bgColorMap = { flat: "#2c3e50", }; -const JsonExplorerContainer = styled.div<{ $theme: keyof typeof bgColorMap }>` +const JsonExplorerContainer = styled.div<{ + $theme: keyof typeof bgColorMap; + $animationStyle: AnimationStyleType; +}>` + ${(props) => props.$animationStyle} height: 100%; overflow-y: scroll; background-color: ${(props) => bgColorMap[props.$theme] || "#ffffff"}; @@ -48,10 +53,14 @@ let JsonExplorerTmpComp = (function () { value: withDefault(ArrayOrJSONObjectControl, JSON.stringify(defaultData, null, 2)), indent: withDefault(NumberControl, 4), expandToggle: BoolControl.DEFAULT_TRUE, - theme: dropdownControl(themeOptions, "shapeshifter:inverted"), + theme: dropdownControl(themeOptions, 'shapeshifter:inverted'), + animationStyle:styleControl(AnimationStyle), }; return new UICompBuilder(childrenMap, (props) => ( - + )} - {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( -
- {children.theme.propertyView({ - label: trans("jsonExplorer.theme"), - })} -
+ {(useContext(EditorContext).editorModeStatus === 'layout' || + useContext(EditorContext).editorModeStatus === 'both') && ( + <> +
+ {children.theme.propertyView({ + label: trans('jsonExplorer.theme'), + })} +
+
+ {children.animationStyle.getPropertyView()} +
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx b/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx index dfe00127f..021325ddf 100644 --- a/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx @@ -6,7 +6,7 @@ import { default as Button } from "antd/es/button"; import { BoolControl } from "comps/controls/boolControl"; import { jsonObjectExposingStateControl } from "comps/controls/codeStateControl"; import { styleControl } from "comps/controls/styleControl"; -import { JsonSchemaFormStyle, type JsonSchemaFormStyleType } from "comps/controls/styleControlConstants"; +import { AnimationStyle, AnimationStyleType, JsonSchemaFormStyle, type JsonSchemaFormStyleType } from "comps/controls/styleControlConstants"; import { depsConfig, NameConfigHidden, withExposingConfigs } from "comps/generators/withExposing"; import { withMethodExposing } from "comps/generators/withMethodExposing"; import type { ValueFromOption } from "lowcoder-design"; @@ -32,7 +32,11 @@ const Form = withTheme(Theme); const EventOptions = [submitEvent] as const; -const Container = styled.div<{ $style: JsonSchemaFormStyleType }>` +const Container = styled.div<{ + $style: JsonSchemaFormStyleType; + $animationStyle: AnimationStyleType; +}>` + ${(props) => props.$animationStyle} background: ${(props) => props.$style.background}; border: 1px solid ${(props) => props.$style.border}; padding: 15px; @@ -188,6 +192,7 @@ let FormBasicComp = (function () { data: jsonObjectExposingStateControl("data", i18nObjs.jsonForm.defaultFormData), onEvent: eventHandlerControl(EventOptions), style: styleControl(JsonSchemaFormStyle), + animationStyle: styleControl(AnimationStyle), }; return new UICompBuilder(childrenMap, (props) => { // rjsf 4.20 supports ui:submitButtonOptions, but if the button is customized, it will not take effect. Here we implement it ourselves @@ -196,7 +201,7 @@ let FormBasicComp = (function () { ] as UISchemaSubmitButtonOptions; return ( - +
{children.style.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
+ )} diff --git a/client/packages/lowcoder/src/comps/comps/navComp/navComp.tsx b/client/packages/lowcoder/src/comps/comps/navComp/navComp.tsx index 1e64730f9..b67f84127 100644 --- a/client/packages/lowcoder/src/comps/comps/navComp/navComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/navComp/navComp.tsx @@ -12,7 +12,11 @@ import { default as Dropdown } from "antd/es/dropdown"; import { default as Menu, MenuProps } from "antd/es/menu"; import { migrateOldData } from "comps/generators/simpleGenerators"; import { styleControl } from "comps/controls/styleControl"; -import { NavigationStyle } from "comps/controls/styleControlConstants"; +import { + AnimationStyle, + AnimationStyleType, + NavigationStyle, +} from "comps/controls/styleControlConstants"; import { hiddenPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; @@ -25,9 +29,13 @@ type IProps = { $borderColor: string; $borderWidth: string; $borderRadius: string; + $animationStyle:AnimationStyleType; }; -const Wrapper = styled("div") >` +const Wrapper = styled("div")< + Pick + >` +${props=>props.$animationStyle} height: 100%; border-radius: ${(props) => props.$borderRadius ? props.$borderRadius : '2px'}; box-sizing: border-box; @@ -127,6 +135,7 @@ const childrenMap = { logoEvent: withDefault(eventHandlerControl(logoEventHandlers), [{ name: "click" }]), horizontalAlignment: alignWithJustifyControl(), style: migrateOldData(styleControl(NavigationStyle), fixOldStyleData), + animationStyle: styleControl(AnimationStyle), items: withDefault(navListComp(), [ { label: trans("menuItem") + " 1", @@ -203,6 +212,7 @@ const NavCompBase = new UICompBuilder(childrenMap, (props) => { return ( {
)} - {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( -
- {children.style.getPropertyView()} -
+ {(useContext(EditorContext).editorModeStatus === "layout" || + useContext(EditorContext).editorModeStatus === "both") && ( + <> +
+ {children.style.getPropertyView()} +
+
+ {children.animationStyle.getPropertyView()} +
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/numberInputComp/numberInputComp.tsx b/client/packages/lowcoder/src/comps/comps/numberInputComp/numberInputComp.tsx index cd633ec48..7d7f3b1ec 100644 --- a/client/packages/lowcoder/src/comps/comps/numberInputComp/numberInputComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/numberInputComp/numberInputComp.tsx @@ -30,7 +30,7 @@ import { formDataChildren, FormDataPropertyView } from "../formComp/formDataCons import { withMethodExposing, refMethods } from "../../generators/withMethodExposing"; import { RefControl } from "../../controls/refControl"; import { styleControl } from "comps/controls/styleControl"; -import { InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; +import { AnimationStyle, InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; import { disabledPropertyView, hiddenPropertyView, @@ -258,8 +258,9 @@ const childrenMap = { onEvent: InputEventHandlerControl, viewRef: RefControl, style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), - labelStyle:styleControl(LabelStyle), - prefixText : stringExposingStateControl("defaultValue"), + labelStyle: styleControl(LabelStyle), + animationStyle: styleControl(AnimationStyle), + prefixText: stringExposingStateControl('defaultValue'), prefixIcon: IconControl, inputFieldStyle: withDefault(styleControl(InputLikeStyle), {borderWidth: '1px'}) , // validation @@ -384,6 +385,7 @@ let NumberInputTmpComp = (function () { style: props.style, labelStyle: props.labelStyle, inputFieldStyle:props.inputFieldStyle, + animationStyle:props.animationStyle, ...validate(props), }); }) @@ -442,6 +444,9 @@ let NumberInputTmpComp = (function () {
{children.inputFieldStyle.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/numberInputComp/rangeSliderComp.tsx b/client/packages/lowcoder/src/comps/comps/numberInputComp/rangeSliderComp.tsx index ee4f545c2..e6e92f8ee 100644 --- a/client/packages/lowcoder/src/comps/comps/numberInputComp/rangeSliderComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/numberInputComp/rangeSliderComp.tsx @@ -19,6 +19,7 @@ const RangeSliderBasicComp = (function () { style: props.style, labelStyle: props.labelStyle, inputFieldStyle:props.inputFieldStyle, + animationStyle:props.animationStyle, children: ( ['accent','validate'].includes(style.name) === false)), prefixIcon: IconControl, suffixIcon: IconControl, - inputFieldStyle:styleControl(SliderStyle) + inputFieldStyle:styleControl(SliderStyle), + animationStyle:styleControl(AnimationStyle) }; export const SliderPropertyView = ( @@ -109,6 +110,9 @@ export const SliderPropertyView = (
{children.inputFieldStyle.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx index 2e859ba9a..3d3e2aa72 100644 --- a/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx +++ b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx @@ -1,4 +1,4 @@ -import { ContainerStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; +import { AnimationStyleType, ContainerStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; import { EditorContext } from "comps/editorState"; import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; import { HintPlaceHolder, ScrollBar } from "lowcoder-design"; @@ -38,13 +38,14 @@ const getStyle = (style: ContainerStyleType) => { `; }; -const Wrapper = styled.div<{ $style: ContainerStyleType }>` +const Wrapper = styled.div<{ $style: ContainerStyleType,$animationStyle:AnimationStyleType }>` display: flex; flex-flow: column; height: 100%; border: 1px solid #d7d9e0; border-radius: 4px; ${(props) => props.$style && getStyle(props.$style)} + ${props=>props.$animationStyle} `; const HeaderInnerGrid = styled(InnerGrid)<{ @@ -109,11 +110,12 @@ const FooterInnerGrid = styled(InnerGrid)<{ export type LayoutProps = LayoutViewProps & { hintPlaceholder?: ReactNode; + animationStyle:AnimationStyleType; }; export function PageLayout(props: LayoutProps & { siderCollapsed: boolean; setSiderCollapsed: (collapsed: boolean) => void }) { - const { container, siderCollapsed, setSiderCollapsed } = props; + const {container, siderCollapsed, setSiderCollapsed, animationStyle} = props; const { showHeader, showFooter, showSider } = container; const { items: headerItems, ...otherHeaderProps } = container.header; const { items: bodyItems, ...otherBodyProps } = container.body["0"].children.view.getView(); @@ -152,7 +154,7 @@ export function PageLayout(props: LayoutProps & { siderCollapsed: boolean; setSi }, }} > - + {showSider && !container.innerSider && !container.siderRight && ( <> @@ -362,8 +364,7 @@ export function PageLayout(props: LayoutProps & { siderCollapsed: boolean; setSi collapsedWidth={container.siderCollapsedWidth} reverseArrow={true} collapsed={siderCollapsed} onCollapse={(value) => setSiderCollapsed(value)} - - > + > { `; }; -export const StyledProgressCircle = styled(Progress) <{ $style: CircleProgressType }>` +export const StyledProgressCircle = styled(Progress)<{ + $style: CircleProgressType; + $animationStyle?: AnimationStyleType; +}>` + ${(props) => props.$animationStyle} width: 100%; height: 100%; padding: 2px; @@ -66,11 +70,13 @@ let ProgressCircleTmpComp = (function () { value: numberExposingStateControl("value", 60), // borderRadius property hidden as it's not valid for progress circle style: styleControl(CircleProgressStyle), + animationStyle: styleControl(AnimationStyle), }; return new UICompBuilder(childrenMap, (props) => { return ( @@ -93,9 +99,14 @@ let ProgressCircleTmpComp = (function () { )} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( -
+ <> +
{children.style.getPropertyView()} -
+
+
+ {children.animationStyle.getPropertyView()} +
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/progressComp.tsx b/client/packages/lowcoder/src/comps/comps/progressComp.tsx index 9090fa249..875fe5117 100644 --- a/client/packages/lowcoder/src/comps/comps/progressComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/progressComp.tsx @@ -5,7 +5,7 @@ import { BoolControl } from "../controls/boolControl"; import { UICompBuilder } from "../generators"; import { NameConfig, NameConfigHidden, withExposingConfigs } from "../generators/withExposing"; import { styleControl } from "comps/controls/styleControl"; -import { ProgressStyle, ProgressStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; +import { AnimationStyle, AnimationStyleType, ProgressStyle, ProgressStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; import styled, { css } from "styled-components"; import { hiddenPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; @@ -44,15 +44,17 @@ const getStyle = (style: ProgressStyleType) => { `; }; -export const ProgressStyled = styled(Progress)<{ $style: ProgressStyleType }>` +export const ProgressStyled = styled(Progress)<{ $style: ProgressStyleType,$animationStyle?: AnimationStyleType}>` ${(props) => props.$style && getStyle(props.$style)} + ${props=>props.$animationStyle} `; const ProgressBasicComp = (function () { const childrenMap = { - value: numberExposingStateControl("value", 60), + value: numberExposingStateControl('value', 60), showInfo: BoolControl, style: styleControl(ProgressStyle), + animationStyle: styleControl(AnimationStyle), }; return new UICompBuilder(childrenMap, (props) => { return ( @@ -60,6 +62,7 @@ const ProgressBasicComp = (function () { percent={Math.round(props.value.value)} showInfo={props.showInfo} $style={props.style} + $animationStyle={props.animationStyle} /> ); }) @@ -83,9 +86,14 @@ const ProgressBasicComp = (function () { )} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( -
+ <> +
{children.style.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/ratingComp.tsx b/client/packages/lowcoder/src/comps/comps/ratingComp.tsx index 3bf8e8549..d679f7a07 100644 --- a/client/packages/lowcoder/src/comps/comps/ratingComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/ratingComp.tsx @@ -10,7 +10,7 @@ import { UICompBuilder, withDefault } from "../generators"; import { CommonNameConfig, NameConfig, withExposingConfigs } from "../generators/withExposing"; import { formDataChildren, FormDataPropertyView } from "./formComp/formDataConstants"; import { styleControl } from "comps/controls/styleControl"; -import { InputFieldStyle, LabelStyle, RatingStyle, RatingStyleType } from "comps/controls/styleControlConstants"; +import { AnimationStyle, InputFieldStyle, LabelStyle, RatingStyle, RatingStyleType } from "comps/controls/styleControlConstants"; import { migrateOldData } from "comps/generators/simpleGenerators"; import { disabledPropertyView, hiddenPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; @@ -44,8 +44,13 @@ const RatingBasicComp = (function () { disabled: BoolCodeControl, onEvent: eventHandlerControl(EventOptions), style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), - labelStyle: styleControl(LabelStyle.filter((style) => ['accent', 'validate'].includes(style.name) === false)), - inputFieldStyle:migrateOldData(styleControl(RatingStyle), fixOldData), + animationStyle: styleControl(AnimationStyle), + labelStyle: styleControl( + LabelStyle.filter( + (style) => ['accent', 'validate'].includes(style.name) === false + ) + ), + inputFieldStyle: migrateOldData(styleControl(RatingStyle), fixOldData), ...formDataChildren, }; return new UICompBuilder(childrenMap, (props) => { @@ -68,6 +73,7 @@ const RatingBasicComp = (function () { style: props.style, labelStyle: props.labelStyle, inputFieldStyle:props.inputFieldStyle, + animationStyle:props.animationStyle, children: ( {children.inputFieldStyle.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx b/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx index 6e5b807b0..6e62b9ffc 100644 --- a/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx +++ b/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx @@ -10,7 +10,9 @@ import { ResponsiveLayoutRowStyle, ResponsiveLayoutRowStyleType, ResponsiveLayoutColStyleType, - ResponsiveLayoutColStyle + ResponsiveLayoutColStyle, + AnimationStyle, + AnimationStyleType } from "comps/controls/styleControlConstants"; import { sameTypeMap, UICompBuilder, withDefault } from "comps/generators"; import { addMapChildAction } from "comps/generators/sameTypeMap"; @@ -41,7 +43,11 @@ import { EditorContext } from "comps/editorState"; import { disabledPropertyView, hiddenPropertyView } from "comps/utils/propertyUtils"; import { DisabledContext } from "comps/generators/uiCompBuilder"; -const RowWrapper = styled(Row)<{$style: ResponsiveLayoutRowStyleType}>` +const RowWrapper = styled(Row)<{ + $style: ResponsiveLayoutRowStyleType; + $animationStyle: AnimationStyleType; +}>` + ${(props) => props.$animationStyle} height: 100%; border: 1px solid ${(props) => props.$style.border}; border-radius: ${(props) => props.$style.radius}; @@ -77,6 +83,7 @@ const childrenMap = { matchColumnsHeight: withDefault(BoolControl, true), rowStyle: withDefault(styleControl(ResponsiveLayoutRowStyle), {}), columnStyle: withDefault(styleControl(ResponsiveLayoutColStyle), {}), + animationStyle:styleControl(AnimationStyle), columnPerRowLG: withDefault(NumberControl, 4), columnPerRowMD: withDefault(NumberControl, 2), columnPerRowSM: withDefault(NumberControl, 1), @@ -117,6 +124,7 @@ const ResponsiveLayout = (props: ResponsiveLayoutProps) => { columnPerRowSM, verticalSpacing, horizontalSpacing, + animationStyle } = props; return ( @@ -125,6 +133,7 @@ const ResponsiveLayout = (props: ResponsiveLayoutProps) => {
@@ -248,6 +257,9 @@ export const ResponsiveLayoutBaseComp = (function () {
{children.columnStyle.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderComp.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderComp.tsx index d6503d4fd..095e85f74 100644 --- a/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderComp.tsx @@ -43,6 +43,7 @@ let CascaderBasicComp = (function () { labelStyle: props.labelStyle, inputFieldStyle:props.inputFieldStyle, childrenInputFieldStyle:props.childrenInputFieldStyle, + animationStyle:props.animationStyle, children: ( {children.childrenInputFieldStyle.getPropertyView()} +
+ {children.animationStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/checkboxComp.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/checkboxComp.tsx index c0cc28a7d..ac3eb7999 100644 --- a/client/packages/lowcoder/src/comps/comps/selectInputComp/checkboxComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/selectInputComp/checkboxComp.tsx @@ -15,7 +15,7 @@ import { } from "./selectInputConstants"; import { formDataChildren } from "../formComp/formDataConstants"; import { styleControl } from "comps/controls/styleControl"; -import { CheckboxStyle, CheckboxStyleType, InputFieldStyle, LabelStyle } from "comps/controls/styleControlConstants"; +import { AnimationStyle, CheckboxStyle, CheckboxStyleType, InputFieldStyle, LabelStyle } from "comps/controls/styleControlConstants"; import { RadioLayoutOptions, RadioPropertyView } from "./radioCompConstants"; import { dropdownControl } from "../../controls/dropdownControl"; import { ValueFromOption } from "lowcoder-design"; @@ -141,6 +141,7 @@ let CheckboxBasicComp = (function () { layout: dropdownControl(RadioLayoutOptions, "horizontal"), viewRef: RefControl, inputFieldStyle:styleControl(CheckboxStyle), + animationStyle:styleControl(AnimationStyle), ...SelectInputValidationChildren, ...formDataChildren, }; @@ -154,6 +155,7 @@ let CheckboxBasicComp = (function () { style: props.style, labelStyle: props.labelStyle, inputFieldStyle:props.inputFieldStyle, + animationStyle:props.animationStyle, children: ( , - inputFieldStyle:styleControl(RadioStyle), + inputFieldStyle: styleControl(RadioStyle), + animationStyle: styleControl(AnimationStyle), ...SelectInputValidationChildren, ...formDataChildren, }; @@ -97,6 +98,7 @@ export const RadioPropertyView = (
{children.style.getPropertyView()}
{children.labelStyle.getPropertyView()}
{children.inputFieldStyle.getPropertyView()}
+
{children.animationStyle.getPropertyView()}
)} diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/segmentedControl.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/segmentedControl.tsx index 8470bd8b1..2b97a324b 100644 --- a/client/packages/lowcoder/src/comps/comps/selectInputComp/segmentedControl.tsx +++ b/client/packages/lowcoder/src/comps/comps/selectInputComp/segmentedControl.tsx @@ -5,7 +5,7 @@ import { ChangeEventHandlerControl } from "comps/controls/eventHandlerControl"; import { LabelControl } from "comps/controls/labelControl"; import { SelectOptionControl } from "comps/controls/optionsControl"; import { styleControl } from "comps/controls/styleControl"; -import { SegmentStyle, SegmentStyleType } from "comps/controls/styleControlConstants"; +import { AnimationStyle, SegmentStyle, SegmentStyleType } from "comps/controls/styleControlConstants"; import styled, { css } from "styled-components"; import { UICompBuilder } from "../../generators"; import { CommonNameConfig, NameConfig, withExposingConfigs } from "../../generators/withExposing"; @@ -77,7 +77,8 @@ const SegmentChildrenMap = { disabled: BoolCodeControl, onEvent: ChangeEventHandlerControl, options: SelectOptionControl, - style: withDefault(styleControl(SegmentStyle),{borderWidth:'1px'}), + style: withDefault(styleControl(SegmentStyle), { borderWidth: '1px' }), + animationStyle:styleControl(AnimationStyle), viewRef: RefControl, ...SelectInputValidationChildren, @@ -93,6 +94,7 @@ let SegmentedControlBasicComp = (function () { return props.label({ required: props.required, style: props.style, + animationStyle: props.animationStyle, children: (
{children.style.getPropertyView()}
+
+ {children.animationStyle.getPropertyView()} +
+ )} )) diff --git a/client/packages/lowcoder/src/comps/comps/switchComp.tsx b/client/packages/lowcoder/src/comps/comps/switchComp.tsx index 8b113857f..7c4820e37 100644 --- a/client/packages/lowcoder/src/comps/comps/switchComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/switchComp.tsx @@ -4,7 +4,7 @@ import { booleanExposingStateControl } from "comps/controls/codeStateControl"; import { changeEvent, eventHandlerControl } from "comps/controls/eventHandlerControl"; import { LabelControl } from "comps/controls/labelControl"; import { styleControl } from "comps/controls/styleControl"; -import { SwitchStyle, SwitchStyleType, LabelStyle, InputFieldStyle } from "comps/controls/styleControlConstants"; +import { SwitchStyle, SwitchStyleType, LabelStyle, InputFieldStyle, AnimationStyle } from "comps/controls/styleControlConstants"; import { migrateOldData } from "comps/generators/simpleGenerators"; import { Section, sectionNames } from "lowcoder-design"; import styled, { css } from "styled-components"; @@ -90,7 +90,12 @@ let SwitchTmpComp = (function () { onEvent: eventHandlerControl(EventOptions), disabled: BoolCodeControl, style: styleControl(InputFieldStyle), - labelStyle: styleControl(LabelStyle.filter((style) => ['accent', 'validate'].includes(style.name) === false)), + animationStyle: styleControl(AnimationStyle), + labelStyle: styleControl( + LabelStyle.filter( + (style) => ['accent', 'validate'].includes(style.name) === false + ) + ), viewRef: RefControl, inputFieldStyle:migrateOldData(styleControl(SwitchStyle), fixOldData), ...formDataChildren, @@ -100,6 +105,7 @@ let SwitchTmpComp = (function () { style: props.style, labelStyle: props.labelStyle, inputFieldStyle:props.inputFieldStyle, + animationStyle:props.animationStyle, children: ( {children.inputFieldStyle.getPropertyView()} +
+ {children.animationStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/tabs/tabbedContainerComp.tsx b/client/packages/lowcoder/src/comps/comps/tabs/tabbedContainerComp.tsx index 1a1899522..5bd7e3253 100644 --- a/client/packages/lowcoder/src/comps/comps/tabs/tabbedContainerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tabs/tabbedContainerComp.tsx @@ -7,7 +7,7 @@ import { stringExposingStateControl } from "comps/controls/codeStateControl"; import { eventHandlerControl } from "comps/controls/eventHandlerControl"; import { TabsOptionControl } from "comps/controls/optionsControl"; import { styleControl } from "comps/controls/styleControl"; -import { ContainerBodyStyle, ContainerBodyStyleType, ContainerHeaderStyle, ContainerHeaderStyleType, TabContainerStyle, TabContainerStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; +import { AnimationStyle, AnimationStyleType, ContainerBodyStyle, ContainerBodyStyleType, ContainerHeaderStyle, ContainerHeaderStyleType, TabContainerStyle, TabContainerStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; import { sameTypeMap, UICompBuilder, withDefault } from "comps/generators"; import { addMapChildAction } from "comps/generators/sameTypeMap"; import { NameConfig, NameConfigHidden, withExposingConfigs } from "comps/generators/withExposing"; @@ -60,6 +60,7 @@ const childrenMap = { style: withDefault(styleControl(TabContainerStyle),{borderWidth:'1px'}), headerStyle: styleControl(ContainerHeaderStyle), bodyStyle: styleControl(ContainerBodyStyle), + animationStyle: styleControl(AnimationStyle), tabsGutter: withDefault(NumberControl, 32), tabsCentered: withDefault(BoolControl, false), }; @@ -133,9 +134,11 @@ const StyledTabs = styled(Tabs)<{ $bodyStyle: ContainerBodyStyleType; $isMobile?: boolean; $showHeader?: boolean; + $animationStyle:AnimationStyleType }>` &.ant-tabs { height: 100%; + ${props=>props.$animationStyle} } .ant-tabs-content-animated { @@ -251,7 +254,8 @@ const TabbedContainer = (props: TabbedContainerProps) => {
- { items={tabItems} tabBarGutter={props.tabsGutter} centered={props.tabsCentered} - > + >
@@ -331,6 +335,9 @@ export const TabbedContainerBaseComp = (function () {
{ children.bodyStyle.getPropertyView() }
+
+ { children.animationStyle.getPropertyView() } +
)} diff --git a/client/packages/lowcoder/src/comps/comps/textComp.tsx b/client/packages/lowcoder/src/comps/comps/textComp.tsx index fd9ce1f18..d312d1de2 100644 --- a/client/packages/lowcoder/src/comps/comps/textComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/textComp.tsx @@ -10,7 +10,7 @@ import { UICompBuilder } from "../generators"; import { NameConfig, NameConfigHidden, withExposingConfigs } from "../generators/withExposing"; import { markdownCompCss, TacoMarkDown } from "lowcoder-design"; import { styleControl } from "comps/controls/styleControl"; -import { TextStyle, TextStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; +import { AnimationStyle, AnimationStyleType, TextStyle, TextStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; import { hiddenPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; import { alignWithJustifyControl } from "comps/controls/alignControl"; @@ -72,10 +72,15 @@ const getStyle = (style: TextStyleType) => { `; }; -const TextContainer = styled.div<{ $type: string; $styleConfig: TextStyleType }>` +const TextContainer = styled.div<{ + $type: string; + $styleConfig: TextStyleType; + $animationStyle:AnimationStyleType; +}>` height: 100%; overflow: auto; margin: 0; + ${props=>props.$animationStyle} ${(props) => props.$type === "text" && "white-space:break-spaces;line-height: 1.9;"}; ${(props) => props.$styleConfig && getStyle(props.$styleConfig)} @@ -126,6 +131,7 @@ let TextTmpComp = (function () { horizontalAlignment: alignWithJustifyControl(), verticalAlignment: dropdownControl(VerticalAlignmentOptions, "center"), style: styleControl(TextStyle), + animationStyle: styleControl(AnimationStyle), margin: MarginControl, padding: PaddingControl, }; @@ -133,6 +139,7 @@ let TextTmpComp = (function () { const value = props.text.value; return ( {children.style.getPropertyView()} +
+ {children.animationStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/inputComp.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/inputComp.tsx index 3e71e3b3d..dc729e78d 100644 --- a/client/packages/lowcoder/src/comps/comps/textInputComp/inputComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/textInputComp/inputComp.tsx @@ -1,7 +1,7 @@ import { Input, Section, sectionNames } from "lowcoder-design"; import { BoolControl } from "comps/controls/boolControl"; import { styleControl } from "comps/controls/styleControl"; -import { InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle, LabelStyleType } from "comps/controls/styleControlConstants"; +import { AnimationStyle, InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle, LabelStyleType } from "comps/controls/styleControlConstants"; import { NameConfig, NameConfigPlaceHolder, @@ -54,6 +54,7 @@ const childrenMap = { prefixIcon: IconControl, suffixIcon: IconControl, inputFieldStyle: styleControl(InputLikeStyle), + animationStyle: styleControl(AnimationStyle), }; let InputBasicComp = new UICompBuilder(childrenMap, (props) => { @@ -74,6 +75,7 @@ let InputBasicComp = new UICompBuilder(childrenMap, (props) => { style: props.style, labelStyle: props.labelStyle, inputFieldStyle:props.inputFieldStyle, + animationStyle:props.animationStyle, ...validateState, }); }) @@ -105,6 +107,7 @@ let InputBasicComp = new UICompBuilder(childrenMap, (props) => {
{children.style.getPropertyView()}
{children.labelStyle.getPropertyView()}
{children.inputFieldStyle.getPropertyView()}
+
{children.animationStyle.getPropertyView()}
)} diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx index 0c1e5235e..0a5add0a5 100644 --- a/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx @@ -22,6 +22,7 @@ import { import { styleControl } from "comps/controls/styleControl"; import styled from "styled-components"; import { + AnimationStyle, InputLikeStyle, InputLikeStyleType, } from "comps/controls/styleControlConstants"; @@ -96,6 +97,7 @@ let MentionTmpComp = (function () { allowClear: BoolControl, autoHeight: AutoHeightControl, style: styleControl(InputLikeStyle), + animationStyle: styleControl(AnimationStyle), mentionList: jsonControl(checkMentionListData, { "@": ["Li Lei", "Han Meimei"], "#": ["123", "456", "789"], @@ -218,6 +220,7 @@ let MentionTmpComp = (function () { ), style: props.style, + animationStyle: props.animationStyle, ...validateState, }); }) @@ -260,9 +263,14 @@ let MentionTmpComp = (function () { )} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( - <>
+ <> +
{children.style.getPropertyView()} -
+
+
+ {children.animationStyle.getPropertyView()} +
+ )} )) diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/passwordComp.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/passwordComp.tsx index ca005ea32..2002a8476 100644 --- a/client/packages/lowcoder/src/comps/comps/textInputComp/passwordComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/textInputComp/passwordComp.tsx @@ -26,7 +26,7 @@ import { import { withMethodExposing } from "../../generators/withMethodExposing"; import { styleControl } from "comps/controls/styleControl"; import styled from "styled-components"; -import { InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle } from "comps/controls/styleControlConstants"; +import { AnimationStyle, InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle } from "comps/controls/styleControlConstants"; import { hiddenPropertyView, minLengthPropertyView, @@ -59,7 +59,8 @@ let PasswordTmpComp = (function () { prefixIcon: IconControl, style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), labelStyle: styleControl(LabelStyle), - inputFieldStyle: styleControl(InputLikeStyle) + inputFieldStyle: styleControl(InputLikeStyle), + animationStyle: styleControl(AnimationStyle), }; return new UICompBuilder(childrenMap, (props) => { const [inputProps, validateState] = useTextInputProps(props); @@ -77,6 +78,7 @@ let PasswordTmpComp = (function () { style: props.style, labelStyle: props.labelStyle, inputFieldStyle:props.inputFieldStyle, + animationStyle:props.animationStyle, ...validateState, }); }) @@ -113,6 +115,7 @@ let PasswordTmpComp = (function () {
{children.style.getPropertyView()}
{children.labelStyle.getPropertyView()}
{children.inputFieldStyle.getPropertyView()}
+
{children.animationStyle.getPropertyView()}
)} diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/textAreaComp.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/textAreaComp.tsx index 530ce4afe..0698d64a4 100644 --- a/client/packages/lowcoder/src/comps/comps/textInputComp/textAreaComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/textInputComp/textAreaComp.tsx @@ -22,7 +22,7 @@ import { import { withMethodExposing, refMethods } from "../../generators/withMethodExposing"; import { styleControl } from "comps/controls/styleControl"; import styled from "styled-components"; -import { InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle } from "comps/controls/styleControlConstants"; +import { AnimationStyle, InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle } from "comps/controls/styleControlConstants"; import { TextArea } from "components/TextArea"; import { allowClearPropertyView, @@ -73,7 +73,8 @@ let TextAreaTmpComp = (function () { autoHeight: withDefault(AutoHeightControl, "fixed"), style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), labelStyle: styleControl(LabelStyle), - inputFieldStyle: styleControl(InputLikeStyle) + inputFieldStyle: styleControl(InputLikeStyle), + animationStyle: styleControl(AnimationStyle) }; return new UICompBuilder(childrenMap, (props) => { const [inputProps, validateState] = useTextInputProps(props); @@ -93,6 +94,7 @@ let TextAreaTmpComp = (function () { ), style: props.style, labelStyle: props.labelStyle, + animationStyle: props.animationStyle, ...validateState, }); }) @@ -123,6 +125,7 @@ let TextAreaTmpComp = (function () {
{children.style.getPropertyView()}
{children.labelStyle.getPropertyView()}
{children.inputFieldStyle.getPropertyView()}
+
{children.animationStyle.getPropertyView()}
)} diff --git a/client/packages/lowcoder/src/comps/comps/timerComp.tsx b/client/packages/lowcoder/src/comps/comps/timerComp.tsx index ef8575e53..b54e06ff6 100644 --- a/client/packages/lowcoder/src/comps/comps/timerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/timerComp.tsx @@ -1,6 +1,6 @@ import { CompAction, RecordConstructorToView, changeChildAction } from "lowcoder-core"; import { styleControl } from "comps/controls/styleControl"; -import { startButtonStyle, StartButtonStyleType, timerStyle, timerStyleType } from "comps/controls/styleControlConstants"; +import { AnimationStyle, AnimationStyleType, startButtonStyle, StartButtonStyleType, timerStyle, timerStyleType } from "comps/controls/styleControlConstants"; import { UICompBuilder } from "comps/generators/uiCompBuilder"; import { NameConfig, NameConfigHidden, withExposingConfigs } from "comps/generators/withExposing"; import { Section, sectionNames } from "lowcoder-design"; @@ -16,13 +16,17 @@ import { dropdownControl } from "../controls/dropdownControl"; import { stringExposingStateControl } from "comps/controls/codeStateControl"; import { BoolControl } from "comps/controls/boolControl"; -const Container = styled.div<{ $style: timerStyleType | undefined }>` +const Container = styled.div<{ + $style: timerStyleType | undefined; + $animationStyle:AnimationStyleType; +}>` align-items: center; cursor: pointer; font-size: 2.9em; text-align: center; word-wrap: break-word; line-height: initial; + ${props=>props.$animationStyle} background-color: ${props => props.$style?.background}; font-weight: ${props=>props?.$style?.textWeight}; border-radius: ${props=>props?.$style?.radius}; @@ -97,6 +101,7 @@ const timerTypeOptions = [ const childrenMap = { style: styleControl(timerStyle), + animationStyle: styleControl(AnimationStyle), startButtonStyle: styleControl(startButtonStyle), resetButtonStyle: styleControl(startButtonStyle), onEvent: eventHandlerControl(EventOptions), @@ -191,9 +196,7 @@ const AvatarGroupView = (props: RecordConstructorToView & { } return ( - + {formatTimeDifference(elapsedTime)}