diff --git a/.gitignore b/.gitignore index 2e1b56cd5..81c0e6c82 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ client/node_modules/ client/packages/lowcoder-plugin-demo/.yarn/install-state.gz client/packages/lowcoder-plugin-demo/yarn.lock client/packages/lowcoder-plugin-demo/.yarn/cache/@types-node-npm-16.18.68-56f72825c0-094ae9ed80.zip +application-dev.yml diff --git a/README.md b/README.md index 07a5693a5..f599bcb0a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@

Lowcoder

-

This is the only Platform, which closes the gap between App Development, Website Development and Slide-Presentations.

+

This is the only Platform, which closes the gap between App Development, Website Development, interactive Slides/Presentations and Collaboration Tools!

Create software applications (internal and customer-facing!) and Meeting/Collaboration tools for your Company and your Customers with minimal coding experience.

@@ -12,40 +12,42 @@ + ## 📢 Use Lowcoder in 3 steps 1. Connect to any data sources or APIs. -2. Build UI with 60+ components. +2. Build flexible and responsive UI with 100+ components and free layout / design possibilities. 3. Share with colleagues and customers. ## 💡 Why Lowcoder -It's cumbersome to create a single app. You had to design user interfaces, write code in multiple languages and frameworks, and understand how all of that code works together. +One platform for everything instead so many different softwares. (like Website Builders, CMS, CRM, POS, ERP, Dashboards & Data Story Visualization, Collaboration Tools). -Low-code/No-code platforms are fast to get started with but quickly become unmaintainable and inflexible. This creates more problems than it solves. +It's cumbersome to create a single app. You had to design user interfaces, write code in multiple languages and frameworks, and understand how all of that code works together. NewGen Lowcode Platforms like Retool and others are great for their simplicity and flexibility - like Lowcoder too, but they can also be limited in different ways, especially when it comes to "external" applications for everyone. Lowcoder wants to take a step forward. More specifically, Lowcoder is: - An all-in-one IDE to create internal or customer-facing (external) apps. -- A place to create, build and share building blocks of web applications. +- A place to create, build and share building blocks of web applications and whole websites. - The tool and community to support your business, and lower the cost and time to develop interactive applications. - The only platform to embed Lowcode Apps natively in Websites (no iFrame!) - The only platform where you can build your own Meeting Tool - like Teams, Zoom or Google Meets, - just in the Lowcode way. +- The only platform which has extensibility plugin architecture [Check Community Contributions](https://www.npmjs.com/search?q=lowcoder-comp) ## 🪄 Features -- **Visual UI builder** with 50+ built-in components. Save 90% of time to build apps. -- **Modules** for reusable (!) component sets in the UI builder. -- **Embed Lowcoder Apps as native parts of any Website** instead of iFrame (!). [Demo](https://github.com/lowcoder-org/lowcoder-sdk-demo) +- **Visual UI builder** with 100+ built-in components. Save 90% of time to build apps. +- **Modules** for reusable (!) embedable component sets in the UI builder. +- **Embed Lowcoder Apps as native parts of any Website** instead of iFrame (!). [Demo](https://lowcoder.cloud/about), [Docu](https://docs.lowcoder.cloud/lowcoder-documentation/lowcoder-extension/native-embed-sdk) - **Video Meeting Components** to create your own individual Web-Meeting tool. - **Query Library** for reusable data queries of your data sources. - **Custom components** to develop own components and use them in the UI builder. - **Native Data connections** to PostgreSQL, MongoDB, MySQL, Redis, Elasticsearch, REST API, SMTP, etc. -- **Stream Data connections** to Websockets for realtime data updates & collaboration +- **Stream Data connections** to Websockets for realtime data updates & collaboration! [Docu](https://docs.lowcoder.cloud/lowcoder-documentation/connect-your-data/data-sources-in-lowcoder/websocket-datasource) - **JavaScript supported everywhere** to transform data, control components, etc. -- **Role-based access control (RBAC)** for granular permission management. +- **Role-based access control (RBAC)** for granular permission management. [Docu](https://docs.lowcoder.cloud/lowcoder-documentation/workspaces-and-teamwork/members-and-groups) - **Auto-saved and restorable history** for release and version control. - **App Themes and Theme Editor** to precisely align with your company's brand guidelines. -- **Self Hosting** to use Lowcoder in your internal company network, even behind the firewall. +- **Self Hosting** to use Lowcoder in your internal company network, even behind the firewall. [Docu](https://docs.lowcoder.cloud/lowcoder-documentation/setup-and-run/self-hosting) - **Free Community Cloud** to start within a minute and build your first Apps. [Start here](https://app.lowcoder.cloud) ## 🏆 Comparisons @@ -59,6 +61,7 @@ Lowcoder wants to take a step forward. More specifically, Lowcoder is: - Lowcoder is open-source. You don't need to worry about vendor lock-in or being stuck with an outdated version of the software. - In Lowcoder, developers can build truly responsive apps - not as cumbersome as the "Desktop / Mobile switch" in Retool - Lowcoder is free and you can contribute! +- With Lowcoder you can design better Apps. More Layout & Design Components as also better support for powerful Data & Admin Dashboards. - The EE Version of Lowcoder comes with a much better pricing model, so you have no "per-user costs". ### Lowcoder vs Appsmith, Tooljet - Lowcoder has more components and richer configuration than Appsmith and Tooljet. @@ -87,16 +90,24 @@ And we mean it... Day by day! ## 💻 Deployment Options [![Deploy to AWS using Stitch](https://img.shields.io/badge/deploy_with-Stitch-%23E369F7?logo=amazonaws&color=%23E369F7)](https://deploy.stitch.tech/lowcoder/lowcoder) +[![Deploy in minutes on Elest.io](https://raw.githubusercontent.com/elestio-examples/element/main/deploy-on-elestio.png)](https://elest.io/open-source/lowcoder) + You can access Lowcoder from [cloud-hosted version](https://app.lowcoder.cloud/) at any time, or use the following resources for self-host Lowcoder on different platforms: - [Docker](https://docs.lowcoder.cloud/lowcoder-documentation/setup-and-run/self-hosting) ## 💪 Contributing - Language support: If you have experience with a language that isn't currently supported by our product, send us a pull request. - Create and share components or demos: If you've created something that might be useful to others, add the link here. -- [Frontend contributing guide](https://github.com/lowcoder-org/lowcoder/tree/main/client) +- [Contributing guide](https://docs.lowcoder.cloud/lowcoder-documentation/lowcoder-extension/opensource-contribution) + +Special tanks goes to [@sjhoeksma](https://github.com/sjhoeksma), [@mousheng](https://github.com/mousheng), [@mat02](https://github.com/mat02), [@jomedya](https://github.com/jomedya) and many other contributors! ## 🥇 Sponsors Accelerate the growth of Lowcoder and unleash its potential with your Sponsorship – together, we're shaping the future of Lowcode for everyone! [Be a Sponsor](https://github.com/sponsors/lowcoder-org) -Like ... [@spacegoats-io](https://github.com/spacegoats-io), [@Jomedya](https://github.com/Jomedya), [@CHSchuepfer](https://github.com/CHSchuepfer), Thank you very much!! \ No newline at end of file +Like ... [@Darkjamin](https://github.com/Darkjamin), [@spacegoats-io](https://github.com/spacegoats-io), [@Jomedya](https://github.com/Jomedya), [@CHSchuepfer](https://github.com/CHSchuepfer), Thank you very much!! + +## Intro Video + +[![Watch the video](https://i.ytimg.com/vi/s4ltAqS0hzM/maxresdefault.jpg?sqp=-oaymwEmCIAKENAF8quKqQMa8AEB-AH-CYAC0AWKAgwIABABGD0gSShyMA8=&rs=AOn4CLAlPOIFdtauythoBKNPXhi6XGwlDQ)](https://youtu.be/s4ltAqS0hzM?feature=shared) \ No newline at end of file diff --git a/client/VERSION b/client/VERSION index a6254504e..9183195ac 100644 --- a/client/VERSION +++ b/client/VERSION @@ -1 +1 @@ -2.3.1 \ No newline at end of file +2.4.0 \ No newline at end of file diff --git a/client/config/test/jest.config.js b/client/config/test/jest.config.js index 90fb74572..53aa19f78 100644 --- a/client/config/test/jest.config.js +++ b/client/config/test/jest.config.js @@ -6,14 +6,10 @@ export function currentDirName(importMetaUrl) { return dirname(fileURLToPath(importMetaUrl)); } - const globals = {}; buildVars.forEach(({ name, defaultValue }) => { globals[name] = process.env[name] || defaultValue; }); -const edition = process.env.REACT_APP_EDITION; -const isEEGlobal = edition === "enterprise-global"; -const isEE = edition === "enterprise" || isEEGlobal; const currentDir = currentDirName(import.meta.url); export default { @@ -22,8 +18,7 @@ export default { "react-markdown": path.resolve(currentDir, "./mocks/react-markdown.js"), "\\.md\\?url$": path.resolve(currentDir, "./mocks/markdown-url-module.js"), "^@lowcoder-ee(.*)$": path.resolve( - currentDir, - isEE ? "../../packages/lowcoder/src/ee/$1" : "../../packages/lowcoder/src/$1" + currentDir, "../../packages/lowcoder/src/$1" ), "lowcoder-sdk": path.resolve(currentDir, "../../packages/lowcoder/src/index.sdk"), }, diff --git a/client/package.json b/client/package.json index 0034bb1d7..44087ce6a 100644 --- a/client/package.json +++ b/client/package.json @@ -13,7 +13,7 @@ "start": "yarn workspace lowcoder start", "start-win": "LOWCODER_API_SERVICE_URL=http://localhost:3000 yarn start", "start:ee": "REACT_APP_EDITION=enterprise yarn workspace lowcoder start", - "start:ee-global": "REACT_APP_EDITION=enterprise-global yarn workspace lowcoder start", + "translate": "node --loader ts-node/esm ./scripts/translate.js", "build": "yarn node ./scripts/build.js", "test": "jest && yarn workspace lowcoder-comps test", "prepare": "yarn workspace lowcoder prepare", @@ -52,9 +52,9 @@ "mq-polyfill": "^1.1.8", "prettier": "^3.1.0", "rimraf": "^3.0.2", - "rollup": "^2.79.0", "shelljs": "^0.8.5", "svgo": "^3.0.0", + "ts-node": "^10.4.0", "typescript": "^4.8.4", "whatwg-fetch": "^3.6.2" }, @@ -76,11 +76,14 @@ "@testing-library/react": "^14.1.2", "@testing-library/user-event": "^14.5.1", "@types/styled-components": "^5.1.34", - "antd-mobile": "^5.28.0", + "antd-mobile": "^5.34.0", "chalk": "4", + "flag-icons": "^7.2.1", "number-precision": "^1.6.0", + "react-countup": "^6.5.3", "react-player": "^2.11.0", "resize-observer-polyfill": "^1.5.1", + "rollup": "^4.13.0", "simplebar": "^6.2.5", "tui-image-editor": "^3.15.3" } diff --git a/client/packages/lowcoder-comps/.gitignore b/client/packages/lowcoder-comps/.gitignore index 4df552dfa..c3bb773d5 100644 --- a/client/packages/lowcoder-comps/.gitignore +++ b/client/packages/lowcoder-comps/.gitignore @@ -1,3 +1,4 @@ /lib /node_modules +/package *.tgz \ No newline at end of file diff --git a/client/packages/lowcoder-comps/package.json b/client/packages/lowcoder-comps/package.json index 029be11e2..1c417f1d4 100644 --- a/client/packages/lowcoder-comps/package.json +++ b/client/packages/lowcoder-comps/package.json @@ -1,6 +1,6 @@ { "name": "lowcoder-comps", - "version": "0.0.27", + "version": "2.4.5", "type": "module", "license": "MIT", "dependencies": { @@ -10,13 +10,17 @@ "@fullcalendar/interaction": "^6.1.6", "@fullcalendar/list": "^6.1.9", "@fullcalendar/moment": "^6.1.6", + "@fullcalendar/multimonth": "^6.1.6", "@fullcalendar/react": "^6.1.6", "@fullcalendar/resource": "^6.1.11", "@fullcalendar/resource-timegrid": "^6.1.11", "@fullcalendar/resource-timeline": "^6.1.11", "@fullcalendar/timegrid": "^6.1.6", + "@fullcalendar/timeline": "^6.1.6", "@types/react": "^18.2.45", "@types/react-dom": "^18.2.18", + "agora-rtc-sdk-ng": "^4.20.2", + "agora-rtm-sdk": "^1.5.1", "big.js": "^6.2.1", "echarts-extension-gmap": "^1.6.0", "echarts-wordcloud": "^2.1.0", @@ -30,19 +34,27 @@ "lowcoder": { "description": "", "comps": { - "chart": { - "name": "Chart", - "icon": "./icons/icon-chart.svg", + "meetingController": { + "name": "Agora Meeting Controller", + "icon": "./icons/icon-comp-calendar.svg", + "layoutInfo": { + "w": 1, + "h": 1 + } + }, + "meetingSharing": { + "name": "Agora Meeting Sharing", + "icon": "./icons/icon-comp-calendar.svg", "layoutInfo": { - "w": 15, + "w": 6, "h": 40 } }, - "imageEditor": { - "name": "Image Editor", - "icon": "./icons/icon-chart.svg", + "meetingStream": { + "name": "Video Stream", + "icon": "./icons/icon-comp-calendar.svg", "layoutInfo": { - "w": 15, + "w": 6, "h": 40 } }, @@ -50,17 +62,137 @@ "name": "Calendar", "icon": "./icons/icon-comp-calendar.svg", "layoutInfo": { - "w": 15, + "w": 19, "h": 60 } }, + "chart": { + "name": "Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "basicChart": { + "name": "Basic Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "imageEditor": { + "name": "Image Editor", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, "mermaid": { "name": "Mermaid", "icon": "./icons/mermaidchart.svg", "layoutInfo": { - "w": 15, + "w": 12, + "h": 40 + } + }, + "funnelChart": { + "name": "Funnel Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "gaugeChart": { + "name": "Gauge Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "sankeyChart": { + "name": "Sankey Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, "h": 40 } + }, + "candleStickChart": { + "name": "CandleStick Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "radarChart": { + "name": "Radar Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "heatmapChart": { + "name": "Heatmap Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "graphChart": { + "name": "Graph Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "treeChart": { + "name": "Tree Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "treemapChart": { + "name": "Treemap Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "sunburstChart": { + "name": "Sunburst Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "themeriverChart": { + "name": "Themeriver Chart", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 12, + "h": 40 + } + }, + "chartsGeoMap": { + "name": "chartsGeoMap", + "icon": "./icons/icon-chart.svg", + "layoutInfo": { + "w": 19, + "h": 60 + } } } }, diff --git a/client/packages/lowcoder/src/comps/comps/meetingComp/meetingControlerUtils.tsx b/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/meetingControlerUtils.tsx similarity index 89% rename from client/packages/lowcoder/src/comps/comps/meetingComp/meetingControlerUtils.tsx rename to client/packages/lowcoder-comps/src/comps/agoraMeetingComp/meetingControlerUtils.tsx index 81b11f622..10e685faf 100644 --- a/client/packages/lowcoder/src/comps/comps/meetingComp/meetingControlerUtils.tsx +++ b/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/meetingControlerUtils.tsx @@ -1,6 +1,7 @@ import { CheckBox, controlItem, Switch, SwitchWrapper } from "lowcoder-design"; import { ReactNode } from "react"; -import { ControlParams, SimpleComp } from "@lowcoder-ee/index.sdk"; +import { ControlParams } from "comps/controls/controlParams"; +import { SimpleComp } from "lowcoder-core"; export class BoolShareVideoControl extends SimpleComp { readonly IGNORABLE_DEFAULT_VALUE = false; diff --git a/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/meetingControllerComp.tsx b/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/meetingControllerComp.tsx new file mode 100644 index 000000000..268b16404 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/meetingControllerComp.tsx @@ -0,0 +1,882 @@ +import { + NameConfig, + BoolControl, + withDefault, + withExposingConfigs, + StringControl, + Section, + sectionNames, + styleControl, + BooleanStateControl, + AutoHeightControl, + stringStateControl, + InnerGrid, + useUserViewMode, + getData, + gridItemCompToGridItems, + Layers, + isNumeric, + withMethodExposing, + eventHandlerControl, + DrawerStyle, + PositionControl, + jsonObjectExposingStateControl, + stateComp, + Drawer, + changeChildAction, + HintPlaceHolder, + // styledm, + // DrawerWrapper, + BackgroundColorContext, + ContainerCompBuilder, + closeEvent, + MeetingEventHandlerControl, +} from "lowcoder-sdk"; +import { default as CloseOutlined } from "@ant-design/icons/CloseOutlined"; +import type { JSONValue } from "../../../../lowcoder/src/util/jsonTypes"; +// import { default as Button } from "antd/es/button"; + +const EventOptions = [closeEvent] as const; +import { trans } from "../../i18n/comps"; +// const DrawerWrapper = styledm.div` +// // Shield the mouse events of the lower layer, the mask can be closed in the edit mode to prevent the lower layer from sliding +// pointer-events: auto; +// `; +import AgoraRTC, { + type ICameraVideoTrack, + type IMicrophoneAudioTrack, + type IAgoraRTCClient, + type IAgoraRTCRemoteUser, + type UID, + type ILocalVideoTrack, +} from "agora-rtc-sdk-ng"; + +import type { RtmChannel, RtmClient } from "agora-rtm-sdk"; +import { useCallback, useEffect, useState } from "react"; +import { ResizeHandle } from "react-resizable"; +import { v4 as uuidv4 } from "uuid"; + +const DEFAULT_SIZE = 378; +const DEFAULT_PADDING = 16; +function transToPxSize(size: string | number) { + return isNumeric(size) ? size + "px" : (size as string); +} + +export const client: IAgoraRTCClient = AgoraRTC.createClient({ + mode: "rtc", + codec: "vp8", +}); + +AgoraRTC.setLogLevel(4); + +/* +0: DEBUG. Output all API logs. +1: INFO. Output logs of the INFO, WARNING and ERROR level. +2: WARNING. Output logs of the WARNING and ERROR level. +3: ERROR. Output logs of the ERROR level. +4: NONE. Do not output any log. +*/ + +let audioTrack: IMicrophoneAudioTrack; +let videoTrack: ICameraVideoTrack; +let screenShareStream: ILocalVideoTrack; +let userId: UID | null | undefined; +let rtmChannelResponse: RtmChannel; +let rtmClient: RtmClient; +// const ButtonStyle = styledm(Button)` +// position: absolute; +// left: 0; +// top: 0; +// z-index: 10; +// font-weight: 700; +// box-shadow: none; +// color: rgba(0, 0, 0, 0.45); +// height: 54px; +// width: 54px; + +// svg { +// width: 16px; +// height: 16px; +// } + +// &, +// :hover, +// :focus { +// background-color: transparent; +// border: none; +// } + +// :hover, +// :focus { +// color: rgba(0, 0, 0, 0.75); +// } +// `; +const turnOnCamera = async (flag?: boolean) => { + if (videoTrack) { + return videoTrack.setEnabled(flag!); + } + videoTrack = await AgoraRTC.createCameraVideoTrack(); + videoTrack.play(userId + ""); +}; + +const turnOnMicrophone = async (flag?: boolean) => { + if (audioTrack) { + return audioTrack.setEnabled(flag!); + } + audioTrack = await AgoraRTC.createMicrophoneAudioTrack(); + if (!flag) { + await client.unpublish(audioTrack); + } else { + await client.publish(audioTrack); + } +}; +const shareScreen = async (sharing: boolean) => { + try { + if (sharing === false) { + await client.unpublish(screenShareStream); + screenShareStream.close(); + await client.publish(videoTrack); + videoTrack.play(userId + ""); + } else { + screenShareStream = await AgoraRTC.createScreenVideoTrack( + { + screenSourceType: "screen", + }, + "disable" + ); + await client.unpublish(videoTrack); + screenShareStream.play("share-screen"); + await client.publish(screenShareStream); + } + } catch (error) { + console.error("Failed to create screen share stream:", error); + } +}; +const leaveChannel = async () => { + //stops local sharing video + if (screenShareStream) { + screenShareStream.close(); + } + + //stops local video streaming and puts off the camera + if (videoTrack) { + await client.unpublish(videoTrack); + await turnOnCamera(false); + } + + //mutes and stops locla audio stream + if (audioTrack) { + await turnOnMicrophone(false); + } + await client.leave(); + await rtmChannelResponse.leave(); +}; + +const publishVideo = async ( + appId: string, + channel: string, + rtmToken: string, + rtcToken: string +) => { + await turnOnCamera(true); + await client.join(appId, channel, rtcToken, userId); + await client.publish(videoTrack); + await rtmInit(appId, userId, rtmToken, channel); +}; + +const sendMessageRtm = (message: any) => { + rtmChannelResponse.sendMessage({ text: JSON.stringify(message) }); +}; + +const sendPeerMessageRtm = (message: any, toId: string) => { + rtmClient.sendMessageToPeer({ text: JSON.stringify(message) }, toId); +}; + +const rtmInit = async (appId: any, uid: any, token: any, channel: any) => { + const AgoraRTM = (await import("agora-rtm-sdk")).default; + rtmClient = AgoraRTM.createInstance(appId); + let options = { + uid: String(uid), + token: token ? token : null, + }; + await rtmClient.login(options); + + rtmChannelResponse = rtmClient.createChannel(channel); + + await rtmChannelResponse.join(); +}; + +const CanvasContainerID = "__canvas_container__"; +const meetingControllerChildren = { + visible: withDefault(BooleanStateControl, "false"), + onEvent: eventHandlerControl(EventOptions), + onMeetingEvent: MeetingEventHandlerControl, + width: StringControl, + height: StringControl, + autoHeight: AutoHeightControl, + style: styleControl(DrawerStyle), + placement: PositionControl, + maskClosable: withDefault(BoolControl, true), + showMask: withDefault(BoolControl, true), + meetingActive: withDefault(BooleanStateControl, "false"), + audioControl: withDefault(BooleanStateControl, "false"), + videoControl: withDefault(BooleanStateControl, "true"), + endCall: withDefault(BooleanStateControl, "false"), + sharing: withDefault(BooleanStateControl, "false"), + appId: withDefault(StringControl, trans("meeting.appid")), + participants: stateComp([]), + usersScreenShared: stateComp([]), + localUser: jsonObjectExposingStateControl(""), + localUserID: withDefault( + stringStateControl(trans("meeting.localUserID")), + uuidv4() + "" + ), + meetingName: withDefault( + stringStateControl(trans("meeting.meetingName")), + uuidv4() + "" + ), + rtmToken: stringStateControl(trans("meeting.rtmToken")), + rtcToken: stringStateControl(trans("meeting.rtcToken")), + messages: stateComp([]), +}; + +let MeetingControllerComp = () =>
Meeting Component is not available. It needs Lowcoder from Version v2.4
; + +if (typeof ContainerCompBuilder === 'function') { + +let MTComp = (function () { + return new ContainerCompBuilder( + meetingControllerChildren, (props: any, dispatch: any) => { + + const isTopBom = ["top", "bottom"].includes(props.placement); + const { items, ...otherContainerProps } = props.container; + // const userViewMode = useUserViewMode(); + // const resizable = !userViewMode && (!isTopBom || !props.autoHeight); + const onResizeStop = useCallback( + ( + e: React.SyntheticEvent, + node: HTMLElement, + size: { width: number; height: number }, + handle: ResizeHandle + ) => { + isTopBom + ? dispatch(changeChildAction("height", size.height, true)) + : dispatch(changeChildAction("width", size.width, true)); + }, + [dispatch, isTopBom] + ); + const [userIds, setUserIds] = useState([]); + const [updateVolume, setUpdateVolume] = useState({ + update: false, + userid: null, + }); + const [rtmMessages, setRtmMessages] = useState([]); + const [localUserSpeaking, setLocalUserSpeaking] = useState(false); + const [localUserVideo, setLocalUserVideo] = + useState(); + const [userJoined, setUserJoined] = useState(); + const [userLeft, setUserLeft] = useState(); + + useEffect(() => { + if (userJoined) { + // console.log("userJoined ", userJoined); + + let prevUsers: any[] = props.participants as []; + // console.log("prevUsers ", prevUsers); + let userData = { + user: userJoined.uid, + audiostatus: userJoined.hasAudio, + streamingVideo: true, + }; + // console.log("userData ", userData); + setUserIds((userIds: any) => [...userIds, userData]); + // console.log("userIds ", userIds); + /* console.log( + "removeDuplicates ", + removeDuplicates(getData([...prevUsers, userData]).data, "user") + ); */ + dispatch( + changeChildAction( + "participants", + removeDuplicates(getData([...prevUsers, userData]).data, "user"), + false + ) + ); + } + }, [userJoined]); + + function removeDuplicates(arr: any, prop: any) { + const uniqueObjects = []; + const seenValues = new Set(); + + for (const obj of arr) { + const objValue = obj[prop]; + + if (!seenValues.has(objValue)) { + seenValues.add(objValue); + uniqueObjects.push(obj); + } + } + + return uniqueObjects; + } + useEffect(() => { + if (userLeft) { + let newUsers = userIds.filter( + (item: any) => item.user !== userLeft.uid + ); + let hostExists = newUsers.filter((f: any) => f.host === true); + if (hostExists.length == 0 && newUsers.length > 0) { + newUsers[0].host = true; + } + setUserIds(newUsers); + dispatch( + changeChildAction( + "participants", + removeDuplicates(getData(newUsers).data, "user"), + false + ) + ); + } + }, [userLeft]); + + // console.log("sharing", props.sharing); + + useEffect(() => { + if (updateVolume.userid) { + let prevUsers: [] = props.participants as []; + + const updatedItems = prevUsers.map((userInfo: any) => { + if ( + userInfo.user === updateVolume.userid && + userInfo.speaking != updateVolume.update + ) { + return { ...userInfo, speaking: updateVolume.update }; + } + return userInfo; + }); + dispatch( + changeChildAction("participants", getData(updatedItems).data, false) + ); + } + }, [updateVolume]); + + useEffect(() => { + let prevUsers: [] = props.participants as []; + const updatedItems = prevUsers.map((userInfo: any) => { + if (userInfo.user === localUserVideo?.uid) { + return { ...userInfo, streamingSharing: props.sharing.value }; + } + return userInfo; + }); + dispatch( + changeChildAction("participants", getData(updatedItems).data, false) + ); + + let localObject = { + user: userId + "", + audiostatus: props.audioControl.value, + streamingVideo: props.videoControl.value, + streamingSharing: props.sharing.value, + speaking: localUserSpeaking, + }; + props.localUser.onChange(localObject); + }, [props.sharing.value]); + + // console.log("participants ", props.participants); + + useEffect(() => { + let prevUsers: [] = props.participants as []; + const updatedItems = prevUsers.map((userInfo: any) => { + if (userInfo.user === localUserVideo?.uid) { + return { ...userInfo, streamingVideo: localUserVideo?.hasVideo }; + } + return userInfo; + }); + dispatch( + changeChildAction("participants", getData(updatedItems).data, false) + ); + }, [localUserVideo?.hasVideo]); + + useEffect(() => { + if (rtmMessages) { + dispatch( + changeChildAction("messages", getData(rtmMessages).data, false) + ); + } + }, [rtmMessages]); + + useEffect(() => { + if (localUserSpeaking === true || localUserVideo) { + let localObject = { + user: userId + "", + audiostatus: props.audioControl.value, + streamingVideo: props.videoControl.value, + speaking: localUserSpeaking, + }; + props.localUser.onChange(localObject); + } + }, [localUserSpeaking]); + + useEffect(() => { + if (rtmChannelResponse) { + rtmClient.on("MessageFromPeer", function (message, peerId) { + setRtmMessages((prevMessages: any[]) => { + // Check if the messages array exceeds the maximum limit + if (prevMessages.length >= 500) { + prevMessages.pop(); // Remove the oldest message + } + return [ + ...prevMessages, + { peermessage: JSON.parse(message.text + ""), from: peerId }, + ]; + }); + }); + + rtmChannelResponse.on("ChannelMessage", function (message, memberId) { + setRtmMessages((prevMessages: any[]) => { + // Check if the messages array exceeds the maximum limit + if (prevMessages.length >= 500) { + prevMessages.pop(); // Remove the oldest message + } + return [ + ...prevMessages, + { + channelmessage: JSON.parse(message.text + ""), + from: memberId, + }, + ]; + }); + + dispatch( + changeChildAction("messages", getData(rtmMessages).data, false) + ); + }); + } + }, [rtmChannelResponse]); + useEffect(() => { + if (client) { + //Enable Agora to send audio bytes + client.enableAudioVolumeIndicator(); + //user activity listeners + client.on("user-joined", (user: IAgoraRTCRemoteUser) => { + setUserJoined(user); + }); + client.on("user-left", (user: IAgoraRTCRemoteUser, reason: any) => { + setUserLeft(user); + }); + + //listen to user speaking, + client.on("volume-indicator", (volumeInfos: any) => { + if (volumeInfos.length === 0) return; + volumeInfos.map((volumeInfo: any) => { + //when the volume is above 30, user is probably speaking + const speaking = volumeInfo.level >= 30; + if ( + volumeInfo.uid === userId && + props.localUser.value.speaking != speaking + ) { + setLocalUserSpeaking(speaking); + } else { + setUpdateVolume({ update: speaking, userid: volumeInfo.uid }); + } + }); + }); + + client.on( + "user-published", + async (user: IAgoraRTCRemoteUser, mediaType: "video" | "audio") => { + setLocalUserVideo(user); + } + ); + client.on( + "user-unpublished", + (user: IAgoraRTCRemoteUser, mediaType: "video" | "audio") => { + setLocalUserVideo(user); + } + ); + } + }, [client]); + + return ( + + {/* */} + + document.querySelector(`#${CanvasContainerID}`) || document.body + } + footer={null} + width={transToPxSize(props.width || DEFAULT_SIZE)} + height={ + !props.autoHeight + ? transToPxSize(props.height || DEFAULT_SIZE) + : "" + } + onClose={(e: any) => { + props.visible.onChange(false); + }} + afterOpenChange={(visible: any) => { + if (!visible) { + props.onEvent("close"); + } + }} + zIndex={Layers.drawer} + maskClosable={props.maskClosable} + mask={props.showMask} + > + {/* { + props.visible.onChange(false); + }} + > + + */} + + + {/* */} + + ); + } + ) + .setPropertyViewFn((children: any) => ( + <> + {/* {(EditorContext.editorModeStatus === "logic" || + EditorContext.editorModeStatus === "both") && ( + <> */} +
+ {children.appId.propertyView({ + label: trans("meeting.appid"), + })} + {children.meetingName.propertyView({ + label: trans("meeting.meetingName"), + })} + {children.localUserID.propertyView({ + label: trans("meeting.localUserID"), + })} + {children.rtmToken.propertyView({ + label: trans("meeting.rtmToken"), + })} + {children.rtcToken.propertyView({ + label: trans("meeting.rtcToken"), + })} +
+
+ {children.onEvent.getPropertyView()} + {children.onMeetingEvent.getPropertyView()} +
+ {/* + )} */} + + {/* {(EditorContext.editorModeStatus === "layout" || + EditorContext.editorModeStatus === "both") && ( + <> */} + {/*
+ {children.placement.propertyView({ + label: trans("meeting.placement"), + radioButton: true, + })} + {["top", "bottom"].includes(children.placement.getView()) + ? children.autoHeight.getPropertyView() + : children.width.propertyView({ + label: trans("meeting.width"), + tooltip: trans("meeting.widthTooltip"), + placeholder: DEFAULT_SIZE + "", + })} + {!children.autoHeight.getView() && + ["top", "bottom"].includes(children.placement.getView()) && + children.height.propertyView({ + label: trans("meeting.height"), + tooltip: trans("meeting.heightTooltip"), + placeholder: DEFAULT_SIZE + "", + })} + {children.maskClosable.propertyView({ + label: trans("meeting.maskClosable"), + })} + {children.showMask.propertyView({ + label: trans("meeting.showMask"), + })} +
+ +
+ {children.style.getPropertyView()} +
*/} + {/* */} + {/* )} */} + + )) + .build(); + + })(); + + MTComp = class extends MTComp { + autoHeight(): boolean { + return false; + } + }; + + MTComp = withMethodExposing(MTComp, [ + { + method: { + name: "openDrawer", + params: [], + }, + execute: (comp: any, values: any) => { + comp.children.visible.getView().onChange(true); + }, + }, + { + method: { + name: "startSharing", + params: [], + }, + execute: async (comp: any, values: any) => { + if (!comp.children.meetingActive.getView().value) return; + let sharing = !comp.children.sharing.getView().value; + await shareScreen(sharing); + comp.children.sharing.change(sharing); + }, + }, + { + method: { + name: "audioControl", + description: trans("meeting.actionBtnDesc"), + params: [], + }, + execute: async (comp: any, values: any) => { + if (!comp.children.meetingActive.getView().value) return; + let value = !comp.children.audioControl.getView().value; + comp.children.localUser.change({ + user: userId + "", + audiostatus: value, + streamingVideo: comp.children.videoControl.getView().value, + speaking: false, + }); + await turnOnMicrophone(value); + comp.children.audioControl.change(value); + }, + }, + { + method: { + name: "videoControl", + description: trans("meeting.actionBtnDesc"), + params: [], + }, + execute: async (comp: any, values: any) => { + //check if meeting is active + if (!comp.children.meetingActive.getView().value) return; + //toggle videoControl + let value = !comp.children.videoControl.getView().value; + if (videoTrack) { + videoTrack.setEnabled(value); + } else { + await turnOnCamera(value); + } + //change my local user data + let localData = { + user: userId + "", + streamingVideo: value, + audiostatus: comp.children.audioControl.getView().value, + speaking: comp.children.localUser.getView().value.speaking, + }; + + comp.children.localUser.change(localData); + comp.children.videoControl.change(value); + }, + }, + { + method: { + name: "startMeeting", + description: trans("meeting.actionBtnDesc"), + params: [], + }, + execute: async (comp: any, values: any) => { + /* console.log("startMeeting ", { + // user: userId + "", + audiostatus: false, + speaking: false, + streamingVideo: true, + }); */ + if (comp.children.meetingActive.getView().value) return; + userId = + comp.children.localUserID.getView().value === "" + ? uuidv4() + : comp.children.localUserID.getView().value; + comp.children.localUser.change({ + user: userId + "", + audiostatus: false, + speaking: false, + streamingVideo: true, + }); + /* console.log("startMeeting localUser ", { + user: userId + "", + audiostatus: false, + speaking: false, + streamingVideo: true, + }); */ + + comp.children.localUser.children.value.dispatch( + changeChildAction( + "localUser", + { + user: userId + "", + audiostatus: false, + speaking: false, + streamingVideo: true, + }, + false + ) + ); + comp.children.videoControl.change(true); + await publishVideo( + comp.children.appId.getView(), + comp.children.meetingName.getView().value === "" + ? uuidv4() + : comp.children.meetingName.getView().value, + comp.children.rtmToken.getView().value, + comp.children.rtcToken.getView().value + ); + comp.children.meetingActive.change(true); + }, + }, + { + method: { + name: "broadCast", + description: trans("meeting.broadCast"), + params: [], + }, + execute: async (comp: any, values: any) => { + if (!comp.children.meetingActive.getView().value) return; + let messagedata = + values !== undefined && values[0] !== undefined ? values[0] : ""; + let toUsers: any = + values !== undefined && values[1] !== undefined ? values[1] : ""; + + let message: any = { + time: Date.now(), + message: messagedata, + }; + + if (toUsers.length > 0 && toUsers[0] !== undefined) { + toUsers.forEach((peer: any) => { + message.to = peer; + sendPeerMessageRtm(message, String(peer)); + }); + } else { + sendMessageRtm(message); + } + }, + }, + { + method: { + name: "setMeetingName", + description: trans("meeting.meetingName"), + params: [], + }, + execute: async (comp: any, values: any) => { + let meetingName: any = values[0]; + comp.children.meetingName.change(meetingName); + }, + }, + { + method: { + name: "setUserName", + description: trans("meeting.userName"), + params: [], + }, + execute: async (comp: any, values: any) => { + let userName: any = values[0]; + let userLocal = comp.children.localUser.getView().value; + comp.children.localUser.change({ ...userLocal, userName: userName }); + }, + }, + { + method: { + name: "setRTCToken", + description: trans("meeting.rtcToken"), + params: [], + }, + execute: async (comp: any, values: any) => { + let rtcToken: any = values[0]; + comp.children.rtcToken.change(rtcToken); + }, + }, + { + method: { + name: "setRTMToken", + description: trans("meeting.rtmToken"), + params: [], + }, + execute: async (comp: any, values: any) => { + let rtmToken: any = values[0]; + comp.children.rtmToken.change(rtmToken); + }, + }, + { + method: { + name: "endMeeting", + description: trans("meeting.actionBtnDesc"), + params: [], + }, + execute: async (comp: any, values: any) => { + if (!comp.children.meetingActive.getView().value) return; + + let value = !comp.children.endCall.getView().value; + comp.children.endCall.change(value); + comp.children.meetingActive.change(false); + + await leaveChannel(); + + comp.children.localUser.change({ + user: userId + "", + streamingVideo: false, + }); + }, + }, + ]); + + MeetingControllerComp = withExposingConfigs(MTComp, [ + new NameConfig("appId", trans("meeting.appid")), + new NameConfig("localUser", trans("meeting.host")), + new NameConfig("participants", trans("meeting.participants")), + new NameConfig("meetingActive", trans("meeting.meetingActive")), + new NameConfig("meetingName", trans("meeting.meetingName")), + new NameConfig("localUserID", trans("meeting.localUserID")), + new NameConfig("messages", trans("meeting.messages")), + new NameConfig("rtmToken", trans("meeting.rtmToken")), + new NameConfig("rtcToken", trans("meeting.rtcToken")), + ]); + +} else { + console.error("ContainerCompBuilder for Meeting Comp is not available. Please ensure that Lowcoder SDK version v2.4 or higher is installed."); +} + +export { MeetingControllerComp }; \ No newline at end of file diff --git a/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingStreamComp.tsx b/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/videoMeetingStreamComp.tsx similarity index 72% rename from client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingStreamComp.tsx rename to client/packages/lowcoder-comps/src/comps/agoraMeetingComp/videoMeetingStreamComp.tsx index 68497e186..7c5569804 100644 --- a/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingStreamComp.tsx +++ b/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/videoMeetingStreamComp.tsx @@ -1,29 +1,28 @@ -import { BoolCodeControl, StringControl } from "comps/controls/codeControl"; -import { EditorContext } from "comps/editorState"; -import { withDefault } from "comps/generators/simpleGenerators"; -import { UICompBuilder } from "comps/generators/uiCompBuilder"; -import ReactResizeDetector from "react-resize-detector"; import { + NameConfig, + withDefault, + withExposingConfigs, + StringControl, Section, sectionNames, -} from "lowcoder-design"; -import { trans } from "i18n"; -import styled from "styled-components"; -import { + AutoHeightControl, + EditorContext, + styled, + MeetingEventHandlerControl, + BoolCodeControl, + RefControl, + stringExposingStateControl, + StringStateControl, + UICompBuilder, CommonNameConfig, - NameConfig, - withExposingConfigs, -} from "../../generators/withExposing"; +} from "lowcoder-sdk"; import { ButtonStyleControl } from "./videobuttonCompConstants"; -import { RefControl } from "comps/controls/refControl"; +import { trans } from "../../i18n/comps"; + +import { client } from "./meetingControllerComp"; +import type { IAgoraRTCRemoteUser } from "agora-rtc-sdk-ng"; import { useEffect, useRef, useState } from "react"; -import { AutoHeightControl } from "comps/controls/autoHeightControl"; -import { client } from "./videoMeetingControllerComp"; -import { IAgoraRTCRemoteUser } from "agora-rtc-sdk-ng"; -import { useContext } from "react"; -import { MeetingEventHandlerControl } from "comps/controls/eventHandlerControl"; -import { StringStateControl, stringExposingStateControl } from "comps/controls/codeStateControl"; -import { hiddenPropertyView } from "comps/utils/propertyUtils"; +import ReactResizeDetector from "react-resize-detector"; const VideoContainer = styled.video` height: 100%; @@ -42,14 +41,17 @@ const meetingStreamChildren = { disabled: BoolCodeControl, loading: BoolCodeControl, style: ButtonStyleControl, - viewRef: RefControl, + viewRef: RefControl, userId: withDefault(stringExposingStateControl(""), "{{meeting1.localUser}}"), - profileImageUrl: withDefault(StringStateControl, "https://api.dicebear.com/7.x/fun-emoji/svg?seed=Peanut&radius=50&backgroundColor=transparent&randomizeIds=true&eyes=wink,sleepClose"), + profileImageUrl: withDefault( + StringStateControl, + "https://api.dicebear.com/7.x/fun-emoji/svg?seed=Peanut&radius=50&backgroundColor=transparent&randomizeIds=true&eyes=wink,sleepClose" + ), noVideoText: stringExposingStateControl(trans("meeting.noVideo")), }; let VideoCompBuilder = (function () { - return new UICompBuilder(meetingStreamChildren, (props) => { + return new UICompBuilder(meetingStreamChildren, (props: any) => { const videoRef = useRef(null); const conRef = useRef(null); const [userId, setUserId] = useState(); @@ -116,7 +118,7 @@ let VideoCompBuilder = (function () { !user.hasVideo && user.uid + "" !== userData.user && userData.user !== "" - ) { + ) { props.onEvent("videoOff"); } } @@ -128,13 +130,12 @@ let VideoCompBuilder = (function () { setVideo(userData.streamingVideo); } }, [props.userId.value]); - - // console.log(props.userId); + console.log("userId", userId); return ( - {(editorState) => ( + {(editorState: any) => (
); }) - .setPropertyViewFn((children) => ( + .setPropertyViewFn((children: any) => ( <>
{children.userId.propertyView({ label: trans("meeting.videoId") })} - + {children.profileImageUrl.propertyView({ label: trans("meeting.profileImageUrl"), - placeholder: "https://api.dicebear.com/7.x/fun-emoji/svg?seed=Peanut&radius=50&backgroundColor=transparent&randomizeIds=true&eyes=wink,sleepClose", + placeholder: + "https://api.dicebear.com/7.x/fun-emoji/svg?seed=Peanut&radius=50&backgroundColor=transparent&randomizeIds=true&eyes=wink,sleepClose", })}
- {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( + {/* {(useContext(EditorContext).editorModeStatus === "logic" || + useContext(EditorContext).editorModeStatus === "both") && (
{children.onEvent.getPropertyView()} {hiddenPropertyView(children)}
)} - {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( - <>
- {children.autoHeight.getPropertyView()} -
-
- {children.profilePadding.propertyView({ - label: "Profile Image Padding", - })} - {children.profileBorderRadius.propertyView({ - label: "Profile Image Border Radius", - })} - {children.videoAspectRatio.propertyView({ - label: "Video Aspect Ratio", - })} - {children.style.getPropertyView()} -
- - )} + {(useContext(EditorContext).editorModeStatus === "layout" || + useContext(EditorContext).editorModeStatus === "both") && ( + <> */} +
+ {children.autoHeight.getPropertyView()} +
+
+ {children.profilePadding.propertyView({ + label: "Profile Image Padding", + })} + {children.profileBorderRadius.propertyView({ + label: "Profile Image Border Radius", + })} + {children.videoAspectRatio.propertyView({ + label: "Video Aspect Ratio", + })} + {children.style.getPropertyView()} +
+ {/* */} + {/* )} */} )) .build(); })(); VideoCompBuilder = class extends VideoCompBuilder { - override autoHeight(): boolean { + autoHeight(): boolean { return this.children.autoHeight.getView(); } }; export const VideoMeetingStreamComp = withExposingConfigs(VideoCompBuilder, [ - new NameConfig("loading", trans("button.loadingDesc")), + new NameConfig("loading", trans("meeting.loadingDesc")), new NameConfig("profileImageUrl", trans("meeting.profileImageUrl")), - ...CommonNameConfig, + ...CommonNameConfig, ]); diff --git a/client/packages/lowcoder/src/comps/comps/meetingComp/videoSharingStreamComp.tsx b/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/videoSharingStreamComp.tsx similarity index 69% rename from client/packages/lowcoder/src/comps/comps/meetingComp/videoSharingStreamComp.tsx rename to client/packages/lowcoder-comps/src/comps/agoraMeetingComp/videoSharingStreamComp.tsx index 192a09ed4..35b94ebdf 100644 --- a/client/packages/lowcoder/src/comps/comps/meetingComp/videoSharingStreamComp.tsx +++ b/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/videoSharingStreamComp.tsx @@ -1,29 +1,26 @@ -import { BoolCodeControl, StringControl } from "comps/controls/codeControl"; -import { EditorContext } from "comps/editorState"; -import { withDefault } from "comps/generators"; -import { UICompBuilder } from "comps/generators/uiCompBuilder"; -import ReactResizeDetector from "react-resize-detector"; import { + NameConfig, + withDefault, + withExposingConfigs, + StringControl, Section, sectionNames, -} from "lowcoder-design"; -import { trans } from "i18n"; -import styled from "styled-components"; -import { + AutoHeightControl, + EditorContext, + styled, + MeetingEventHandlerControl, + BoolCodeControl, + RefControl, + stringExposingStateControl, + UICompBuilder, CommonNameConfig, - NameConfig, - withExposingConfigs, -} from "../../generators/withExposing"; -import { ButtonStyleControl } from "./videobuttonCompConstants"; -import { RefControl } from "comps/controls/refControl"; +} from "lowcoder-sdk"; import { useEffect, useRef, useState } from "react"; -import { AutoHeightControl } from "comps/controls/autoHeightControl"; -import { client } from "./videoMeetingControllerComp"; -import { IAgoraRTCRemoteUser } from "agora-rtc-sdk-ng"; -import { useContext } from "react"; -import { MeetingEventHandlerControl } from "comps/controls/eventHandlerControl"; -import { stringExposingStateControl } from "comps/controls/codeStateControl"; -import { hiddenPropertyView } from "comps/utils/propertyUtils"; +import { client } from "./meetingControllerComp"; +import type { IAgoraRTCRemoteUser } from "agora-rtc-sdk-ng"; +import { trans } from "../../i18n/comps"; +import ReactResizeDetector from "react-resize-detector"; +import { ButtonStyleControl } from "./videobuttonCompConstants"; const VideoContainer = styled.video` height: 100%; @@ -42,13 +39,13 @@ const sharingStreamChildren = { disabled: BoolCodeControl, loading: BoolCodeControl, style: ButtonStyleControl, - viewRef: RefControl, + viewRef: RefControl, userId: withDefault(stringExposingStateControl(""), "{{meeting1.localUser}}"), noVideoText: stringExposingStateControl(trans("meeting.noVideo")), }; let SharingCompBuilder = (function () { - return new UICompBuilder(sharingStreamChildren, (props) => { + return new UICompBuilder(sharingStreamChildren, (props: any) => { const videoRef = useRef(null); const conRef = useRef(null); const [userId, setUserId] = useState(); @@ -95,8 +92,6 @@ let SharingCompBuilder = (function () { client.on( "user-unpublished", (user: IAgoraRTCRemoteUser, mediaType: "video" | "audio") => { - // console.log("user-unpublished"); - if (mediaType === "audio") { if ( !user.hasAudio && @@ -130,7 +125,7 @@ let SharingCompBuilder = (function () { return ( - {(editorState) => ( + {(editorState: any) => (
{userId ? ( @@ -161,7 +156,7 @@ let SharingCompBuilder = (function () { ) : ( <> )} - {/*

{userName ?? ""}

-
*/} +
)}
); }) - .setPropertyViewFn((children) => ( + .setPropertyViewFn((children: any) => ( <>
{children.userId.propertyView({ label: trans("meeting.videoId") })}
- {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( + {/* {(useContext(EditorContext).editorModeStatus === "logic" || + useContext(EditorContext).editorModeStatus === "both") && (
{children.onEvent.getPropertyView()} {hiddenPropertyView(children)}
- )} + )} */} - {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( - <>
- {children.autoHeight.getPropertyView()} -
-
- {children.profilePadding.propertyView({ - label: "Profile Image Padding", - })} - {children.profileBorderRadius.propertyView({ - label: "Profile Image Border Radius", - })} - {children.videoAspectRatio.propertyView({ - label: "Video Aspect Ratio", - })} - {children.style.getPropertyView()} -
- - )} + {/* {(useContext(EditorContext).editorModeStatus === "layout" || + useContext(EditorContext).editorModeStatus === "both") && ( + <> */} +
+ {children.autoHeight.getPropertyView()} +
+
+ {children.profilePadding.propertyView({ + label: "Profile Image Padding", + })} + {children.profileBorderRadius.propertyView({ + label: "Profile Image Border Radius", + })} + {children.videoAspectRatio.propertyView({ + label: "Video Aspect Ratio", + })} + {children.style?.getPropertyView()} +
+ {/* */} + {/* )} */} )) .build(); })(); SharingCompBuilder = class extends SharingCompBuilder { - override autoHeight(): boolean { + autoHeight(): boolean { return this.children.autoHeight.getView(); } }; export const VideoSharingStreamComp = withExposingConfigs(SharingCompBuilder, [ - new NameConfig("loading", trans("button.loadingDesc")), + new NameConfig("loading", trans("meeting.loadingDesc")), ...CommonNameConfig, ]); + \ No newline at end of file diff --git a/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/videobuttonCompConstants.tsx b/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/videobuttonCompConstants.tsx new file mode 100644 index 000000000..2b74fd189 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/agoraMeetingComp/videobuttonCompConstants.tsx @@ -0,0 +1,111 @@ +import { default as Button } from "antd/es/button"; +import { + styleControl, + ButtonStyleType, + ButtonStyle, + migrateOldData, + refMethods, + blurMethod, + clickMethod, + focusWithOptions, + genActiveColor, + genHoverColor, +} from "lowcoder-sdk"; +import styled, { css } from "styled-components"; +// import { genActiveColor, genHoverColor } from "lowcoder-design"; + +export function getButtonStyle(buttonStyle: any) { + const hoverColor = genHoverColor(buttonStyle.background); + const activeColor = genActiveColor(buttonStyle.background); + return css` + &&& { + border-radius: ${buttonStyle.radius}; + margin: ${buttonStyle.margin}; + padding: ${buttonStyle.padding}; + &:not(:disabled) { + // click animation color + --antd-wave-shadow-color: ${buttonStyle.border}; + border-color: ${buttonStyle.border}; + color: ${buttonStyle.text}; + background-color: ${buttonStyle.background}; + border-radius: ${buttonStyle.radius}; + margin: ${buttonStyle.margin}; + padding: ${buttonStyle.padding}; + + &:hover, + &:focus { + color: ${buttonStyle.text}; + background-color: ${hoverColor}; + border-color: ${buttonStyle.border === buttonStyle.background + ? hoverColor + : buttonStyle.border}; + } + + &:active { + color: ${buttonStyle.text}; + background-color: ${activeColor}; + border-color: ${buttonStyle.border === buttonStyle.background + ? activeColor + : buttonStyle.border}; + } + } + } + `; +} + +export const Button100 = styled(Button)<{ $buttonStyle?: any }>` + ${(props) => props.$buttonStyle && getButtonStyle(props.$buttonStyle)} + width: 100%; + height: auto; + display: inline-flex; + justify-content: center; + align-items: center; + overflow: hidden; + span { + overflow: hidden; + text-overflow: ellipsis; + } + gap: 6px; +`; + +export const ButtonCompWrapper = styled.div<{ disabled: boolean }>` + // The button component is disabled but can respond to drag & select events + ${(props) => + props.disabled && + ` + cursor: not-allowed; + button:disabled { + pointer-events: none; + } + `}; +`; + +/** + * Compatible with old data 2022-08-05 + */ +function fixOldData(oldData: any) { + if ( + oldData && + (oldData.hasOwnProperty("backgroundColor") || + oldData.hasOwnProperty("borderColor") || + oldData.hasOwnProperty("color")) + ) { + return { + background: oldData.backgroundColor, + border: oldData.borderColor, + text: oldData.color, + }; + } + return oldData; +} +const ButtonTmpStyleControl = styleControl(ButtonStyle); +export const ButtonStyleControl = migrateOldData( + ButtonTmpStyleControl, + fixOldData +); + +export const buttonRefMethods = refMethods([ + focusWithOptions, + blurMethod, + clickMethod, +]); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartComp.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartComp.tsx new file mode 100644 index 000000000..e2eb34577 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartComp.tsx @@ -0,0 +1,295 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "./chartConfigs/cartesianAxisConfig"; +import { chartChildrenMap, ChartSize, getDataKeys } from "./chartConstants"; +import { chartPropertyView } from "./chartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "./reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withMethodExposing, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "comps/chartComp/chartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: trans("chart.UIMode"), + value: "ui", + } +] as const; + +let BasicChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'ui'),...chartChildrenMap}, () => null) + .setPropertyViewFn(chartPropertyView) + .build(); +})(); + +BasicChartTmpComp = withViewFn(BasicChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={themeConfig} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +BasicChartTmpComp = class extends BasicChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let BasicChartComp = withExposingConfigs(BasicChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) => input.data, + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + +export const BasicChartCompWithDefault = withDefault(BasicChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/barChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/barChartConfig.tsx new file mode 100644 index 000000000..6c91fe252 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/barChartConfig.tsx @@ -0,0 +1,51 @@ +import { + BoolControl, + dropdownControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { BarSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +const BarTypeOptions = [ + { + label: trans("chart.basicBar"), + value: "basicBar", + }, + { + label: trans("chart.stackedBar"), + value: "stackedBar", + }, +] as const; + +export const BarChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + type: dropdownControl(BarTypeOptions, "basicBar"), + }, + (props): BarSeriesOption => { + const config: BarSeriesOption = { + type: "bar", + label: { + show: props.showLabel, + position: "top", + }, + }; + if (props.type === "stackedBar") { + config.stack = "stackValue"; + } + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("chart.barType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/candleStickChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/candleStickChartConfig.tsx new file mode 100644 index 000000000..7b7b5b103 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/candleStickChartConfig.tsx @@ -0,0 +1,35 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { CandlestickSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const CandleStickChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): CandlestickSeriesOption => { + const config: CandlestickSeriesOption = { + type: "candlestick", + label: { + show: props.showLabel, + position: "top", + }, + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("candleStickChart.candleStickType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/cartesianAxisConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/cartesianAxisConfig.tsx new file mode 100644 index 000000000..da4d70221 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/cartesianAxisConfig.tsx @@ -0,0 +1,307 @@ +import { XAXisComponentOption, YAXisComponentOption } from "echarts"; +import { ChartSize, XAxisDirectionType } from "../chartConstants"; +import { i18n } from "lowcoder-core"; +import { + MultiCompBuilder, + withContext, + NumberControl, + StringControl, + dropdownControl, + JSONValue, + isNumeric, +} from "lowcoder-sdk"; +import { i18nObjs, trans } from "i18n/comps"; +import _, { isNil } from "lodash"; +import { xAxisTypeUrl } from "./chartUrls"; + +const XAxisTypeOptions = [ + { + label: trans("chart.auto"), + value: "default", + }, + { + label: trans("chart.categoryAxis"), + value: "category", + }, + { + label: trans("chart.valueAxis"), + value: "value", + }, + { + label: trans("chart.timeAxis"), + value: "time", + }, + { + label: trans("chart.logAxis"), + value: "log", + }, +] as const; + +const YAxisTypeOptions = [ + { + label: trans("chart.valueAxis"), + value: "value", + }, + { + label: trans("chart.categoryAxis"), + value: "category", + }, + { + label: trans("chart.timeAxis"), + value: "time", + }, + { + label: trans("chart.logAxis"), + value: "log", + }, +] as const; + +export type EchartsAxisType = "category" | "value" | "time" | "log"; + +const axisCommonMap = { + axisName: StringControl, + logBase: NumberControl, +}; + +export const AxisFormatterComp = withContext( + new MultiCompBuilder({ value: StringControl }, (props) => props.value) + .setPropertyViewFn((children) => + children.value.propertyView({ + label: trans("chart.yAxisDataFormat"), + placeholder: "{{value}}", + tooltip: trans("chart.yAxisDataFormatTooltip"), + }) + ) + .build(), + ["value"] as const +); + +export const XAxisConfig = (function () { + return new MultiCompBuilder( + { + ...axisCommonMap, + type: dropdownControl(XAxisTypeOptions, "default"), + }, + (props): XAXisComponentOption => { + const config: XAXisComponentOption = { + name: props.axisName, + nameGap: 22, + // @ts-ignore + nameLocation: "middle", + }; + if (props.type !== "default") { + // don't assign value for default value, compute it in the end + config.type = props.type; + } + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.axisName.propertyView({ + label: trans("chart.xAxisName"), + })} + {children.type.propertyView({ + label: trans("chart.xAxisType"), + tooltip: ( + <> + {trans("chart.xAxisTypeTooltip")} + + {trans("chart.xAxisType")} + + + ), + })} + {children.type.getView() === "log" && + children.logBase.propertyView({ + label: trans("chart.logBase"), + })} + + )) + .build(); +})(); + +export const YAxisConfig = (function () { + return new MultiCompBuilder( + { + ...axisCommonMap, + // the old data has "type" field with default value "category". change field name to "yAxisType" for compatibility + yAxisType: dropdownControl(YAxisTypeOptions, "value"), + formatter: AxisFormatterComp, + }, + (props) => () => { + const config: YAXisComponentOption = { + name: props.axisName, + type: props.yAxisType, + nameTextStyle: { + align: "left", + }, + }; + const numberFormat = new Intl.NumberFormat(i18n.locales, { + notation: "compact", + }); + (config.axisLabel as any) = { + formatter: (value: string | number) => { + const res = (props.formatter as any)({ value: value }); + if (!isNil(res) && res !== "") { + return res; + } + if ( + (props.yAxisType === "value" || props.yAxisType === "log") && + typeof value === "number" + ) { + return numberFormat.format(value); + } + return value + ""; + }, + }; + if (props.yAxisType === "log") { + (config as any).logBase = props.logBase || 10; + } + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.axisName.propertyView({ + label: trans("chart.yAxisName"), + })} + {children.yAxisType.propertyView({ + label: trans("chart.yAxisType"), + })} + {children.yAxisType.getView() === "log" && + children.logBase.propertyView({ + label: trans("chart.logBase"), + })} + {children.formatter.getPropertyView()} + + )) + .build(); +})(); + +function calcXAxisType(xAxisData: Array): EchartsAxisType { + if (!xAxisData || xAxisData.length <= 0) { + return "category"; + } + const sampleData = xAxisData[0]; + if (!sampleData) { + return "category"; + } + if (isNumeric(sampleData)) { + return "value"; + } else if (!isNaN(new Date(sampleData.toString()).getDate())) { + return "time"; + } else { + return "category"; + } +} + +const dateInterval = { + year: 3600 * 24 * 1000 * 365, + month: 3600 * 24 * 1000 * 28, + day: 3600 * 24 * 1000, +}; + +function calcTimeInterval(xAxisData: Array) { + const minIntervals = xAxisData.map((data) => { + if (!data) { + // 1 is echarts default value, to make sure axis tick is integer + return 1; + } + const dataLen = data.toString().length; + if (dataLen === 4) { + // year 2022 + return dateInterval.year; + } else if (dataLen === 6 || dataLen === 7) { + // month 2022-01 222201 + return dateInterval.month; + } else if (dataLen === 10 || dataLen === 8) { + // day 2022-01-01 20220101 + return dateInterval.day; + } else { + return 1; + } + }); + return _.min(minIntervals); +} + +let measureCanvas: HTMLCanvasElement; + +// calculate x-axis text width +function getXAxisDataLength(xAxisData: Array) { + const canvas = measureCanvas || (measureCanvas = document.createElement("canvas")); + const context = canvas.getContext("2d"); + if (!context) { + return []; + } + // echarts default font + context.font = "normal 12px sans-serif"; + return xAxisData.map((d) => (d ? context.measureText(d.toString()).width + 2 : 0)); +} + +export function calcXYConfig( + xConfig: XAXisComponentOption, + yConfig: YAXisComponentOption, + xAxisDirection: XAxisDirectionType, + xAxisData: Array, + chartSize?: ChartSize & { right: number } +) { + const resXConfig = { ...xConfig }; + const resYConfig = { ...yConfig }; + + if (!resXConfig.type) { + // simple calculate x-axis type + resXConfig.type = calcXAxisType(xAxisData); + } + // x-axis label style adaptive + if (resXConfig.type === "category" && chartSize) { + const xAxisDataLenList = getXAxisDataLength(xAxisData); + // get x-axis single data's max width + const maxDataWidth = _.max(xAxisDataLenList); + const lastDataWidth = xAxisDataLenList[xAxisDataLenList.length - 1]; + // grid width + let eachDataWidth = chartSize.w / xAxisData.length; + let rotate = 0; + let labelWidth = maxDataWidth; + // rotate when width is not enough + if (maxDataWidth && eachDataWidth < maxDataWidth && xAxisDirection === "horizontal") { + labelWidth = Math.min(maxDataWidth, 150); + // vertical rotate 0.87 => sin(60) when exceeding the right boundary + const verticalRotate = + lastDataWidth && lastDataWidth * 0.87 > eachDataWidth / 2 + chartSize.right; + rotate = verticalRotate ? 270 : 330; + // to keep x-axis name under label, nameGap is related to label rotation angle + resXConfig.nameGap = verticalRotate ? labelWidth + 5 : labelWidth / 2 + 10; + } else if (xAxisDirection === "vertical" && maxDataWidth) { + // vertical direction + resXConfig.nameGap = maxDataWidth + 10; + } + resXConfig.axisLabel = { + interval: 0, + width: labelWidth, + // @ts-ignore + overflow: "truncate", + rotate: rotate, + }; + } else if (resXConfig.type === "time") { + (resXConfig as any).minInterval = calcTimeInterval(xAxisData); + const timeXAxisLabel = i18nObjs.timeXAxisLabel; + if (timeXAxisLabel) { + resXConfig.axisLabel = timeXAxisLabel; + } + } + if (xAxisDirection === "vertical") { + resYConfig.nameLocation = "middle"; + resYConfig.nameGap = 25; + } + + return xAxisDirection === "horizontal" + ? { + xConfig: resXConfig, + yConfig: resYConfig, + } + : { + xConfig: resYConfig, + yConfig: resXConfig, + }; +} diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/chartUrls.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/chartUrls.tsx new file mode 100644 index 000000000..ef8ada4b0 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/chartUrls.tsx @@ -0,0 +1,9 @@ +import { language } from "i18n/comps"; + +const echartsUrlLocale = language === "zh" ? "zh" : "en"; +export const optionUrl = `https://echarts.apache.org/${echartsUrlLocale}/option.html`; +export const examplesUrl = `https://echarts.apache.org/examples/${echartsUrlLocale}/index.html`; +export const xAxisTypeUrl = `${optionUrl}#xAxis.type`; +export const googleMapsApiUrl = `https://maps.googleapis.com/maps/api/js`; +export const mapOptionUrl = `https://github.com/plainheart/echarts-extension-gmap`; +export const mapExamplesUrl = `https://codepen.io/plainheart/pen/VweLGbR`; \ No newline at end of file diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/echartsLabelConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/echartsLabelConfig.tsx new file mode 100644 index 000000000..64b808e01 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/echartsLabelConfig.tsx @@ -0,0 +1,49 @@ +import { + AlignClose, + AlignRight, + AlignLeft, + dropdownControl, + MultiCompBuilder, +} from "lowcoder-sdk"; +import { LegendComponentOption } from "echarts"; +import { trans } from "i18n/comps"; + +const LabelPositionOptions = [ + { + label: , + value: "inside", + }, + { + label: , + value: "right", + }, + { + label: , + value: "left", + }, +] as const; + +export const EchartsLabelConfig = (function () { + return new MultiCompBuilder( + { + position: dropdownControl(LabelPositionOptions, "inside"), + }, + (props): LegendComponentOption => { + const config: LegendComponentOption = { + top: "inside", + type: "scroll", + }; + config.top = props.position + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.position.propertyView({ + label: trans("echarts.labelPosition"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/echartsLegendConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/echartsLegendConfig.tsx new file mode 100644 index 000000000..41fb166fb --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/echartsLegendConfig.tsx @@ -0,0 +1,44 @@ +import { + AlignBottom, + AlignTop, + dropdownControl, + MultiCompBuilder, +} from "lowcoder-sdk"; +import { LegendComponentOption } from "echarts"; +import { trans } from "i18n/comps"; + +const LegendPositionOptions = [ + { + label: , + value: "bottom", + }, + { + label: , + value: "top", + }, +] as const; + +export const EchartsLegendConfig = (function () { + return new MultiCompBuilder( + { + position: dropdownControl(LegendPositionOptions, "bottom"), + }, + (props): LegendComponentOption => { + const config: LegendComponentOption = { + top: "bottom", + type: "scroll", + }; + config.top = props.position + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.position.propertyView({ + label: trans("echarts.legendPosition"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/echartsTitleConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/echartsTitleConfig.tsx new file mode 100644 index 000000000..a9305de25 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/echartsTitleConfig.tsx @@ -0,0 +1,49 @@ +import { + AlignClose, + AlignRight, + AlignLeft, + dropdownControl, + MultiCompBuilder, +} from "lowcoder-sdk"; +import { LegendComponentOption } from "echarts"; +import { trans } from "i18n/comps"; + +const TitlePositionOptions = [ + { + label: , + value: "center", + }, + { + label: , + value: "right", + }, + { + label: , + value: "left", + }, +] as const; + +export const EchartsTitleConfig = (function () { + return new MultiCompBuilder( + { + position: dropdownControl(TitlePositionOptions, "center"), + }, + (props): LegendComponentOption => { + const config: LegendComponentOption = { + top: "center", + type: "scroll", + }; + config.top = props.position + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.position.propertyView({ + label: trans("echarts.titlePosition"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/funnelChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/funnelChartConfig.tsx new file mode 100644 index 000000000..84d3f4691 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/funnelChartConfig.tsx @@ -0,0 +1,35 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { FunnelSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const FunnelChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): FunnelSeriesOption => { + const config: FunnelSeriesOption = { + type: "funnel", + label: { + show: props.showLabel, + position: "top", + }, + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("funnelChart.funnelType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/gaugeChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/gaugeChartConfig.tsx new file mode 100644 index 000000000..a72c96cbb --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/gaugeChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { GaugeSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const GaugeChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): GaugeSeriesOption => { + const config: GaugeSeriesOption = { + type: "gauge", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("gaugeChart.gaugeType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/graphChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/graphChartConfig.tsx new file mode 100644 index 000000000..dbc23403e --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/graphChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { GraphSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const GraphChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): GraphSeriesOption => { + const config: GraphSeriesOption = { + type: "graph", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("graphChart.graphType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/heatmapChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/heatmapChartConfig.tsx new file mode 100644 index 000000000..cbebb6410 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/heatmapChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { HeatmapSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const HeatmapChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): HeatmapSeriesOption => { + const config: HeatmapSeriesOption = { + type: "heatmap", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("heatmapChart.heatmapType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/legendConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/legendConfig.tsx new file mode 100644 index 000000000..1384c88d8 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/legendConfig.tsx @@ -0,0 +1,55 @@ +import { + AlignBottom, + AlignClose, + AlignRight, + dropdownControl, + MultiCompBuilder, +} from "lowcoder-sdk"; +import { LegendComponentOption } from "echarts"; +import { trans } from "i18n/comps"; + +const LegendPositionOptions = [ + { + label: , + value: "bottom", + }, + { + label: , + value: "right", + }, + { + label: , + value: "close", + }, +] as const; + +export const LegendConfig = (function () { + return new MultiCompBuilder( + { + position: dropdownControl(LegendPositionOptions, "bottom"), + }, + (props): LegendComponentOption => { + const config: LegendComponentOption = { + top: "bottom", + type: "scroll", + }; + if (props.position === "right") { + config.top = "center"; + config.left = "right"; + config.orient = "vertical"; + } else if (props.position === "close") { + config.show = false; + } + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.position.propertyView({ + label: trans("chart.legendPosition"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/lineChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/lineChartConfig.tsx new file mode 100644 index 000000000..266e5fbf7 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/lineChartConfig.tsx @@ -0,0 +1,96 @@ +import { LineSeriesOption } from "echarts"; +import { + MultiCompBuilder, + BoolControl, + dropdownControl, + showLabelPropertyView, + withContext, + StringControl, + ColorOrBoolCodeControl, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; + +const BarTypeOptions = [ + { + label: trans("chart.basicLine"), + value: "basicLine", + }, + { + label: trans("chart.stackedLine"), + value: "stackedLine", + }, + { + label: trans("chart.areaLine"), + value: "areaLine", + }, +] as const; + +export const ItemColorComp = withContext( + new MultiCompBuilder({ value: ColorOrBoolCodeControl }, (props) => props.value) + .setPropertyViewFn((children) => + children.value.propertyView({ + label: trans("chart.pointColorLabel"), + placeholder: "{{value < 25000}}", + tooltip: trans("chart.pointColorTooltip"), + }) + ) + .build(), + ["seriesName", "value"] as const +); + +export const LineChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + type: dropdownControl(BarTypeOptions, "basicLine"), + smooth: BoolControl, + itemColor: ItemColorComp, + }, + (props): LineSeriesOption => { + const config: LineSeriesOption = { + type: "line", + label: { + show: props.showLabel, + }, + itemStyle: { + color: (params) => { + if (!params.encode || !params.dimensionNames) { + return params.color; + } + const dataKey = params.dimensionNames[params.encode["y"][0]]; + const color = (props.itemColor as any)({ + seriesName: params.seriesName, + value: (params.data as any)[dataKey], + }); + if (color === "true") { + return "red"; + } else if (color === "false" || !color) { + return params.color; + } + return color; + }, + }, + }; + if (props.type === "stackedLine") { + config.stack = "stackValue"; + } else if (props.type === "areaLine") { + config.areaStyle = {}; + } + if (props.smooth) { + config.smooth = true; + } + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.type.propertyView({ + label: trans("chart.lineType"), + })} + {showLabelPropertyView(children)} + {children.smooth.propertyView({ label: trans("chart.smooth") })} + {children.itemColor.getPropertyView()} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/pieChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/pieChartConfig.tsx new file mode 100644 index 000000000..0861fb6ba --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/pieChartConfig.tsx @@ -0,0 +1,83 @@ +import { MultiCompBuilder } from "lowcoder-sdk"; +import { PieSeriesOption } from "echarts"; +import { dropdownControl } from "lowcoder-sdk"; +import { ConstructorToView } from "lowcoder-core"; +import { trans } from "i18n/comps"; + +const BarTypeOptions = [ + { + label: trans("chart.basicPie"), + value: "basicPie", + }, + { + label: trans("chart.doughnutPie"), + value: "doughnutPie", + }, + { + label: trans("chart.rosePie"), + value: "rosePie", + }, +] as const; + +// radius percent for each pie chart when one line has [1, 2, 3] pie charts +const pieRadiusConfig = [65, 35, 20]; + +type PieConfigViewType = ConstructorToView; + +export const PieChartConfig = (function () { + return new MultiCompBuilder( + { + type: dropdownControl(BarTypeOptions, "basicPie"), + }, + (props): PieSeriesOption => { + const config: PieSeriesOption = { + type: "pie", + label: { + show: true, + formatter: "{d}%", + }, + }; + if (props.type === "rosePie") { + config.roseType = "area"; + } else if (props.type === "doughnutPie") { + config.radius = ["40%", "60%"]; + } + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.type.propertyView({ + label: trans("chart.pieType"), + })} + + )) + .build(); +})(); + +export function getPieRadiusAndCenter( + seriesLength: number, + pieIndex: number, + pieConfig: PieConfigViewType +) { + const columnPieNum = Math.min(seriesLength, pieRadiusConfig.length); + const radiusNumber = pieRadiusConfig[columnPieNum - 1]; + const isDoughnutPie = Array.isArray(pieConfig.radius); + const radius = isDoughnutPie + ? [(radiusNumber / 1.6).toFixed(2) + "%", radiusNumber + "%"] + : radiusNumber + "%"; + + /*** calculate center coordinates ***/ + const pieDiameter = 100 / columnPieNum; + const xPosition = (pieDiameter * (pieIndex % columnPieNum) + pieDiameter / 2).toFixed(2) + "%"; + const rowIndex = Math.floor(pieIndex / columnPieNum) + 1; + const yPosition = + ((100 / Math.floor((columnPieNum * 2 + seriesLength - 1) / columnPieNum)) * rowIndex).toFixed( + 2 + ) + "%"; + // log.log("Echarts height: index:", pieConfig, radius, pieIndex, xPosition, yPosition); + return { + radius: radius, + center: [xPosition, yPosition], + } as const; +} diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/radarChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/radarChartConfig.tsx new file mode 100644 index 000000000..5615c2d73 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/radarChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { RadarSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const RadarChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): RadarSeriesOption => { + const config: RadarSeriesOption = { + type: "radar", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("radarChart.radarType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/sankeyChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/sankeyChartConfig.tsx new file mode 100644 index 000000000..60c646c0b --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/sankeyChartConfig.tsx @@ -0,0 +1,35 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { SankeySeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const SankeyChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): SankeySeriesOption => { + const config: SankeySeriesOption = { + type: "sankey", + label: { + show: props.showLabel, + position: "top", + }, + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("sankeyChart.sankeyType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/scatterChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/scatterChartConfig.tsx new file mode 100644 index 000000000..edb339bdb --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/scatterChartConfig.tsx @@ -0,0 +1,62 @@ +import { + MultiCompBuilder, + dropdownControl, + BoolControl, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { ScatterSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +const ScatterShapeOptions = [ + { + label: trans("chart.circle"), + value: "circle", + }, + { + label: trans("chart.rect"), + value: "rect", + }, + { + label: trans("chart.triangle"), + value: "triangle", + }, + { + label: trans("chart.diamond"), + value: "diamond", + }, + { + label: trans("chart.pin"), + value: "pin", + }, + { + label: trans("chart.arrow"), + value: "arrow", + }, +] as const; + +export const ScatterChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + shape: dropdownControl(ScatterShapeOptions, "circle"), + }, + (props): ScatterSeriesOption => { + return { + type: "scatter", + symbol: props.shape, + label: { + show: props.showLabel, + }, + }; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.shape.propertyView({ + label: trans("chart.scatterShape"), + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/sunburstChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/sunburstChartConfig.tsx new file mode 100644 index 000000000..8306911a3 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/sunburstChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { SunburstSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const SunburstChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): SunburstSeriesOption => { + const config: SunburstSeriesOption = { + type: "sunburst", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("sunburstChart.sunburstType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/themeriverChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/themeriverChartConfig.tsx new file mode 100644 index 000000000..ae639eb22 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/themeriverChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { ThemeRiverSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const ThemeriverChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): ThemeRiverSeriesOption => { + const config: ThemeRiverSeriesOption = { + type: "themeRiver", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("themeriverChart.themeriverType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/treeChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/treeChartConfig.tsx new file mode 100644 index 000000000..3f824008d --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/treeChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { TreeSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const TreeChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): TreeSeriesOption => { + const config: TreeSeriesOption = { + type: "tree", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("treeChart.treeType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/treemapChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/treemapChartConfig.tsx new file mode 100644 index 000000000..a201337ef --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConfigs/treemapChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { TreemapSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const TreemapChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): TreemapSeriesOption => { + const config: TreemapSeriesOption = { + type: "treemap", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("treemapChart.treemapType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConstants.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConstants.tsx new file mode 100644 index 000000000..d43134234 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartConstants.tsx @@ -0,0 +1,301 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "./chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "./chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "./chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "./chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "./chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "./chartConfigs/lineChartConfig"; +import { PieChartConfig } from "./chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "./chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "./seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { GaugeChartConfig } from "./chartConfigs/gaugeChartConfig"; +import { FunnelChartConfig } from "./chartConfigs/funnelChartConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + funnel: FunnelChartConfig, + gauge: GaugeChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "funnel"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultEchartsJsonOption), + echartsTitle: withDefault(StringControl, trans("echarts.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const chartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(chartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartPropertyView.tsx new file mode 100644 index 000000000..cfda76b14 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartPropertyView.tsx @@ -0,0 +1,214 @@ +import { changeChildAction, CompAction } from "lowcoder-core"; +import { ChartCompChildrenType, ChartTypeOptions,getDataKeys } from "./chartConstants"; +import { newSeries } from "./seriesComp"; +import { + CustomModal, + Dropdown, + hiddenPropertyView, + Option, + RedButton, + Section, + sectionNames, + controlItem, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl, mapExamplesUrl, mapOptionUrl, optionUrl } from "./chartConfigs/chartUrls"; + +export function chartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + const series = children.series.getView(); + const columnOptions = getDataKeys(children.data.getView()).map((key) => ({ + label: key, + value: key, + })); + + const uiModePropertyView = ( + <> +
+ {children.data.propertyView({ + label: trans("chart.data"), + })} + { + // keep the previous value + if (children.chartConfig.children.comp.children.hasOwnProperty("showLabel")) { + children.chartConfig.dispatchChangeValueAction({ + compType: value as any, + comp: { + showLabel: ( + children.chartConfig.children.comp.children as any + ).showLabel.toJsonValue(), + }, + }); + } else { + children.chartConfig.dispatchChangeValueAction({ + compType: value, + }); + } + }} + /> + { + dispatch(changeChildAction("xAxisKey", value)); + }} + /> +
+
+
+ {children.onUIEvent.propertyView({title: trans("chart.chartEventHandlers")})} +
+
+ {children.onEvent.propertyView()} +
+
+
+ {children.title.propertyView({ label: trans("chart.title") })} + {children.chartConfig.children.compType.getView() !== "pie" && ( + <> + {children.xAxisDirection.propertyView({ + label: trans("chart.xAxisDirection"), + radioButton: true, + })} + {children.xConfig.getPropertyView()} + {children.yConfig.getPropertyView()} + + )} + {children.legendConfig.getPropertyView()} + {hiddenPropertyView(children)} +
+
{children.chartConfig.getPropertyView()}
+ + ); + + const jsonModePropertyView = ( + <> + + ); + + const mapModePropertyView = ( + <> +
+ {children.mapApiKey.propertyView({ + label: "API Key" + })} + {children.mapZoomLevel.propertyView({ + label: "Zoom Level" + })} + {controlItem({}, ( + + {'Center Position'} + + ))} + {children.mapCenterLng.propertyView({ + label: "Longitude" + })} + {children.mapCenterLat.propertyView({ + label: "Latitude" + })} + {children.showCharts.propertyView({ + label: "Show Charts" + })} +
+
+ {children.mapOptions.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} +
+
+
+ {children.onMapEvent.propertyView({title: trans("chart.chartEventHandlers")})} +
+
+ {children.onEvent.propertyView()} +
+
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "ui": + return uiModePropertyView; + case "json": + return jsonModePropertyView; + case "map": + return mapModePropertyView; + } + } + return ( + <> + {/*
+ {children.mode.propertyView({ + label: "", + radioButton: true, + })} +
*/} + {getChatConfigByMode(children.mode.getView())} + + ); +} diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/chartUtils.ts b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartUtils.ts new file mode 100644 index 000000000..57b908be5 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/chartUtils.ts @@ -0,0 +1,328 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "./reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "./chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":"center" + }, + "backgroundColor": props?.style?.background, + "color": props.echartsOption.data?.map(data => data.color), + "tooltip": props.tooltip&&{ + "trigger": "item", + "formatter": "{a}
{b} : {c}%" + }, + "legend":props.legendVisibility&& { + "data": props.echartsOption.data?.map(data=>data.name), + "top": props.echartsLegendConfig.top, + }, + "series": [ + { + "name": props.echartsConfig.type, + "type": props.echartsConfig.type, + "left": "10%", + "top": 60, + "bottom": 60, + "width": "80%", + "min": 0, + "max": 100, + "gap": 2, + "label": { + "show": true, + "position": props.echartsLabelConfig.top + }, + "data": props.echartsOption.data + } + ] +} + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/reactEcharts/core.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/reactEcharts/core.tsx new file mode 100644 index 000000000..1b5d9410a --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/reactEcharts/core.tsx @@ -0,0 +1,194 @@ +import type { ECharts } from "echarts"; +import { PureComponent } from "react"; +import isEqual from "fast-deep-equal"; +import { EChartsReactProps, EChartsInstance } from "./types"; +import _ from "lodash"; +import log from "loglevel"; + +function isString(v: any): boolean { + return typeof v === "string"; +} + +function isFunction(v: any): boolean { + return typeof v === "function"; +} + +/** + * core component for echarts binding + */ +export default class EChartsReactCore extends PureComponent { + /** + * echarts render container + */ + public ele: HTMLElement | null; + + /** + * echarts library entry + */ + protected echarts: any; + + constructor(props: EChartsReactProps) { + super(props); + + this.echarts = props.echarts; + this.ele = null; + } + + componentDidMount() { + this.renderNewEcharts(); + } + + // update + componentDidUpdate(prevProps: EChartsReactProps) { + /** + * if shouldSetOption return false, then return, not update echarts options + * default is true + */ + const { shouldSetOption } = this.props; + if (shouldSetOption && isFunction(shouldSetOption) && !shouldSetOption(prevProps, this.props)) { + return; + } + + /** + * the props below need to dispose before re-render + * 1. when switching theme + * 2. when modifying opts + * 3. when modifying onEvents, thus the binded event issue #151 can be cancel + */ + if ( + !isEqual(prevProps.theme, this.props.theme) || + !isEqual(prevProps.opts, this.props.opts) || + !isEqual(prevProps.onEvents, this.props.onEvents) || + !isEqual(prevProps.mode, this.props.mode) + // this.props.option.gmap + ) { + this.dispose(); + + this.renderNewEcharts(); // re-render + return; + } + + if(this.props.mode === "json") { + this.updateEChartsOption(); + return; + } + + // when these props are not isEqual, update echarts + const pickKeys = ["option", "notMerge", "lazyUpdate", "showLoading", "loadingOption"]; + if (!isEqual(_.pick(this.props, pickKeys), _.pick(prevProps, pickKeys))) { + this.updateEChartsOption(); + } + } + + componentWillUnmount() { + this.dispose(); + } + + /** + * return the echart object + * 1. if exist, return the existed instance + * 2. or new one instance + */ + public getEchartsInstance(): ECharts { + return ( + this.echarts.getInstanceByDom(this.ele) || + this.echarts.init(this.ele, this.props.theme, this.props.opts) + ); + } + + /** + * dispose echarts and clear size-sensor + */ + private dispose() { + if (this.ele) { + // dispose echarts instance + this.echarts.dispose(this.ele); + } + } + + /** + * render a new echarts instance + */ + private renderNewEcharts() { + const { onEvents, onChartReady } = this.props; + + // 1. new echarts instance + const echartsInstance = this.updateEChartsOption(); + + // 2. bind events + this.bindEvents(echartsInstance, onEvents || {}); + + // 3. on chart ready + if (onChartReady && isFunction(onChartReady)) onChartReady(echartsInstance); + } + + // bind the events + private bindEvents(instance: any, events: EChartsReactProps["onEvents"]) { + function _bindEvent(eventName: string, func: Function) { + // ignore the event config which not satisfy + if (isString(eventName) && isFunction(func)) { + // binding event + instance.on(eventName, (param: any) => { + func(param, instance); + }); + } + } + + // loop and bind + for (const eventName in events) { + if (Object.prototype.hasOwnProperty.call(events, eventName)) { + _bindEvent(eventName, events[eventName]); + } + } + } + + /** + * render the echarts + */ + private updateEChartsOption(): EChartsInstance { + const { + option, + notMerge = false, + lazyUpdate = false, + showLoading, + loadingOption = null, + } = this.props; + // 1. get or initial the echarts object + const echartInstance = this.getEchartsInstance(); + // 2. set the echarts option + try { + // set option catch exception + echartInstance.setOption(option, { + notMerge: notMerge, + lazyUpdate: lazyUpdate, + silent: true, + }); + } catch (e) { + // FIXME: if don't dispose, setOption again will call cause bugs + // https://github.com/apache/echarts/issues/16608 + this.dispose(); + log.warn("invalid echarts option:", e); + } + // 3. set loading mask + if (showLoading) echartInstance.showLoading(loadingOption); + else echartInstance.hideLoading(); + + return echartInstance; + } + + render(): JSX.Element { + const { style, className = "" } = this.props; + // default height = 300 + const newStyle = { height: 300, ...style }; + + return ( +
{ + this.ele = e; + }} + style={newStyle} + className={`echarts-for-react ${className}`} + /> + ); + } +} diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/reactEcharts/index.ts b/client/packages/lowcoder-comps/src/comps/basicChartComp/reactEcharts/index.ts new file mode 100644 index 000000000..dcb57f0f9 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/reactEcharts/index.ts @@ -0,0 +1,21 @@ +import * as echarts from "echarts"; +import "echarts-wordcloud"; +import { EChartsReactProps, EChartsInstance, EChartsOptionWithMap } from "./types"; +import EChartsReactCore from "./core"; + +/** + * reference: https://github.com/hustcc/echarts-for-react + * add exception-catch for setOption + * if query isn't successfully loaded, chart will fail to load and can't reload + */ +export type { EChartsReactProps, EChartsOptionWithMap, EChartsInstance }; + +// export the Component the echarts Object. +export default class EChartsReact extends EChartsReactCore { + constructor(props: EChartsReactProps) { + super(props); + + // initialize as echarts package + this.echarts = echarts; + } +} diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/reactEcharts/types.ts b/client/packages/lowcoder-comps/src/comps/basicChartComp/reactEcharts/types.ts new file mode 100644 index 000000000..2764d4b81 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/reactEcharts/types.ts @@ -0,0 +1,76 @@ +import { CSSProperties } from "react"; +import { EChartsOption } from "echarts"; +import { GoogleMapComponentOption } from "echarts-extension-gmap"; + +export type EChartsOptionWithMap = EChartsOption & GoogleMapComponentOption; + +export type EChartsInstance = any; + +export type Opts = { + readonly devicePixelRatio?: number; + readonly renderer?: "canvas" | "svg"; + readonly width?: number | null | undefined | "auto"; + readonly height?: number | null | undefined | "auto"; + readonly locale?: string; +}; + +export type EChartsReactProps = { + /** + * echarts library entry, use it for import necessary. + */ + readonly echarts?: any; + /** + * `className` for container + */ + readonly className?: string; + /** + * `style` for container + */ + readonly style?: CSSProperties; + /** + * echarts option + */ + readonly option: EChartsOptionWithMap; + /** + * echarts theme config, can be: + * 1. theme name string + * 2. theme object + */ + readonly theme?: string | Record; + /** + * notMerge config for echarts, default is `false` + */ + readonly notMerge?: boolean; + /** + * lazyUpdate config for echarts, default is `false` + */ + readonly lazyUpdate?: boolean; + /** + * showLoading config for echarts, default is `false` + */ + readonly showLoading?: boolean; + /** + * loadingOption config for echarts, default is `null` + */ + readonly loadingOption?: any; + /** + * echarts opts config, default is `{}` + */ + readonly opts?: Opts; + /** + * when after chart reander, do the callback widht echarts instance + */ + readonly onChartReady?: (instance: EChartsInstance) => void; + /** + * bind events, default is `{}` + */ + readonly onEvents?: Record; + /** + * should update echarts options + */ + readonly shouldSetOption?: (prevProps: EChartsReactProps, props: EChartsReactProps) => boolean; + /** + * echarts mode: ui | json | map + */ + readonly mode?: 'ui' | 'json' | 'map' +}; diff --git a/client/packages/lowcoder-comps/src/comps/basicChartComp/seriesComp.tsx b/client/packages/lowcoder-comps/src/comps/basicChartComp/seriesComp.tsx new file mode 100644 index 000000000..9ded885b5 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/basicChartComp/seriesComp.tsx @@ -0,0 +1,119 @@ +import { + BoolControl, + StringControl, + list, + JSONObject, + isNumeric, + genRandomKey, + Dropdown, + OptionsType, + MultiCompBuilder, + valueComp, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; + +import { ConstructorToComp, ConstructorToDataType, ConstructorToView } from "lowcoder-core"; +import { CompAction, CustomAction, customAction, isMyCustomAction } from "lowcoder-core"; + +export type SeriesCompType = ConstructorToComp; +export type RawSeriesCompType = ConstructorToView; +type SeriesDataType = ConstructorToDataType; + +type ActionDataType = { + type: "chartDataChanged"; + chartData: Array; +}; + +export function newSeries(name: string, columnName: string): SeriesDataType { + return { + seriesName: name, + columnName: columnName, + dataIndex: genRandomKey(), + }; +} + +const seriesChildrenMap = { + columnName: StringControl, + seriesName: StringControl, + hide: BoolControl, + // unique key, for sort + dataIndex: valueComp(""), +}; + +const SeriesTmpComp = new MultiCompBuilder(seriesChildrenMap, (props) => { + return props; +}) + .setPropertyViewFn(() => { + return <>; + }) + .build(); + +class SeriesComp extends SeriesTmpComp { + getPropertyViewWithData(columnOptions: OptionsType): React.ReactNode { + return ( + <> + {this.children.seriesName.propertyView({ + label: trans("chart.seriesName"), + })} + { + this.children.columnName.dispatchChangeValueAction(value); + }} + /> + + ); + } +} + +const SeriesListTmpComp = list(SeriesComp); + +export class SeriesListComp extends SeriesListTmpComp { + override reduce(action: CompAction): this { + if (isMyCustomAction(action, "chartDataChanged")) { + // auto generate series + const actions = this.genExampleSeriesActions(action.value.chartData); + return this.reduce(this.multiAction(actions)); + } + return super.reduce(action); + } + + private genExampleSeriesActions(chartData: Array) { + const actions: CustomAction[] = []; + if (!chartData || chartData.length <= 0 || !chartData[0]) { + return actions; + } + let delCnt = 0; + const existColumns = this.getView().map((s) => s.getView().columnName); + // delete series not in data + existColumns.forEach((columnName) => { + if (chartData[0]?.[columnName] === undefined) { + actions.push(this.deleteAction(0)); + delCnt++; + } + }); + if (existColumns.length > delCnt) { + // don't generate example if exists + return actions; + } + // generate example series + const exampleKeys = Object.keys(chartData[0]) + .filter((key) => { + return !existColumns.includes(key) && isNumeric(chartData[0][key]); + }) + .slice(0, 3); + exampleKeys.forEach((key) => actions.push(this.pushAction(newSeries(key, key)))); + return actions; + } + + dispatchDataChanged(chartData: Array): void { + this.dispatch( + customAction({ + type: "chartDataChanged", + chartData: chartData, + }) + ); + } +} diff --git a/client/packages/lowcoder-comps/src/comps/calendarComp/calendarComp.tsx b/client/packages/lowcoder-comps/src/comps/calendarComp/calendarComp.tsx index c65de7873..b6d1b912a 100644 --- a/client/packages/lowcoder-comps/src/comps/calendarComp/calendarComp.tsx +++ b/client/packages/lowcoder-comps/src/comps/calendarComp/calendarComp.tsx @@ -1,3 +1,23 @@ +import { default as Form } from "antd/es/form"; +import { default as Input } from "antd/es/input"; +import { trans, getCalendarLocale } from "../../i18n/comps"; +import { createRef, useContext, useRef, useState, useEffect } from "react"; +import dayjs from "dayjs"; +import FullCalendar from "@fullcalendar/react"; +import resourceTimelinePlugin from "@fullcalendar/resource-timeline"; +import resourceTimeGridPlugin from "@fullcalendar/resource-timegrid"; +import adaptivePlugin from "@fullcalendar/adaptive"; +import dayGridPlugin from "@fullcalendar/daygrid"; +import multiMonthPlugin from '@fullcalendar/multimonth'; +import timeGridPlugin from "@fullcalendar/timegrid"; +import interactionPlugin from "@fullcalendar/interaction"; +import listPlugin from "@fullcalendar/list"; +import allLocales from "@fullcalendar/core/locales-all"; +import { EventContentArg, DateSelectArg } from "@fullcalendar/core"; +import momentPlugin from "@fullcalendar/moment"; + +import ErrorBoundary from "./errorBoundary"; + import { isValidColor, NameConfig, @@ -6,10 +26,12 @@ import { UICompBuilder, withDefault, withExposingConfigs, + withMethodExposing, NumberControl, StringControl, hiddenPropertyView, ChangeEventHandlerControl, + DragEventHandlerControl, Section, sectionNames, dropdownControl, @@ -20,24 +42,9 @@ import { CustomModal, jsonValueExposingStateControl, CalendarDeleteIcon, - Tooltip, + Tooltip } from "lowcoder-sdk"; -import { default as Form } from "antd/es/form"; -import { default as Input } from "antd/es/input"; -import { trans, getCalendarLocale } from "../../i18n/comps"; -import { createRef, useContext, useRef, useState } from "react"; -import resourceTimelinePlugin from "@fullcalendar/resource-timeline"; -import resourceTimeGridPlugin from "@fullcalendar/resource-timegrid"; -import adaptivePlugin from "@fullcalendar/adaptive"; -import FullCalendar from "@fullcalendar/react"; -import dayGridPlugin from "@fullcalendar/daygrid"; -import timeGridPlugin from "@fullcalendar/timegrid"; -import interactionPlugin from "@fullcalendar/interaction"; -import listPlugin from "@fullcalendar/list"; -import allLocales from "@fullcalendar/core/locales-all"; -import { EventContentArg, DateSelectArg } from "@fullcalendar/core"; -import momentPlugin from "@fullcalendar/moment"; import { DefaultWithFreeViewOptions, DefaultWithPremiumViewOptions, @@ -52,61 +59,159 @@ import { headerToolbar, views, slotLabelFormat, + slotLabelFormatWeek, + slotLabelFormatMonth, viewClassNames, FormWrapper, + resourcesDefaultData, + resourcesEventsDefaultData, + resourceTimeLineHeaderToolbar, + resourceTimeGridHeaderToolbar, } from "./calendarConstants"; -import dayjs from "dayjs"; - -function filterViews() {} +// this should ensure backwards compatibility with older versions of the SDK +const safeDragEventHandlerControl = typeof DragEventHandlerControl !== 'undefined' ? DragEventHandlerControl : () => {}; + const childrenMap = { events: jsonValueExposingStateControl("events", defaultData), + resourcesEvents: jsonValueExposingStateControl("resourcesEvents", resourcesEventsDefaultData), + resources: jsonValueExposingStateControl("resources", resourcesDefaultData), + resourceName: withDefault(StringControl, trans("calendar.resourcesDefault")), onEvent: ChangeEventHandlerControl, - + onDropEvent: safeDragEventHandlerControl, editable: withDefault(BoolControl, true), - defaultDate: withDefault(StringControl, "{{ new Date() }}"), - defaultFreeView: dropdownControl(DefaultWithFreeViewOptions, "timeGridWeek"), - defaultPremiumView: dropdownControl( - DefaultWithPremiumViewOptions, - "timeGridWeek" - ), - - firstDay: dropdownControl(FirstDayOptions, "1"), showEventTime: withDefault(BoolControl, true), showWeekends: withDefault(BoolControl, true), showAllDay: withDefault(BoolControl, true), + defaultDate: withDefault(StringControl, "{{ new Date() }}"), + firstDay: dropdownControl(FirstDayOptions, "1"), dayMaxEvents: withDefault(NumberControl, 2), eventMaxStack: withDefault(NumberControl, 0), style: styleControl(CalendarStyle), - licenceKey: withDefault(StringControl, ""), + licenseKey: withDefault( StringControl, "" ), + currentFreeView: dropdownControl(DefaultWithFreeViewOptions, "timeGridWeek"), + currentPremiumView: dropdownControl(DefaultWithPremiumViewOptions, "resourceTimelineDay"), }; let CalendarBasicComp = (function () { - return new UICompBuilder(childrenMap, (props) => { + return new UICompBuilder(childrenMap, (props: { + events: any; + resourcesEvents: any; + resources: any; + resourceName : string + onEvent?: any; + onDropEvent?: any; + editable?: boolean; + showEventTime?: boolean; + showWeekends?: boolean; + showAllDay?: boolean; + defaultDate?: string; + firstDay?: string; + dayMaxEvents?: number; + eventMaxStack?: number; + style: any; + licenseKey?: string; + licensed?: boolean; + currentFreeView?: string; + currentPremiumView?: string; + }) => { + const theme = useContext(ThemeContext); const ref = createRef(); const editEvent = useRef(); - const [form] = Form.useForm(); + const [form] = Form.useForm(); const [left, setLeft] = useState(undefined); + const [licensed, setLicensed] = useState(props.licenseKey !== ""); + + useEffect(() => { + setLicensed(props.licenseKey !== ""); + }, [props.licenseKey]); - const events = props.events.value.map((item: EventType) => { + let currentView = licensed ? props.currentPremiumView : props.currentFreeView; + let currentEvents = currentView == "resourceTimelineDay" || currentView == "resourceTimeGridDay" ? props.resourcesEvents : props.events; + + console.log("currentEvents", currentEvents); + + // we use one central stack of events for all views + let events = Array.isArray(currentEvents.value) ? currentEvents.value.map((item: EventType) => { return { title: item.title, id: item.id, start: dayjs(item.start, DateParser).format(), end: dayjs(item.end, DateParser).format(), allDay: item.allDay, - color: isValidColor(item.color || "") - ? item.color - : theme?.theme?.primary, - ...(item.groupId ? { groupId: item.groupId } : null), + resourceId: item.resourceId ? item.resourceId : null, + color: isValidColor(item.color || "") ? item.color : theme?.theme?.primary, + ...(item.groupId ? { groupId: item.groupId } : {}), }; + }) : [currentEvents.value]; + + const resources = props.resources.value; + + // list all plugins for Fullcalendar + const plugins = [ + dayGridPlugin, + timeGridPlugin, + interactionPlugin, + listPlugin, + momentPlugin, + resourceTimelinePlugin, + resourceTimeGridPlugin, + adaptivePlugin, + multiMonthPlugin, + ]; + + // filter out premium plugins if not licensed + const filteredPlugins = plugins.filter((plugin) => { + if (!licensed) { + return ![resourceTimelinePlugin, resourceTimeGridPlugin, adaptivePlugin].includes(plugin); + } + return true; }); - const { - defaultDate, - defaultFreeView, - defaultPremiumView, + const toolBar = (defaultView: any) => { + switch (defaultView) { + case "resourceTimelineDay": + return resourceTimeLineHeaderToolbar; + break; + case "resourceTimeGridDay": + return resourceTimeGridHeaderToolbar; + break; + default: + return headerToolbar; + break; + } + }; + + + const [currentSlotLabelFormat, setCurrentSlotLabelFormat] = useState(slotLabelFormat); + + const handleDatesSet = (arg: { view: { type: any; }; }) => { + switch (arg.view.type) { + case "resourceTimelineDay": + setCurrentSlotLabelFormat(slotLabelFormat); + break; + case "resourceTimelineWeek": + setCurrentSlotLabelFormat(slotLabelFormatWeek); + break; + case "resourceTimelineMonth": + setCurrentSlotLabelFormat(slotLabelFormatMonth); + break; + default: + setCurrentSlotLabelFormat(slotLabelFormat); + break; + } + }; + + let initialDate: string | undefined; + + try { + initialDate = new Date(props.defaultDate || Date.now()).toISOString(); + } catch (error) { + initialDate = undefined; + } + + let { showEventTime, showWeekends, showAllDay, @@ -115,7 +220,8 @@ let CalendarBasicComp = (function () { style, firstDay, editable, - licenceKey, + licenseKey, + resourceName, } = props; function renderEventContent(eventInfo: EventContentArg) { @@ -145,16 +251,16 @@ let CalendarBasicComp = (function () { return (
{eventInfo.timeText}
{eventInfo.event.title}
{ e.stopPropagation(); @@ -307,24 +413,19 @@ let CalendarBasicComp = (function () { } props.onEvent("change"); form.resetFields(); - }); + }); //small change }, onCancel: () => { form.resetFields(); }, }); - }; + }; - let initialDate = defaultDate; - try { - initialDate = new Date(defaultDate).toISOString(); - } catch (error) { - initialDate = undefined; - } - let defaultView = defaultFreeView; - if (licenceKey != "") { - defaultView = defaultPremiumView; - } + const handleDrop = () => { + if (typeof props.onDropEvent === 'function') { + props.onDropEvent("dropEvent"); + } + }; return ( - { - let left = 0; - const ele = info.jsEvent.target as HTMLElement; - if (info.view.type === ViewType.DAY) { - if (info.allDay) { - left = ele.offsetParent?.parentElement?.offsetLeft || 0; + + (!showEventTime ? "no-time" : "")} + slotLabelFormat={currentSlotLabelFormat} + viewClassNames={viewClassNames} + moreLinkText={trans("calendar.more")} + initialDate={initialDate} + initialView={currentView} + editable={editable} + selectable={editable} + datesSet={handleDatesSet} + selectMirror={false} + displayEventTime={showEventTime} + dayMaxEvents={dayMaxEvents} + eventMaxStack={eventMaxStack || undefined} + weekends={showWeekends} + allDaySlot={showAllDay} + eventContent={renderEventContent} + select={(info) => handleCreate(info)} + eventClick={(info) => { + const event = events.find( + (item: EventType) => item.id === info.event.id + ); + editEvent.current = event; + setTimeout(() => { + editEvent.current = undefined; + }, 500); + }} + moreLinkClick={(info) => { + let left = 0; + const ele = info.jsEvent.target as HTMLElement; + if (info.view.type === ViewType.DAY) { + if (info.allDay) { + left = ele.offsetParent?.parentElement?.offsetLeft || 0; + } else { + left = ele.parentElement?.offsetLeft || 0; + } } else { - left = ele.parentElement?.offsetLeft || 0; + if (info.allDay) { + left = + ele.offsetParent?.parentElement?.parentElement?.offsetLeft || + 0; + } else { + left = + ele.offsetParent?.parentElement?.parentElement?.parentElement + ?.offsetLeft || 0; + } } - } else { - if (info.allDay) { - left = - ele.offsetParent?.parentElement?.parentElement?.offsetLeft || - 0; - } else { - left = - ele.offsetParent?.parentElement?.parentElement?.parentElement - ?.offsetLeft || 0; + setLeft(left); + }} + eventsSet={(info) => { + let needChange = false; + let changeEvents: EventType[] = []; + info.forEach((item) => { + const event = events.find((i: EventType) => i.id === item.id); + const start = dayjs(item.start, DateParser).format(); + const end = dayjs(item.end, DateParser).format(); + if ( + start !== event?.start || + end !== event?.end || + !!item.allDay !== !!event?.allDay + ) { + needChange = true; + changeEvents.push({ + ...event, + allDay: item.allDay, + start: item.startStr, + end: item.endStr, + }); + } else { + changeEvents.push(event); + } + }); + if (needChange) { + props.onEvent("change"); } - } - setLeft(left); - }} - buttonText={buttonText} - schedulerLicenseKey={licenceKey} - views={views} - eventClassNames={() => (!showEventTime ? "no-time" : "")} - slotLabelFormat={slotLabelFormat} - viewClassNames={viewClassNames} - moreLinkText={trans("calendar.more")} - initialDate={initialDate} - initialView={defaultView} - editable={editable} - selectable={editable} - selectMirror={false} - displayEventTime={showEventTime} - dayMaxEvents={dayMaxEvents} - eventMaxStack={eventMaxStack || undefined} - weekends={showWeekends} - allDaySlot={showAllDay} - eventContent={renderEventContent} - select={(info) => handleCreate(info)} - eventClick={(info) => { - const event = events.find( - (item: EventType) => item.id === info.event.id - ); - editEvent.current = event; - setTimeout(() => { - editEvent.current = undefined; - }, 500); - }} - eventsSet={(info) => { - let needChange = false; - let changeEvents: EventType[] = []; - info.forEach((item) => { - const event = events.find((i: EventType) => i.id === item.id); - const start = dayjs(item.start, DateParser).format(); - const end = dayjs(item.end, DateParser).format(); - if ( - start !== event?.start || - end !== event?.end || - !!item.allDay !== !!event?.allDay - ) { - needChange = true; - changeEvents.push({ - ...event, - allDay: item.allDay, - start: item.startStr, - end: item.endStr, - }); - } else { - changeEvents.push(event); + }} + eventDragStop={(info) => { + if (info.view) { + handleDrop } - }); - if (needChange) { - props.events.onChange(changeEvents); - props.onEvent("change"); - } - }} - /> + }} + /> + ); }) - .setPropertyViewFn((children) => { - let licence = children.licenceKey.getView(); + .setPropertyViewFn((children: { + events: { propertyView: (arg0: {}) => any; }; + resourcesEvents: { propertyView: (arg0: {}) => any; }; + resources: { propertyView: (arg0: {}) => any; }; + resourceName: { propertyView: (arg0: {}) => any; }; + onEvent: { propertyView: ({title}?: {title?: string}) => any; }; + onDropEvent: { propertyView: ({title}?: {title?: string}) => any; }; + editable: { propertyView: (arg0: { label: string; }) => any; }; + showEventTime: { propertyView: (arg0: { label: string; tooltip: string; }) => any; }; + showWeekends: { propertyView: (arg0: { label: string; }) => any; }; + showAllDay: { propertyView: (arg0: { label: string; tooltip: string; }) => any; }; + defaultDate: { propertyView: (arg0: { label: string; tooltip: string; }) => any; }; + firstDay: { propertyView: (arg0: { label: string; }) => any; }; + dayMaxEvents: { propertyView: (arg0: { label: string; tooltip: string; }) => any; }; + eventMaxStack: { propertyView: (arg0: { label: string; tooltip: string; }) => any; }; + currentFreeView: { propertyView: (arg0: { label: string; tooltip: string; }) => any; }; + currentPremiumView: { propertyView: (arg0: { label: string; tooltip: string; }) => any; }; + style: { getPropertyView: () => any; }; + licenseKey: { getView: () => any; propertyView: (arg0: { label: string; }) => any; }; + }) => { + + const license = children.licenseKey.getView(); + return ( <>
- {children.events.propertyView({})} + {children.defaultDate.propertyView({ label: trans("calendar.defaultDate"), tooltip: trans("calendar.defaultDateTooltip"), })} + {children.events.propertyView({label: trans("calendar.events")})} + {license == "" ? null : children.resourcesEvents.propertyView({label: trans("calendar.resourcesEvents")})}
+ { license != "" && +
+ {children.resources.propertyView({label: trans("calendar.resources")})} + {children.resourceName.propertyView({label: trans("calendar.resourcesName")})} +
+ }
- {children.licenceKey.propertyView({ - label: trans("calendar.licence"), - })} - {children.onEvent.getPropertyView()} + {hiddenPropertyView(children)} +
+ {children.onEvent.propertyView()} +
+
+ {children.onDropEvent?.propertyView({title: trans("calendar.dragDropEventHandlers")})} +
+ {children.editable.propertyView({ label: trans("calendar.editable"), })}
- {children.editable.propertyView({ - label: trans("calendar.editable"), - })} - {children.defaultDate.propertyView({ - label: trans("calendar.defaultDate"), - tooltip: trans("calendar.defaultDateTooltip"), - })} - {licence == "" - ? children.defaultFreeView.propertyView({ - label: trans("calendar.defaultView"), - tooltip: trans("calendar.defaultViewTooltip"), - }) - : children.defaultPremiumView.propertyView({ - label: trans("calendar.defaultView"), - tooltip: trans("calendar.defaultViewTooltip"), - })} - {children.firstDay.propertyView({ - label: trans("calendar.startWeek"), - })} - {children.showEventTime.propertyView({ - label: trans("calendar.showEventTime"), - tooltip: trans("calendar.showEventTimeTooltip"), - })} - {children.showWeekends.propertyView({ - label: trans("calendar.showWeekends"), - })} - {children.showAllDay.propertyView({ - label: trans("calendar.showAllDay"), - tooltip: trans("calendar.showAllDayTooltip"), - })} - {children.dayMaxEvents.propertyView({ - label: trans("calendar.dayMaxEvents"), - tooltip: trans("calendar.dayMaxEventsTooltip"), - })} - {children.eventMaxStack.propertyView({ - label: trans("calendar.eventMaxStack"), - tooltip: trans("calendar.eventMaxStackTooltip"), - })} + {children.showEventTime.propertyView({ label: trans("calendar.showEventTime"), tooltip: trans("calendar.showEventTimeTooltip"), })} + {children.showWeekends.propertyView({ label: trans("calendar.showWeekends"), })} + {children.showAllDay.propertyView({ label: trans("calendar.showAllDay"), tooltip: trans("calendar.showAllDayTooltip"), })} + {children.dayMaxEvents.propertyView({ label: trans("calendar.dayMaxEvents"), tooltip: trans("calendar.dayMaxEventsTooltip"), })} + {children.eventMaxStack.propertyView({ label: trans("calendar.eventMaxStack"), tooltip: trans("calendar.eventMaxStackTooltip"), })}
- {hiddenPropertyView(children)} + {children.licenseKey.propertyView({ label: trans("calendar.license"), tooltip: trans("calendar.licenseTooltip"), })} + {license == "" + ? children.currentFreeView.propertyView({ label: trans("calendar.defaultView"), tooltip: trans("calendar.defaultViewTooltip"), }) + : children.currentPremiumView.propertyView({ label: trans("calendar.defaultView"), tooltip: trans("calendar.defaultViewTooltip"), })} + {children.firstDay.propertyView({ label: trans("calendar.startWeek"), })}
{children.style.getPropertyView()} @@ -508,7 +617,130 @@ CalendarBasicComp = class extends CalendarBasicComp { } }; -export const CalendarComp = withExposingConfigs(CalendarBasicComp, [ +const TmpCalendarComp = withExposingConfigs(CalendarBasicComp, [ new NameConfig("events", trans("calendar.events")), + new NameConfig("resourcesEvents", trans("calendar.resourcesEvents")), + new NameConfig("resources", trans("calendar.resources")), NameConfigHidden, ]); + +let CalendarComp = withMethodExposing(TmpCalendarComp, [ + + /* this is not backwards compatible with older versions of the SDK + { + method: { + name: "setCalendarView", + description: "Sets the view of the calendar to a specified type", + params: [{ name: "viewType", type: "string" }], + }, + execute: (comp, values) => { + const viewType = values[0] as string || "timeGridWeek"; // Default to "timeGridWeek" if undefined + const viewKey = comp.children.licenseKey.getView() === "" ? 'defaultFreeView' : 'defaultPremiumView'; + comp.children[viewKey].dispatchChangeValueAction(viewType); + } + },*/ + + + { + method: { + name: "setResourceTimeGridDayView", + description: "Switches the calendar view to 'Resource Time Grid Day', which displays resources along the vertical axis and the hours of a single day along the horizontal axis.", + params: [{ name: "viewType", type: "string" }], + }, + execute: (comp) => { + const viewKey = comp.children.licenseKey.getView() === "" ? 'defaultFreeView' : 'defaultPremiumView'; + comp.children["viewKey"].dispatchChangeValueAction("resourceTimeGridDay"); + } + }, + { + method: { + name: "setResourceTimelineDayView", + description: "Switches the calendar view to 'Resource Timeline Day', showing events against a timeline for a single day, segmented by resources.", + params: [{ name: "viewType", type: "string" }], + }, + execute: (comp) => { + const viewKey = comp.children.licenseKey.getView() === "" ? 'defaultFreeView' : 'defaultPremiumView'; + comp.children["viewKey"].dispatchChangeValueAction("resourceTimelineDay"); + } + }, + { + method: { + name: "setDayGridWeekView", + description: "Switches the calendar view to 'Day Grid Week', where the days of the week are displayed as columns and events are laid out in grid form.", + params: [{ name: "viewType", type: "string" }], + }, + execute: (comp) => { + const viewKey = comp.children.licenseKey.getView() === "" ? 'defaultFreeView' : 'defaultPremiumView'; + comp.children["viewKey"].dispatchChangeValueAction("dayGridWeek"); + } + }, + { + method: { + name: "setTimeGridWeekView", + description: "Switches the calendar view to 'Day Grid Week', where the days of the week are displayed as columns and events are laid out in grid form.", + params: [{ name: "viewType", type: "string" }], + }, + execute: (comp) => { + const viewKey = comp.children.licenseKey.getView() === "" ? 'defaultFreeView' : 'defaultPremiumView'; + comp.children["viewKey"].dispatchChangeValueAction("timeGridWeek"); + } + }, + { + method: { + name: "setTimeGridDayView", + description: "Switches the calendar view to 'Time Grid Day', which shows a detailed hourly schedule for a single day.", + params: [{ name: "viewType", type: "string" }], + }, + execute: (comp) => { + const viewKey = comp.children.licenseKey.getView() === "" ? 'defaultFreeView' : 'defaultPremiumView'; + comp.children["viewKey"].dispatchChangeValueAction("timeGridDay"); + } + }, + { + method: { + name: "setDayGridDayView", + description: "Switches the calendar view to 'Day Grid Day', displaying a single day in a grid layout that includes all events for that day.", + params: [{ name: "viewType", type: "string" }], + }, + execute: (comp) => { + const viewKey = comp.children.licenseKey.getView() === "" ? 'defaultFreeView' : 'defaultPremiumView'; + comp.children["viewKey"].dispatchChangeValueAction("dayGridDay"); + } + }, + { + method: { + name: "setListWeekView", + description: "Switches the calendar view to 'List Week', which provides a list-style overview of all events happening throughout the week.", + params: [{ name: "viewType", type: "string" }], + }, + execute: (comp) => { + const viewKey = comp.children.licenseKey.getView() === "" ? 'defaultFreeView' : 'defaultPremiumView'; + comp.children["viewKey"].dispatchChangeValueAction("listWeek"); + } + }, + { + method: { + name: "setDayGridMonthView", + description: "Switches the calendar view to 'Day Grid Month', presenting the entire month in a grid with events displayed on their respective days.", + params: [{ name: "viewType", type: "string" }], + }, + execute: (comp) => { + const viewKey = comp.children.licenseKey.getView() === "" ? 'defaultFreeView' : 'defaultPremiumView'; + comp.children["viewKey"].dispatchChangeValueAction("dayGridMonth"); + } + }, + { + method: { + name: "setMultiMonthYearView", + description: "Switches the calendar view to 'Multi Month Year', showing multiple months at once, allowing for long-term planning and overview.", + params: [{ name: "viewType", type: "string" }], + }, + execute: (comp) => { + const viewKey = comp.children.licenseKey.getView() === "" ? 'defaultFreeView' : 'defaultPremiumView'; + comp.children["viewKey"].dispatchChangeValueAction("multiMonthYear"); + } + } + ]); + + +export { CalendarComp }; \ No newline at end of file diff --git a/client/packages/lowcoder-comps/src/comps/calendarComp/calendarConstants.tsx b/client/packages/lowcoder-comps/src/comps/calendarComp/calendarConstants.tsx index 394c0427a..0250b299f 100644 --- a/client/packages/lowcoder-comps/src/comps/calendarComp/calendarConstants.tsx +++ b/client/packages/lowcoder-comps/src/comps/calendarComp/calendarConstants.tsx @@ -27,8 +27,8 @@ import { import { default as Form } from "antd/es/form"; export const Wrapper = styled.div<{ - $editable: boolean; - $style: CalendarStyleType; + $editable?: boolean; + $style?: CalendarStyleType; $theme?: ThemeDetail; $left?: number; }>` @@ -635,7 +635,7 @@ export const Wrapper = styled.div<{ } `; -export const Remove = styled.div<{ isList: boolean }>` +export const Remove = styled.div<{ $isList: boolean }>` position: absolute; pointer-events: auto; top: 0; @@ -652,21 +652,21 @@ export const Remove = styled.div<{ isList: boolean }>` `; export const Event = styled.div<{ - bg: string; + $bg: string; theme: Object; - isList: boolean; - allDay: boolean; + $isList: boolean; + $allDay: boolean; $style: CalendarStyleType; }>` height: 100%; width: 100%; pointer-events: none; border-radius: 4px; - box-shadow: ${(props) => !props.isList && "0 0 5px 0 rgba(0, 0, 0, 0.15)"}; + box-shadow: ${(props) => !props.$isList && "0 0 5px 0 rgba(0, 0, 0, 0.15)"}; border: 1px solid ${(props) => props.$style.border}; - display: ${(props) => props.isList && "flex"}; + display: ${(props) => props.$isList && "flex"}; background-color: ${(props) => - !props.isList && lightenColor(props.$style.background, 0.1)}; + !props.$isList && lightenColor(props.$style.background, 0.1)}; overflow: hidden; font-size: 13px; line-height: 19px; @@ -682,12 +682,12 @@ export const Event = styled.div<{ left: 2px; top: 2px; border-radius: 3px; - background-color: ${(props) => props.bg}; + background-color: ${(props) => props.$bg}; } .event-time { color: ${(props) => - !props.isList && + !props.$isList && (isDarkColor(props.$style.text) ? lightenColor(props.$style.text, 0.2) : props.$style.text)}; @@ -696,7 +696,7 @@ export const Event = styled.div<{ margin-top: 2px; } .event-title { - color: ${(props) => !props.isList && props.$style.text}; + color: ${(props) => !props.$isList && props.$style.text}; font-weight: 500; margin-left: 15px; white-space: pre-wrap; @@ -763,6 +763,7 @@ export const FormWrapper = styled(Form)` export type EventType = { id?: string; + resourceId?: string; label?: string; title?: string; start?: string; @@ -774,15 +775,28 @@ export type EventType = { }; export enum ViewType { + YEAR = "multiMonthYear", MONTH = "dayGridMonth", WEEK = "timeGridWeek", DAY = "timeGridDay", + DAYLIST = "dayGridDay", LIST = "listWeek", TIMEGRID = "timeGridDay", } - export const DefaultWithPremiumViewOptions = [ + { + label: trans("calendar.resourceTimeGridDay"), + value: "resourceTimeGridDay", + }, + { + label: trans("calendar.timeline"), + value: "resourceTimelineDay", + }, + { + label: trans("calendar.year"), + value: "multiMonthYear", + }, { label: trans("calendar.month"), value: "dayGridMonth", @@ -792,8 +806,12 @@ export const DefaultWithPremiumViewOptions = [ value: "timeGridWeek", }, { - label: trans("calendar.timeline"), - value: "resourceTimeline", + label: trans("calendar.weekdaygrid"), + value: "dayGridWeek", + }, + { + label: trans("calendar.daygrid"), + value: "dayGridDay", }, { label: trans("calendar.day"), @@ -806,6 +824,10 @@ export const DefaultWithPremiumViewOptions = [ ] as const; export const DefaultWithFreeViewOptions = [ + { + label: trans("calendar.year"), + value: "multiMonthYear", + }, { label: trans("calendar.month"), value: "dayGridMonth", @@ -814,6 +836,14 @@ export const DefaultWithFreeViewOptions = [ label: trans("calendar.week"), value: "timeGridWeek", }, + { + label: trans("calendar.weekdaygrid"), + value: "dayGridWeek", + }, + { + label: trans("calendar.daygrid"), + value: "dayGridDay", + }, { label: trans("calendar.day"), value: "timeGridDay", @@ -871,6 +901,58 @@ export const defaultData = [ allDay: true, }, ]; +export const resourcesEventsDefaultData = [ + { + id: "1", + resourceId: "d1", + title: "event 1", + start: dayjs().hour(10).minute(0).second(0).format(DATE_TIME_FORMAT), + end: dayjs().hour(17).minute(30).second(0).format(DATE_TIME_FORMAT), + color: "#079968", + }, + { + id: "2", + resourceId: "b", + title: "event 5", + start: dayjs().hour(8).minute(0).second(0).format(DATE_TIME_FORMAT), + end: dayjs().hour(16).minute(30).second(0).format(DATE_TIME_FORMAT), + color: "#079968", + }, + { + id: "3", + resourceId: "a", + title: "event 3", + start: dayjs().hour(12).minute(0).second(0).format(DATE_TIME_FORMAT), + end: dayjs().hour(21).minute(30).second(0).format(DATE_TIME_FORMAT), + color: "#079968", + }, +]; + +export const resourcesDefaultData = [ + { + id: "a", + title: "Auditorium A", + }, + { + id: "b", + title: "Auditorium B", + eventColor: "green", + }, + { + id: "d", + title: "Auditorium D", + children: [ + { + id: "d1", + title: "Room D1", + }, + { + id: "d2", + title: "Room D2", + }, + ], + }, +]; export const buttonText = { today: trans("calendar.today"), @@ -886,6 +968,16 @@ export const headerToolbar = { right: "prev today next dayGridMonth,timeGridWeek,timeGridDay,listWeek", }; +export const resourceTimeLineHeaderToolbar = { + left: "title", + right: + "prev today next resourceTimelineMonth,resourceTimelineWeek,resourceTimelineDay", +}; +export const resourceTimeGridHeaderToolbar = { + left: "title", + right: "prev today next", +}; + const weekHeadContent = (info: DayHeaderContentArg) => { const text = info.text.split(" "); return { @@ -930,7 +1022,17 @@ export const slotLabelFormat = [ { hour: "2-digit", minute: "2-digit", - }, + }, +] as FormatterInput[]; + +export const slotLabelFormatWeek = [ + { week: "short" }, + { hour: "2-digit" }, +] as FormatterInput[]; + +export const slotLabelFormatMonth = [ + { week: "short" }, + { weekday: "short" } ] as FormatterInput[]; export const viewClassNames = (info: ViewContentArg) => { @@ -943,4 +1045,4 @@ export const viewClassNames = (info: ViewContentArg) => { } } return className; -}; +}; \ No newline at end of file diff --git a/client/packages/lowcoder-comps/src/comps/calendarComp/errorBoundary.tsx b/client/packages/lowcoder-comps/src/comps/calendarComp/errorBoundary.tsx new file mode 100644 index 000000000..7a73fb254 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/calendarComp/errorBoundary.tsx @@ -0,0 +1,30 @@ +import { default as Button } from "antd/es/button"; +import React from "react"; + +export default class ErrorBoundary extends React.Component { + constructor(props: any) { + super(props); + this.state = {}; + } + + static getDerivedStateFromError(error: any) { + // Update state so the next render will show the fallback UI. + return { errorMessage: error.toString() }; + } + + componentDidCatch(error: any, errorInfo: any) {} + + render() { + if (this.state.errorMessage) { + return ( + <> +

{this.state.errorMessage}

+ + + ); + } + return this.props.children; + } +} diff --git a/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartComp.tsx b/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartComp.tsx new file mode 100644 index 000000000..3d1750d9c --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartComp.tsx @@ -0,0 +1,318 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { candleStickChartChildrenMap, ChartSize, getDataKeys } from "./candleStickChartConstants"; +import { candleStickChartPropertyView } from "./candleStickChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./candleStickChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let CandleStickChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...candleStickChartChildrenMap}, () => null) + .setPropertyViewFn(candleStickChartPropertyView) + .build(); +})(); + +CandleStickChartTmpComp = withViewFn(CandleStickChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +CandleStickChartTmpComp = class extends CandleStickChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let CandleStickChartComp = withExposingConfigs(CandleStickChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const CandleStickChartCompWithDefault = withDefault(CandleStickChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartConstants.tsx new file mode 100644 index 000000000..1de9ffdb3 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartConstants.tsx @@ -0,0 +1,299 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { CandleStickChartConfig } from "../chartComp/chartConfigs/candleStickChartConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + candleStick: CandleStickChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "candleStick"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultCandleStickChartOption), + echartsTitle: withDefault(StringControl, trans("candleStickChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const candleStickChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(candleStickChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartPropertyView.tsx new file mode 100644 index 000000000..9fa9060e3 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartPropertyView.tsx @@ -0,0 +1,54 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./candleStickChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function candleStickChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.echartsTitle.propertyView({ label: trans("candleStickChart.title") })} + {children.tooltip.propertyView({label: trans("candleStickChart.tooltip")})} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartUtils.ts b/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartUtils.ts new file mode 100644 index 000000000..00dcb0d2d --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/candleStickChartComp/candleStickChartUtils.ts @@ -0,0 +1,339 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":"center" + }, + "backgroundColor": props?.style?.background, + "color": props.echartsOption.data?.map(data => data.color), + "tooltip": props.tooltip&&{ + "trigger": "axis", + "axisPointer": { + "type": "cross" + } + }, + "grid": { + "left": "10%", + "right": "10%", + "bottom": "10%", + }, + "xAxis": { + "type": "category", + "data": props.echartsOption.xAxis.data + }, + "yAxis": { + "type": "value", + "scale": true + }, + "series": [ + { + "name": props.echartsConfig.type, + "type": props.echartsConfig.type, + "left": "10%", + "top": 60, + "bottom": 60, + "width": "80%", + "min": 0, + "max": 100, + "gap": 2, + "label": { + "show": true, + "position": props.echartsLabelConfig.top + }, + "data": props.echartsOption.data, + } + ] +} + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartComp.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartComp.tsx index 092a8d382..7e49fed09 100644 --- a/client/packages/lowcoder-comps/src/comps/chartComp/chartComp.tsx +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartComp.tsx @@ -27,6 +27,7 @@ import { withViewFn, ThemeContext, chartColorPalette, + getPromiseAfterDispatch, } from "lowcoder-sdk"; import { getEchartsLocale, trans } from "i18n/comps"; import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; @@ -39,6 +40,8 @@ import { import 'echarts-extension-gmap'; import log from "loglevel"; +let clickEventCallback = () => {}; + let ChartTmpComp = (function () { return new UICompBuilder(chartChildrenMap, () => null) .setPropertyViewFn(chartPropertyView) @@ -55,6 +58,7 @@ ChartTmpComp = withViewFn(ChartTmpComp, (comp) => { const mapZoomlevel = comp.children.mapZoomLevel.getView(); const onUIEvent = comp.children.onUIEvent.getView(); const onMapEvent = comp.children.onMapEvent.getView(); + const onEvent = comp.children.onEvent.getView(); const echartsCompRef = useRef(); const [chartSize, setChartSize] = useState(); @@ -73,7 +77,44 @@ ChartTmpComp = withViewFn(ChartTmpComp, (comp) => { log.error('theme chart error: ', error); } + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + useEffect(() => { + // click events for JSON/Map mode + if (mode === 'ui') return; + + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [mode, mapScriptLoaded]); + + useEffect(() => { + // click events for UI mode if(mode !== 'ui') return; // bind events @@ -84,16 +125,34 @@ ChartTmpComp = withViewFn(ChartTmpComp, (comp) => { echartsCompInstance?.on("selectchanged", (param: any) => { const option: any = echartsCompInstance?.getOption(); //log.log("chart select change", param); + // trigger click event listener + + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + if (param.fromAction === "select") { - comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option))); + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); onUIEvent("select"); } else if (param.fromAction === "unselect") { - comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option))); + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); onUIEvent("unselect"); } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); }); // unbind - return () => echartsCompInstance?.off("selectchanged"); + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; }, [mode, onUIEvent]); const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); @@ -127,10 +186,12 @@ ChartTmpComp = withViewFn(ChartTmpComp, (comp) => { useEffect(() => { if( mode !== 'map') { - comp.children.mapInstance.dispatch(changeValueAction(undefined)) + comp.children.mapInstance.dispatch(changeValueAction(null, false)) return; } + if(comp.children.mapInstance.value) return; + const gMapScript = loadGoogleMapsScript(apiKey); if(isMapScriptLoaded) { handleOnMapScriptLoad(); @@ -284,6 +345,14 @@ let ChartComp = withExposingConfigs(ChartTmpComp, [ return input.selectedPoints; }, }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), depsConfig({ name: "data", desc: trans("chart.dataDesc"), @@ -339,6 +408,21 @@ ChartComp = withMethodExposing(ChartComp, [ }); } }, + { + method: { + name: "onClick", + params: [ + { + name: "callback", + type: "function", + }, + ], + }, + execute: (comp, params) => { + clickEventCallback = params[0]; + document.addEventListener('clickEvent', clickEventCallback); + } + }, ]) export const ChartCompWithDefault = withDefault(ChartComp, { @@ -355,4 +439,4 @@ export const ChartCompWithDefault = withDefault(ChartComp, { columnName: "budget", }, ], -}); +}); \ No newline at end of file diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/candleStickChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/candleStickChartConfig.tsx new file mode 100644 index 000000000..7b7b5b103 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/candleStickChartConfig.tsx @@ -0,0 +1,35 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { CandlestickSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const CandleStickChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): CandlestickSeriesOption => { + const config: CandlestickSeriesOption = { + type: "candlestick", + label: { + show: props.showLabel, + position: "top", + }, + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("candleStickChart.candleStickType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/echartsLabelConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/echartsLabelConfig.tsx new file mode 100644 index 000000000..64b808e01 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/echartsLabelConfig.tsx @@ -0,0 +1,49 @@ +import { + AlignClose, + AlignRight, + AlignLeft, + dropdownControl, + MultiCompBuilder, +} from "lowcoder-sdk"; +import { LegendComponentOption } from "echarts"; +import { trans } from "i18n/comps"; + +const LabelPositionOptions = [ + { + label: , + value: "inside", + }, + { + label: , + value: "right", + }, + { + label: , + value: "left", + }, +] as const; + +export const EchartsLabelConfig = (function () { + return new MultiCompBuilder( + { + position: dropdownControl(LabelPositionOptions, "inside"), + }, + (props): LegendComponentOption => { + const config: LegendComponentOption = { + top: "inside", + type: "scroll", + }; + config.top = props.position + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.position.propertyView({ + label: trans("echarts.labelPosition"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/echartsLegendConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/echartsLegendConfig.tsx new file mode 100644 index 000000000..41fb166fb --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/echartsLegendConfig.tsx @@ -0,0 +1,44 @@ +import { + AlignBottom, + AlignTop, + dropdownControl, + MultiCompBuilder, +} from "lowcoder-sdk"; +import { LegendComponentOption } from "echarts"; +import { trans } from "i18n/comps"; + +const LegendPositionOptions = [ + { + label: , + value: "bottom", + }, + { + label: , + value: "top", + }, +] as const; + +export const EchartsLegendConfig = (function () { + return new MultiCompBuilder( + { + position: dropdownControl(LegendPositionOptions, "bottom"), + }, + (props): LegendComponentOption => { + const config: LegendComponentOption = { + top: "bottom", + type: "scroll", + }; + config.top = props.position + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.position.propertyView({ + label: trans("echarts.legendPosition"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/echartsTitleConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/echartsTitleConfig.tsx new file mode 100644 index 000000000..a9305de25 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/echartsTitleConfig.tsx @@ -0,0 +1,49 @@ +import { + AlignClose, + AlignRight, + AlignLeft, + dropdownControl, + MultiCompBuilder, +} from "lowcoder-sdk"; +import { LegendComponentOption } from "echarts"; +import { trans } from "i18n/comps"; + +const TitlePositionOptions = [ + { + label: , + value: "center", + }, + { + label: , + value: "right", + }, + { + label: , + value: "left", + }, +] as const; + +export const EchartsTitleConfig = (function () { + return new MultiCompBuilder( + { + position: dropdownControl(TitlePositionOptions, "center"), + }, + (props): LegendComponentOption => { + const config: LegendComponentOption = { + top: "center", + type: "scroll", + }; + config.top = props.position + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {children.position.propertyView({ + label: trans("echarts.titlePosition"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/funnelChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/funnelChartConfig.tsx new file mode 100644 index 000000000..84d3f4691 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/funnelChartConfig.tsx @@ -0,0 +1,35 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { FunnelSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const FunnelChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): FunnelSeriesOption => { + const config: FunnelSeriesOption = { + type: "funnel", + label: { + show: props.showLabel, + position: "top", + }, + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("funnelChart.funnelType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/gaugeChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/gaugeChartConfig.tsx new file mode 100644 index 000000000..a72c96cbb --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/gaugeChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { GaugeSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const GaugeChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): GaugeSeriesOption => { + const config: GaugeSeriesOption = { + type: "gauge", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("gaugeChart.gaugeType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/graphChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/graphChartConfig.tsx new file mode 100644 index 000000000..dbc23403e --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/graphChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { GraphSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const GraphChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): GraphSeriesOption => { + const config: GraphSeriesOption = { + type: "graph", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("graphChart.graphType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/heatmapChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/heatmapChartConfig.tsx new file mode 100644 index 000000000..cbebb6410 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/heatmapChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { HeatmapSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const HeatmapChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): HeatmapSeriesOption => { + const config: HeatmapSeriesOption = { + type: "heatmap", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("heatmapChart.heatmapType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/radarChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/radarChartConfig.tsx new file mode 100644 index 000000000..5615c2d73 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/radarChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { RadarSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const RadarChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): RadarSeriesOption => { + const config: RadarSeriesOption = { + type: "radar", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("radarChart.radarType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/sankeyChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/sankeyChartConfig.tsx new file mode 100644 index 000000000..60c646c0b --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/sankeyChartConfig.tsx @@ -0,0 +1,35 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { SankeySeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const SankeyChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): SankeySeriesOption => { + const config: SankeySeriesOption = { + type: "sankey", + label: { + show: props.showLabel, + position: "top", + }, + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("sankeyChart.sankeyType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/sunburstChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/sunburstChartConfig.tsx new file mode 100644 index 000000000..8306911a3 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/sunburstChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { SunburstSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const SunburstChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): SunburstSeriesOption => { + const config: SunburstSeriesOption = { + type: "sunburst", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("sunburstChart.sunburstType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/themeriverChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/themeriverChartConfig.tsx new file mode 100644 index 000000000..ae639eb22 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/themeriverChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { ThemeRiverSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const ThemeriverChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): ThemeRiverSeriesOption => { + const config: ThemeRiverSeriesOption = { + type: "themeRiver", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("themeriverChart.themeriverType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/treeChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/treeChartConfig.tsx new file mode 100644 index 000000000..3f824008d --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/treeChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { TreeSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const TreeChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): TreeSeriesOption => { + const config: TreeSeriesOption = { + type: "tree", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("treeChart.treeType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/treemapChartConfig.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/treemapChartConfig.tsx new file mode 100644 index 000000000..a201337ef --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConfigs/treemapChartConfig.tsx @@ -0,0 +1,31 @@ +import { + BoolControl, + MultiCompBuilder, + showLabelPropertyView, +} from "lowcoder-sdk"; +import { TreemapSeriesOption } from "echarts"; +import { trans } from "i18n/comps"; + +export const TreemapChartConfig = (function () { + return new MultiCompBuilder( + { + showLabel: BoolControl, + }, + (props): TreemapSeriesOption => { + const config: TreemapSeriesOption = { + type: "treemap", + }; + return config; + } + ) + .setPropertyViewFn((children) => ( + <> + {showLabelPropertyView(children)} + {children.type.propertyView({ + label: trans("treemapChart.treemapType"), + radioButton: true, + })} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartConstants.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartConstants.tsx index 763851512..71962fd53 100644 --- a/client/packages/lowcoder-comps/src/comps/chartComp/chartConstants.tsx +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartConstants.tsx @@ -15,6 +15,7 @@ import { withType, ValueFromOption, uiChildren, + clickEvent, } from "lowcoder-sdk"; import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; import { BarChartConfig } from "./chartConfigs/barChartConfig"; @@ -67,7 +68,6 @@ export const UIEventOptions = [ value: "select", description: trans("chart.selectDesc"), }, - { label: trans("chart.unSelect"), value: "unselect", @@ -253,6 +253,10 @@ export const chartUiModeChildren = { onUIEvent: eventHandlerControl(UIEventOptions), }; +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultEchartsJsonOption), +} + const chartMapModeChildren = { mapInstance: stateComp(), getMapInstance: FunctionControl, @@ -265,24 +269,31 @@ const chartMapModeChildren = { showCharts: withDefault(BoolControl, true), } +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + export const chartChildrenMap = { mode: dropdownControl(chartModeOptions, "ui"), - echartsOption: jsonControl(toObject, i18nObjs.defaultEchartsJsonOption), - selectedPoints: stateComp< - Array<{ - seriesName: string; - // coordinate chart - x?: any; - y?: any; - // pie or funnel - itemName?: any; - value?: any; - }> - >([]), + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), ...chartUiModeChildren, + ...chartJsonModeChildren, ...chartMapModeChildren, }; const chartUiChildrenMap = uiChildren(chartChildrenMap); export type ChartCompPropsType = RecordConstructorToView; -export type ChartCompChildrenType = RecordConstructorToComp; +export type ChartCompChildrenType = RecordConstructorToComp; \ No newline at end of file diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/chartComp/chartPropertyView.tsx index 41055d133..7bc6cf488 100644 --- a/client/packages/lowcoder-comps/src/comps/chartComp/chartPropertyView.tsx +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartPropertyView.tsx @@ -105,7 +105,14 @@ export function chartPropertyView( dataIndex={(s) => s.getView().dataIndex} />
-
{children.onUIEvent.getPropertyView()}
+
+
+ {children.onUIEvent.propertyView({title: trans("chart.chartEventHandlers")})} +
+
+ {children.onEvent.propertyView()} +
+
{children.title.propertyView({ label: trans("chart.title") })} {children.chartConfig.children.compType.getView() !== "pie" && ( @@ -144,6 +151,9 @@ export function chartPropertyView( ), })}
+
+ {children.onEvent.propertyView()} +
{hiddenPropertyView(children)}
); @@ -189,7 +199,14 @@ export function chartPropertyView( ), })} -
{children.onMapEvent.getPropertyView()}
+
+
+ {children.onMapEvent.propertyView({title: trans("chart.chartEventHandlers")})} +
+
+ {children.onEvent.propertyView()} +
+
{hiddenPropertyView(children)}
); @@ -215,4 +232,4 @@ export function chartPropertyView( {getChatConfigByMode(children.mode.getView())} ); -} +} \ No newline at end of file diff --git a/client/packages/lowcoder-comps/src/comps/chartComp/chartUtils.ts b/client/packages/lowcoder-comps/src/comps/chartComp/chartUtils.ts index 8a1d912fe..5b652ef94 100644 --- a/client/packages/lowcoder-comps/src/comps/chartComp/chartUtils.ts +++ b/client/packages/lowcoder-comps/src/comps/chartComp/chartUtils.ts @@ -288,4 +288,4 @@ export function loadGoogleMapsScript(apiKey: string) { window.document.body.appendChild(script); return script; -} +} \ No newline at end of file diff --git a/client/packages/lowcoder-comps/src/comps/chartsGeoMapComp/chartsGeoMapComp.tsx b/client/packages/lowcoder-comps/src/comps/chartsGeoMapComp/chartsGeoMapComp.tsx new file mode 100644 index 000000000..2fa1ddf7e --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/chartsGeoMapComp/chartsGeoMapComp.tsx @@ -0,0 +1,388 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../basicChartComp/chartConfigs/cartesianAxisConfig"; +import { chartChildrenMap, ChartSize, getDataKeys } from "../basicChartComp/chartConstants"; +import { chartPropertyView } from "../basicChartComp/chartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../basicChartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withMethodExposing, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/basicChartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, + loadGoogleMapsScript, +} from "comps/basicChartComp/chartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "Map", + value: "map", + } +] as const; + +let MapTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'map'),...chartChildrenMap}, () => null) + .setPropertyViewFn(chartPropertyView) + .build(); +})(); + +MapTmpComp = withViewFn(MapTmpComp, (comp) => { + const apiKey = comp.children.mapApiKey.getView(); + const mode = comp.children.mode.getView(); + const mapCenterPosition = { + lng: comp.children.mapCenterLng.getView(), + lat: comp.children.mapCenterLat.getView(), + } + const mapZoomlevel = comp.children.mapZoomLevel.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onMapEvent = comp.children.onMapEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const [mapScriptLoaded, setMapScriptLoaded] = useState(false); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [mapScriptLoaded]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + const isMapScriptLoaded = useMemo(() => { + return mapScriptLoaded || window?.google; + }, [mapScriptLoaded]) + + const loadGoogleMapData = () => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + + comp.children.mapInstance.dispatch(changeValueAction(echartsCompInstance)) + onMapEvent('mapReady') + } + + const handleOnMapScriptLoad = () => { + setMapScriptLoaded(true); + setTimeout(() => { + loadGoogleMapData(); + }) + } + + useEffect(() => { + if(comp.children.mapInstance.value) return; + + const gMapScript = loadGoogleMapsScript(apiKey); + if(isMapScriptLoaded) { + handleOnMapScriptLoad(); + return; + } + gMapScript.addEventListener('load', handleOnMapScriptLoad); + return () => { + gMapScript.removeEventListener('load', handleOnMapScriptLoad); + } + }, [apiKey, option]) + + useEffect(() => { + onMapEvent('centerPositionChange'); + }, [mapCenterPosition.lat, mapCenterPosition.lng]) + + useEffect(() => { + onMapEvent('zoomLevelChange'); + }, [mapZoomlevel]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + {isMapScriptLoaded && ( + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={undefined} + mode={mode} + /> + )} + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +MapTmpComp = class extends MapTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let ChartsGeoMapCompTMP = withExposingConfigs(MapTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[], + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + +export const ChartsGeoMapComp = withMethodExposing(ChartsGeoMapCompTMP, [ + { + method: { + name: "getMapInstance", + }, + execute: (comp) => { + return new Promise(resolve => { + let intervalCount = 0; + const mapInstanceInterval = setInterval(() => { + const instance = comp.children.mapInstance.getView(); + const mapInstance = instance?.getModel()?.getComponent("gmap")?.getGoogleMap() + if(mapInstance || intervalCount === 10) { + clearInterval(mapInstanceInterval) + resolve(mapInstance) + } + intervalCount++; + }, 1000); + }) + } + }, + { + method: { + name: "getMapZoomLevel", + }, + execute: (comp) => { + return comp.children.mapZoomLevel.getView(); + } + }, + { + method: { + name: "getMapCenterPosition", + }, + execute: (comp) => { + return Promise.resolve({ + lng: comp.children.mapCenterLng.getView(), + lat: comp.children.mapCenterLat.getView(), + }); + } + }, + { + method: { + name: "onClick", + params: [ + { + name: "callback", + type: "function", + }, + ], + }, + execute: (comp, params) => { + clickEventCallback = params[0]; + document.addEventListener('clickEvent', clickEventCallback); + } + }, +]) + +/* export const MapCompWithDefault = withDefault(ChartsGeoMapComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); */ diff --git a/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartComp.tsx b/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartComp.tsx new file mode 100644 index 000000000..f26078335 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartComp.tsx @@ -0,0 +1,318 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { funnelChartChildrenMap, ChartSize, getDataKeys } from "./funnelChartConstants"; +import { funnelChartPropertyView } from "./funnelChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./funnelChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let FunnelChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...funnelChartChildrenMap}, () => null) + .setPropertyViewFn(funnelChartPropertyView) + .build(); +})(); + +FunnelChartTmpComp = withViewFn(FunnelChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +FunnelChartTmpComp = class extends FunnelChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let FunnelChartComp = withExposingConfigs(FunnelChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const FunnelChartCompWithDefault = withDefault(FunnelChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartConstants.tsx new file mode 100644 index 000000000..36e55cf52 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartConstants.tsx @@ -0,0 +1,309 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { FunnelChartConfig } from "../chartComp/chartConfigs/funnelChartConfig"; +import { EchartsTitleConfig } from "comps/chartComp/chartConfigs/echartsTitleConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + funnel: FunnelChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "funnel"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultFunnelChartOption), + echartsTitle: withDefault(StringControl, trans("funnelChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + echartsTitleConfig:EchartsTitleConfig, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + label: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), + left:withDefault(NumberControl,trans('funnelChart.defaultLeft')), + top:withDefault(NumberControl,trans('funnelChart.defaultTop')), + bottom:withDefault(NumberControl,trans('funnelChart.defaultBottom')), + width:withDefault(NumberControl,trans('funnelChart.defaultWidth')), + min:withDefault(NumberControl,trans('funnelChart.defaultMin')), + max:withDefault(NumberControl,trans('funnelChart.defaultMax')), + gap:withDefault(NumberControl,trans('funnelChart.defaultGap')) +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const funnelChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(funnelChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartPropertyView.tsx new file mode 100644 index 000000000..4f90f9ac9 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartPropertyView.tsx @@ -0,0 +1,66 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./funnelChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function funnelChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.legendVisibility.getView()&& children.echartsLegendConfig.getPropertyView()} + {children.label.getView()&& children.echartsLabelConfig.getPropertyView()} + {children.echartsTitleConfig.getPropertyView()} + {children.left.propertyView({ label: trans("funnelChart.left") })} + {children.top.propertyView({ label: trans("funnelChart.top") })} + {children.bottom.propertyView({ label: trans("funnelChart.bottom") })} + {children.width.propertyView({ label: trans("funnelChart.width") })} + {children.min.propertyView({ label: trans("funnelChart.min") })} + {children.max.propertyView({ label: trans("funnelChart.max") })} + {children.gap.propertyView({ label: trans("funnelChart.gap") })} + {children.echartsTitle.propertyView({ label: trans("funnelChart.title") })} + {children.tooltip.propertyView({label: trans("funnelChart.tooltip")})} + {children.label.propertyView({label: trans("funnelChart.label")})} + {children.legendVisibility.propertyView({label: trans("funnelChart.legendVisibility")})} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartUtils.ts b/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartUtils.ts new file mode 100644 index 000000000..2f2b33505 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/funnelChartComp/funnelChartUtils.ts @@ -0,0 +1,328 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":props.echartsTitleConfig.top + }, + "backgroundColor": props?.style?.background, + "color": props.echartsOption.data?.map(data => data.color), + "tooltip": props.tooltip&&{ + "trigger": "item", + "formatter": "{a}
{b} : {c}%" + }, + "legend":props.legendVisibility&& { + "data": props.echartsOption.data?.map(data=>data.name), + "top": props.echartsLegendConfig.top, + }, + "series": [ + { + "name": props.echartsConfig.type, + "type": props.echartsConfig.type, + "left": `${props.left}%`, + "top": props.top, + "bottom": props.bottom, + "width": `${props.left}%`, + "min": props.min, + "max": props.max, + "gap": props.gap, + "label": { + "show": props.label, + "position": props.echartsLabelConfig.top + }, + "data": props.echartsOption.data + } + ] +} + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartComp.tsx b/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartComp.tsx new file mode 100644 index 000000000..3823dd888 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartComp.tsx @@ -0,0 +1,319 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { gaugeChartChildrenMap, ChartSize, getDataKeys } from "./gaugeChartConstants"; +import { gaugeChartPropertyView } from "./gaugeChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl, + JSONObject +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./gaugeChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let GaugeChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...gaugeChartChildrenMap}, () => null) + .setPropertyViewFn(gaugeChartPropertyView) + .build(); +})(); + +GaugeChartTmpComp = withViewFn(GaugeChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +GaugeChartTmpComp = class extends GaugeChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let GaugeChartComp = withExposingConfigs(GaugeChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const GaugeChartCompWithDefault = withDefault(GaugeChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartConstants.tsx new file mode 100644 index 000000000..5f128faec --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartConstants.tsx @@ -0,0 +1,309 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { GaugeChartConfig } from "../chartComp/chartConfigs/gaugeChartConfig"; +import { EchartsTitleConfig } from "comps/chartComp/chartConfigs/echartsTitleConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + gauge: GaugeChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "gauge"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultGaugeChartOption), + echartsTitle: withDefault(StringControl, trans("gaugeChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + echartsTitleConfig:EchartsTitleConfig, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), + label: withDefault(BoolControl, true), + left:withDefault(NumberControl,trans('gaugeChart.defaultLeft')), + top:withDefault(NumberControl,trans('gaugeChart.defaultTop')), + bottom:withDefault(NumberControl,trans('gaugeChart.defaultBottom')), + width:withDefault(NumberControl,trans('gaugeChart.defaultWidth')), + min:withDefault(NumberControl,trans('gaugeChart.defaultMin')), + max:withDefault(NumberControl,trans('gaugeChart.defaultMax')), + gap:withDefault(NumberControl,trans('gaugeChart.defaultGap')) +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const gaugeChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(gaugeChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartPropertyView.tsx new file mode 100644 index 000000000..b1ac4bad3 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartPropertyView.tsx @@ -0,0 +1,62 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./gaugeChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function gaugeChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.echartsTitleConfig.getPropertyView()} + {children.echartsTitle.propertyView({ label: trans("gaugeChart.title") })} + {/* {children.left.propertyView({ label: trans("gaugeChart.left") })} + {children.top.propertyView({ label: trans("gaugeChart.top") })} + {children.bottom.propertyView({ label: trans("gaugeChart.bottom") })} + {children.width.propertyView({ label: trans("gaugeChart.width") })} */} + {children.min.propertyView({ label: trans("gaugeChart.min") })} + {children.max.propertyView({ label: trans("gaugeChart.max") })} + {/* {children.gap.propertyView({ label: trans("gaugeChart.gap") })} */} + {children.tooltip.propertyView({ label: trans("gaugeChart.tooltip") })} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartUtils.ts b/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartUtils.ts new file mode 100644 index 000000000..4babbe7c7 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/gaugeChartComp/gaugeChartUtils.ts @@ -0,0 +1,330 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":props.echartsTitleConfig.top + }, + "backgroundColor": props?.style?.background, + "color": props.echartsOption.data?.map(data => data.color), + "tooltip": props.tooltip&&{ + "trigger": "item", + "formatter": "{a}
{b} : {c}%" + }, + "series": [ + { + "name": props.echartsConfig.type, + "type": props.echartsConfig.type, + "left": `${props.left}%`, + "top": props.top, + "bottom": props.bottom, + "width": `${props.left}%`, + "min": props.min, + "max": props.max, + "gap": props.gap, + 'detail': { + "backgroundColor": props?.style?.background, "formatter": "{value}%" + }, + "label": { + "show": props.label, + "position": props.echartsLabelConfig.top + }, + /*"detail": { + "formatter": "{value}%" + }, */ + "data": props.echartsOption.data + } + ] +} + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartComp.tsx b/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartComp.tsx new file mode 100644 index 000000000..7b395901c --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartComp.tsx @@ -0,0 +1,319 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { graphChartChildrenMap, ChartSize, getDataKeys } from "./graphChartConstants"; +import { graphChartPropertyView } from "./graphChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl, + JSONObject +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./graphChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let GraphChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...graphChartChildrenMap}, () => null) + .setPropertyViewFn(graphChartPropertyView) + .build(); +})(); + +GraphChartTmpComp = withViewFn(GraphChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +GraphChartTmpComp = class extends GraphChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let GraphChartComp = withExposingConfigs(GraphChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const GraphChartCompWithDefault = withDefault(GraphChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartConstants.tsx new file mode 100644 index 000000000..a3c5c0095 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartConstants.tsx @@ -0,0 +1,299 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { GraphChartConfig } from "../chartComp/chartConfigs/graphChartConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + graph: GraphChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "graph"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultGraphChartOption), + echartsTitle: withDefault(StringControl, trans("graphChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const graphChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(graphChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartPropertyView.tsx new file mode 100644 index 000000000..3ad76fb1e --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartPropertyView.tsx @@ -0,0 +1,54 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./graphChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function graphChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.echartsTitle.propertyView({ label: trans("graphChart.title") })} + {children.tooltip.propertyView({label: trans("graphChart.tooltip")})} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartUtils.ts b/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartUtils.ts new file mode 100644 index 000000000..df231bd0d --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/graphChartComp/graphChartUtils.ts @@ -0,0 +1,319 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":"center" + }, + "backgroundColor": props?.style?.background, + "color": props.echartsOption.data?.map(data => data.color), + "tooltip": props.tooltip&& { + "trigger": "item" + }, + 'series': [ + { + "type": "graph", + "layout": "force", + "force": { + "repulsion": 100, + "gravity": 0.1, + "edgeLength": 100 + }, + 'categories': props.echartsOption.categories, + 'links': props.echartsOption.links, + 'nodes': props.echartsOption.nodes, + } + ] +} + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartComp.tsx b/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartComp.tsx new file mode 100644 index 000000000..760b79dca --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartComp.tsx @@ -0,0 +1,318 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { heatmapChartChildrenMap, ChartSize, getDataKeys } from "./heatmapChartConstants"; +import { heatmapChartPropertyView } from "./heatmapChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./heatmapChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let HeatmapChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...heatmapChartChildrenMap}, () => null) + .setPropertyViewFn(heatmapChartPropertyView) + .build(); +})(); + +HeatmapChartTmpComp = withViewFn(HeatmapChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +HeatmapChartTmpComp = class extends HeatmapChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let HeatmapChartComp = withExposingConfigs(HeatmapChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const HeatmapChartCompWithDefault = withDefault(HeatmapChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartConstants.tsx new file mode 100644 index 000000000..d4a8a9a29 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartConstants.tsx @@ -0,0 +1,299 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { HeatmapChartConfig } from "comps/chartComp/chartConfigs/heatmapChartConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + heatmap: HeatmapChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "heatmap"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultHeatmapChartOption), + echartsTitle: withDefault(StringControl, trans("heatmapChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const heatmapChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(heatmapChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartPropertyView.tsx new file mode 100644 index 000000000..8f990546e --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartPropertyView.tsx @@ -0,0 +1,54 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./heatmapChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function heatmapChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.echartsTitle.propertyView({ label: trans("heatmapChart.title") })} + {children.tooltip.propertyView({label: trans("heatmapChart.tooltip")})} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartUtils.ts b/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartUtils.ts new file mode 100644 index 000000000..6d9c0bef9 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/heatmapChartComp/heatmapChartUtils.ts @@ -0,0 +1,336 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":"center" + }, + "backgroundColor": props?.style?.background, + "color": props.echartsOption.data?.map(data => data.color), + "tooltip": props.tooltip&&{ + "position": "top" + }, + "grid": { + "height": "50%", + "top": "10%" + }, + "visualMap": { + "min": 0, + "max": 100, + "calculable": true, + "orient": "horizontal", + "left": "center", + "bottom": "15%" + }, + "legend": { + "data": ["Heatmap"], + "left": "left" + }, + 'xAxis': { + "type": "category", + 'data':props.echartsOption.xAxis.data + }, + 'yAxis': { + "type": "category", + data: props.echartsOption.yAxis.data + }, + 'series': [ + { + 'name': 'Heatmap', + 'type': 'heatmap', + 'data':props.echartsOption.data + } + ] +} + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartComp.tsx b/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartComp.tsx new file mode 100644 index 000000000..b9a9af5be --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartComp.tsx @@ -0,0 +1,318 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { radarChartChildrenMap, ChartSize, getDataKeys } from "./radarChartConstants"; +import { radarChartPropertyView } from "./radarChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./radarChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let RadarChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...radarChartChildrenMap}, () => null) + .setPropertyViewFn(radarChartPropertyView) + .build(); +})(); + +RadarChartTmpComp = withViewFn(RadarChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +RadarChartTmpComp = class extends RadarChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let RadarChartComp = withExposingConfigs(RadarChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const RadarChartCompWithDefault = withDefault(RadarChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartConstants.tsx new file mode 100644 index 000000000..a96f7a36d --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartConstants.tsx @@ -0,0 +1,299 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { RadarChartConfig } from "comps/chartComp/chartConfigs/radarChartConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + radar: RadarChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "radar"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultRadarChartOption), + echartsTitle: withDefault(StringControl, trans("radarChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const radarChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(radarChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartPropertyView.tsx new file mode 100644 index 000000000..f6ea20b14 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartPropertyView.tsx @@ -0,0 +1,54 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./radarChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function radarChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.echartsTitle.propertyView({ label: trans("radarChart.title") })} + {children.tooltip.propertyView({label: trans("radarChart.tooltip")})} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartUtils.ts b/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartUtils.ts new file mode 100644 index 000000000..3ce2d0f7b --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/radarChartComp/radarChartUtils.ts @@ -0,0 +1,320 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":"center" + }, + "backgroundColor": props?.style?.background, + "color": props.echartsOption.data?.map(data => data.color), + "tooltip": { + "trigger": "axis", + "formatter": function(params) { + let tooltipText = params[0].name + '
'; + params.forEach(function(item) { + tooltipText += item.seriesName + ': ' + item.value + '
'; + }); + return tooltipText; + } + }, + "radar": [ + { + "indicator": props.echartsOption.indicator, + "center": ["50%", "50%"], + "radius": "60%" + } + ], + "series": props.echartsOption.series.map(option=>{return {...option,type:'radar'}}) +} + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartComp.tsx b/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartComp.tsx new file mode 100644 index 000000000..680f47771 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartComp.tsx @@ -0,0 +1,318 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { sankeyChartChildrenMap, ChartSize, getDataKeys } from "./sankeyChartConstants"; +import { sankeyChartPropertyView } from "./sankeyChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./sankeyChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let SankeyChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...sankeyChartChildrenMap}, () => null) + .setPropertyViewFn(sankeyChartPropertyView) + .build(); +})(); + +SankeyChartTmpComp = withViewFn(SankeyChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +SankeyChartTmpComp = class extends SankeyChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let SankeyChartComp = withExposingConfigs(SankeyChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const SankeyChartCompWithDefault = withDefault(SankeyChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartConstants.tsx new file mode 100644 index 000000000..bc106cebe --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartConstants.tsx @@ -0,0 +1,299 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { SankeyChartConfig } from "../chartComp/chartConfigs/sankeyChartConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + sankey: SankeyChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "sankey"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultSankeyChartOption), + echartsTitle: withDefault(StringControl, trans("sankeyChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const sankeyChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(sankeyChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartPropertyView.tsx new file mode 100644 index 000000000..da18ef2a4 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartPropertyView.tsx @@ -0,0 +1,55 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./sankeyChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function sankeyChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.echartsLabelConfig.getPropertyView()} + {children.echartsTitle.propertyView({ label: trans("sankeyChart.title") })} + {children.tooltip.propertyView({label: trans("sankeyChart.tooltip")})} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartUtils.ts b/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartUtils.ts new file mode 100644 index 000000000..819fa4e67 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/sankeyChartComp/sankeyChartUtils.ts @@ -0,0 +1,325 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":"center" + }, + "backgroundColor": props?.style?.background, + "color": props.echartsOption.data?.map(data => data.color), + "tooltip": props.tooltip&&{ + "trigger": "item", + "formatter": "{a}
{b} : {c}%" + }, + "series": [ + { + "name": props.echartsConfig.type, + "type": props.echartsConfig.type, + "left": "10%", + "top": 60, + "bottom": 60, + "width": "80%", + "min": 0, + "max": 100, + "gap": 2, + "label": { + "show": true, + "position": props.echartsLabelConfig.top + }, + "data": props.echartsOption.data, + "links":props.echartsOption.links + } + ] +} + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartComp.tsx b/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartComp.tsx new file mode 100644 index 000000000..a136b12b6 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartComp.tsx @@ -0,0 +1,318 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { sunburstChartChildrenMap, ChartSize, getDataKeys } from "./sunburstChartConstants"; +import { sunburstChartPropertyView } from "./sunburstChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./sunburstChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let SunburstChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...sunburstChartChildrenMap}, () => null) + .setPropertyViewFn(sunburstChartPropertyView) + .build(); +})(); + +SunburstChartTmpComp = withViewFn(SunburstChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +SunburstChartTmpComp = class extends SunburstChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let SunburstChartComp = withExposingConfigs(SunburstChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const SunburstChartCompWithDefault = withDefault(SunburstChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartConstants.tsx new file mode 100644 index 000000000..c4e7aa539 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartConstants.tsx @@ -0,0 +1,299 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { SunburstChartConfig } from "comps/chartComp/chartConfigs/sunburstChartConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + sunburst: SunburstChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "sunburst"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultSunburstChartOption), + echartsTitle: withDefault(StringControl, trans("sunburstChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const sunburstChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(sunburstChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartPropertyView.tsx new file mode 100644 index 000000000..c8e631be8 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartPropertyView.tsx @@ -0,0 +1,54 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./sunburstChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function sunburstChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.echartsTitle.propertyView({ label: trans("sunburstChart.title") })} + {children.tooltip.propertyView({label: trans("sunburstChart.tooltip")})} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartUtils.ts b/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartUtils.ts new file mode 100644 index 000000000..85bbb9676 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/sunburstChartComp/sunburstChartUtils.ts @@ -0,0 +1,318 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":"center" + }, + "backgroundColor": props?.style?.background, + "color": props.echartsOption.data?.map(data => data.color), + "tooltip": props.tooltip&&{ + "trigger": "item", + "formatter": "{b}: {c}" + }, + "series": [ + { + "name": props.echartsConfig.type, + "type": props.echartsConfig.type, + "top": "10%", + "left": "10%", + "bottom": "10%", + "right": "10%", + "symbolSize": 7, + 'data': props.echartsOption.data, + } + ] +} + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartComp.tsx b/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartComp.tsx new file mode 100644 index 000000000..225c65cc6 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartComp.tsx @@ -0,0 +1,318 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { themeriverChartChildrenMap, ChartSize, getDataKeys } from "./themeriverChartConstants"; +import { themeriverChartPropertyView } from "./themeriverChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./themeriverChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let ThemeriverChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...themeriverChartChildrenMap}, () => null) + .setPropertyViewFn(themeriverChartPropertyView) + .build(); +})(); + +ThemeriverChartTmpComp = withViewFn(ThemeriverChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +ThemeriverChartTmpComp = class extends ThemeriverChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let ThemeriverChartComp = withExposingConfigs(ThemeriverChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const ThemeriverChartCompWithDefault = withDefault(ThemeriverChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartConstants.tsx new file mode 100644 index 000000000..589634148 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartConstants.tsx @@ -0,0 +1,299 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { ThemeriverChartConfig } from "comps/chartComp/chartConfigs/themeriverChartConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + themeriver: ThemeriverChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "themeriver"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultThemeriverChartOption), + echartsTitle: withDefault(StringControl, trans("themeriverChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const themeriverChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(themeriverChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartPropertyView.tsx new file mode 100644 index 000000000..529dbcc57 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartPropertyView.tsx @@ -0,0 +1,54 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./themeriverChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function themeriverChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.echartsTitle.propertyView({ label: trans("themeriverChart.title") })} + {children.tooltip.propertyView({label: trans("themeriverChart.tooltip")})} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartUtils.ts b/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartUtils.ts new file mode 100644 index 000000000..5d9195e3c --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/themeriverChartComp/themeriverChartUtils.ts @@ -0,0 +1,345 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":"center" + }, + "backgroundColor": props.style.background, + "tooltip": props.tooltip&&{ + "trigger": "axis", + "axisPointer": { + "type": "line", + "lineStyle": { + "color": "rgba(0,0,0,0.2)", + "width": 2, + "type": "solid" + } + } + }, + "singleAxis": { + "type": "time", + "bottom": 50, + "axisTick": {}, + "axisLabel": {}, + "splitLine": {}, + "axisPointer": { + "animation": true, + "label": { + "show": true, + "color": "#fff" + } + }, + "splitNumber": 30 + }, + "series": [ + { + "type": props.echartsConfig.type, + "data": props.echartsOption.data, + "label": { + "show": true, + "position": "top", + "fontSize": 12 + }, + "emphasis": { + "itemStyle": { + "shadowBlur": 20, + "shadowColor": "rgba(0, 0, 0, 0.8)" + } + } + } + ] +} + + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/treeChartComp/treeChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/treeChartComp/treeChartConstants.tsx new file mode 100644 index 000000000..573cc03db --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/treeChartComp/treeChartConstants.tsx @@ -0,0 +1,299 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { TreeChartConfig } from "comps/chartComp/chartConfigs/treeChartConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + tree: TreeChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "tree"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultTreeChartOption), + echartsTitle: withDefault(StringControl, trans("treeChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const treeChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(treeChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/treeChartComp/treeChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/treeChartComp/treeChartPropertyView.tsx new file mode 100644 index 000000000..920062913 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/treeChartComp/treeChartPropertyView.tsx @@ -0,0 +1,54 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./treeChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function treeChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.echartsTitle.propertyView({ label: trans("treeChart.title") })} + {children.tooltip.propertyView({label: trans("treeChart.tooltip")})} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/treeChartComp/treeChartUtils.ts b/client/packages/lowcoder-comps/src/comps/treeChartComp/treeChartUtils.ts new file mode 100644 index 000000000..c7719fdb7 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/treeChartComp/treeChartUtils.ts @@ -0,0 +1,330 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":"center" + }, + "backgroundColor": props?.style?.background, + "color": props.echartsOption.data?.map(data => data.color), + "tooltip": props.tooltip&&{ + "trigger": "item", + "triggerOn": "mousemove" + }, + "series": [ + { + "name": props.echartsConfig.type, + "type": props.echartsConfig.type, + "top": "10%", + "left": "10%", + "bottom": "10%", + "right": "10%", + "symbolSize": 7, + 'data': props.echartsOption.data, + "label": { + "position": "top", + "verticalAlign": "middle", + "align": "right" + }, + "leaves": { + "label": { + "position": "bottom", + "verticalAlign": "middle", + "align": "left" + } + } + } + ] +} + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/comps/treeChartComp/treechartComp.tsx b/client/packages/lowcoder-comps/src/comps/treeChartComp/treechartComp.tsx new file mode 100644 index 000000000..91bb602e8 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/treeChartComp/treechartComp.tsx @@ -0,0 +1,318 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { treeChartChildrenMap, ChartSize, getDataKeys } from "./treeChartConstants"; +import { treeChartPropertyView } from "./treeChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./treeChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let TreeChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...treeChartChildrenMap}, () => null) + .setPropertyViewFn(treeChartPropertyView) + .build(); +})(); + +TreeChartTmpComp = withViewFn(TreeChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +TreeChartTmpComp = class extends TreeChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let TreeChartComp = withExposingConfigs(TreeChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const TreeChartCompWithDefault = withDefault(TreeChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartComp.tsx b/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartComp.tsx new file mode 100644 index 000000000..fa0d6f078 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartComp.tsx @@ -0,0 +1,318 @@ +import { + changeChildAction, + changeValueAction, + CompAction, + CompActionTypes, + wrapChildAction, +} from "lowcoder-core"; +import { AxisFormatterComp, EchartsAxisType } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { treemapChartChildrenMap, ChartSize, getDataKeys } from "./treemapChartConstants"; +import { treeChartPropertyView } from "./treemapChartPropertyView"; +import _ from "lodash"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; +import ReactResizeDetector from "react-resize-detector"; +import ReactECharts from "../chartComp/reactEcharts"; +import { + childrenToProps, + depsConfig, + genRandomKey, + NameConfig, + UICompBuilder, + withDefault, + withExposingConfigs, + withViewFn, + ThemeContext, + chartColorPalette, + getPromiseAfterDispatch, + dropdownControl +} from "lowcoder-sdk"; +import { getEchartsLocale, trans } from "i18n/comps"; +import { ItemColorComp } from "comps/chartComp/chartConfigs/lineChartConfig"; +import { + echartsConfigOmitChildren, + getEchartsConfig, + getSelectedPoints, +} from "./treemapChartUtils"; +import 'echarts-extension-gmap'; +import log from "loglevel"; + +let clickEventCallback = () => {}; + +const chartModeOptions = [ + { + label: "ECharts JSON", + value: "json", + } +] as const; + +let TreemapChartTmpComp = (function () { + return new UICompBuilder({mode:dropdownControl(chartModeOptions,'json'),...treemapChartChildrenMap}, () => null) + .setPropertyViewFn(treeChartPropertyView) + .build(); +})(); + +TreemapChartTmpComp = withViewFn(TreemapChartTmpComp, (comp) => { + const mode = comp.children.mode.getView(); + const onUIEvent = comp.children.onUIEvent.getView(); + const onEvent = comp.children.onEvent.getView(); + const echartsCompRef = useRef(); + const [chartSize, setChartSize] = useState(); + const firstResize = useRef(true); + const theme = useContext(ThemeContext); + const defaultChartTheme = { + color: chartColorPalette, + backgroundColor: "#fff", + }; + + let themeConfig = defaultChartTheme; + try { + themeConfig = theme?.theme.chart ? JSON.parse(theme?.theme.chart) : defaultChartTheme; + } catch (error) { + log.error('theme chart error: ', error); + } + + const triggerClickEvent = async (dispatch: any, action: CompAction) => { + await getPromiseAfterDispatch( + dispatch, + action, + { autoHandleAfterReduce: true } + ); + onEvent('click'); + } + + useEffect(() => { + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("click", (param: any) => { + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: 'click', + data: param.data, + } + })); + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", param.data, false) + ); + }); + return () => { + echartsCompInstance?.off("click"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, []); + + useEffect(() => { + // bind events + const echartsCompInstance = echartsCompRef?.current?.getEchartsInstance(); + if (!echartsCompInstance) { + return _.noop; + } + echartsCompInstance?.on("selectchanged", (param: any) => { + const option: any = echartsCompInstance?.getOption(); + document.dispatchEvent(new CustomEvent("clickEvent", { + bubbles: true, + detail: { + action: param.fromAction, + data: getSelectedPoints(param, option) + } + })); + + if (param.fromAction === "select") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("select"); + } else if (param.fromAction === "unselect") { + comp.dispatch(changeChildAction("selectedPoints", getSelectedPoints(param, option), false)); + onUIEvent("unselect"); + } + + triggerClickEvent( + comp.dispatch, + changeChildAction("lastInteractionData", getSelectedPoints(param, option), false) + ); + }); + // unbind + return () => { + echartsCompInstance?.off("selectchanged"); + document.removeEventListener('clickEvent', clickEventCallback) + }; + }, [onUIEvent]); + + const echartsConfigChildren = _.omit(comp.children, echartsConfigOmitChildren); + const option = useMemo(() => { + return getEchartsConfig( + childrenToProps(echartsConfigChildren) as ToViewReturn, + chartSize + ); + }, [chartSize, ...Object.values(echartsConfigChildren)]); + + useEffect(() => { + comp.children.mapInstance.dispatch(changeValueAction(null, false)) + if(comp.children.mapInstance.value) return; + }, [option]) + + return ( + { + if (w && h) { + setChartSize({ w: w, h: h }); + } + if (!firstResize.current) { + // ignore the first resize, which will impact the loading animation + echartsCompRef.current?.getEchartsInstance().resize(); + } else { + firstResize.current = false; + } + }} + > + (echartsCompRef.current = e)} + style={{ height: "100%" }} + notMerge + lazyUpdate + opts={{ locale: getEchartsLocale() }} + option={option} + theme={mode !== 'map' ? themeConfig : undefined} + mode={mode} + /> + + ); +}); + +function getYAxisFormatContextValue( + data: Array, + yAxisType: EchartsAxisType, + yAxisName?: string +) { + const dataSample = yAxisName && data.length > 0 && data[0][yAxisName]; + let contextValue = dataSample; + if (yAxisType === "time") { + // to timestamp + const time = + typeof dataSample === "number" || typeof dataSample === "string" + ? new Date(dataSample).getTime() + : null; + if (time) contextValue = time; + } + return contextValue; +} + +TreemapChartTmpComp = class extends TreemapChartTmpComp { + private lastYAxisFormatContextVal?: JSONValue; + private lastColorContext?: JSONObject; + + updateContext(comp: this) { + // the context value of axis format + let resultComp = comp; + const data = comp.children.data.getView(); + const sampleSeries = comp.children.series.getView().find((s) => !s.getView().hide); + const yAxisContextValue = getYAxisFormatContextValue( + data, + comp.children.yConfig.children.yAxisType.getView(), + sampleSeries?.children.columnName.getView() + ); + if (yAxisContextValue !== comp.lastYAxisFormatContextVal) { + comp.lastYAxisFormatContextVal = yAxisContextValue; + resultComp = comp.setChild( + "yConfig", + comp.children.yConfig.reduce( + wrapChildAction( + "formatter", + AxisFormatterComp.changeContextDataAction({ value: yAxisContextValue }) + ) + ) + ); + } + // item color context + const colorContextVal = { + seriesName: sampleSeries?.children.seriesName.getView(), + value: yAxisContextValue, + }; + if ( + comp.children.chartConfig.children.comp.children.hasOwnProperty("itemColor") && + !_.isEqual(colorContextVal, comp.lastColorContext) + ) { + comp.lastColorContext = colorContextVal; + resultComp = resultComp.setChild( + "chartConfig", + comp.children.chartConfig.reduce( + wrapChildAction( + "comp", + wrapChildAction("itemColor", ItemColorComp.changeContextDataAction(colorContextVal)) + ) + ) + ); + } + return resultComp; + } + + override reduce(action: CompAction): this { + const comp = super.reduce(action); + if (action.type === CompActionTypes.UPDATE_NODES_V2) { + const newData = comp.children.data.getView(); + // data changes + if (comp.children.data !== this.children.data) { + setTimeout(() => { + // update x-axis value + const keys = getDataKeys(newData); + if (keys.length > 0 && !keys.includes(comp.children.xAxisKey.getView())) { + comp.children.xAxisKey.dispatch(changeValueAction(keys[0] || "")); + } + // pass to child series comp + comp.children.series.dispatchDataChanged(newData); + }, 0); + } + return this.updateContext(comp); + } + return comp; + } + + override autoHeight(): boolean { + return false; + } +}; + +let TreemapChartComp = withExposingConfigs(TreemapChartTmpComp, [ + depsConfig({ + name: "selectedPoints", + desc: trans("chart.selectedPointsDesc"), + depKeys: ["selectedPoints"], + func: (input) => { + return input.selectedPoints; + }, + }), + depsConfig({ + name: "lastInteractionData", + desc: trans("chart.lastInteractionDataDesc"), + depKeys: ["lastInteractionData"], + func: (input) => { + return input.lastInteractionData; + }, + }), + depsConfig({ + name: "data", + desc: trans("chart.dataDesc"), + depKeys: ["data", "mode"], + func: (input) =>[] , + }), + new NameConfig("title", trans("chart.titleDesc")), +]); + + +export const TreemapChartCompWithDefault = withDefault(TreemapChartComp, { + xAxisKey: "date", + series: [ + { + dataIndex: genRandomKey(), + seriesName: trans("chart.spending"), + columnName: "spending", + }, + { + dataIndex: genRandomKey(), + seriesName: trans("chart.budget"), + columnName: "budget", + }, + ], +}); diff --git a/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartConstants.tsx b/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartConstants.tsx new file mode 100644 index 000000000..a5c302b2b --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartConstants.tsx @@ -0,0 +1,299 @@ +import { + jsonControl, + JSONObject, + stateComp, + toJSONObjectArray, + toObject, + BoolControl, + withDefault, + StringControl, + NumberControl, + FunctionControl, + dropdownControl, + eventHandlerControl, + valueComp, + withType, + uiChildren, + clickEvent, + styleControl, + EchartsStyle +} from "lowcoder-sdk"; +import { RecordConstructorToComp, RecordConstructorToView } from "lowcoder-core"; +import { BarChartConfig } from "../chartComp/chartConfigs/barChartConfig"; +import { XAxisConfig, YAxisConfig } from "../chartComp/chartConfigs/cartesianAxisConfig"; +import { LegendConfig } from "../chartComp/chartConfigs/legendConfig"; +import { EchartsLegendConfig } from "../chartComp/chartConfigs/echartsLegendConfig"; +import { EchartsLabelConfig } from "../chartComp/chartConfigs/echartsLabelConfig"; +import { LineChartConfig } from "../chartComp/chartConfigs/lineChartConfig"; +import { PieChartConfig } from "../chartComp/chartConfigs/pieChartConfig"; +import { ScatterChartConfig } from "../chartComp/chartConfigs/scatterChartConfig"; +import { SeriesListComp } from "../chartComp/seriesComp"; +import { EChartsOption } from "echarts"; +import { i18nObjs, trans } from "i18n/comps"; +import { TreemapChartConfig } from "comps/chartComp/chartConfigs/treemapChartConfig"; + +export const ChartTypeOptions = [ + { + label: trans("chart.bar"), + value: "bar", + }, + { + label: trans("chart.line"), + value: "line", + }, + { + label: trans("chart.scatter"), + value: "scatter", + }, + { + label: trans("chart.pie"), + value: "pie", + }, +] as const; + +export const UIEventOptions = [ + { + label: trans("chart.select"), + value: "select", + description: trans("chart.selectDesc"), + }, + { + label: trans("chart.unSelect"), + value: "unselect", + description: trans("chart.unselectDesc"), + }, +] as const; + +export const MapEventOptions = [ + { + label: trans("chart.mapReady"), + value: "mapReady", + description: trans("chart.mapReadyDesc"), + }, + { + label: trans("chart.zoomLevelChange"), + value: "zoomLevelChange", + description: trans("chart.zoomLevelChangeDesc"), + }, + { + label: trans("chart.centerPositionChange"), + value: "centerPositionChange", + description: trans("chart.centerPositionChangeDesc"), + }, +] as const; + +export const XAxisDirectionOptions = [ + { + label: trans("chart.horizontal"), + value: "horizontal", + }, + { + label: trans("chart.vertical"), + value: "vertical", + }, +] as const; + +export type XAxisDirectionType = ValueFromOption; + +export const noDataAxisConfig = { + animation: false, + xAxis: { + type: "category", + name: trans("chart.noData"), + nameLocation: "middle", + data: [], + axisLine: { + lineStyle: { + color: "#8B8FA3", + }, + }, + }, + yAxis: { + type: "value", + axisLabel: { + color: "#8B8FA3", + }, + splitLine: { + lineStyle: { + color: "#F0F0F0", + }, + }, + }, + tooltip: { + show: false, + }, + series: [ + { + data: [700], + type: "line", + itemStyle: { + opacity: 0, + }, + }, + ], +} as EChartsOption; + +export const noDataPieChartConfig = { + animation: false, + tooltip: { + show: false, + }, + legend: { + formatter: trans("chart.unknown"), + top: "bottom", + selectedMode: false, + }, + color: ["#B8BBCC", "#CED0D9", "#DCDEE6", "#E6E6EB"], + series: [ + { + type: "pie", + radius: "35%", + center: ["25%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + { + type: "pie", + radius: "35%", + center: ["75%", "50%"], + silent: true, + label: { + show: false, + }, + data: [ + { + name: "1", + value: 70, + }, + { + name: "2", + value: 68, + }, + { + name: "3", + value: 48, + }, + { + name: "4", + value: 40, + }, + ], + }, + ], +} as EChartsOption; + +export type ChartSize = { w: number; h: number }; + +export const getDataKeys = (data: Array) => { + if (!data) { + return []; + } + const dataKeys: Array = []; + data.slice(0, 50).forEach((d) => { + Object.keys(d).forEach((key) => { + if (!dataKeys.includes(key)) { + dataKeys.push(key); + } + }); + }); + return dataKeys; +}; + +const ChartOptionMap = { + bar: BarChartConfig, + line: LineChartConfig, + pie: PieChartConfig, + scatter: ScatterChartConfig, +}; + +const EchartsOptionMap = { + treemap: TreemapChartConfig, +}; + +const ChartOptionComp = withType(ChartOptionMap, "bar"); +const EchartsOptionComp = withType(EchartsOptionMap, "treemap"); +export type CharOptionCompType = keyof typeof ChartOptionMap; + +export const chartUiModeChildren = { + title: StringControl, + data: jsonControl(toJSONObjectArray, i18nObjs.defaultDataSource), + xAxisKey: valueComp(""), // x-axis, key from data + xAxisDirection: dropdownControl(XAxisDirectionOptions, "horizontal"), + series: SeriesListComp, + xConfig: XAxisConfig, + yConfig: YAxisConfig, + legendConfig: LegendConfig, + chartConfig: ChartOptionComp, + onUIEvent: eventHandlerControl(UIEventOptions), +}; + +const chartJsonModeChildren = { + echartsOption: jsonControl(toObject, i18nObjs.defaultTreemapChartOption), + echartsTitle: withDefault(StringControl, trans("treemapChart.defaultTitle")), + echartsLegendConfig: EchartsLegendConfig, + echartsLabelConfig: EchartsLabelConfig, + echartsConfig: EchartsOptionComp, + style: styleControl(EchartsStyle), + tooltip: withDefault(BoolControl, true), + legendVisibility: withDefault(BoolControl, true), +} + +const chartMapModeChildren = { + mapInstance: stateComp(), + getMapInstance: FunctionControl, + mapApiKey: withDefault(StringControl, ''), + mapZoomLevel: withDefault(NumberControl, 3), + mapCenterLng: withDefault(NumberControl, 15.932644), + mapCenterLat: withDefault(NumberControl, 50.942063), + mapOptions: jsonControl(toObject, i18nObjs.defaultMapJsonOption), + onMapEvent: eventHandlerControl(MapEventOptions), + showCharts: withDefault(BoolControl, true), +} + +export type UIChartDataType = { + seriesName: string; + // coordinate chart + x?: any; + y?: any; + // pie or funnel + itemName?: any; + value?: any; +}; + +export type NonUIChartDataType = { + name: string; + value: any; +} + +export const treemapChartChildrenMap = { + selectedPoints: stateComp>([]), + lastInteractionData: stateComp | NonUIChartDataType>({}), + onEvent: eventHandlerControl([clickEvent] as const), + ...chartUiModeChildren, + ...chartJsonModeChildren, + ...chartMapModeChildren, +}; + +const chartUiChildrenMap = uiChildren(treemapChartChildrenMap); +export type ChartCompPropsType = RecordConstructorToView; +export type ChartCompChildrenType = RecordConstructorToComp; diff --git a/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartPropertyView.tsx b/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartPropertyView.tsx new file mode 100644 index 000000000..4d5c543bb --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartPropertyView.tsx @@ -0,0 +1,54 @@ +import { CompAction } from "lowcoder-core"; +import { ChartCompChildrenType } from "./treemapChartConstants"; +import { + hiddenPropertyView, + Section, + sectionNames, +} from "lowcoder-sdk"; +import { trans } from "i18n/comps"; +import { examplesUrl,optionUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function treeChartPropertyView( + children: ChartCompChildrenType, + dispatch: (action: CompAction) => void +) { + + const jsonModePropertyView = ( + <> +
+ {children.echartsOption.propertyView({ + label: trans("chart.echartsOptionLabel"), + styleName: "higher", + tooltip: ( + + ), + })} + {children.echartsTitle.propertyView({ label: trans("treemapChart.title") })} + {children.tooltip.propertyView({label: trans("treemapChart.tooltip")})} +
+
+ {children.onEvent.propertyView()} +
+
+ {children.style.getPropertyView()} +
+
{hiddenPropertyView(children)}
+ + ); + + const getChatConfigByMode = (mode: string) => { + switch(mode) { + case "json": + return jsonModePropertyView; + } + } + return getChatConfigByMode(children.mode.getView()) +} diff --git a/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartUtils.ts b/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartUtils.ts new file mode 100644 index 000000000..81f033597 --- /dev/null +++ b/client/packages/lowcoder-comps/src/comps/treemapChartComp/treemapChartUtils.ts @@ -0,0 +1,319 @@ +import { + CharOptionCompType, + ChartCompPropsType, + ChartSize, + noDataAxisConfig, + noDataPieChartConfig, +} from "comps/chartComp/chartConstants"; +import { getPieRadiusAndCenter } from "comps/chartComp/chartConfigs/pieChartConfig"; +import { EChartsOptionWithMap } from "../chartComp/reactEcharts/types"; +import _ from "lodash"; +import { chartColorPalette, isNumeric, JSONObject, loadScript } from "lowcoder-sdk"; +import { calcXYConfig } from "comps/chartComp/chartConfigs/cartesianAxisConfig"; +import Big from "big.js"; +import { googleMapsApiUrl } from "../chartComp/chartConfigs/chartUrls"; + +export function transformData( + originData: JSONObject[], + xAxis: string, + seriesColumnNames: string[] +) { + // aggregate data by x-axis + const transformedData: JSONObject[] = []; + originData.reduce((prev, cur) => { + if (cur === null || cur === undefined) { + return prev; + } + const groupValue = cur[xAxis] as string; + if (!prev[groupValue]) { + // init as 0 + const initValue: any = {}; + seriesColumnNames.forEach((name) => { + initValue[name] = 0; + }); + prev[groupValue] = initValue; + transformedData.push(prev[groupValue]); + } + // remain the x-axis data + prev[groupValue][xAxis] = groupValue; + seriesColumnNames.forEach((key) => { + if (key === xAxis) { + return; + } else if (isNumeric(cur[key])) { + const bigNum = Big(cur[key]); + prev[groupValue][key] = bigNum.add(prev[groupValue][key]).toNumber(); + } else { + prev[groupValue][key] += 1; + } + }); + return prev; + }, {} as any); + return transformedData; +} + +const notAxisChartSet: Set = new Set(["pie"] as const); +export const echartsConfigOmitChildren = [ + "hidden", + "selectedPoints", + "onUIEvent", + "mapInstance" +] as const; +type EchartsConfigProps = Omit; + +export function isAxisChart(type: CharOptionCompType) { + return !notAxisChartSet.has(type); +} + +export function getSeriesConfig(props: EchartsConfigProps) { + const visibleSeries = props.series.filter((s) => !s.getView().hide); + const seriesLength = visibleSeries.length; + return visibleSeries.map((s, index) => { + if (isAxisChart(props.chartConfig.type)) { + let encodeX: string, encodeY: string; + const horizontalX = props.xAxisDirection === "horizontal"; + let itemStyle = props.chartConfig.itemStyle; + // FIXME: need refactor... chartConfig returns a function with paramters + if (props.chartConfig.type === "bar") { + // barChart's border radius, depend on x-axis direction and stack state + const borderRadius = horizontalX ? [2, 2, 0, 0] : [0, 2, 2, 0]; + if (props.chartConfig.stack && index === visibleSeries.length - 1) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } else if (!props.chartConfig.stack) { + itemStyle = { ...itemStyle, borderRadius: borderRadius }; + } + } + if (horizontalX) { + encodeX = props.xAxisKey; + encodeY = s.getView().columnName; + } else { + encodeX = s.getView().columnName; + encodeY = props.xAxisKey; + } + return { + name: s.getView().seriesName, + selectedMode: "single", + select: { + itemStyle: { + borderColor: "#000", + }, + }, + encode: { + x: encodeX, + y: encodeY, + }, + // each type of chart's config + ...props.chartConfig, + itemStyle: itemStyle, + label: { + ...props.chartConfig.label, + ...(!horizontalX && { position: "outside" }), + }, + }; + } else { + // pie + const radiusAndCenter = getPieRadiusAndCenter(seriesLength, index, props.chartConfig); + return { + ...props.chartConfig, + radius: radiusAndCenter.radius, + center: radiusAndCenter.center, + name: s.getView().seriesName, + selectedMode: "single", + encode: { + itemName: props.xAxisKey, + value: s.getView().columnName, + }, + }; + } + }); +} + +// https://echarts.apache.org/en/option.html +export function getEchartsConfig(props: EchartsConfigProps, chartSize?: ChartSize): EChartsOptionWithMap { + if (props.mode === "json") { + let opt={ + "title": { + "text": props.echartsTitle, + 'top': props.echartsLegendConfig.top === 'bottom' ?'top':'bottom', + "left":"center" + }, + "backgroundColor": props?.style?.background, + "color": [], + "tooltip": props.tooltip&&{ + "trigger": "item", + "formatter": "{b}: {c}", + "axisPointer": { + "type": "shadow" + }, + }, + "series": [ + { + "name": props.echartsConfig.type, + "type": props.echartsConfig.type, + 'data': props.echartsOption.data, + "breadcrumb": { + "show": true + } + } + ] + } + return props.echartsOption ? opt : {}; + + } + + if(props.mode === "map") { + const { + mapZoomLevel, + mapCenterLat, + mapCenterLng, + mapOptions, + showCharts, + } = props; + + const echartsOption = mapOptions && showCharts ? mapOptions : {}; + return { + gmap: { + center: [mapCenterLng, mapCenterLat], + zoom: mapZoomLevel, + renderOnMoving: true, + echartsLayerZIndex: showCharts ? 2019 : 0, + roam: true + }, + ...echartsOption, + } + } + // axisChart + const axisChart = isAxisChart(props.chartConfig.type); + const gridPos = { + left: 20, + right: props.legendConfig.left === "right" ? "10%" : 20, + top: 50, + bottom: 35, + }; + let config: EChartsOptionWithMap = { + title: { text: props.title, left: "center" }, + tooltip: { + confine: true, + trigger: axisChart ? "axis" : "item", + }, + legend: props.legendConfig, + grid: { + ...gridPos, + containLabel: true, + }, + }; + if (props.data.length <= 0) { + // no data + return { + ...config, + ...(axisChart ? noDataAxisConfig : noDataPieChartConfig), + }; + } + const yAxisConfig = props.yConfig(); + const seriesColumnNames = props.series + .filter((s) => !s.getView().hide) + .map((s) => s.getView().columnName); + // y-axis is category and time, data doesn't need to aggregate + const transformedData = + yAxisConfig.type === "category" || yAxisConfig.type === "time" + ? props.data + : transformData(props.data, props.xAxisKey, seriesColumnNames); + config = { + ...config, + dataset: [ + { + source: transformedData, + sourceHeader: false, + }, + ], + series: getSeriesConfig(props), + }; + if (axisChart) { + // pure chart's size except the margin around + let chartRealSize; + if (chartSize) { + const rightSize = + typeof gridPos.right === "number" + ? gridPos.right + : (chartSize.w * parseFloat(gridPos.right)) / 100.0; + chartRealSize = { + // actually it's self-adaptive with the x-axis label on the left, not that accurate but work + w: chartSize.w - gridPos.left - rightSize, + // also self-adaptive on the bottom + h: chartSize.h - gridPos.top - gridPos.bottom, + right: rightSize, + }; + } + const finalXyConfig = calcXYConfig( + props.xConfig, + yAxisConfig, + props.xAxisDirection, + transformedData.map((d) => d[props.xAxisKey]), + chartRealSize + ); + config = { + ...config, + // @ts-ignore + xAxis: finalXyConfig.xConfig, + // @ts-ignore + yAxis: finalXyConfig.yConfig, + }; + } + // log.log("Echarts transformedData and config", transformedData, config); + return config; +} + +export function getSelectedPoints(param: any, option: any) { + const series = option.series; + const dataSource = _.isArray(option.dataset) && option.dataset[0]?.source; + if (series && dataSource) { + return param.selected.flatMap((selectInfo: any) => { + const seriesInfo = series[selectInfo.seriesIndex]; + if (!seriesInfo || !seriesInfo.encode) { + return []; + } + return selectInfo.dataIndex.map((index: any) => { + const commonResult = { + seriesName: seriesInfo.name, + }; + if (seriesInfo.encode.itemName && seriesInfo.encode.value) { + return { + ...commonResult, + itemName: dataSource[index][seriesInfo.encode.itemName], + value: dataSource[index][seriesInfo.encode.value], + }; + } else { + return { + ...commonResult, + x: dataSource[index][seriesInfo.encode.x], + y: dataSource[index][seriesInfo.encode.y], + }; + } + }); + }); + } + return []; +} + +export function loadGoogleMapsScript(apiKey: string) { + const mapsUrl = `${googleMapsApiUrl}?key=${apiKey}`; + const scripts = document.getElementsByTagName('script'); + // is script already loaded + let scriptIndex = _.findIndex(scripts, (script) => script.src.endsWith(mapsUrl)); + if(scriptIndex > -1) { + return scripts[scriptIndex]; + } + // is script loaded with diff api_key, remove the script and load again + scriptIndex = _.findIndex(scripts, (script) => script.src.startsWith(googleMapsApiUrl)); + if(scriptIndex > -1) { + scripts[scriptIndex].remove(); + } + + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = mapsUrl; + script.async = true; + script.defer = true; + window.document.body.appendChild(script); + + return script; +} diff --git a/client/packages/lowcoder-comps/src/i18n/comps/locales/en.ts b/client/packages/lowcoder-comps/src/i18n/comps/locales/en.ts index 18c022991..65fe5995d 100644 --- a/client/packages/lowcoder-comps/src/i18n/comps/locales/en.ts +++ b/client/packages/lowcoder-comps/src/i18n/comps/locales/en.ts @@ -1,4 +1,113 @@ export const en = { + calendarChart: { + calendarType: 'Calendar Chart Type', + title: 'Title', + defaultTitle: 'Calendar Chart', + tooltip: 'Tooltip', + }, + themeriverChart: { + themeriverType: 'Themeriver Chart Type', + title: 'Title', + defaultTitle: 'Themeriver Chart', + tooltip: 'Tooltip', + }, + sunburstChart: { + sunburstType: 'Sunburst Chart Type', + title: 'Title', + defaultTitle: 'Sunburst Chart', + tooltip: 'Tooltip', + }, + treemapChart: { + treemapType: 'Treemap Chart Type', + title: 'Title', + defaultTitle: 'Treemap Chart', + tooltip: 'Tooltip', + }, + treeChart: { + treeType: 'Tree Chart Type', + title: 'Title', + defaultTitle: 'Tree Chart', + tooltip: 'Tooltip', + }, + graphChart: { + graphType: 'Graph Chart Type', + title: 'Title', + defaultTitle: 'Graph Chart', + tooltip: 'Tooltip', + }, + heatmapChart: { + heatmapType: 'Heatmap Chart Type', + title: 'Title', + defaultTitle: 'Heatmap Chart', + tooltip: 'Tooltip', + }, + radarChart: { + radarType: 'Radar Chart Type', + title: 'Title', + defaultTitle: 'Radar Chart', + tooltip: 'Tooltip', + }, + candleStickChart: { + candleStickType: 'CandleStick Chart Type', + title: 'Title', + defaultTitle: 'CandleStick Chart', + tooltip: 'Tooltip', + }, + sankeyChart: { + sankeyType: 'Sankey Chart Type', + title: 'Title', + defaultTitle: 'Sankey Chart', + tooltip: 'Tooltip', + }, + funnelChart: { + title: 'Title', + defaultTitle: 'Funnel Chart', + funnelType:'Funnel Chart Type', + tooltip: 'Tooltip', + legendVisibility: 'Legend Visibility', + left: 'Left', + defaultLeft:'35', + top: 'Top', + defaultTop:'60', + bottom: 'Bottom', + defaultBottom:'60', + width: 'Width', + defaultWidth:'80', + min: 'Min', + defaultMin:'0', + max: 'Max', + defaultMax:'100', + gap: 'Gap', + defaultGap: '2', + label:'Label', + }, + gaugeChart: { + title: 'Title', + defaultTitle: 'Gauge Chart', + gaugeType: 'Gauge Chart Type', + tooltip: 'Tooltip', + left: 'Left', + defaultLeft:'35', + top: 'Top', + defaultTop:'60', + bottom: 'Bottom', + defaultBottom:'60', + width: 'Width', + defaultWidth:'80', + min: 'Min', + defaultMin:'0', + max: 'Max', + defaultMax:'100', + gap: 'Gap', + defaultGap: '2', + label:'Label', + }, + echarts: { + defaultTitle: "Data Display", + legendPosition: "Legend Position", + labelPosition: "Label Position", + titlePosition: "Title Position", + }, chart: { delete: "Delete", data: "Data", @@ -14,6 +123,7 @@ export const en = { seriesName: "Series Name", dataColumns: "Data Columns", title: "Title", + tooltip:'Tooltip', xAxisDirection: "X-axis Direction", xAxisName: "X-axis Name", xAxisType: "X-axis Type", @@ -64,6 +174,7 @@ export const en = { unselectDesc: "Triggered when a user unselects part of the data in the chart", selectedPointsDesc: "Selected Points", + lastInteractionDataDesc: "Last Interaction Data", dataDesc: "JSON Data for the Chart", titleDesc: "Current Chart Title", scatterShape: "Scatter Shape", @@ -82,6 +193,7 @@ export const en = { zoomLevelChangeDesc: "Triggers when the map zoom level changes", centerPositionChange: "Center Position Change", centerPositionChangeDesc: "Triggers when the map center position changes", + chartEventHandlers: "Chart Event Handlers", }, imageEditor: { defaultSrc: "", @@ -96,10 +208,72 @@ export const en = { dataDesc: "Image Data", buttonTextDesc: "Button Text", }, + meeting: { + logLevel: "Agora SDK Log Level", + placement: "Meeting Drawer Placement", + meeting: "Meeting Settings", + loadingDesc: "loadingDesc", + cameraView: "Camera View", + cameraViewDesc: "Camera View of the Local User (Host)", + screenShared: "Screen Shared", + heightTooltip: "Pixel, e.g. 378", + height: "Drawer Height", + widthTooltip: "Pixel or Percentage, e.g. 520, 60%", + width: "Drawer Width", + screenSharedDesc: "Screen Shared by the Local User (Host)", + audioUnmuted: "Audio Unmuted", + audioMuted: "Audio Muted", + videoClicked: "Video Clicked", + showMask: "Show Mask", + maskClosable: "Click Outside to Close", + videoOff: "Video Off", + videoOn: "Video On", + size: "Size", + top: "Top", + host: "Host of the Meeting Room. You would need to manage the host as own Application Logic", + participants: "Participants of the Meeting Room", + shareScreen: "Display Screen Shared by the Local User", + appid: "Agora Application ID", + meetingName: "Meeting Name", + localUserID: "Host User ID", + userName: "Host User Name", + rtmToken: "Agora RTM Token", + rtcToken: "Agora RTC Token", + noVideo: "No Video", + profileImageUrl: "Profile Image URL", + right: "Right", + bottom: "Bottom", + videoId: "Video Stream ID", + audioStatus: "Audio Status", + left: "Left", + openDrawerDesc: "Open Drawer", + closeDrawerDesc: "Close Drawer", + actionBtnDesc: "Action Button", + broadCast: "Broadcast Messages", + title: "Meeting Title", + meetingCompName: "Agora Meeting Controller", + sharingCompName: "Screen Share Stream", + videoCompName: "Camera Stream", + videoSharingCompName: "Screen Share Stream", + meetingControlCompName: "Control Button", + meetingCompDesc: "Meeting Component", + meetingCompControls: "Meeting Control", + meetingCompKeywords: "Agora Meeting, Web Meeting, Collaboration", + iconSize: "Icon Size", + userId: "Host User ID", + roomId: "Room ID", + meetingActive: "Ongoing Meeting", + messages: "Broadcasted Messages", + }, calendar: { events: "Events Data", + resources: "Resources", + resourcesDefault: "Rooms", + resourcesName: "Resource Name", + resourcesEvents : "Resources Events Data", editable: "Editable", - licence: "Licence Key", + license: "Licence Key", + licenseTooltip: "Get your licence key from https://fullcalendar.io/purchase to enable premium views like Resource Timeline and Resource Grid.", defaultDate: "Default Date", defaultDateTooltip: "Initial display date of the calendar", defaultView: "Default View", @@ -110,11 +284,9 @@ export const en = { showAllDay: "Show All-Day", showAllDayTooltip: "Display all-day slot in week and day views", dayMaxEvents: "Day Max Events", - dayMaxEventsTooltip: - "Max events per day in month view, 0 for cell height limit", + dayMaxEventsTooltip: "Max events per day in month view, 0 for cell height limit", eventMaxStack: "Event Max Stack", - eventMaxStackTooltip: - "Max events to stack horizontally in week and day views, 0 for no limit", + eventMaxStackTooltip: "Max events to stack horizontally in week and day views, 0 for no limit", selectInterval: "Selected Interval", selectEvent: "Selected Event", changeSet: "Changed Event Object", @@ -125,9 +297,13 @@ export const en = { today: "Today", month: "Month", week: "Week", + weekdaygrid : "Days of Week", + daygrid : "Day Events List", + year: "Year", day: "Day", - list: "List", - timeline: "TimeLine", //added by fred + list: "Events List", + timeline: "Resource Timeline", //added by fred + resourceTimeGridDay: "Resource Grid", //added by fred monday: "Monday", tuesday: "Tuesday", wednesday: "Wednesday", @@ -149,5 +325,6 @@ export const en = { eventIdRequire: "Enter Event ID", eventIdTooltip: "Unique ID for each event", eventIdExist: "ID Exists", + dragDropEventHandlers: "Drag/Drop Event Handlers", }, }; diff --git a/client/packages/lowcoder-comps/src/i18n/comps/locales/enObj.tsx b/client/packages/lowcoder-comps/src/i18n/comps/locales/enObj.tsx index 6f82ef845..2e1b9b874 100644 --- a/client/packages/lowcoder-comps/src/i18n/comps/locales/enObj.tsx +++ b/client/packages/lowcoder-comps/src/i18n/comps/locales/enObj.tsx @@ -154,44 +154,246 @@ export const enObj: I18nObjects = { ], defaultEchartsJsonOption: { - title: { - text: "Funnel Chart", - left: "center", - }, - backgroundColor: "#ffffff", - color: chartColorPalette, - tooltip: { - trigger: "item", - formatter: "{a}
{b} : {c}%", - }, - legend: { - data: ["Show", "Click", "Visit", "Query", "Buy"], - top: "bottom", - }, + data: [ + { value: 100, name: "Show",color:'#fc8452' }, + { value: 80, name: "Click" ,color:'#9a60b4'}, + { value: 60, name: "Visit" ,color:'#fac858'}, + { value: 40, name: "Query" ,color:'#ee6666'}, + { value: 20, name: "Buy" ,color:'#3ba272'}, + ], + }, + defaultFunnelChartOption: { + data: [ + { value: 100, name: "Show",color:'#fc8452' }, + { value: 80, name: "Click" ,color:'#9a60b4'}, + { value: 60, name: "Visit" ,color:'#fac858'}, + { value: 40, name: "Query" ,color:'#ee6666'}, + { value: 20, name: "Buy" ,color:'#3ba272'}, + ], + }, + defaultGaugeChartOption: { + data: [ + { value: 60, name: "Completed",color:'#fc8452' } + ] + }, + defaultSankeyChartOption: { + data: [ + {name: "Show"}, + {name: "Click"}, + {name: "Visit"}, + {name: "Query"}, + {name: "Buy"} + ], + links: [ + {source: "Show", target: "Click", value: 80}, + {source: "Click", target: "Visit", value: 60}, + {source: "Visit", target: "Query", value: 40}, + {source: "Query", target: "Buy", value: 20} + ] + }, + defaultCandleStickChartOption: { + xAxis: { + data: ["Day 1", "Day 2", "Day 3", "Day 4", "Day 5"] + }, + data:[ + [100, 200, 50, 150], + [120, 220, 80, 180], + [80, 150, 60, 130], + [130, 230, 110, 190], + [90, 180, 70, 160] + ] + }, + defaultRadarChartOption: { + indicator: [ + { name: "Indicator 1", max: 100 }, + { name: "Indicator 2", max: 100 }, + { name: "Indicator 3", max: 100 }, + { name: "Indicator 4", max: 100 }, + { name: "Indicator 5", max: 100 } + ], series: [ + { + "name": "Data 1", + "data": [ + { + "value": [90, 80, 70, 60, 50], + "name": "Data 1" + } + ] + }, { - name: "Funnel", - type: "funnel", - left: "10%", - top: 60, - bottom: 60, - width: "80%", - min: 0, - max: 100, - gap: 2, - label: { - show: true, - position: "inside", + "name": "Data 2", + "data": [ + { + "value": [70, 60, 50, 40, 30], + "name": "Data 2" + } + ] + } + ] + }, + defaultHeatmapChartOption: { + xAxis: { + "data": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] + }, + yAxis: { + "data": ["Morning", "Afternoon", "Evening"] + }, + data: [ + [0, 0, 10], + [0, 1, 20], + [0, 2, 30], + [1, 0, 40], + [1, 1, 50], + [1, 2, 60], + [2, 0, 70], + [2, 1, 80], + [2, 2, 90], + [3, 0, 100], + [3, 1, 90], + [3, 2, 80], + [4, 0, 70], + [4, 1, 60], + [4, 2, 50], + [5, 0, 40], + [5, 1, 30], + [5, 2, 20], + [6, 0, 10], + [6, 1, 0], + [6, 2, 10] + ] + }, + defaultGraphChartOption: { + categories: [ + {name: "Nodes"}, + {name: "Edges"} + ], + nodes: [ + {name: "Node 1", category: 0}, + {name: "Node 2", category: 0}, + {name: "Node 3", category: 0} + ], + links: [ + {source: "Node 1", target: "Node 2", category: 1}, + {source: "Node 2", target: "Node 3", category: 1} + ] + }, + defaultTreeChartOption: { + data: [{ + name: "Parent", + children: [ + { + name: "Child 1", + children: [ + { name: "Child 1-1" }, + { name: "Child 1-2" } + ] + }, + { + name: "Child 2", + children: [ + { name: "Child 2-1" }, + { name: "Child 2-2" } + ] + } + ] + }] + }, + defaultTreemapChartOption: { + data: [ + { + name: 'nodeA', + value: 10, + children: [ + { + name: 'nodeAa', + value: 4, + }, + { + name: 'nodeAb', + value: 6 + } + ] }, - data: [ - { value: 100, name: "Show" }, - { value: 80, name: "Click" }, - { value: 60, name: "Visit" }, - { value: 40, name: "Query" }, - { value: 20, name: "Buy" }, - ], - }, - ], + { + name: 'nodeB', + value: 20, + children: [ + { + name: 'nodeBa', + value: 20, + children: [ + { + name: 'nodeBa1', + value: 20 + } + ] + } + ] + } + ] + }, + defaultSunburstChartOption: { + data: [ + { + name: "Grandparent", + children: [ + { + name: "Parent A", + children: [ + {name: "Child A1", value: 10}, + {name: "Child A2", value: 20} + ] + }, + { + name: "Parent B", + children: [ + {name: "Child B1", value: 15}, + {name: "Child B2", value: 25} + ] + } + ] + } + ] + }, + defaultCalendarChartOption: { + data:[ + ["2022-01-01", 10], + ["2022-02-05", 30], + ["2022-03-15", 50], + ["2022-04-20", 70], + ["2022-05-25", 90], + ["2022-06-30", 100], + ["2022-07-10", 80], + ["2022-08-20", 60], + ["2022-09-25", 40], + ["2022-10-30", 20], + ["2022-11-05", 5] + ] + }, + defaultThemeriverChartOption: { + data: [ + ["2024-01-01", 10, "Category A"], + ["2024-01-02", 15, "Category A"], + ["2024-01-03", 20, "Category A"], + ["2024-01-04", 25, "Category A"], + ["2024-01-05", 30, "Category A"], + ["2024-01-06", 35, "Category A"], + ["2024-01-07", 40, "Category A"], + ["2024-01-08", 45, "Category A"], + ["2024-01-09", 50, "Category A"], + ["2024-01-10", 55, "Category A"], + ["2024-01-01", 15, "Category B"], + ["2024-01-02", 20, "Category B"], + ["2024-01-03", 25, "Category B"], + ["2024-01-04", 30, "Category B"], + ["2024-01-05", 35, "Category B"], + ["2024-01-06", 40, "Category B"], + ["2024-01-07", 45, "Category B"], + ["2024-01-08", 50, "Category B"], + ["2024-01-09", 55, "Category B"], + ["2024-01-10", 60, "Category B"] + ] }, defaultMapJsonOption: defaultMapData, diff --git a/client/packages/lowcoder-comps/src/i18n/comps/locales/types.tsx b/client/packages/lowcoder-comps/src/i18n/comps/locales/types.tsx index 92f3cc4b6..4f227e3bc 100644 --- a/client/packages/lowcoder-comps/src/i18n/comps/locales/types.tsx +++ b/client/packages/lowcoder-comps/src/i18n/comps/locales/types.tsx @@ -4,6 +4,18 @@ import { XAXisComponentOption } from "echarts"; export type I18nObjects = { defaultDataSource: JSONObject[]; defaultEchartsJsonOption: Record; + defaultGaugeChartOption: Record; + defaultFunnelChartOption: Record; + defaultSankeyChartOption: Record; + defaultCandleStickChartOption: Record; + defaultRadarChartOption: Record; + defaultHeatmapChartOption: Record; + defaultGraphChartOption: Record; + defaultTreeChartOption: Record; + defaultTreemapChartOption: Record; + defaultSunburstChartOption: Record; + defaultCalendarChartOption: Record; + defaultThemeriverChartOption: Record; defaultMapJsonOption: Record; timeXAxisLabel?: XAXisComponentOption["axisLabel"]; imageEditorLocale?: Record; diff --git a/client/packages/lowcoder-comps/src/i18n/comps/locales/zh.ts b/client/packages/lowcoder-comps/src/i18n/comps/locales/zh.ts index 28c9d202d..2a80a7332 100644 --- a/client/packages/lowcoder-comps/src/i18n/comps/locales/zh.ts +++ b/client/packages/lowcoder-comps/src/i18n/comps/locales/zh.ts @@ -1,5 +1,9 @@ -export const zh = { +import { en } from "./en"; + +export const zh: typeof en = { + ...en, chart: { + ...en.chart, delete: "删除", data: "数据", mode: "模式", @@ -61,6 +65,7 @@ export const zh = { selectDesc: "当用户选择图表中的部分数据时触发", unselectDesc: "当用户取消选择图表中的部分数据时触发", selectedPointsDesc: "已选中的数据点", + lastInteractionDataDesc: "最后交互数据", dataDesc: "当前图表使用的原始数据", titleDesc: "当前图表标题", scatterShape: "散点形状", @@ -77,9 +82,11 @@ export const zh = { zoomLevelChange: "缩放级别更改", zoomLevelChangeDesc: "地图缩放级别更改时触发", centerPositionChange: "中心位置变化", - centerPositionChangeDesc: "地图中心位置改变时触发" + centerPositionChangeDesc: "地图中心位置改变时触发", + chartEventHandlers: "图表事件处理程序", }, imageEditor: { + ...en.imageEditor, defaultSrc: "", save: "保存", saveDesc: "保存图像", @@ -93,7 +100,14 @@ export const zh = { buttonTextDesc: "按钮文本", }, calendar: { + ...en.calendar, events: "事件数据", + resources: "资源数据", + resourcesDefault: "客房", + resourcesEvents: "资源事件", + resourcesName: "资源名称", + license : "许可证密钥", + licenseTooltip: "从 https://fullcalendar.io/purchase 获取许可证密钥,启用资源时间轴和资源网格等高级视图。", editable: "可编辑", defaultDate: "默认日期", defaultDateTooltip: "日历最初显示的日期", @@ -120,6 +134,8 @@ export const zh = { week: "周", day: "日", list: "列表", + timeline: "时间轴", + resourceTimeGridDay: "资源时间网格日", monday: "星期一", tuesday: "星期二", wednesday: "星期三", @@ -141,5 +157,6 @@ export const zh = { eventIdRequire: "请输入事件ID", eventIdTooltip: "每个事件的唯一标识符", eventIdExist: "ID已存在", + dragDropEventHandlers: "拖/放事件处理程序", }, }; \ No newline at end of file diff --git a/client/packages/lowcoder-comps/src/index.ts b/client/packages/lowcoder-comps/src/index.ts index 065393b52..acdc6c784 100644 --- a/client/packages/lowcoder-comps/src/index.ts +++ b/client/packages/lowcoder-comps/src/index.ts @@ -1,11 +1,44 @@ import { ChartCompWithDefault } from "./comps/chartComp/chartComp"; import { ImageEditorComp } from "./comps/imageEditorComp/index"; import { CalendarComp } from "./comps/calendarComp/calendarComp"; -import { MermaidComp } from "comps/mermaidComp"; +import { ChartsGeoMapComp } from "./comps/chartsGeoMapComp/chartsGeoMapComp"; +import { FunnelChartCompWithDefault } from "./comps/funnelChartComp/funnelChartComp"; +import { GaugeChartCompWithDefault } from "./comps/gaugeChartComp/gaugeChartComp"; +import { SankeyChartCompWithDefault } from "./comps/sankeyChartComp/sankeyChartComp"; +import { CandleStickChartCompWithDefault } from "./comps/candleStickChartComp/candleStickChartComp"; +import { RadarChartCompWithDefault } from "./comps/radarChartComp/radarChartComp"; +import { HeatmapChartCompWithDefault } from "./comps/heatmapChartComp/heatmapChartComp"; +import { GraphChartCompWithDefault } from "./comps/graphChartComp/graphChartComp"; +import { TreeChartCompWithDefault } from "./comps/treeChartComp/treechartComp"; +import { TreemapChartCompWithDefault } from "./comps/treemapChartComp/treemapChartComp"; +import { SunburstChartCompWithDefault } from "./comps/sunburstChartComp/sunburstChartComp"; +import { ThemeriverChartCompWithDefault } from "./comps/themeriverChartComp/themeriverChartComp"; + +import { MermaidComp } from "./comps/mermaidComp"; +import { MeetingControllerComp } from "./comps/agoraMeetingComp/meetingControllerComp"; +import { VideoMeetingStreamComp } from "./comps/agoraMeetingComp/videoMeetingStreamComp"; +import { VideoSharingStreamComp } from "./comps/agoraMeetingComp/videoSharingStreamComp"; +import { BasicChartCompWithDefault } from "comps/basicChartComp/chartComp"; export default { chart: ChartCompWithDefault, + basicChart: BasicChartCompWithDefault, + chartsGeoMap: ChartsGeoMapComp, + funnelChart: FunnelChartCompWithDefault, + gaugeChart: GaugeChartCompWithDefault, + sankeyChart: SankeyChartCompWithDefault, + candleStickChart: CandleStickChartCompWithDefault, + radarChart: RadarChartCompWithDefault, + heatmapChart: HeatmapChartCompWithDefault, + graphChart: GraphChartCompWithDefault, + treeChart: TreeChartCompWithDefault, + treemapChart: TreemapChartCompWithDefault, + sunburstChart: SunburstChartCompWithDefault, + themeriverChart: ThemeriverChartCompWithDefault, imageEditor: ImageEditorComp, calendar: CalendarComp, mermaid: MermaidComp, + meetingController: MeetingControllerComp, + meetingStream: VideoMeetingStreamComp, + meetingSharing: VideoSharingStreamComp, }; diff --git a/client/packages/lowcoder-comps/tsconfig.json b/client/packages/lowcoder-comps/tsconfig.json index 94ce9207c..9ffb002dd 100644 --- a/client/packages/lowcoder-comps/tsconfig.json +++ b/client/packages/lowcoder-comps/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "ESNext", "experimentalDecorators": true, "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, diff --git a/client/packages/lowcoder-core/lib/index.cjs b/client/packages/lowcoder-core/lib/index.cjs index 5522eabf9..610615a10 100644 --- a/client/packages/lowcoder-core/lib/index.cjs +++ b/client/packages/lowcoder-core/lib/index.cjs @@ -1,3 +1,5 @@ +// this is used in Node.js ?? + 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); @@ -7589,15 +7591,62 @@ function requireReactJsxRuntime_development () { } (jsxRuntime)); var en = {}; - var zh = {}; +var de = {}; +var fr = {}; +var es = {}; +var it = {}; +var ar = {}; +var th = {}; +var vi = {}; +var ms = {}; +var id = {}; +var hi = {}; +var ta = {}; +var kn = {}; +var ml = {}; +var ru = {}; +var pl = {}; +var cs = {}; +var uk = {}; +var bg = {}; +var sr = {}; +var hr = {}; +var sk = {}; +var sl = {}; +var mk = {}; +var pt = {}; // file examples: en, enGB, zh, zhHK var localeData = /*#__PURE__*/Object.freeze({ __proto__: null, en: en, - zh: zh + zh: zh, + de: de, + fr: fr, + es: es, + it: it, + ar: ar, + th: th, + vi: vi, + ms: ms, + id: id, + hi: hi, + ta: ta, + kn: kn, + ml: ml, + ru: ru, + pl: pl, + cs: cs, + uk: uk, + bg: bg, + sr: sr, + hr: hr, + sk: sk, + sl: sl, + mk: mk, + pt: pt }); var ErrorKind; @@ -11156,8 +11205,14 @@ originalMessage) { } var varName = el.value; // Enforce that all required values are provided by the caller. + var value = ""; if (!(values && varName in values)) { - throw new MissingValueError(varName, originalMessage); + // throw new MissingValueError(varName, originalMessage); + console.log("No value provided for the variable \"" + varName + "\". " + originalMessage); + value = varName; + } + else { + value = values[varName]; } var value = values[varName]; if (isArgumentElement(el)) { @@ -11408,7 +11463,8 @@ var IntlMessageFormat$1 = /** @class */ (function () { this.ast = message; } if (!Array.isArray(this.ast)) { - throw new TypeError('A message must be provided as a String or AST.'); + // throw new TypeError('A message must be provided as a String or AST.'); + console.log('Translator: A message must be provided as a String or AST.', this.ast); } // Creates a new object with the specified `formats` merged with the default // formats. @@ -11511,16 +11567,25 @@ See the accompanying LICENSE file for terms. */ var IntlMessageFormat = IntlMessageFormat$1; -var defaultLocale = "en"; +var defaultLocale = "en"; var locales = [defaultLocale]; + +// Falk - Adapted the central translator to check if a localStorage key is existing. + +const uiLanguage = localStorage.getItem('lowcoder_uiLanguage'); + if (globalThis.navigator) { - if (navigator.languages && navigator.languages.length > 0) { + if (uiLanguage) { + locales = [uiLanguage]; + } + else if (navigator.languages && navigator.languages.length > 0) { locales = __spreadArray([], navigator.languages, true); } else { locales = [navigator.language || navigator.userLanguage || defaultLocale]; } } + function parseLocale(s) { var locale = s.trim(); if (!locale) { @@ -11580,7 +11645,9 @@ function getDataByLocale(fileData, suffix, filterLocales, targetLocales) { return { data: data, language: name_1.slice(0, 2) }; } } - throw new Error("Not found ".concat(names)); + console.error("Not found ".concat(names)); + // better to continue the app without crashing + // throw new Error("Not found ".concat(names)); } var globalMessageKeyPrefix = "@"; var globalMessages = Object.fromEntries(Object.entries(getDataByLocale(localeData, "").data).map(function (_a) { @@ -11626,7 +11693,7 @@ var Translator = /** @class */ (function () { return Translator; }()); function getI18nObjects(fileData, filterLocales) { - return getDataByLocale(fileData, "Obj", filterLocales).data; + return getDataByLocale(fileData, "Obj", filterLocales)?.data; } exports.AbstractComp = AbstractComp; diff --git a/client/packages/lowcoder-core/lib/index.d.ts b/client/packages/lowcoder-core/lib/index.d.ts index b29a693f4..ea81c29e7 100644 --- a/client/packages/lowcoder-core/lib/index.d.ts +++ b/client/packages/lowcoder-core/lib/index.d.ts @@ -1,5 +1,7 @@ +// this is the tpyes file next to index.js + /// -import { ReactNode } from 'react'; +import React, { ReactNode } from 'react'; type EvalMethods = Record>; type CodeType = undefined | "JSON" | "Function" | "PureJSON"; @@ -613,6 +615,7 @@ declare abstract class MultiBaseComp ChildrenType[typeof childName]>): CompAction; + getRef(): React.RefObject; } declare function mergeExtra(e1: ExtraNodeType | undefined, e2: ExtraNodeType): ExtraNodeType; @@ -647,7 +650,9 @@ declare const i18n: { region?: string | undefined; locales: string[]; }; + declare function getValueByLocale(defaultValue: T, func: (info: LocaleInfo) => T | undefined): T; + type AddDot = T extends "" ? "" : `.${T}`; type ValidKey = Exclude; type NestedKey = (T extends object ? { @@ -657,6 +662,7 @@ type AddPrefix = { [K in keyof T as K extends string ? `${P}${K}` : never]: T[K]; }; declare const globalMessages: AddPrefix<{}, "@">; + type GlobalMessageKey = NestedKey; type VariableValue = string | number | boolean | Date | React.ReactNode; diff --git a/client/packages/lowcoder-core/lib/index.js b/client/packages/lowcoder-core/lib/index.js index ab547694d..f2b298d74 100644 --- a/client/packages/lowcoder-core/lib/index.js +++ b/client/packages/lowcoder-core/lib/index.js @@ -7581,15 +7581,62 @@ function requireReactJsxRuntime_development () { } (jsxRuntime)); var en = {}; - var zh = {}; +var de = {}; +var fr = {}; +var es = {}; +var it = {}; +var ar = {}; +var th = {}; +var vi = {}; +var ms = {}; +var id = {}; +var hi = {}; +var ta = {}; +var kn = {}; +var ml = {}; +var ru = {}; +var pl = {}; +var cs = {}; +var uk = {}; +var bg = {}; +var sr = {}; +var hr = {}; +var sk = {}; +var sl = {}; +var mk = {}; +var pt = {}; // file examples: en, enGB, zh, zhHK var localeData = /*#__PURE__*/Object.freeze({ __proto__: null, en: en, - zh: zh + zh: zh, + de: de, + fr: fr, + es: es, + it: it, + ar: ar, + th: th, + vi: vi, + ms: ms, + id: id, + hi: hi, + ta: ta, + kn: kn, + ml: ml, + ru: ru, + pl: pl, + cs: cs, + uk: uk, + bg: bg, + sr: sr, + hr: hr, + sk: sk, + sl: sl, + mk: mk, + pt: pt }); var ErrorKind; @@ -11147,11 +11194,16 @@ originalMessage) { continue; } var varName = el.value; + var value = ""; // Enforce that all required values are provided by the caller. if (!(values && varName in values)) { - throw new MissingValueError(varName, originalMessage); + console.log("No value provided for the variable \"" + varName + "\". " + originalMessage); + // throw new MissingValueError(varName, originalMessage); + value = varName; + } + else { + value = values[varName]; } - var value = values[varName]; if (isArgumentElement(el)) { if (!value || typeof value === 'string' || typeof value === 'number') { value = @@ -11505,14 +11557,22 @@ var IntlMessageFormat = IntlMessageFormat$1; var defaultLocale = "en"; var locales = [defaultLocale]; + +// Falk - Adapted the central translator to check if a localStorage key is existing. + +const uiLanguage = localStorage.getItem('lowcoder_uiLanguage'); if (globalThis.navigator) { - if (navigator.languages && navigator.languages.length > 0) { + if (uiLanguage) { + locales = [uiLanguage]; + } + else if (navigator.languages && navigator.languages.length > 0) { locales = __spreadArray([], navigator.languages, true); } else { locales = [navigator.language || navigator.userLanguage || defaultLocale]; } } + function parseLocale(s) { var locale = s.trim(); if (!locale) { @@ -11572,9 +11632,13 @@ function getDataByLocale(fileData, suffix, filterLocales, targetLocales) { return { data: data, language: name_1.slice(0, 2) }; } } - throw new Error("Not found ".concat(names)); + // throw new Error("Not found ".concat(names)); + // better to continue the app without crashing + console.error("Not found ".concat(names)); } + var globalMessageKeyPrefix = "@"; + var globalMessages = Object.fromEntries(Object.entries(getDataByLocale(localeData, "").data).map(function (_a) { var k = _a[0], v = _a[1]; return [ @@ -11635,7 +11699,7 @@ var Translator = /** @class */ (function () { }()); function getI18nObjects(fileData, filterLocales) { - return getDataByLocale(fileData, "Obj", filterLocales).data; + return getDataByLocale(fileData, "Obj", filterLocales)?.data; } export { AbstractComp, AbstractNode, CachedNode, CodeNode, CompActionTypes, FetchCheckNode, FunctionNode, MultiBaseComp, RecordNode, RelaxedJsonParser, SimpleAbstractComp, SimpleComp, SimpleNode, Translator, ValueAndMsg, WrapContextNodeV2, WrapNode, changeChildAction, changeDependName, changeEditDSLAction, changeValueAction, clearMockWindow, clearStyleEval, customAction, deferAction, deleteCompAction, dependingNodeMapEquals, evalFunc, evalFunctionResult, evalNodeOrMinor, evalPerfUtil, evalScript, evalStyle, executeQueryAction, fromRecord, fromUnevaledValue, fromValue, fromValueWithCache, getDynamicStringSegments, getI18nObjects, getValueByLocale, i18n, isBroadcastAction, isChildAction, isCustomAction, isDynamicSegment, isFetching, isMyCustomAction, mergeExtra, multiChangeAction, nodeIsRecord, onlyEvalAction, relaxedJSONToJSON, renameAction, replaceCompAction, routeByNameAction, transformWrapper, triggerModuleEventAction, unwrapChildAction, updateActionContextAction, updateNodesV2Action, withFunction, wrapActionExtraInfo, wrapChildAction, wrapContext, wrapDispatch }; diff --git a/client/packages/lowcoder-core/src/i18n/index.tsx b/client/packages/lowcoder-core/src/i18n/index.tsx index c12ea7ac5..553d25d8d 100644 --- a/client/packages/lowcoder-core/src/i18n/index.tsx +++ b/client/packages/lowcoder-core/src/i18n/index.tsx @@ -3,12 +3,20 @@ import IntlMessageFormat from "intl-messageformat"; import log from "loglevel"; import { Fragment } from "react"; +// this is a copy of the translator from ../../lib/index.js +// TODO: check if this file is used at all + const defaultLocale = "en"; let locales = [defaultLocale]; +// Falk - Adapted the central translator to check if a localStorage key is existing. +const uiLanguage = localStorage.getItem('lowcoder_uiLanguage'); if (globalThis.navigator) { - if (navigator.languages && navigator.languages.length > 0) { + if (uiLanguage) { + locales = [uiLanguage]; + } + else if (navigator.languages && navigator.languages.length > 0) { locales = [...navigator.languages]; } else { locales = [navigator.language || ((navigator as any).userLanguage as string) || defaultLocale]; @@ -68,6 +76,7 @@ function getDataByLocale( filterLocales?: string, targetLocales?: string[] ) { + let localeInfos = [...fallbackLocaleInfos]; const targetLocaleInfo = parseLocales(targetLocales || []); @@ -96,8 +105,8 @@ function getDataByLocale( return { data: data as T, language: name.slice(0, 2) }; } } - - throw new Error(`Not found ${names}`); + console.error(`Not found ${names}`); + // throw new Error(`Not found ${names}`); } type AddDot = T extends "" ? "" : `.${T}`; @@ -187,5 +196,5 @@ export class Translator { } export function getI18nObjects(fileData: object, filterLocales?: string) { - return getDataByLocale(fileData, "Obj", filterLocales).data; + return getDataByLocale(fileData, "Obj", filterLocales)?.data; } diff --git a/client/packages/lowcoder-core/src/i18n/locales/de.ts b/client/packages/lowcoder-core/src/i18n/locales/de.ts new file mode 100644 index 000000000..e50d7a5b9 --- /dev/null +++ b/client/packages/lowcoder-core/src/i18n/locales/de.ts @@ -0,0 +1,3 @@ +import { en } from "./en"; + +export const de: typeof en = {}; diff --git a/client/packages/lowcoder-core/src/i18n/locales/index.ts b/client/packages/lowcoder-core/src/i18n/locales/index.ts index b52d58808..a43758e20 100644 --- a/client/packages/lowcoder-core/src/i18n/locales/index.ts +++ b/client/packages/lowcoder-core/src/i18n/locales/index.ts @@ -2,3 +2,4 @@ // fallback example: current locale is zh-HK, fallback order is zhHK => zh => en export * from "./en"; export * from "./zh"; +export * from "./de"; diff --git a/client/packages/lowcoder-design/src/components/GlobalInstances.tsx b/client/packages/lowcoder-design/src/components/GlobalInstances.tsx index 3b9aabb7a..19b2ec8e8 100644 --- a/client/packages/lowcoder-design/src/components/GlobalInstances.tsx +++ b/client/packages/lowcoder-design/src/components/GlobalInstances.tsx @@ -1,7 +1,7 @@ -import { App } from 'antd'; -import type { MessageInstance } from 'antd/es/message/interface'; -import type { ModalStaticFunctions } from 'antd/es/modal/confirm'; -import type { NotificationInstance } from 'antd/es/notification/interface'; +import { default as App } from "antd/es/app"; +import type { MessageInstance } from "antd/es/message/interface"; +import type { ModalStaticFunctions } from "antd/es/modal/confirm"; +import type { NotificationInstance } from "antd/es/notification/interface"; let messageInstance: MessageInstance; let notificationInstance: NotificationInstance; diff --git a/client/packages/lowcoder-design/src/components/Input.tsx b/client/packages/lowcoder-design/src/components/Input.tsx index 7fb9ced59..91f95fab9 100644 --- a/client/packages/lowcoder-design/src/components/Input.tsx +++ b/client/packages/lowcoder-design/src/components/Input.tsx @@ -8,7 +8,6 @@ import { INPUT_DEFAULT_ONCHANGE_DEBOUNCE } from "constants/perf"; export const StyledInput = styled(AntdInput)` width: ${(props) => (props.width ? props.width : "100%")}; - background: #fdfdfd; border: 1px solid ${BorderColor}; border-radius: ${BorderRadius}; padding-left: 12px; diff --git a/client/packages/lowcoder-design/src/components/Label.tsx b/client/packages/lowcoder-design/src/components/Label.tsx index 0ec5cce40..91b846acb 100644 --- a/client/packages/lowcoder-design/src/components/Label.tsx +++ b/client/packages/lowcoder-design/src/components/Label.tsx @@ -5,7 +5,6 @@ export const labelCss: any = css` user-select: none; font-size: 13px; - color: #222222; &:hover { cursor: default; diff --git a/client/packages/lowcoder-design/src/components/ScrollBar.tsx b/client/packages/lowcoder-design/src/components/ScrollBar.tsx index 30a8bf467..cf51ee68b 100644 --- a/client/packages/lowcoder-design/src/components/ScrollBar.tsx +++ b/client/packages/lowcoder-design/src/components/ScrollBar.tsx @@ -1,11 +1,11 @@ import React from "react"; import SimpleBar from "simplebar-react"; -import 'simplebar-react/dist/simplebar.min.css'; import styled from "styled-components"; import { DebouncedFunc } from 'lodash'; // Assuming you're using lodash's DebouncedFunc type +// import 'simplebar-react/dist/simplebar.min.css'; -const ScrollBarWrapper = styled.div<{ hidePlaceholder?: boolean }>` +const ScrollBarWrapper = styled.div<{ $hideplaceholder?: boolean }>` min-height: 0; height: 100%; width: 100%; @@ -37,7 +37,7 @@ const ScrollBarWrapper = styled.div<{ hidePlaceholder?: boolean }>` bottom: 10px; } - ${props => props.hidePlaceholder && ` + ${props => Boolean(props.$hideplaceholder) && ` .simplebar-placeholder { display: none !important; } @@ -54,11 +54,20 @@ interface IProps { scrollableNodeProps?: { onScroll: DebouncedFunc<(e: any) => void>; }; - hidePlaceholder?: boolean; + $hideplaceholder?: boolean; hideScrollbar?: boolean; } -export const ScrollBar = ({ height = "100%", className, children, style, scrollableNodeProps, hideScrollbar = false, ...otherProps }: IProps) => { +export const ScrollBar = ({ + className, + children, + style, + scrollableNodeProps, + hideScrollbar = false, + $hideplaceholder = false, + ...otherProps +}: IProps) => { + const height = style?.height ?? '100%'; // You can now use the style prop directly or pass it to SimpleBar const combinedStyle = { ...style, height }; // Example of combining height with passed style diff --git a/client/packages/lowcoder-design/src/components/Search.tsx b/client/packages/lowcoder-design/src/components/Search.tsx index 05249e3c1..68d1719ac 100644 --- a/client/packages/lowcoder-design/src/components/Search.tsx +++ b/client/packages/lowcoder-design/src/components/Search.tsx @@ -13,11 +13,21 @@ const SearchInput = styled(Input)` font-size: 13px; user-select: none; overflow: hidden; + background-color: #fdfdfd; + color: #000; &:focus { outline: none; box-shadow: 0 0 0 3px #daecfc; } + &:hover { + background-color: #fdfdfd; + color: #000; + } + &:focus-within { + background-color: #fdfdfd; + color: #000; + } `; const SearchDiv = styled.div<{ error?: boolean }>` height: 32px; diff --git a/client/packages/lowcoder-design/src/components/Section.tsx b/client/packages/lowcoder-design/src/components/Section.tsx index 869c0eabf..cad6e8bf0 100644 --- a/client/packages/lowcoder-design/src/components/Section.tsx +++ b/client/packages/lowcoder-design/src/components/Section.tsx @@ -75,6 +75,7 @@ const ShowChildren = styled.div<{ $show?: string; $noMargin?: boolean }>` interface ISectionConfig { name?: string; + open?: boolean; width?: number; noMargin?: boolean; style?: React.CSSProperties; @@ -103,7 +104,9 @@ export const PropertySectionContext = React.createContext) => { const { name } = props; const { compName, state, toggle } = useContext(PropertySectionContext); - const open = name ? state[compName]?.[name] !== false : true; + const open = props.open !== undefined ? props.open : name ? state[compName]?.[name] !== false : true; + + // console.log("open", open, props.open); const handleToggle = () => { if (!name) { @@ -142,6 +145,16 @@ export const sectionNames = { validation: trans("prop.validation"), layout: trans("prop.layout"), style: trans("prop.style"), + labelStyle:trans("prop.labelStyle"), data: trans("prop.data"), - meetings : trans("prop.meetings"), // added by Falk Wolsky + meetings: trans("prop.meetings"), // added by Falk Wolsky + field: trans("prop.field"), + inputFieldStyle:trans("prop.inputFieldStyle"), + avatarStyle:trans("prop.avatarStyle"), + captionStyle:trans("prop.captionStyle"), + startButtonStyle:trans("prop.startButtonStyle"), + resetButtonStyle:trans("prop.resetButtonStyle"), + headerStyle:trans("prop.headerStyle"), + bodyStyle:trans("prop.bodyStyle"), + badgeStyle:trans("prop.badgeStyle"), }; diff --git a/client/packages/lowcoder-design/src/components/Trees.tsx b/client/packages/lowcoder-design/src/components/Trees.tsx index 7688ae1d1..e309e142e 100644 --- a/client/packages/lowcoder-design/src/components/Trees.tsx +++ b/client/packages/lowcoder-design/src/components/Trees.tsx @@ -1,7 +1,7 @@ import styled, { css } from "styled-components"; import { ReactComponent as Folded } from "icons/icon-folded.svg"; -import { DataNode, TreeProps } from "antd/lib/tree"; -import DirectoryTree from "antd/lib/tree/DirectoryTree"; +import { DataNode, TreeProps } from "antd/es/tree"; +import DirectoryTree from "antd/es/tree/DirectoryTree"; export const Treediv = styled.div<{ $height?: number }>` padding-left: 24px; diff --git a/client/packages/lowcoder-design/src/components/audio.tsx b/client/packages/lowcoder-design/src/components/audio.tsx index cb39aabbe..7014ea9ee 100644 --- a/client/packages/lowcoder-design/src/components/audio.tsx +++ b/client/packages/lowcoder-design/src/components/audio.tsx @@ -1,8 +1,10 @@ import { CSSProperties } from "react"; -import { Ref } from "react"; -import ReactPlayer from "react-player"; +import { lazy, Ref } from "react"; +import type {default as ReactPlayerType} from "react-player"; import styled from "styled-components"; +const ReactPlayer = lazy(() => import("react-player")); + const Audio = styled(ReactPlayer)` height: 32px !important; `; @@ -14,7 +16,7 @@ export function TacoAudio(props: { onEnded?: () => void; className?: string; style?: CSSProperties; - audioRef?: Ref; + audioRef?: Ref; autoPlay?: boolean; loop?: boolean; }) { diff --git a/client/packages/lowcoder-design/src/components/colorSelect/colorUtils.ts b/client/packages/lowcoder-design/src/components/colorSelect/colorUtils.ts index c3e3a9da3..ac24c5900 100644 --- a/client/packages/lowcoder-design/src/components/colorSelect/colorUtils.ts +++ b/client/packages/lowcoder-design/src/components/colorSelect/colorUtils.ts @@ -1,6 +1,6 @@ import { colord, extend } from "colord"; import namesPlugin from "colord/plugins/names"; -import { generate } from "@ant-design/colors"; +import { generate } from "@ant-design/colors/es"; extend([namesPlugin]); diff --git a/client/packages/lowcoder-design/src/components/customSelect.tsx b/client/packages/lowcoder-design/src/components/customSelect.tsx index 7f7ab99fb..f6540aaad 100644 --- a/client/packages/lowcoder-design/src/components/customSelect.tsx +++ b/client/packages/lowcoder-design/src/components/customSelect.tsx @@ -21,6 +21,7 @@ const SelectWrapper = styled.div<{ $border?: boolean }>` height: 100%; align-items: center; margin-right: 8px; + background-color: #fff; .ant-select-selection-item { display: flex; diff --git a/client/packages/lowcoder-design/src/components/iconSelect/index.tsx b/client/packages/lowcoder-design/src/components/iconSelect/index.tsx index 232f89ca7..85643d344 100644 --- a/client/packages/lowcoder-design/src/components/iconSelect/index.tsx +++ b/client/packages/lowcoder-design/src/components/iconSelect/index.tsx @@ -1,12 +1,12 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import type { IconDefinition } from "@fortawesome/free-regular-svg-icons"; // import type { IconDefinition as IconDefinitionBrands } from "@fortawesome/free-brands-svg-icons"; -import { Popover } from "antd"; -import { ActionType } from "@rc-component/trigger/lib/interface"; +import { default as Popover } from "antd/lib/popover"; +import type { ActionType } from "@rc-component/trigger/lib/interface"; import { TacoInput } from "components/tacoInput"; import { Tooltip } from "components/toolTip"; import { trans } from "i18n/design"; -import _ from "lodash"; +import { upperFirst, sortBy } from "lodash"; import { ReactNode, useEffect, @@ -14,13 +14,13 @@ import { useMemo, useRef, useState, + Suspense } from "react"; import Draggable from "react-draggable"; -import { default as List, ListRowProps } from "react-virtualized/dist/es/List"; +import { default as List, type ListRowProps } from "react-virtualized/dist/es/List"; import styled from "styled-components"; import { CloseIcon, SearchIcon } from "icons"; import { ANTDICON } from "icons/antIcon"; -import { Divider } from "antd-mobile"; const PopupContainer = styled.div` width: 580px; @@ -141,7 +141,7 @@ class Icon { readonly title: string; constructor(readonly def: IconDefinition | any, readonly names: string[]) { if (def?.iconName) { - this.title = def.iconName.split("-").map(_.upperFirst).join(" "); + this.title = def.iconName.split("-").map(upperFirst).join(" "); } else { this.title = names[0].slice(5); this.def = def; @@ -231,7 +231,7 @@ function search( .toLowerCase() .split(/\s+/g) .filter((t) => t); - return _.sortBy( + return sortBy( Object.entries(allIcons).filter(([key, icon]) => { if (icon.names.length === 0) { return false; @@ -297,7 +297,11 @@ const IconPopup = (props: { onChangeIcon(key); }} > - {icon.getView()} + + + {icon.getView()} + + {key} @@ -394,7 +398,7 @@ export const IconSelect = (props: { visible={visible} setVisible={setVisible} trigger="click" - leftOffset={-96} + leftOffset={-30} searchKeywords={props.searchKeywords} /> ); diff --git a/client/packages/lowcoder-design/src/components/markdown.tsx b/client/packages/lowcoder-design/src/components/markdown.tsx index 463a813d9..45eefd536 100644 --- a/client/packages/lowcoder-design/src/components/markdown.tsx +++ b/client/packages/lowcoder-design/src/components/markdown.tsx @@ -1,9 +1,12 @@ import { css } from "styled-components"; -import ReactMarkdown from "react-markdown"; +import { lazy } from "react"; +// import ReactMarkdown from "react-markdown"; import rehypeRaw from "rehype-raw"; import rehypeSanitize, { defaultSchema } from "rehype-sanitize"; import remarkGfm from "remark-gfm"; -import { ReactMarkdownOptions } from "react-markdown/lib/react-markdown"; +import type { ReactMarkdownOptions } from "react-markdown/lib/react-markdown"; + +const ReactMarkdown = lazy(() => import('react-markdown')); export const markdownCompCss = css` .markdown-body { diff --git a/client/packages/lowcoder-design/src/components/query.tsx b/client/packages/lowcoder-design/src/components/query.tsx index 6ff0ce913..60824c194 100644 --- a/client/packages/lowcoder-design/src/components/query.tsx +++ b/client/packages/lowcoder-design/src/components/query.tsx @@ -1,7 +1,7 @@ import styled, { css } from "styled-components"; import { default as Alert } from "antd/es/alert"; import { ReactNode } from "react"; -import { AlertProps } from "antd/lib/alert"; +import { AlertProps } from "antd/es/alert"; import { ToolTipLabel } from "./toolTip"; import { DocLink } from "components/ExternalLink"; diff --git a/client/packages/lowcoder-design/src/components/shapeSelect/index.tsx b/client/packages/lowcoder-design/src/components/shapeSelect/index.tsx new file mode 100644 index 000000000..a4a71964b --- /dev/null +++ b/client/packages/lowcoder-design/src/components/shapeSelect/index.tsx @@ -0,0 +1,487 @@ +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import type { IconDefinition } from "@fortawesome/free-regular-svg-icons"; +import { default as Popover } from "antd/lib/popover"; +import type { ActionType } from "@rc-component/trigger/lib/interface"; +import { TacoInput } from "components/tacoInput"; +import { Tooltip } from "components/toolTip"; +import { trans } from "i18n/design"; +import { upperFirst, sortBy } from "lodash"; +import { shapes } from "coolshapes-react"; +import { Coolshape } from "coolshapes-react"; + +import { + ReactNode, + useEffect, + useCallback, + useMemo, + useRef, + useState, + Suspense, +} from "react"; +import Draggable from "react-draggable"; +import { + default as List, + type ListRowProps, +} from "react-virtualized/dist/es/List"; +import styled from "styled-components"; +import { CloseIcon, SearchIcon } from "icons"; +import { ANTDICON } from "icons/antIcon"; +import { JSX } from "react/jsx-runtime"; + +const PopupContainer = styled.div` + width: 580px; + background: #ffffff; + box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); + border-radius: 8px; + box-sizing: border-box; +`; +const TitleDiv = styled.div` + height: 48px; + display: flex; + align-items: center; + padding: 0 16px; + justify-content: space-between; + user-select: none; +`; +const TitleText = styled.span` + font-size: 16px; + color: #222222; + line-height: 16px; +`; +const StyledCloseIcon = styled(CloseIcon)` + width: 16px; + height: 16px; + cursor: pointer; + color: #8b8fa3; + + &:hover g line { + stroke: #222222; + } +`; + +const SearchDiv = styled.div` + position: relative; + margin: 0px 16px; + padding-bottom: 8px; + display: flex; + justify-content: space-between; +`; +const StyledSearchIcon = styled(SearchIcon)` + position: absolute; + top: 6px; + left: 12px; +`; +const IconListWrapper = styled.div` + padding-left: 10px; + padding-right: 4px; + .gtujLP { + overflow: hidden; + } + .iconsDiv div { + float: left; + } +`; +const IconList = styled(List)` + scrollbar-gutter: stable; + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background-clip: content-box; + border-radius: 9999px; + background-color: rgba(139, 143, 163, 0.2); + } + + &::-webkit-scrollbar-thumb:hover { + background-color: rgba(139, 143, 163, 0.36); + } +`; + +const IconRow = styled.div` + padding: 0 6px; + display: flex; + align-items: flex-start; /* Align items to the start to allow different heights */ + justify-content: space-between; + + &:last-child { + gap: 8px; + justify-content: flex-start; + } +`; + +const IconItemContainer = styled.div` + width: 60px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + cursor: pointer; + font-size: 28px; + margin-bottom: 24px; + + &:hover { + border: 1px solid #315efb; + border-radius: 4px; + } + + &:focus { + border: 1px solid #315efb; + border-radius: 4px; + box-shadow: 0 0 0 2px #d6e4ff; + } +`; + +const IconWrapper = styled.div` + height: auto; + display: flex; + align-items: center; + justify-content: center; +`; + +const IconKeyDisplay = styled.div` + font-size: 8px; + color: #8b8fa3; + margin-top: 4px; /* Space between the icon and the text */ + text-align: center; + word-wrap: break-word; /* Ensure text wraps */ + width: 100%; /* Ensure the container can grow */ +`; + +class Icon { + readonly title: string; + constructor( + readonly def: IconDefinition | any, + readonly names: string[] + ) { + if (def?.iconName) { + this.title = def.iconName.split("-").map(upperFirst).join(" "); + } else { + this.title = names[0].slice(5); + this.def = def; + } + } + getView() { + if (this.names[0]?.startsWith("antd/")) return this.def; + else + return ( + + ); + } +} + +let allIcons: Record | undefined = undefined; + +function getAllIcons() { + if (allIcons !== undefined) { + return allIcons; + } + // console.log(shapes); + // const [{ far }, { fas }] = await Promise.all([ + // import("@fortawesome/free-regular-svg-icons"), + // import("@fortawesome/free-solid-svg-icons"), + // // import("@fontawesome/free-brands-svg-icons"), + // ]); + + const ret: Record = {}; + // for (const [type, pack] of Object.entries({ solid: fas, regular: far })) { + // const list = Object.entries(pack); + // // console.log("list of icons ", list); + + // for (const [k, def] of list) { + // ret[type + "/" + def.iconName] = new Icon(def, [def.iconName]); + // } + // for (const [k, def] of list) { + // const name = k.startsWith("fa") ? k.slice(2) : k; + // ret[type + "/" + def.iconName].names.push(name); + // // for compatibility of old data + // const key = type + "/" + name; + // if (ret[key] === undefined) { + // ret[key] = new Icon(def, []); + // } + // } + // } + //append ant icon + // for (let key of Object.keys(shapes: any)) { + // // ret["antd/" + key] = new Icon( + // // ANTDICON[key.toLowerCase() as keyof typeof ANTDICON], + // // ["antd/" + key] + // // ); + // // ret[key + "/"].names.push("test"); + // ret[key] = shapes[key].map((Shape: JSX.IntrinsicAttributes, index: any) => { + // return ; + // }); + // } + allIcons = ret; + console.log(ret); + + return ret; + + // { + // let all = Object.keys(shapes).map((shapeType: any, _) => { + // return shapes[shapeType].map((Shape: JSX.IntrinsicAttributes, index: any) => { + // return ; + // }); + // }); + // console.log(all); + + // } + + // const [{ far }, { fas }] = await Promise.all([ + // import("@fortawesome/free-regular-svg-icons"), + // import("@fortawesome/free-solid-svg-icons"), + // // import("@fontawesome/free-brands-svg-icons"), + // ]); + + // const ret: Record = {}; + // for (const [type, pack] of Object.entries({ solid: fas, regular: far })) { + // const list = Object.entries(pack); + // // console.log("list of icons ", list); + + // for (const [k, def] of list) { + // ret[type + "/" + def.iconName] = new Icon(def, [def.iconName]); + // } + // for (const [k, def] of list) { + // const name = k.startsWith("fa") ? k.slice(2) : k; + // ret[type + "/" + def.iconName].names.push(name); + // // for compatibility of old data + // const key = type + "/" + name; + // if (ret[key] === undefined) { + // ret[key] = new Icon(def, []); + // } + // } + // } + // //append ant icon + // for (let key of Object.keys(ANTDICON)) { + // ret["antd/" + key] = new Icon( + // ANTDICON[key.toLowerCase() as keyof typeof ANTDICON], + // ["antd/" + key] + // ); + // } + // allIcons = ret; + // console.log(ret); + + // return ret; +} + +export const sharePrefix = "/icon:"; + +export function removeShapeQuote(value?: string) { + return value + ? value.startsWith('"') && value.endsWith('"') + ? value.slice(1, -1) + : value + : ""; +} + +function getIconKey(value?: string) { + const v = removeShapeQuote(value); + return v.startsWith(sharePrefix) ? v.slice(sharePrefix.length) : ""; +} + +export function useShape(value?: string) { + const key = getIconKey(value); + const [icon, setIcon] = useState(undefined); + useEffect(() => { + let allshapes = getAllIcons(); + setIcon(allshapes[key]); + }, [key]); + return icon; +} + +function search( + allIcons: Record, + searchText: string, + searchKeywords?: Record, + IconType?: "OnlyAntd" | "All" | "default" | undefined +) { + const tokens = searchText + .toLowerCase() + .split(/\s+/g) + .filter((t) => t); + return sortBy( + Object.entries(allIcons).filter(([key, icon]) => { + if (icon.names.length === 0) { + return false; + } + if (IconType === "OnlyAntd" && !key.startsWith("antd/")) return false; + if (IconType === "default" && key.startsWith("antd/")) return false; + let text = icon.names + .flatMap((name) => [name, searchKeywords?.[name]]) + .filter((t) => t) + .join(" "); + text = (icon.title + " " + text).toLowerCase(); + return tokens.every((t) => text.includes(t)); + }), + ([key, icon]) => icon.title + ); +} + +const IconPopup = (props: { + onChange: (value: string) => void; + label?: ReactNode; + onClose: () => void; + searchKeywords?: Record; + IconType?: "OnlyAntd" | "All" | "default" | undefined; +}) => { + const [allIcons, setAllIcons] = useState>({}); + const onChangeRef = useRef(props.onChange); + onChangeRef.current = props.onChange; + const onChangeIcon = useCallback( + (key: string) => onChangeRef.current(key), + [] + ); + + useEffect(() => { + let shapes = getAllIcons(); + console.log("shapes ", shapes); + + setAllIcons(shapes); + }, []); + + // const rowRenderer = useCallback( + // (p: ListRowProps) => ( + // + // {searchResults + // .slice(p.index * columnNum, (p.index + 1) * columnNum) + // .map(([key, icon]) => ( + // + // { + // onChangeIcon(key); + // }} + // > + // + // {icon.getView()} + // + // {key} + // + // + // ))} + // + // ), + // [searchResults, allIcons, onChangeIcon] + // ); + return ( + + + + {trans("shapeSelect.title")} + + + {/* + setSearchText(e.target.value)} + placeholder={trans("shapeSelect.searchPlaceholder")} + /> + + */} + + <> + {Object.keys(shapes).map((shapeType: string, _i: number) => { + return shapes[shapeType as keyof typeof shapes].map( + (Shape: any, index: any) => { + return ( +
{ + onChangeIcon(index + "_" + shapeType); + }} + > + { + onChangeIcon(index + "_" + shapeType); + }} + /> +

{shapeType}

+
+ ); + } + ); + })} + +
+
+
+ ); +}; + +export const ShapeSelectBase = (props: { + onChange: (value: string) => void; + label?: ReactNode; + children?: ReactNode; + visible?: boolean; + setVisible?: (v: boolean) => void; + trigger?: ActionType; + leftOffset?: number; + parent?: HTMLElement | null; + searchKeywords?: Record; + IconType?: "OnlyAntd" | "All" | "default" | undefined; +}) => { + const { setVisible, parent } = props; + return ( + parent : undefined} + // hide the original background when dragging the popover is allowed + overlayInnerStyle={{ + border: "none", + boxShadow: "none", + background: "transparent", + }} + // when dragging is allowed, always re-location to avoid the popover exceeds the screen + destroyTooltipOnHide + content={ + setVisible?.(false)} + searchKeywords={props.searchKeywords} + IconType={props.IconType} + /> + } + > + {props.children} + + ); +}; + +export const ShapeSelect = (props: { + onChange: (value: string) => void; + label?: ReactNode; + children?: ReactNode; + searchKeywords?: Record; + IconType?: "OnlyAntd" | "All" | "default" | undefined; +}) => { + const [visible, setVisible] = useState(false); + return ( + + ); +}; diff --git a/client/packages/lowcoder-design/src/components/video.tsx b/client/packages/lowcoder-design/src/components/video.tsx index 5a6fbf273..db7945912 100644 --- a/client/packages/lowcoder-design/src/components/video.tsx +++ b/client/packages/lowcoder-design/src/components/video.tsx @@ -1,6 +1,9 @@ -import ReactPlayer from "react-player"; +// import ReactPlayer from "react-player"; +import { lazy } from 'react'; import styled from "styled-components"; -import { videoPlayTriangle } from "icons"; +import { VideoCompIcon } from "icons"; + +const ReactPlayer = lazy(() => import("react-player")); export const Video = styled(ReactPlayer)` height: 100% !important; @@ -25,7 +28,7 @@ export const Container = styled.div` } } `; -const PlayTriangle = styled(videoPlayTriangle)` +const PlayTriangle = styled(VideoCompIcon)` position: absolute; left: 0; top: 0; diff --git a/client/packages/lowcoder-design/src/i18n/design/locales/de.ts b/client/packages/lowcoder-design/src/i18n/design/locales/de.ts new file mode 100644 index 000000000..4fa309fd7 --- /dev/null +++ b/client/packages/lowcoder-design/src/i18n/design/locales/de.ts @@ -0,0 +1,3 @@ +import { en } from "./en"; + +export const de: typeof en = {...en}; 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 c6fa81f69..b15621be1 100644 --- a/client/packages/lowcoder-design/src/i18n/design/locales/en.ts +++ b/client/packages/lowcoder-design/src/i18n/design/locales/en.ts @@ -18,13 +18,24 @@ export const en = { }, prop: { basic: "Basic", + resources: "Resources", interaction: "Interaction", advanced: "Advanced", validation: "Validation", layout: "Layout", + labelStyle: "Label Style", style: "Style", - meetings : "Meeting Settings", + meetings: "Meeting Settings", data: "Data", + field: 'Field', + inputFieldStyle: 'Input Field Style', + avatarStyle: 'Avatar Style', + captionStyle: 'Caption Style', + startButtonStyle: 'Start Button Style', + resetButtonStyle: 'Reset Button Style', + headerStyle: 'Header Style', + bodyStyle: 'Body Style', + badgeStyle: 'Badge Style', }, passwordInput: { label: "Password:", @@ -43,6 +54,10 @@ export const en = { title: "Select icon", searchPlaceholder: "Search icon", }, + shapeSelect: { + title: "Select shape", + searchPlaceholder: "Search shape", + }, eventHandler: { advanced: "Advanced", }, diff --git a/client/packages/lowcoder-design/src/i18n/design/locales/index.ts b/client/packages/lowcoder-design/src/i18n/design/locales/index.ts index b52d58808..dbf19146b 100644 --- a/client/packages/lowcoder-design/src/i18n/design/locales/index.ts +++ b/client/packages/lowcoder-design/src/i18n/design/locales/index.ts @@ -2,3 +2,4 @@ // fallback example: current locale is zh-HK, fallback order is zhHK => zh => en export * from "./en"; export * from "./zh"; +export * from "./de"; \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/i18n/design/locales/zh.ts b/client/packages/lowcoder-design/src/i18n/design/locales/zh.ts index 3fe60174b..9b9d6a742 100644 --- a/client/packages/lowcoder-design/src/i18n/design/locales/zh.ts +++ b/client/packages/lowcoder-design/src/i18n/design/locales/zh.ts @@ -18,10 +18,12 @@ export const zh = { }, prop: { basic: "基础", + resources: "资源", interaction: "交互", advanced: "高级", validation: "验证", layout: "布局", + labelStyle:"标签样式", style: "样式", meetings: "会议", data: "数据", diff --git a/client/packages/lowcoder-design/src/icons/IconCompIcon.svg b/client/packages/lowcoder-design/src/icons/IconCompIcon.svg deleted file mode 100644 index ce549b56c..000000000 --- a/client/packages/lowcoder-design/src/icons/IconCompIcon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/antIcon.tsx b/client/packages/lowcoder-design/src/icons/antIcon.tsx index e746cdab1..7b3770362 100644 --- a/client/packages/lowcoder-design/src/icons/antIcon.tsx +++ b/client/packages/lowcoder-design/src/icons/antIcon.tsx @@ -1,794 +1,794 @@ -import { - AccountBookFilled, - AccountBookOutlined, - AccountBookTwoTone, - AimOutlined, - AlertFilled, - AlertOutlined, - AlertTwoTone, - AlibabaOutlined, - AlignCenterOutlined, - AlignLeftOutlined, - AlignRightOutlined, - AlipayCircleFilled, - AlipayCircleOutlined, - AlipayOutlined, - AlipaySquareFilled, - AliwangwangFilled, - AliwangwangOutlined, - AliyunOutlined, - AmazonCircleFilled, - AmazonOutlined, - AmazonSquareFilled, - AndroidFilled, - AndroidOutlined, - AntCloudOutlined, - AntDesignOutlined, - ApartmentOutlined, - ApiFilled, - ApiOutlined, - ApiTwoTone, - AppleFilled, - AppleOutlined, - AppstoreAddOutlined, - AppstoreFilled, - AppstoreOutlined, - AppstoreTwoTone, - AreaChartOutlined, - ArrowDownOutlined, - ArrowLeftOutlined, - ArrowRightOutlined, - ArrowUpOutlined, - ArrowsAltOutlined, - AudioFilled, - AudioMutedOutlined, - AudioOutlined, - AudioTwoTone, - AuditOutlined, - BackwardFilled, - BackwardOutlined, - BankFilled, - BankOutlined, - BankTwoTone, - BarChartOutlined, - BarcodeOutlined, - BarsOutlined, - BehanceCircleFilled, - BehanceOutlined, - BehanceSquareFilled, - BehanceSquareOutlined, - BellFilled, - BellOutlined, - BellTwoTone, - BgColorsOutlined, - BlockOutlined, - BoldOutlined, - BookFilled, - BookOutlined, - BookTwoTone, - BorderBottomOutlined, - BorderHorizontalOutlined, - BorderInnerOutlined, - BorderLeftOutlined, - BorderOuterOutlined, - BorderOutlined, - BorderRightOutlined, - BorderTopOutlined, - BorderVerticleOutlined, - BorderlessTableOutlined, - BoxPlotFilled, - BoxPlotOutlined, - BoxPlotTwoTone, - BranchesOutlined, - BugFilled, - BugOutlined, - BugTwoTone, - BuildFilled, - BuildOutlined, - BuildTwoTone, - BulbFilled, - BulbOutlined, - BulbTwoTone, - CalculatorFilled, - CalculatorOutlined, - CalculatorTwoTone, - CalendarFilled, - CalendarOutlined, - CalendarTwoTone, - CameraFilled, - CameraOutlined, - CameraTwoTone, - CarFilled, - CarOutlined, - CarTwoTone, - CaretDownFilled, - CaretDownOutlined, - CaretLeftFilled, - CaretLeftOutlined, - CaretRightFilled, - CaretRightOutlined, - CaretUpFilled, - CaretUpOutlined, - CarryOutFilled, - CarryOutOutlined, - CarryOutTwoTone, - CheckCircleFilled, - CheckCircleOutlined, - CheckCircleTwoTone, - CheckOutlined, - CheckSquareFilled, - CheckSquareOutlined, - CheckSquareTwoTone, - ChromeFilled, - ChromeOutlined, - CiCircleFilled, - CiCircleOutlined, - CiCircleTwoTone, - CiOutlined, - CiTwoTone, - ClearOutlined, - ClockCircleFilled, - ClockCircleOutlined, - ClockCircleTwoTone, - CloseCircleFilled, - CloseCircleOutlined, - CloseCircleTwoTone, - CloseOutlined, - CloseSquareFilled, - CloseSquareOutlined, - CloseSquareTwoTone, - CloudDownloadOutlined, - CloudFilled, - CloudOutlined, - CloudServerOutlined, - CloudSyncOutlined, - CloudTwoTone, - CloudUploadOutlined, - ClusterOutlined, - CodeFilled, - CodeOutlined, - CodeSandboxCircleFilled, - CodeSandboxOutlined, - CodeSandboxSquareFilled, - CodeTwoTone, - CodepenCircleFilled, - CodepenCircleOutlined, - CodepenOutlined, - CodepenSquareFilled, - CoffeeOutlined, - ColumnHeightOutlined, - ColumnWidthOutlined, - CommentOutlined, - CompassFilled, - CompassOutlined, - CompassTwoTone, - CompressOutlined, - ConsoleSqlOutlined, - ContactsFilled, - ContactsOutlined, - ContactsTwoTone, - ContainerFilled, - ContainerOutlined, - ContainerTwoTone, - ControlFilled, - ControlOutlined, - ControlTwoTone, - CopyFilled, - CopyOutlined, - CopyTwoTone, - CopyrightCircleFilled, - CopyrightCircleOutlined, - CopyrightCircleTwoTone, - CopyrightOutlined, - CopyrightTwoTone, - CreditCardFilled, - CreditCardOutlined, - CreditCardTwoTone, - CrownFilled, - CrownOutlined, - CrownTwoTone, - CustomerServiceFilled, - CustomerServiceOutlined, - CustomerServiceTwoTone, - DashOutlined, - DashboardFilled, - DashboardOutlined, - DashboardTwoTone, - DatabaseFilled, - DatabaseOutlined, - DatabaseTwoTone, - DeleteColumnOutlined, - DeleteFilled, - DeleteOutlined, - DeleteRowOutlined, - DeleteTwoTone, - DeliveredProcedureOutlined, - DeploymentUnitOutlined, - DesktopOutlined, - DiffFilled, - DiffOutlined, - DiffTwoTone, - DingdingOutlined, - DingtalkCircleFilled, - DingtalkOutlined, - DingtalkSquareFilled, - DisconnectOutlined, - DislikeFilled, - DislikeOutlined, - DislikeTwoTone, - DollarCircleFilled, - DollarCircleOutlined, - DollarCircleTwoTone, - DollarOutlined, - DollarTwoTone, - DotChartOutlined, - DoubleLeftOutlined, - DoubleRightOutlined, - DownCircleFilled, - DownCircleOutlined, - DownCircleTwoTone, - DownOutlined, - DownSquareFilled, - DownSquareOutlined, - DownSquareTwoTone, - DownloadOutlined, - DragOutlined, - DribbbleCircleFilled, - DribbbleOutlined, - DribbbleSquareFilled, - DribbbleSquareOutlined, - DropboxCircleFilled, - DropboxOutlined, - DropboxSquareFilled, - EditFilled, - EditOutlined, - EditTwoTone, - EllipsisOutlined, - EnterOutlined, - EnvironmentFilled, - EnvironmentOutlined, - EnvironmentTwoTone, - EuroCircleFilled, - EuroCircleOutlined, - EuroCircleTwoTone, - EuroOutlined, - EuroTwoTone, - ExceptionOutlined, - ExclamationCircleFilled, - ExclamationCircleOutlined, - ExclamationCircleTwoTone, - ExclamationOutlined, - ExpandAltOutlined, - ExpandOutlined, - ExperimentFilled, - ExperimentOutlined, - ExperimentTwoTone, - ExportOutlined, - EyeFilled, - EyeInvisibleFilled, - EyeInvisibleOutlined, - EyeInvisibleTwoTone, - EyeOutlined, - EyeTwoTone, - FacebookFilled, - FacebookOutlined, - FallOutlined, - FastBackwardFilled, - FastBackwardOutlined, - FastForwardFilled, - FastForwardOutlined, - FieldBinaryOutlined, - FieldNumberOutlined, - FieldStringOutlined, - FieldTimeOutlined, - FileAddFilled, - FileAddOutlined, - FileAddTwoTone, - FileDoneOutlined, - FileExcelFilled, - FileExcelOutlined, - FileExcelTwoTone, - FileExclamationFilled, - FileExclamationOutlined, - FileExclamationTwoTone, - FileFilled, - FileGifOutlined, - FileImageFilled, - FileImageOutlined, - FileImageTwoTone, - FileJpgOutlined, - FileMarkdownFilled, - FileMarkdownOutlined, - FileMarkdownTwoTone, - FileOutlined, - FilePdfFilled, - FilePdfOutlined, - FilePdfTwoTone, - FilePptFilled, - FilePptOutlined, - FilePptTwoTone, - FileProtectOutlined, - FileSearchOutlined, - FileSyncOutlined, - FileTextFilled, - FileTextOutlined, - FileTextTwoTone, - FileTwoTone, - FileUnknownFilled, - FileUnknownOutlined, - FileUnknownTwoTone, - FileWordFilled, - FileWordOutlined, - FileWordTwoTone, - FileZipFilled, - FileZipOutlined, - FileZipTwoTone, - FilterFilled, - FilterOutlined, - FilterTwoTone, - FireFilled, - FireOutlined, - FireTwoTone, - FlagFilled, - FlagOutlined, - FlagTwoTone, - FolderAddFilled, - FolderAddOutlined, - FolderAddTwoTone, - FolderFilled, - FolderOpenFilled, - FolderOpenOutlined, - FolderOpenTwoTone, - FolderOutlined, - FolderTwoTone, - FolderViewOutlined, - FontColorsOutlined, - FontSizeOutlined, - ForkOutlined, - FormOutlined, - FormatPainterFilled, - FormatPainterOutlined, - ForwardFilled, - ForwardOutlined, - FrownFilled, - FrownOutlined, - FrownTwoTone, - FullscreenExitOutlined, - FullscreenOutlined, - FunctionOutlined, - FundFilled, - FundOutlined, - FundProjectionScreenOutlined, - FundTwoTone, - FundViewOutlined, - FunnelPlotFilled, - FunnelPlotOutlined, - FunnelPlotTwoTone, - GatewayOutlined, - GifOutlined, - GiftFilled, - GiftOutlined, - GiftTwoTone, - GithubFilled, - GithubOutlined, - GitlabFilled, - GitlabOutlined, - GlobalOutlined, - GoldFilled, - GoldOutlined, - GoldTwoTone, - GoldenFilled, - GoogleCircleFilled, - GoogleOutlined, - GooglePlusCircleFilled, - GooglePlusOutlined, - GooglePlusSquareFilled, - GoogleSquareFilled, - GroupOutlined, - HddFilled, - HddOutlined, - HddTwoTone, - HeartFilled, - HeartOutlined, - HeartTwoTone, - HeatMapOutlined, - HighlightFilled, - HighlightOutlined, - HighlightTwoTone, - HistoryOutlined, - HolderOutlined, - HomeFilled, - HomeOutlined, - HomeTwoTone, - HourglassFilled, - HourglassOutlined, - HourglassTwoTone, - Html5Filled, - Html5Outlined, - Html5TwoTone, - IdcardFilled, - IdcardOutlined, - IdcardTwoTone, - IeCircleFilled, - IeOutlined, - IeSquareFilled, - ImportOutlined, - InboxOutlined, - InfoCircleFilled, - InfoCircleOutlined, - InfoCircleTwoTone, - InfoOutlined, - InsertRowAboveOutlined, - InsertRowBelowOutlined, - InsertRowLeftOutlined, - InsertRowRightOutlined, - InstagramFilled, - InstagramOutlined, - InsuranceFilled, - InsuranceOutlined, - InsuranceTwoTone, - InteractionFilled, - InteractionOutlined, - InteractionTwoTone, - IssuesCloseOutlined, - ItalicOutlined, - KeyOutlined, - LaptopOutlined, - LayoutFilled, - LayoutOutlined, - LayoutTwoTone, - LeftCircleFilled, - LeftCircleOutlined, - LeftCircleTwoTone, - LeftOutlined, - LeftSquareFilled, - LeftSquareOutlined, - LeftSquareTwoTone, - LikeFilled, - LikeOutlined, - LikeTwoTone, - LineChartOutlined, - LineHeightOutlined, - LineOutlined, - LinkOutlined, - LinkedinFilled, - LinkedinOutlined, - Loading3QuartersOutlined, - LoadingOutlined, - LockFilled, - LockOutlined, - LockTwoTone, - LoginOutlined, - LogoutOutlined, - MacCommandFilled, - MacCommandOutlined, - MailFilled, - MailOutlined, - MailTwoTone, - ManOutlined, - MedicineBoxFilled, - MedicineBoxOutlined, - MedicineBoxTwoTone, - MediumCircleFilled, - MediumOutlined, - MediumSquareFilled, - MediumWorkmarkOutlined, - MehFilled, - MehOutlined, - MehTwoTone, - MenuFoldOutlined, - MenuOutlined, - MenuUnfoldOutlined, - MergeCellsOutlined, - MessageFilled, - MessageOutlined, - MessageTwoTone, - MinusCircleFilled, - MinusCircleOutlined, - MinusCircleTwoTone, - MinusOutlined, - MinusSquareFilled, - MinusSquareOutlined, - MinusSquareTwoTone, - MobileFilled, - MobileOutlined, - MobileTwoTone, - MoneyCollectFilled, - MoneyCollectOutlined, - MoneyCollectTwoTone, - MonitorOutlined, - MoreOutlined, - NodeCollapseOutlined, - NodeExpandOutlined, - NodeIndexOutlined, - NotificationFilled, - NotificationOutlined, - NotificationTwoTone, - NumberOutlined, - OneToOneOutlined, - OrderedListOutlined, - PaperClipOutlined, - PartitionOutlined, - PauseCircleFilled, - PauseCircleOutlined, - PauseCircleTwoTone, - PauseOutlined, - PayCircleFilled, - PayCircleOutlined, - PercentageOutlined, - PhoneFilled, - PhoneOutlined, - PhoneTwoTone, - PicCenterOutlined, - PicLeftOutlined, - PicRightOutlined, - PictureFilled, - PictureOutlined, - PictureTwoTone, - PieChartFilled, - PieChartOutlined, - PieChartTwoTone, - PlayCircleFilled, - PlayCircleOutlined, - PlayCircleTwoTone, - PlaySquareFilled, - PlaySquareOutlined, - PlaySquareTwoTone, - PlusCircleFilled, - PlusCircleOutlined, - PlusCircleTwoTone, - PlusOutlined, - PlusSquareFilled, - PlusSquareOutlined, - PlusSquareTwoTone, - PoundCircleFilled, - PoundCircleOutlined, - PoundCircleTwoTone, - PoundOutlined, - PoweroffOutlined, - PrinterFilled, - PrinterOutlined, - PrinterTwoTone, - ProfileFilled, - ProfileOutlined, - ProfileTwoTone, - ProjectFilled, - ProjectOutlined, - ProjectTwoTone, - PropertySafetyFilled, - PropertySafetyOutlined, - PropertySafetyTwoTone, - PullRequestOutlined, - PushpinFilled, - PushpinOutlined, - PushpinTwoTone, - QqCircleFilled, - QqOutlined, - QqSquareFilled, - QrcodeOutlined, - QuestionCircleFilled, - QuestionCircleOutlined, - QuestionCircleTwoTone, - QuestionOutlined, - RadarChartOutlined, - RadiusBottomleftOutlined, - RadiusBottomrightOutlined, - RadiusSettingOutlined, - RadiusUpleftOutlined, - RadiusUprightOutlined, - ReadFilled, - ReadOutlined, - ReconciliationFilled, - ReconciliationOutlined, - ReconciliationTwoTone, - RedEnvelopeFilled, - RedEnvelopeOutlined, - RedEnvelopeTwoTone, - RedditCircleFilled, - RedditOutlined, - RedditSquareFilled, - RedoOutlined, - ReloadOutlined, - RestFilled, - RestOutlined, - RestTwoTone, - RetweetOutlined, - RightCircleFilled, - RightCircleOutlined, - RightCircleTwoTone, - RightOutlined, - RightSquareFilled, - RightSquareOutlined, - RightSquareTwoTone, - RiseOutlined, - RobotFilled, - RobotOutlined, - RocketFilled, - RocketOutlined, - RocketTwoTone, - RollbackOutlined, - RotateLeftOutlined, - RotateRightOutlined, - SafetyCertificateFilled, - SafetyCertificateOutlined, - SafetyCertificateTwoTone, - SafetyOutlined, - SaveFilled, - SaveOutlined, - SaveTwoTone, - ScanOutlined, - ScheduleFilled, - ScheduleOutlined, - ScheduleTwoTone, - ScissorOutlined, - SearchOutlined, - SecurityScanFilled, - SecurityScanOutlined, - SecurityScanTwoTone, - SelectOutlined, - SendOutlined, - SettingFilled, - SettingOutlined, - SettingTwoTone, - ShakeOutlined, - ShareAltOutlined, - ShopFilled, - ShopOutlined, - ShopTwoTone, - ShoppingCartOutlined, - ShoppingFilled, - ShoppingOutlined, - ShoppingTwoTone, - ShrinkOutlined, - SignalFilled, - SisternodeOutlined, - SketchCircleFilled, - SketchOutlined, - SketchSquareFilled, - SkinFilled, - SkinOutlined, - SkinTwoTone, - SkypeFilled, - SkypeOutlined, - SlackCircleFilled, - SlackOutlined, - SlackSquareFilled, - SlackSquareOutlined, - SlidersFilled, - SlidersOutlined, - SlidersTwoTone, - SmallDashOutlined, - SmileFilled, - SmileOutlined, - SmileTwoTone, - SnippetsFilled, - SnippetsOutlined, - SnippetsTwoTone, - SolutionOutlined, - SortAscendingOutlined, - SortDescendingOutlined, - SoundFilled, - SoundOutlined, - SoundTwoTone, - SplitCellsOutlined, - StarFilled, - StarOutlined, - StarTwoTone, - StepBackwardFilled, - StepBackwardOutlined, - StepForwardFilled, - StepForwardOutlined, - StockOutlined, - StopFilled, - StopOutlined, - StopTwoTone, - StrikethroughOutlined, - SubnodeOutlined, - SwapLeftOutlined, - SwapOutlined, - SwapRightOutlined, - SwitcherFilled, - SwitcherOutlined, - SwitcherTwoTone, - SyncOutlined, - TableOutlined, - TabletFilled, - TabletOutlined, - TabletTwoTone, - TagFilled, - TagOutlined, - TagTwoTone, - TagsFilled, - TagsOutlined, - TagsTwoTone, - TaobaoCircleFilled, - TaobaoCircleOutlined, - TaobaoOutlined, - TaobaoSquareFilled, - TeamOutlined, - ThunderboltFilled, - ThunderboltOutlined, - ThunderboltTwoTone, - ToTopOutlined, - ToolFilled, - ToolOutlined, - ToolTwoTone, - TrademarkCircleFilled, - TrademarkCircleOutlined, - TrademarkCircleTwoTone, - TrademarkOutlined, - TransactionOutlined, - TranslationOutlined, - TrophyFilled, - TrophyOutlined, - TrophyTwoTone, - TwitterCircleFilled, - TwitterOutlined, - TwitterSquareFilled, - UnderlineOutlined, - UndoOutlined, - UngroupOutlined, - UnlockFilled, - UnlockOutlined, - UnlockTwoTone, - UnorderedListOutlined, - UpCircleFilled, - UpCircleOutlined, - UpCircleTwoTone, - UpOutlined, - UpSquareFilled, - UpSquareOutlined, - UpSquareTwoTone, - UploadOutlined, - UsbFilled, - UsbOutlined, - UsbTwoTone, - UserAddOutlined, - UserDeleteOutlined, - UserOutlined, - UserSwitchOutlined, - UsergroupAddOutlined, - UsergroupDeleteOutlined, - VerifiedOutlined, - VerticalAlignBottomOutlined, - VerticalAlignMiddleOutlined, - VerticalAlignTopOutlined, - VerticalLeftOutlined, - VerticalRightOutlined, - VideoCameraAddOutlined, - VideoCameraFilled, - VideoCameraOutlined, - VideoCameraTwoTone, - WalletFilled, - WalletOutlined, - WalletTwoTone, - WarningFilled, - WarningOutlined, - WarningTwoTone, - WechatFilled, - WechatOutlined, - WeiboCircleFilled, - WeiboCircleOutlined, - WeiboOutlined, - WeiboSquareFilled, - WeiboSquareOutlined, - WhatsAppOutlined, - WifiOutlined, - WindowsFilled, - WindowsOutlined, - WomanOutlined, - YahooFilled, - YahooOutlined, - YoutubeFilled, - YoutubeOutlined, - YuqueFilled, - YuqueOutlined, - ZhihuCircleFilled, - ZhihuOutlined, - ZhihuSquareFilled, - ZoomInOutlined, - ZoomOutOutlined, -} from "@ant-design/icons"; +import { lazy } from 'react'; + +const AccountBookFilled = lazy(() => import("@ant-design/icons/AccountBookFilled")); +const AccountBookOutlined = lazy(() => import("@ant-design/icons/AccountBookOutlined")); +const AccountBookTwoTone = lazy(() => import("@ant-design/icons/AccountBookTwoTone")); +const AimOutlined = lazy(() => import("@ant-design/icons/AimOutlined")); +const AlertFilled = lazy(() => import("@ant-design/icons/AlertFilled")); +const AlertOutlined = lazy(() => import("@ant-design/icons/AlertOutlined")); +const AlertTwoTone = lazy(() => import("@ant-design/icons/AlertTwoTone")); +const AlibabaOutlined = lazy(() => import("@ant-design/icons/AlibabaOutlined")); +const AlignCenterOutlined = lazy(() => import("@ant-design/icons/AlignCenterOutlined")); +const AlignLeftOutlined = lazy(() => import("@ant-design/icons/AlignLeftOutlined")); +const AlignRightOutlined = lazy(() => import("@ant-design/icons/AlignRightOutlined")); +const AlipayCircleFilled = lazy(() => import("@ant-design/icons/AlipayCircleFilled")); +const AlipayCircleOutlined = lazy(() => import("@ant-design/icons/AlipayCircleOutlined")); +const AlipayOutlined = lazy(() => import("@ant-design/icons/AlipayOutlined")); +const AlipaySquareFilled = lazy(() => import("@ant-design/icons/AlipaySquareFilled")); +const AliwangwangFilled = lazy(() => import("@ant-design/icons/AliwangwangFilled")); +const AliwangwangOutlined = lazy(() => import("@ant-design/icons/AliwangwangOutlined")); +const AliyunOutlined = lazy(() => import("@ant-design/icons/AliyunOutlined")); +const AmazonCircleFilled = lazy(() => import("@ant-design/icons/AmazonCircleFilled")); +const AmazonOutlined = lazy(() => import("@ant-design/icons/AmazonOutlined")); +const AmazonSquareFilled = lazy(() => import("@ant-design/icons/AmazonSquareFilled")); +const AndroidFilled = lazy(() => import("@ant-design/icons/AndroidFilled")); +const AndroidOutlined = lazy(() => import("@ant-design/icons/AndroidOutlined")); +const AntCloudOutlined = lazy(() => import("@ant-design/icons/AntCloudOutlined")); +const AntDesignOutlined = lazy(() => import("@ant-design/icons/AntDesignOutlined")); +const ApartmentOutlined = lazy(() => import("@ant-design/icons/ApartmentOutlined")); +const ApiFilled = lazy(() => import("@ant-design/icons/ApiFilled")); +const ApiOutlined = lazy(() => import("@ant-design/icons/ApiOutlined")); +const ApiTwoTone = lazy(() => import("@ant-design/icons/ApiTwoTone")); +const AppleFilled = lazy(() => import("@ant-design/icons/AppleFilled")); +const AppleOutlined = lazy(() => import("@ant-design/icons/AppleOutlined")); +const AppstoreAddOutlined = lazy(() => import("@ant-design/icons/AppstoreAddOutlined")); +const AppstoreFilled = lazy(() => import("@ant-design/icons/AppstoreFilled")); +const AppstoreOutlined = lazy(() => import("@ant-design/icons/AppstoreOutlined")); +const AppstoreTwoTone = lazy(() => import("@ant-design/icons/AppstoreTwoTone")); +const AreaChartOutlined = lazy(() => import("@ant-design/icons/AreaChartOutlined")); +const ArrowDownOutlined = lazy(() => import("@ant-design/icons/ArrowDownOutlined")); +const ArrowLeftOutlined = lazy(() => import("@ant-design/icons/ArrowLeftOutlined")); +const ArrowRightOutlined = lazy(() => import("@ant-design/icons/ArrowRightOutlined")); +const ArrowUpOutlined = lazy(() => import("@ant-design/icons/ArrowUpOutlined")); +const ArrowsAltOutlined = lazy(() => import("@ant-design/icons/ArrowsAltOutlined")); +const AudioFilled = lazy(() => import("@ant-design/icons/AudioFilled")); +const AudioMutedOutlined = lazy(() => import("@ant-design/icons/AudioMutedOutlined")); +const AudioOutlined = lazy(() => import("@ant-design/icons/AudioOutlined")); +const AudioTwoTone = lazy(() => import("@ant-design/icons/AudioTwoTone")); +const AuditOutlined = lazy(() => import("@ant-design/icons/AuditOutlined")); +const BackwardFilled = lazy(() => import("@ant-design/icons/BackwardFilled")); +const BackwardOutlined = lazy(() => import("@ant-design/icons/BackwardOutlined")); +const BankFilled = lazy(() => import("@ant-design/icons/BankFilled")); +const BankOutlined = lazy(() => import("@ant-design/icons/BankOutlined")); +const BankTwoTone = lazy(() => import("@ant-design/icons/BankTwoTone")); +const BarChartOutlined = lazy(() => import("@ant-design/icons/BarChartOutlined")); +const BarcodeOutlined = lazy(() => import("@ant-design/icons/BarcodeOutlined")); +const BarsOutlined = lazy(() => import("@ant-design/icons/BarsOutlined")); +const BehanceCircleFilled = lazy(() => import("@ant-design/icons/BehanceCircleFilled")); +const BehanceOutlined = lazy(() => import("@ant-design/icons/BehanceOutlined")); +const BehanceSquareFilled = lazy(() => import("@ant-design/icons/BehanceSquareFilled")); +const BehanceSquareOutlined = lazy(() => import("@ant-design/icons/BehanceSquareOutlined")); +const BellFilled = lazy(() => import("@ant-design/icons/BellFilled")); +const BellOutlined = lazy(() => import("@ant-design/icons/BellOutlined")); +const BellTwoTone = lazy(() => import("@ant-design/icons/BellTwoTone")); +const BgColorsOutlined = lazy(() => import("@ant-design/icons/BgColorsOutlined")); +const BlockOutlined = lazy(() => import("@ant-design/icons/BlockOutlined")); +const BoldOutlined = lazy(() => import("@ant-design/icons/BoldOutlined")); +const BookFilled = lazy(() => import("@ant-design/icons/BookFilled")); +const BookOutlined = lazy(() => import("@ant-design/icons/BookOutlined")); +const BookTwoTone = lazy(() => import("@ant-design/icons/BookTwoTone")); +const BorderBottomOutlined = lazy(() => import("@ant-design/icons/BorderBottomOutlined")); +const BorderHorizontalOutlined = lazy(() => import("@ant-design/icons/BorderHorizontalOutlined")); +const BorderInnerOutlined = lazy(() => import("@ant-design/icons/BorderInnerOutlined")); +const BorderLeftOutlined = lazy(() => import("@ant-design/icons/BorderLeftOutlined")); +const BorderOuterOutlined = lazy(() => import("@ant-design/icons/BorderOuterOutlined")); +const BorderOutlined = lazy(() => import("@ant-design/icons/BorderOutlined")); +const BorderRightOutlined = lazy(() => import("@ant-design/icons/BorderRightOutlined")); +const BorderTopOutlined = lazy(() => import("@ant-design/icons/BorderTopOutlined")); +const BorderVerticleOutlined = lazy(() => import("@ant-design/icons/BorderVerticleOutlined")); +const BorderlessTableOutlined = lazy(() => import("@ant-design/icons/BorderlessTableOutlined")); +const BoxPlotFilled = lazy(() => import("@ant-design/icons/BoxPlotFilled")); +const BoxPlotOutlined = lazy(() => import("@ant-design/icons/BoxPlotOutlined")); +const BoxPlotTwoTone = lazy(() => import("@ant-design/icons/BoxPlotTwoTone")); +const BranchesOutlined = lazy(() => import("@ant-design/icons/BranchesOutlined")); +const BugFilled = lazy(() => import("@ant-design/icons/BugFilled")); +const BugOutlined = lazy(() => import("@ant-design/icons/BugOutlined")); +const BugTwoTone = lazy(() => import("@ant-design/icons/BugTwoTone")); +const BuildFilled = lazy(() => import("@ant-design/icons/BuildFilled")); +const BuildOutlined = lazy(() => import("@ant-design/icons/BuildOutlined")); +const BuildTwoTone = lazy(() => import("@ant-design/icons/BuildTwoTone")); +const BulbFilled = lazy(() => import("@ant-design/icons/BulbFilled")); +const BulbOutlined = lazy(() => import("@ant-design/icons/BulbOutlined")); +const BulbTwoTone = lazy(() => import("@ant-design/icons/BulbTwoTone")); +const CalculatorFilled = lazy(() => import("@ant-design/icons/CalculatorFilled")); +const CalculatorOutlined = lazy(() => import("@ant-design/icons/CalculatorOutlined")); +const CalculatorTwoTone = lazy(() => import("@ant-design/icons/CalculatorTwoTone")); +const CalendarFilled = lazy(() => import("@ant-design/icons/CalendarFilled")); +const CalendarOutlined = lazy(() => import("@ant-design/icons/CalendarOutlined")); +const CalendarTwoTone = lazy(() => import("@ant-design/icons/CalendarTwoTone")); +const CameraFilled = lazy(() => import("@ant-design/icons/CameraFilled")); +const CameraOutlined = lazy(() => import("@ant-design/icons/CameraOutlined")); +const CameraTwoTone = lazy(() => import("@ant-design/icons/CameraTwoTone")); +const CarFilled = lazy(() => import("@ant-design/icons/CarFilled")); +const CarOutlined = lazy(() => import("@ant-design/icons/CarOutlined")); +const CarTwoTone = lazy(() => import("@ant-design/icons/CarTwoTone")); +const CaretDownFilled = lazy(() => import("@ant-design/icons/CaretDownFilled")); +const CaretDownOutlined = lazy(() => import("@ant-design/icons/CaretDownOutlined")); +const CaretLeftFilled = lazy(() => import("@ant-design/icons/CaretLeftFilled")); +const CaretLeftOutlined = lazy(() => import("@ant-design/icons/CaretLeftOutlined")); +const CaretRightFilled = lazy(() => import("@ant-design/icons/CaretRightFilled")); +const CaretRightOutlined = lazy(() => import("@ant-design/icons/CaretRightOutlined")); +const CaretUpFilled = lazy(() => import("@ant-design/icons/CaretUpFilled")); +const CaretUpOutlined = lazy(() => import("@ant-design/icons/CaretUpOutlined")); +const CarryOutFilled = lazy(() => import("@ant-design/icons/CarryOutFilled")); +const CarryOutOutlined = lazy(() => import("@ant-design/icons/CarryOutOutlined")); +const CarryOutTwoTone = lazy(() => import("@ant-design/icons/CarryOutTwoTone")); +const CheckCircleFilled = lazy(() => import("@ant-design/icons/CheckCircleFilled")); +const CheckCircleOutlined = lazy(() => import("@ant-design/icons/CheckCircleOutlined")); +const CheckCircleTwoTone = lazy(() => import("@ant-design/icons/CheckCircleTwoTone")); +const CheckOutlined = lazy(() => import("@ant-design/icons/CheckOutlined")); +const CheckSquareFilled = lazy(() => import("@ant-design/icons/CheckSquareFilled")); +const CheckSquareOutlined = lazy(() => import("@ant-design/icons/CheckSquareOutlined")); +const CheckSquareTwoTone = lazy(() => import("@ant-design/icons/CheckSquareTwoTone")); +const ChromeFilled = lazy(() => import("@ant-design/icons/ChromeFilled")); +const ChromeOutlined = lazy(() => import("@ant-design/icons/ChromeOutlined")); +const CiCircleFilled = lazy(() => import("@ant-design/icons/CiCircleFilled")); +const CiCircleOutlined = lazy(() => import("@ant-design/icons/CiCircleOutlined")); +const CiCircleTwoTone = lazy(() => import("@ant-design/icons/CiCircleTwoTone")); +const CiOutlined = lazy(() => import("@ant-design/icons/CiOutlined")); +const CiTwoTone = lazy(() => import("@ant-design/icons/CiTwoTone")); +const ClearOutlined = lazy(() => import("@ant-design/icons/ClearOutlined")); +const ClockCircleFilled = lazy(() => import("@ant-design/icons/ClockCircleFilled")); +const ClockCircleOutlined = lazy(() => import("@ant-design/icons/ClockCircleOutlined")); +const ClockCircleTwoTone = lazy(() => import("@ant-design/icons/ClockCircleTwoTone")); +const CloseCircleFilled = lazy(() => import("@ant-design/icons/CloseCircleFilled")); +const CloseCircleOutlined = lazy(() => import("@ant-design/icons/CloseCircleOutlined")); +const CloseCircleTwoTone = lazy(() => import("@ant-design/icons/CloseCircleTwoTone")); +const CloseOutlined = lazy(() => import("@ant-design/icons/CloseOutlined")); +const CloseSquareFilled = lazy(() => import("@ant-design/icons/CloseSquareFilled")); +const CloseSquareOutlined = lazy(() => import("@ant-design/icons/CloseSquareOutlined")); +const CloseSquareTwoTone = lazy(() => import("@ant-design/icons/CloseSquareTwoTone")); +const CloudDownloadOutlined = lazy(() => import("@ant-design/icons/CloudDownloadOutlined")); +const CloudFilled = lazy(() => import("@ant-design/icons/CloudFilled")); +const CloudOutlined = lazy(() => import("@ant-design/icons/CloudOutlined")); +const CloudServerOutlined = lazy(() => import("@ant-design/icons/CloudServerOutlined")); +const CloudSyncOutlined = lazy(() => import("@ant-design/icons/CloudSyncOutlined")); +const CloudTwoTone = lazy(() => import("@ant-design/icons/CloudTwoTone")); +const CloudUploadOutlined = lazy(() => import("@ant-design/icons/CloudUploadOutlined")); +const ClusterOutlined = lazy(() => import("@ant-design/icons/ClusterOutlined")); +const CodeFilled = lazy(() => import("@ant-design/icons/CodeFilled")); +const CodeOutlined = lazy(() => import("@ant-design/icons/CodeOutlined")); +const CodeSandboxCircleFilled = lazy(() => import("@ant-design/icons/CodeSandboxCircleFilled")); +const CodeSandboxOutlined = lazy(() => import("@ant-design/icons/CodeSandboxOutlined")); +const CodeSandboxSquareFilled = lazy(() => import("@ant-design/icons/CodeSandboxSquareFilled")); +const CodeTwoTone = lazy(() => import("@ant-design/icons/CodeTwoTone")); +const CodepenCircleFilled = lazy(() => import("@ant-design/icons/CodepenCircleFilled")); +const CodepenCircleOutlined = lazy(() => import("@ant-design/icons/CodepenCircleOutlined")); +const CodepenOutlined = lazy(() => import("@ant-design/icons/CodepenOutlined")); +const CodepenSquareFilled = lazy(() => import("@ant-design/icons/CodepenSquareFilled")); +const CoffeeOutlined = lazy(() => import("@ant-design/icons/CoffeeOutlined")); +const ColumnHeightOutlined = lazy(() => import("@ant-design/icons/ColumnHeightOutlined")); +const ColumnWidthOutlined = lazy(() => import("@ant-design/icons/ColumnWidthOutlined")); +const CommentOutlined = lazy(() => import("@ant-design/icons/CommentOutlined")); +const CompassFilled = lazy(() => import("@ant-design/icons/CompassFilled")); +const CompassOutlined = lazy(() => import("@ant-design/icons/CompassOutlined")); +const CompassTwoTone = lazy(() => import("@ant-design/icons/CompassTwoTone")); +const CompressOutlined = lazy(() => import("@ant-design/icons/CompressOutlined")); +const ConsoleSqlOutlined = lazy(() => import("@ant-design/icons/ConsoleSqlOutlined")); +const ContactsFilled = lazy(() => import("@ant-design/icons/ContactsFilled")); +const ContactsOutlined = lazy(() => import("@ant-design/icons/ContactsOutlined")); +const ContactsTwoTone = lazy(() => import("@ant-design/icons/ContactsTwoTone")); +const ContainerFilled = lazy(() => import("@ant-design/icons/ContainerFilled")); +const ContainerOutlined = lazy(() => import("@ant-design/icons/ContainerOutlined")); +const ContainerTwoTone = lazy(() => import("@ant-design/icons/ContainerTwoTone")); +const ControlFilled = lazy(() => import("@ant-design/icons/ControlFilled")); +const ControlOutlined = lazy(() => import("@ant-design/icons/ControlOutlined")); +const ControlTwoTone = lazy(() => import("@ant-design/icons/ControlTwoTone")); +const CopyFilled = lazy(() => import("@ant-design/icons/CopyFilled")); +const CopyOutlined = lazy(() => import("@ant-design/icons/CopyOutlined")); +const CopyTwoTone = lazy(() => import("@ant-design/icons/CopyTwoTone")); +const CopyrightCircleFilled = lazy(() => import("@ant-design/icons/CopyrightCircleFilled")); +const CopyrightCircleOutlined = lazy(() => import("@ant-design/icons/CopyrightCircleOutlined")); +const CopyrightCircleTwoTone = lazy(() => import("@ant-design/icons/CopyrightCircleTwoTone")); +const CopyrightOutlined = lazy(() => import("@ant-design/icons/CopyrightOutlined")); +const CopyrightTwoTone = lazy(() => import("@ant-design/icons/CopyrightTwoTone")); +const CreditCardFilled = lazy(() => import("@ant-design/icons/CreditCardFilled")); +const CreditCardOutlined = lazy(() => import("@ant-design/icons/CreditCardOutlined")); +const CreditCardTwoTone = lazy(() => import("@ant-design/icons/CreditCardTwoTone")); +const CrownFilled = lazy(() => import("@ant-design/icons/CrownFilled")); +const CrownOutlined = lazy(() => import("@ant-design/icons/CrownOutlined")); +const CrownTwoTone = lazy(() => import("@ant-design/icons/CrownTwoTone")); +const CustomerServiceFilled = lazy(() => import("@ant-design/icons/CustomerServiceFilled")); +const CustomerServiceOutlined = lazy(() => import("@ant-design/icons/CustomerServiceOutlined")); +const CustomerServiceTwoTone = lazy(() => import("@ant-design/icons/CustomerServiceTwoTone")); +const DashOutlined = lazy(() => import("@ant-design/icons/DashOutlined")); +const DashboardFilled = lazy(() => import("@ant-design/icons/DashboardFilled")); +const DashboardOutlined = lazy(() => import("@ant-design/icons/DashboardOutlined")); +const DashboardTwoTone = lazy(() => import("@ant-design/icons/DashboardTwoTone")); +const DatabaseFilled = lazy(() => import("@ant-design/icons/DatabaseFilled")); +const DatabaseOutlined = lazy(() => import("@ant-design/icons/DatabaseOutlined")); +const DatabaseTwoTone = lazy(() => import("@ant-design/icons/DatabaseTwoTone")); +const DeleteColumnOutlined = lazy(() => import("@ant-design/icons/DeleteColumnOutlined")); +const DeleteFilled = lazy(() => import("@ant-design/icons/DeleteFilled")); +const DeleteOutlined = lazy(() => import("@ant-design/icons/DeleteOutlined")); +const DeleteRowOutlined = lazy(() => import("@ant-design/icons/DeleteRowOutlined")); +const DeleteTwoTone = lazy(() => import("@ant-design/icons/DeleteTwoTone")); +const DeliveredProcedureOutlined = lazy(() => import("@ant-design/icons/DeliveredProcedureOutlined")); +const DeploymentUnitOutlined = lazy(() => import("@ant-design/icons/DeploymentUnitOutlined")); +const DesktopOutlined = lazy(() => import("@ant-design/icons/DesktopOutlined")); +const DiffFilled = lazy(() => import("@ant-design/icons/DiffFilled")); +const DiffOutlined = lazy(() => import("@ant-design/icons/DiffOutlined")); +const DiffTwoTone = lazy(() => import("@ant-design/icons/DiffTwoTone")); +const DingdingOutlined = lazy(() => import("@ant-design/icons/DingdingOutlined")); +const DingtalkCircleFilled = lazy(() => import("@ant-design/icons/DingtalkCircleFilled")); +const DingtalkOutlined = lazy(() => import("@ant-design/icons/DingtalkOutlined")); +const DingtalkSquareFilled = lazy(() => import("@ant-design/icons/DingtalkSquareFilled")); +const DisconnectOutlined = lazy(() => import("@ant-design/icons/DisconnectOutlined")); +const DislikeFilled = lazy(() => import("@ant-design/icons/DislikeFilled")); +const DislikeOutlined = lazy(() => import("@ant-design/icons/DislikeOutlined")); +const DislikeTwoTone = lazy(() => import("@ant-design/icons/DislikeTwoTone")); +const DollarCircleFilled = lazy(() => import("@ant-design/icons/DollarCircleFilled")); +const DollarCircleOutlined = lazy(() => import("@ant-design/icons/DollarCircleOutlined")); +const DollarCircleTwoTone = lazy(() => import("@ant-design/icons/DollarCircleTwoTone")); +const DollarOutlined = lazy(() => import("@ant-design/icons/DollarOutlined")); +const DollarTwoTone = lazy(() => import("@ant-design/icons/DollarTwoTone")); +const DotChartOutlined = lazy(() => import("@ant-design/icons/DotChartOutlined")); +const DoubleLeftOutlined = lazy(() => import("@ant-design/icons/DoubleLeftOutlined")); +const DoubleRightOutlined = lazy(() => import("@ant-design/icons/DoubleRightOutlined")); +const DownCircleFilled = lazy(() => import("@ant-design/icons/DownCircleFilled")); +const DownCircleOutlined = lazy(() => import("@ant-design/icons/DownCircleOutlined")); +const DownCircleTwoTone = lazy(() => import("@ant-design/icons/DownCircleTwoTone")); +const DownOutlined = lazy(() => import("@ant-design/icons/DownOutlined")); +const DownSquareFilled = lazy(() => import("@ant-design/icons/DownSquareFilled")); +const DownSquareOutlined = lazy(() => import("@ant-design/icons/DownSquareOutlined")); +const DownSquareTwoTone = lazy(() => import("@ant-design/icons/DownSquareTwoTone")); +const DownloadOutlined = lazy(() => import("@ant-design/icons/DownloadOutlined")); +const DragOutlined = lazy(() => import("@ant-design/icons/DragOutlined")); +const DribbbleCircleFilled = lazy(() => import("@ant-design/icons/DribbbleCircleFilled")); +const DribbbleOutlined = lazy(() => import("@ant-design/icons/DribbbleOutlined")); +const DribbbleSquareFilled = lazy(() => import("@ant-design/icons/DribbbleSquareFilled")); +const DribbbleSquareOutlined = lazy(() => import("@ant-design/icons/DribbbleSquareOutlined")); +const DropboxCircleFilled = lazy(() => import("@ant-design/icons/DropboxCircleFilled")); +const DropboxOutlined = lazy(() => import("@ant-design/icons/DropboxOutlined")); +const DropboxSquareFilled = lazy(() => import("@ant-design/icons/DropboxSquareFilled")); +const EditFilled = lazy(() => import("@ant-design/icons/EditFilled")); +const EditOutlined = lazy(() => import("@ant-design/icons/EditOutlined")); +const EditTwoTone = lazy(() => import("@ant-design/icons/EditTwoTone")); +const EllipsisOutlined = lazy(() => import("@ant-design/icons/EllipsisOutlined")); +const EnterOutlined = lazy(() => import("@ant-design/icons/EnterOutlined")); +const EnvironmentFilled = lazy(() => import("@ant-design/icons/EnvironmentFilled")); +const EnvironmentOutlined = lazy(() => import("@ant-design/icons/EnvironmentOutlined")); +const EnvironmentTwoTone = lazy(() => import("@ant-design/icons/EnvironmentTwoTone")); +const EuroCircleFilled = lazy(() => import("@ant-design/icons/EuroCircleFilled")); +const EuroCircleOutlined = lazy(() => import("@ant-design/icons/EuroCircleOutlined")); +const EuroCircleTwoTone = lazy(() => import("@ant-design/icons/EuroCircleTwoTone")); +const EuroOutlined = lazy(() => import("@ant-design/icons/EuroOutlined")); +const EuroTwoTone = lazy(() => import("@ant-design/icons/EuroTwoTone")); +const ExceptionOutlined = lazy(() => import("@ant-design/icons/ExceptionOutlined")); +const ExclamationCircleFilled = lazy(() => import("@ant-design/icons/ExclamationCircleFilled")); +const ExclamationCircleOutlined = lazy(() => import("@ant-design/icons/ExclamationCircleOutlined")); +const ExclamationCircleTwoTone = lazy(() => import("@ant-design/icons/ExclamationCircleTwoTone")); +const ExclamationOutlined = lazy(() => import("@ant-design/icons/ExclamationOutlined")); +const ExpandAltOutlined = lazy(() => import("@ant-design/icons/ExpandAltOutlined")); +const ExpandOutlined = lazy(() => import("@ant-design/icons/ExpandOutlined")); +const ExperimentFilled = lazy(() => import("@ant-design/icons/ExperimentFilled")); +const ExperimentOutlined = lazy(() => import("@ant-design/icons/ExperimentOutlined")); +const ExperimentTwoTone = lazy(() => import("@ant-design/icons/ExperimentTwoTone")); +const ExportOutlined = lazy(() => import("@ant-design/icons/ExportOutlined")); +const EyeFilled = lazy(() => import("@ant-design/icons/EyeFilled")); +const EyeInvisibleFilled = lazy(() => import("@ant-design/icons/EyeInvisibleFilled")); +const EyeInvisibleOutlined = lazy(() => import("@ant-design/icons/EyeInvisibleOutlined")); +const EyeInvisibleTwoTone = lazy(() => import("@ant-design/icons/EyeInvisibleTwoTone")); +const EyeOutlined = lazy(() => import("@ant-design/icons/EyeOutlined")); +const EyeTwoTone = lazy(() => import("@ant-design/icons/EyeTwoTone")); +const FacebookFilled = lazy(() => import("@ant-design/icons/FacebookFilled")); +const FacebookOutlined = lazy(() => import("@ant-design/icons/FacebookOutlined")); +const FallOutlined = lazy(() => import("@ant-design/icons/FallOutlined")); +const FastBackwardFilled = lazy(() => import("@ant-design/icons/FastBackwardFilled")); +const FastBackwardOutlined = lazy(() => import("@ant-design/icons/FastBackwardOutlined")); +const FastForwardFilled = lazy(() => import("@ant-design/icons/FastForwardFilled")); +const FastForwardOutlined = lazy(() => import("@ant-design/icons/FastForwardOutlined")); +const FieldBinaryOutlined = lazy(() => import("@ant-design/icons/FieldBinaryOutlined")); +const FieldNumberOutlined = lazy(() => import("@ant-design/icons/FieldNumberOutlined")); +const FieldStringOutlined = lazy(() => import("@ant-design/icons/FieldStringOutlined")); +const FieldTimeOutlined = lazy(() => import("@ant-design/icons/FieldTimeOutlined")); +const FileAddFilled = lazy(() => import("@ant-design/icons/FileAddFilled")); +const FileAddOutlined = lazy(() => import("@ant-design/icons/FileAddOutlined")); +const FileAddTwoTone = lazy(() => import("@ant-design/icons/FileAddTwoTone")); +const FileDoneOutlined = lazy(() => import("@ant-design/icons/FileDoneOutlined")); +const FileExcelFilled = lazy(() => import("@ant-design/icons/FileExcelFilled")); +const FileExcelOutlined = lazy(() => import("@ant-design/icons/FileExcelOutlined")); +const FileExcelTwoTone = lazy(() => import("@ant-design/icons/FileExcelTwoTone")); +const FileExclamationFilled = lazy(() => import("@ant-design/icons/FileExclamationFilled")); +const FileExclamationOutlined = lazy(() => import("@ant-design/icons/FileExclamationOutlined")); +const FileExclamationTwoTone = lazy(() => import("@ant-design/icons/FileExclamationTwoTone")); +const FileFilled = lazy(() => import("@ant-design/icons/FileFilled")); +const FileGifOutlined = lazy(() => import("@ant-design/icons/FileGifOutlined")); +const FileImageFilled = lazy(() => import("@ant-design/icons/FileImageFilled")); +const FileImageOutlined = lazy(() => import("@ant-design/icons/FileImageOutlined")); +const FileImageTwoTone = lazy(() => import("@ant-design/icons/FileImageTwoTone")); +const FileJpgOutlined = lazy(() => import("@ant-design/icons/FileJpgOutlined")); +const FileMarkdownFilled = lazy(() => import("@ant-design/icons/FileMarkdownFilled")); +const FileMarkdownOutlined = lazy(() => import("@ant-design/icons/FileMarkdownOutlined")); +const FileMarkdownTwoTone = lazy(() => import("@ant-design/icons/FileMarkdownTwoTone")); +const FileOutlined = lazy(() => import("@ant-design/icons/FileOutlined")); +const FilePdfFilled = lazy(() => import("@ant-design/icons/FilePdfFilled")); +const FilePdfOutlined = lazy(() => import("@ant-design/icons/FilePdfOutlined")); +const FilePdfTwoTone = lazy(() => import("@ant-design/icons/FilePdfTwoTone")); +const FilePptFilled = lazy(() => import("@ant-design/icons/FilePptFilled")); +const FilePptOutlined = lazy(() => import("@ant-design/icons/FilePptOutlined")); +const FilePptTwoTone = lazy(() => import("@ant-design/icons/FilePptTwoTone")); +const FileProtectOutlined = lazy(() => import("@ant-design/icons/FileProtectOutlined")); +const FileSearchOutlined = lazy(() => import("@ant-design/icons/FileSearchOutlined")); +const FileSyncOutlined = lazy(() => import("@ant-design/icons/FileSyncOutlined")); +const FileTextFilled = lazy(() => import("@ant-design/icons/FileTextFilled")); +const FileTextOutlined = lazy(() => import("@ant-design/icons/FileTextOutlined")); +const FileTextTwoTone = lazy(() => import("@ant-design/icons/FileTextTwoTone")); +const FileTwoTone = lazy(() => import("@ant-design/icons/FileTwoTone")); +const FileUnknownFilled = lazy(() => import("@ant-design/icons/FileUnknownFilled")); +const FileUnknownOutlined = lazy(() => import("@ant-design/icons/FileUnknownOutlined")); +const FileUnknownTwoTone = lazy(() => import("@ant-design/icons/FileUnknownTwoTone")); +const FileWordFilled = lazy(() => import("@ant-design/icons/FileWordFilled")); +const FileWordOutlined = lazy(() => import("@ant-design/icons/FileWordOutlined")); +const FileWordTwoTone = lazy(() => import("@ant-design/icons/FileWordTwoTone")); +const FileZipFilled = lazy(() => import("@ant-design/icons/FileZipFilled")); +const FileZipOutlined = lazy(() => import("@ant-design/icons/FileZipOutlined")); +const FileZipTwoTone = lazy(() => import("@ant-design/icons/FileZipTwoTone")); +const FilterFilled = lazy(() => import("@ant-design/icons/FilterFilled")); +const FilterOutlined = lazy(() => import("@ant-design/icons/FilterOutlined")); +const FilterTwoTone = lazy(() => import("@ant-design/icons/FilterTwoTone")); +const FireFilled = lazy(() => import("@ant-design/icons/FireFilled")); +const FireOutlined = lazy(() => import("@ant-design/icons/FireOutlined")); +const FireTwoTone = lazy(() => import("@ant-design/icons/FireTwoTone")); +const FlagFilled = lazy(() => import("@ant-design/icons/FlagFilled")); +const FlagOutlined = lazy(() => import("@ant-design/icons/FlagOutlined")); +const FlagTwoTone = lazy(() => import("@ant-design/icons/FlagTwoTone")); +const FolderAddFilled = lazy(() => import("@ant-design/icons/FolderAddFilled")); +const FolderAddOutlined = lazy(() => import("@ant-design/icons/FolderAddOutlined")); +const FolderAddTwoTone = lazy(() => import("@ant-design/icons/FolderAddTwoTone")); +const FolderFilled = lazy(() => import("@ant-design/icons/FolderFilled")); +const FolderOpenFilled = lazy(() => import("@ant-design/icons/FolderOpenFilled")); +const FolderOpenOutlined = lazy(() => import("@ant-design/icons/FolderOpenOutlined")); +const FolderOpenTwoTone = lazy(() => import("@ant-design/icons/FolderOpenTwoTone")); +const FolderOutlined = lazy(() => import("@ant-design/icons/FolderOutlined")); +const FolderTwoTone = lazy(() => import("@ant-design/icons/FolderTwoTone")); +const FolderViewOutlined = lazy(() => import("@ant-design/icons/FolderViewOutlined")); +const FontColorsOutlined = lazy(() => import("@ant-design/icons/FontColorsOutlined")); +const FontSizeOutlined = lazy(() => import("@ant-design/icons/FontSizeOutlined")); +const ForkOutlined = lazy(() => import("@ant-design/icons/ForkOutlined")); +const FormOutlined = lazy(() => import("@ant-design/icons/FormOutlined")); +const FormatPainterFilled = lazy(() => import("@ant-design/icons/FormatPainterFilled")); +const FormatPainterOutlined = lazy(() => import("@ant-design/icons/FormatPainterOutlined")); +const ForwardFilled = lazy(() => import("@ant-design/icons/ForwardFilled")); +const ForwardOutlined = lazy(() => import("@ant-design/icons/ForwardOutlined")); +const FrownFilled = lazy(() => import("@ant-design/icons/FrownFilled")); +const FrownOutlined = lazy(() => import("@ant-design/icons/FrownOutlined")); +const FrownTwoTone = lazy(() => import("@ant-design/icons/FrownTwoTone")); +const FullscreenExitOutlined = lazy(() => import("@ant-design/icons/FullscreenExitOutlined")); +const FullscreenOutlined = lazy(() => import("@ant-design/icons/FullscreenOutlined")); +const FunctionOutlined = lazy(() => import("@ant-design/icons/FunctionOutlined")); +const FundFilled = lazy(() => import("@ant-design/icons/FundFilled")); +const FundOutlined = lazy(() => import("@ant-design/icons/FundOutlined")); +const FundProjectionScreenOutlined = lazy(() => import("@ant-design/icons/FundProjectionScreenOutlined")); +const FundTwoTone = lazy(() => import("@ant-design/icons/FundTwoTone")); +const FundViewOutlined = lazy(() => import("@ant-design/icons/FundViewOutlined")); +const FunnelPlotFilled = lazy(() => import("@ant-design/icons/FunnelPlotFilled")); +const FunnelPlotOutlined = lazy(() => import("@ant-design/icons/FunnelPlotOutlined")); +const FunnelPlotTwoTone = lazy(() => import("@ant-design/icons/FunnelPlotTwoTone")); +const GatewayOutlined = lazy(() => import("@ant-design/icons/GatewayOutlined")); +const GifOutlined = lazy(() => import("@ant-design/icons/GifOutlined")); +const GiftFilled = lazy(() => import("@ant-design/icons/GiftFilled")); +const GiftOutlined = lazy(() => import("@ant-design/icons/GiftOutlined")); +const GiftTwoTone = lazy(() => import("@ant-design/icons/GiftTwoTone")); +const GithubFilled = lazy(() => import("@ant-design/icons/GithubFilled")); +const GithubOutlined = lazy(() => import("@ant-design/icons/GithubOutlined")); +const GitlabFilled = lazy(() => import("@ant-design/icons/GitlabFilled")); +const GitlabOutlined = lazy(() => import("@ant-design/icons/GitlabOutlined")); +const GlobalOutlined = lazy(() => import("@ant-design/icons/GlobalOutlined")); +const GoldFilled = lazy(() => import("@ant-design/icons/GoldFilled")); +const GoldOutlined = lazy(() => import("@ant-design/icons/GoldOutlined")); +const GoldTwoTone = lazy(() => import("@ant-design/icons/GoldTwoTone")); +const GoldenFilled = lazy(() => import("@ant-design/icons/GoldenFilled")); +const GoogleCircleFilled = lazy(() => import("@ant-design/icons/GoogleCircleFilled")); +const GoogleOutlined = lazy(() => import("@ant-design/icons/GoogleOutlined")); +const GooglePlusCircleFilled = lazy(() => import("@ant-design/icons/GooglePlusCircleFilled")); +const GooglePlusOutlined = lazy(() => import("@ant-design/icons/GooglePlusOutlined")); +const GooglePlusSquareFilled = lazy(() => import("@ant-design/icons/GooglePlusSquareFilled")); +const GoogleSquareFilled = lazy(() => import("@ant-design/icons/GoogleSquareFilled")); +const GroupOutlined = lazy(() => import("@ant-design/icons/GroupOutlined")); +const HddFilled = lazy(() => import("@ant-design/icons/HddFilled")); +const HddOutlined = lazy(() => import("@ant-design/icons/HddOutlined")); +const HddTwoTone = lazy(() => import("@ant-design/icons/HddTwoTone")); +const HeartFilled = lazy(() => import("@ant-design/icons/HeartFilled")); +const HeartOutlined = lazy(() => import("@ant-design/icons/HeartOutlined")); +const HeartTwoTone = lazy(() => import("@ant-design/icons/HeartTwoTone")); +const HeatMapOutlined = lazy(() => import("@ant-design/icons/HeatMapOutlined")); +const HighlightFilled = lazy(() => import("@ant-design/icons/HighlightFilled")); +const HighlightOutlined = lazy(() => import("@ant-design/icons/HighlightOutlined")); +const HighlightTwoTone = lazy(() => import("@ant-design/icons/HighlightTwoTone")); +const HistoryOutlined = lazy(() => import("@ant-design/icons/HistoryOutlined")); +const HolderOutlined = lazy(() => import("@ant-design/icons/HolderOutlined")); +const HomeFilled = lazy(() => import("@ant-design/icons/HomeFilled")); +const HomeOutlined = lazy(() => import("@ant-design/icons/HomeOutlined")); +const HomeTwoTone = lazy(() => import("@ant-design/icons/HomeTwoTone")); +const HourglassFilled = lazy(() => import("@ant-design/icons/HourglassFilled")); +const HourglassOutlined = lazy(() => import("@ant-design/icons/HourglassOutlined")); +const HourglassTwoTone = lazy(() => import("@ant-design/icons/HourglassTwoTone")); +const Html5Filled = lazy(() => import("@ant-design/icons/Html5Filled")); +const Html5Outlined = lazy(() => import("@ant-design/icons/Html5Outlined")); +const Html5TwoTone = lazy(() => import("@ant-design/icons/Html5TwoTone")); +const IdcardFilled = lazy(() => import("@ant-design/icons/IdcardFilled")); +const IdcardOutlined = lazy(() => import("@ant-design/icons/IdcardOutlined")); +const IdcardTwoTone = lazy(() => import("@ant-design/icons/IdcardTwoTone")); +const IeCircleFilled = lazy(() => import("@ant-design/icons/IeCircleFilled")); +const IeOutlined = lazy(() => import("@ant-design/icons/IeOutlined")); +const IeSquareFilled = lazy(() => import("@ant-design/icons/IeSquareFilled")); +const ImportOutlined = lazy(() => import("@ant-design/icons/ImportOutlined")); +const InboxOutlined = lazy(() => import("@ant-design/icons/InboxOutlined")); +const InfoCircleFilled = lazy(() => import("@ant-design/icons/InfoCircleFilled")); +const InfoCircleOutlined = lazy(() => import("@ant-design/icons/InfoCircleOutlined")); +const InfoCircleTwoTone = lazy(() => import("@ant-design/icons/InfoCircleTwoTone")); +const InfoOutlined = lazy(() => import("@ant-design/icons/InfoOutlined")); +const InsertRowAboveOutlined = lazy(() => import("@ant-design/icons/InsertRowAboveOutlined")); +const InsertRowBelowOutlined = lazy(() => import("@ant-design/icons/InsertRowBelowOutlined")); +const InsertRowLeftOutlined = lazy(() => import("@ant-design/icons/InsertRowLeftOutlined")); +const InsertRowRightOutlined = lazy(() => import("@ant-design/icons/InsertRowRightOutlined")); +const InstagramFilled = lazy(() => import("@ant-design/icons/InstagramFilled")); +const InstagramOutlined = lazy(() => import("@ant-design/icons/InstagramOutlined")); +const InsuranceFilled = lazy(() => import("@ant-design/icons/InsuranceFilled")); +const InsuranceOutlined = lazy(() => import("@ant-design/icons/InsuranceOutlined")); +const InsuranceTwoTone = lazy(() => import("@ant-design/icons/InsuranceTwoTone")); +const InteractionFilled = lazy(() => import("@ant-design/icons/InteractionFilled")); +const InteractionOutlined = lazy(() => import("@ant-design/icons/InteractionOutlined")); +const InteractionTwoTone = lazy(() => import("@ant-design/icons/InteractionTwoTone")); +const IssuesCloseOutlined = lazy(() => import("@ant-design/icons/IssuesCloseOutlined")); +const ItalicOutlined = lazy(() => import("@ant-design/icons/ItalicOutlined")); +const KeyOutlined = lazy(() => import("@ant-design/icons/KeyOutlined")); +const LaptopOutlined = lazy(() => import("@ant-design/icons/LaptopOutlined")); +const LayoutFilled = lazy(() => import("@ant-design/icons/LayoutFilled")); +const LayoutOutlined = lazy(() => import("@ant-design/icons/LayoutOutlined")); +const LayoutTwoTone = lazy(() => import("@ant-design/icons/LayoutTwoTone")); +const LeftCircleFilled = lazy(() => import("@ant-design/icons/LeftCircleFilled")); +const LeftCircleOutlined = lazy(() => import("@ant-design/icons/LeftCircleOutlined")); +const LeftCircleTwoTone = lazy(() => import("@ant-design/icons/LeftCircleTwoTone")); +const LeftOutlined = lazy(() => import("@ant-design/icons/LeftOutlined")); +const LeftSquareFilled = lazy(() => import("@ant-design/icons/LeftSquareFilled")); +const LeftSquareOutlined = lazy(() => import("@ant-design/icons/LeftSquareOutlined")); +const LeftSquareTwoTone = lazy(() => import("@ant-design/icons/LeftSquareTwoTone")); +const LikeFilled = lazy(() => import("@ant-design/icons/LikeFilled")); +const LikeOutlined = lazy(() => import("@ant-design/icons/LikeOutlined")); +const LikeTwoTone = lazy(() => import("@ant-design/icons/LikeTwoTone")); +const LineChartOutlined = lazy(() => import("@ant-design/icons/LineChartOutlined")); +const LineHeightOutlined = lazy(() => import("@ant-design/icons/LineHeightOutlined")); +const LineOutlined = lazy(() => import("@ant-design/icons/LineOutlined")); +const LinkOutlined = lazy(() => import("@ant-design/icons/LinkOutlined")); +const LinkedinFilled = lazy(() => import("@ant-design/icons/LinkedinFilled")); +const LinkedinOutlined = lazy(() => import("@ant-design/icons/LinkedinOutlined")); +const Loading3QuartersOutlined = lazy(() => import("@ant-design/icons/Loading3QuartersOutlined")); +const LoadingOutlined = lazy(() => import("@ant-design/icons/LoadingOutlined")); +const LockFilled = lazy(() => import("@ant-design/icons/LockFilled")); +const LockOutlined = lazy(() => import("@ant-design/icons/LockOutlined")); +const LockTwoTone = lazy(() => import("@ant-design/icons/LockTwoTone")); +const LoginOutlined = lazy(() => import("@ant-design/icons/LoginOutlined")); +const LogoutOutlined = lazy(() => import("@ant-design/icons/LogoutOutlined")); +const MacCommandFilled = lazy(() => import("@ant-design/icons/MacCommandFilled")); +const MacCommandOutlined = lazy(() => import("@ant-design/icons/MacCommandOutlined")); +const MailFilled = lazy(() => import("@ant-design/icons/MailFilled")); +const MailOutlined = lazy(() => import("@ant-design/icons/MailOutlined")); +const MailTwoTone = lazy(() => import("@ant-design/icons/MailTwoTone")); +const ManOutlined = lazy(() => import("@ant-design/icons/ManOutlined")); +const MedicineBoxFilled = lazy(() => import("@ant-design/icons/MedicineBoxFilled")); +const MedicineBoxOutlined = lazy(() => import("@ant-design/icons/MedicineBoxOutlined")); +const MedicineBoxTwoTone = lazy(() => import("@ant-design/icons/MedicineBoxTwoTone")); +const MediumCircleFilled = lazy(() => import("@ant-design/icons/MediumCircleFilled")); +const MediumOutlined = lazy(() => import("@ant-design/icons/MediumOutlined")); +const MediumSquareFilled = lazy(() => import("@ant-design/icons/MediumSquareFilled")); +const MediumWorkmarkOutlined = lazy(() => import("@ant-design/icons/MediumWorkmarkOutlined")); +const MehFilled = lazy(() => import("@ant-design/icons/MehFilled")); +const MehOutlined = lazy(() => import("@ant-design/icons/MehOutlined")); +const MehTwoTone = lazy(() => import("@ant-design/icons/MehTwoTone")); +const MenuFoldOutlined = lazy(() => import("@ant-design/icons/MenuFoldOutlined")); +const MenuOutlined = lazy(() => import("@ant-design/icons/MenuOutlined")); +const MenuUnfoldOutlined = lazy(() => import("@ant-design/icons/MenuUnfoldOutlined")); +const MergeCellsOutlined = lazy(() => import("@ant-design/icons/MergeCellsOutlined")); +const MessageFilled = lazy(() => import("@ant-design/icons/MessageFilled")); +const MessageOutlined = lazy(() => import("@ant-design/icons/MessageOutlined")); +const MessageTwoTone = lazy(() => import("@ant-design/icons/MessageTwoTone")); +const MinusCircleFilled = lazy(() => import("@ant-design/icons/MinusCircleFilled")); +const MinusCircleOutlined = lazy(() => import("@ant-design/icons/MinusCircleOutlined")); +const MinusCircleTwoTone = lazy(() => import("@ant-design/icons/MinusCircleTwoTone")); +const MinusOutlined = lazy(() => import("@ant-design/icons/MinusOutlined")); +const MinusSquareFilled = lazy(() => import("@ant-design/icons/MinusSquareFilled")); +const MinusSquareOutlined = lazy(() => import("@ant-design/icons/MinusSquareOutlined")); +const MinusSquareTwoTone = lazy(() => import("@ant-design/icons/MinusSquareTwoTone")); +const MobileFilled = lazy(() => import("@ant-design/icons/MobileFilled")); +const MobileOutlined = lazy(() => import("@ant-design/icons/MobileOutlined")); +const MobileTwoTone = lazy(() => import("@ant-design/icons/MobileTwoTone")); +const MoneyCollectFilled = lazy(() => import("@ant-design/icons/MoneyCollectFilled")); +const MoneyCollectOutlined = lazy(() => import("@ant-design/icons/MoneyCollectOutlined")); +const MoneyCollectTwoTone = lazy(() => import("@ant-design/icons/MoneyCollectTwoTone")); +const MonitorOutlined = lazy(() => import("@ant-design/icons/MonitorOutlined")); +const MoreOutlined = lazy(() => import("@ant-design/icons/MoreOutlined")); +const NodeCollapseOutlined = lazy(() => import("@ant-design/icons/NodeCollapseOutlined")); +const NodeExpandOutlined = lazy(() => import("@ant-design/icons/NodeExpandOutlined")); +const NodeIndexOutlined = lazy(() => import("@ant-design/icons/NodeIndexOutlined")); +const NotificationFilled = lazy(() => import("@ant-design/icons/NotificationFilled")); +const NotificationOutlined = lazy(() => import("@ant-design/icons/NotificationOutlined")); +const NotificationTwoTone = lazy(() => import("@ant-design/icons/NotificationTwoTone")); +const NumberOutlined = lazy(() => import("@ant-design/icons/NumberOutlined")); +const OneToOneOutlined = lazy(() => import("@ant-design/icons/OneToOneOutlined")); +const OrderedListOutlined = lazy(() => import("@ant-design/icons/OrderedListOutlined")); +const PaperClipOutlined = lazy(() => import("@ant-design/icons/PaperClipOutlined")); +const PartitionOutlined = lazy(() => import("@ant-design/icons/PartitionOutlined")); +const PauseCircleFilled = lazy(() => import("@ant-design/icons/PauseCircleFilled")); +const PauseCircleOutlined = lazy(() => import("@ant-design/icons/PauseCircleOutlined")); +const PauseCircleTwoTone = lazy(() => import("@ant-design/icons/PauseCircleTwoTone")); +const PauseOutlined = lazy(() => import("@ant-design/icons/PauseOutlined")); +const PayCircleFilled = lazy(() => import("@ant-design/icons/PayCircleFilled")); +const PayCircleOutlined = lazy(() => import("@ant-design/icons/PayCircleOutlined")); +const PercentageOutlined = lazy(() => import("@ant-design/icons/PercentageOutlined")); +const PhoneFilled = lazy(() => import("@ant-design/icons/PhoneFilled")); +const PhoneOutlined = lazy(() => import("@ant-design/icons/PhoneOutlined")); +const PhoneTwoTone = lazy(() => import("@ant-design/icons/PhoneTwoTone")); +const PicCenterOutlined = lazy(() => import("@ant-design/icons/PicCenterOutlined")); +const PicLeftOutlined = lazy(() => import("@ant-design/icons/PicLeftOutlined")); +const PicRightOutlined = lazy(() => import("@ant-design/icons/PicRightOutlined")); +const PictureFilled = lazy(() => import("@ant-design/icons/PictureFilled")); +const PictureOutlined = lazy(() => import("@ant-design/icons/PictureOutlined")); +const PictureTwoTone = lazy(() => import("@ant-design/icons/PictureTwoTone")); +const PieChartFilled = lazy(() => import("@ant-design/icons/PieChartFilled")); +const PieChartOutlined = lazy(() => import("@ant-design/icons/PieChartOutlined")); +const PieChartTwoTone = lazy(() => import("@ant-design/icons/PieChartTwoTone")); +const PlayCircleFilled = lazy(() => import("@ant-design/icons/PlayCircleFilled")); +const PlayCircleOutlined = lazy(() => import("@ant-design/icons/PlayCircleOutlined")); +const PlayCircleTwoTone = lazy(() => import("@ant-design/icons/PlayCircleTwoTone")); +const PlaySquareFilled = lazy(() => import("@ant-design/icons/PlaySquareFilled")); +const PlaySquareOutlined = lazy(() => import("@ant-design/icons/PlaySquareOutlined")); +const PlaySquareTwoTone = lazy(() => import("@ant-design/icons/PlaySquareTwoTone")); +const PlusCircleFilled = lazy(() => import("@ant-design/icons/PlusCircleFilled")); +const PlusCircleOutlined = lazy(() => import("@ant-design/icons/PlusCircleOutlined")); +const PlusCircleTwoTone = lazy(() => import("@ant-design/icons/PlusCircleTwoTone")); +const PlusOutlined = lazy(() => import("@ant-design/icons/PlusOutlined")); +const PlusSquareFilled = lazy(() => import("@ant-design/icons/PlusSquareFilled")); +const PlusSquareOutlined = lazy(() => import("@ant-design/icons/PlusSquareOutlined")); +const PlusSquareTwoTone = lazy(() => import("@ant-design/icons/PlusSquareTwoTone")); +const PoundCircleFilled = lazy(() => import("@ant-design/icons/PoundCircleFilled")); +const PoundCircleOutlined = lazy(() => import("@ant-design/icons/PoundCircleOutlined")); +const PoundCircleTwoTone = lazy(() => import("@ant-design/icons/PoundCircleTwoTone")); +const PoundOutlined = lazy(() => import("@ant-design/icons/PoundOutlined")); +const PoweroffOutlined = lazy(() => import("@ant-design/icons/PoweroffOutlined")); +const PrinterFilled = lazy(() => import("@ant-design/icons/PrinterFilled")); +const PrinterOutlined = lazy(() => import("@ant-design/icons/PrinterOutlined")); +const PrinterTwoTone = lazy(() => import("@ant-design/icons/PrinterTwoTone")); +const ProfileFilled = lazy(() => import("@ant-design/icons/ProfileFilled")); +const ProfileOutlined = lazy(() => import("@ant-design/icons/ProfileOutlined")); +const ProfileTwoTone = lazy(() => import("@ant-design/icons/ProfileTwoTone")); +const ProjectFilled = lazy(() => import("@ant-design/icons/ProjectFilled")); +const ProjectOutlined = lazy(() => import("@ant-design/icons/ProjectOutlined")); +const ProjectTwoTone = lazy(() => import("@ant-design/icons/ProjectTwoTone")); +const PropertySafetyFilled = lazy(() => import("@ant-design/icons/PropertySafetyFilled")); +const PropertySafetyOutlined = lazy(() => import("@ant-design/icons/PropertySafetyOutlined")); +const PropertySafetyTwoTone = lazy(() => import("@ant-design/icons/PropertySafetyTwoTone")); +const PullRequestOutlined = lazy(() => import("@ant-design/icons/PullRequestOutlined")); +const PushpinFilled = lazy(() => import("@ant-design/icons/PushpinFilled")); +const PushpinOutlined = lazy(() => import("@ant-design/icons/PushpinOutlined")); +const PushpinTwoTone = lazy(() => import("@ant-design/icons/PushpinTwoTone")); +const QqCircleFilled = lazy(() => import("@ant-design/icons/QqCircleFilled")); +const QqOutlined = lazy(() => import("@ant-design/icons/QqOutlined")); +const QqSquareFilled = lazy(() => import("@ant-design/icons/QqSquareFilled")); +const QrcodeOutlined = lazy(() => import("@ant-design/icons/QrcodeOutlined")); +const QuestionCircleFilled = lazy(() => import("@ant-design/icons/QuestionCircleFilled")); +const QuestionCircleOutlined = lazy(() => import("@ant-design/icons/QuestionCircleOutlined")); +const QuestionCircleTwoTone = lazy(() => import("@ant-design/icons/QuestionCircleTwoTone")); +const QuestionOutlined = lazy(() => import("@ant-design/icons/QuestionOutlined")); +const RadarChartOutlined = lazy(() => import("@ant-design/icons/RadarChartOutlined")); +const RadiusBottomleftOutlined = lazy(() => import("@ant-design/icons/RadiusBottomleftOutlined")); +const RadiusBottomrightOutlined = lazy(() => import("@ant-design/icons/RadiusBottomrightOutlined")); +const RadiusSettingOutlined = lazy(() => import("@ant-design/icons/RadiusSettingOutlined")); +const RadiusUpleftOutlined = lazy(() => import("@ant-design/icons/RadiusUpleftOutlined")); +const RadiusUprightOutlined = lazy(() => import("@ant-design/icons/RadiusUprightOutlined")); +const ReadFilled = lazy(() => import("@ant-design/icons/ReadFilled")); +const ReadOutlined = lazy(() => import("@ant-design/icons/ReadOutlined")); +const ReconciliationFilled = lazy(() => import("@ant-design/icons/ReconciliationFilled")); +const ReconciliationOutlined = lazy(() => import("@ant-design/icons/ReconciliationOutlined")); +const ReconciliationTwoTone = lazy(() => import("@ant-design/icons/ReconciliationTwoTone")); +const RedEnvelopeFilled = lazy(() => import("@ant-design/icons/RedEnvelopeFilled")); +const RedEnvelopeOutlined = lazy(() => import("@ant-design/icons/RedEnvelopeOutlined")); +const RedEnvelopeTwoTone = lazy(() => import("@ant-design/icons/RedEnvelopeTwoTone")); +const RedditCircleFilled = lazy(() => import("@ant-design/icons/RedditCircleFilled")); +const RedditOutlined = lazy(() => import("@ant-design/icons/RedditOutlined")); +const RedditSquareFilled = lazy(() => import("@ant-design/icons/RedditSquareFilled")); +const RedoOutlined = lazy(() => import("@ant-design/icons/RedoOutlined")); +const ReloadOutlined = lazy(() => import("@ant-design/icons/ReloadOutlined")); +const RestFilled = lazy(() => import("@ant-design/icons/RestFilled")); +const RestOutlined = lazy(() => import("@ant-design/icons/RestOutlined")); +const RestTwoTone = lazy(() => import("@ant-design/icons/RestTwoTone")); +const RetweetOutlined = lazy(() => import("@ant-design/icons/RetweetOutlined")); +const RightCircleFilled = lazy(() => import("@ant-design/icons/RightCircleFilled")); +const RightCircleOutlined = lazy(() => import("@ant-design/icons/RightCircleOutlined")); +const RightCircleTwoTone = lazy(() => import("@ant-design/icons/RightCircleTwoTone")); +const RightOutlined = lazy(() => import("@ant-design/icons/RightOutlined")); +const RightSquareFilled = lazy(() => import("@ant-design/icons/RightSquareFilled")); +const RightSquareOutlined = lazy(() => import("@ant-design/icons/RightSquareOutlined")); +const RightSquareTwoTone = lazy(() => import("@ant-design/icons/RightSquareTwoTone")); +const RiseOutlined = lazy(() => import("@ant-design/icons/RiseOutlined")); +const RobotFilled = lazy(() => import("@ant-design/icons/RobotFilled")); +const RobotOutlined = lazy(() => import("@ant-design/icons/RobotOutlined")); +const RocketFilled = lazy(() => import("@ant-design/icons/RocketFilled")); +const RocketOutlined = lazy(() => import("@ant-design/icons/RocketOutlined")); +const RocketTwoTone = lazy(() => import("@ant-design/icons/RocketTwoTone")); +const RollbackOutlined = lazy(() => import("@ant-design/icons/RollbackOutlined")); +const RotateLeftOutlined = lazy(() => import("@ant-design/icons/RotateLeftOutlined")); +const RotateRightOutlined = lazy(() => import("@ant-design/icons/RotateRightOutlined")); +const SafetyCertificateFilled = lazy(() => import("@ant-design/icons/SafetyCertificateFilled")); +const SafetyCertificateOutlined = lazy(() => import("@ant-design/icons/SafetyCertificateOutlined")); +const SafetyCertificateTwoTone = lazy(() => import("@ant-design/icons/SafetyCertificateTwoTone")); +const SafetyOutlined = lazy(() => import("@ant-design/icons/SafetyOutlined")); +const SaveFilled = lazy(() => import("@ant-design/icons/SaveFilled")); +const SaveOutlined = lazy(() => import("@ant-design/icons/SaveOutlined")); +const SaveTwoTone = lazy(() => import("@ant-design/icons/SaveTwoTone")); +const ScanOutlined = lazy(() => import("@ant-design/icons/ScanOutlined")); +const ScheduleFilled = lazy(() => import("@ant-design/icons/ScheduleFilled")); +const ScheduleOutlined = lazy(() => import("@ant-design/icons/ScheduleOutlined")); +const ScheduleTwoTone = lazy(() => import("@ant-design/icons/ScheduleTwoTone")); +const ScissorOutlined = lazy(() => import("@ant-design/icons/ScissorOutlined")); +const SearchOutlined = lazy(() => import("@ant-design/icons/SearchOutlined")); +const SecurityScanFilled = lazy(() => import("@ant-design/icons/SecurityScanFilled")); +const SecurityScanOutlined = lazy(() => import("@ant-design/icons/SecurityScanOutlined")); +const SecurityScanTwoTone = lazy(() => import("@ant-design/icons/SecurityScanTwoTone")); +const SelectOutlined = lazy(() => import("@ant-design/icons/SelectOutlined")); +const SendOutlined = lazy(() => import("@ant-design/icons/SendOutlined")); +const SettingFilled = lazy(() => import("@ant-design/icons/SettingFilled")); +const SettingOutlined = lazy(() => import("@ant-design/icons/SettingOutlined")); +const SettingTwoTone = lazy(() => import("@ant-design/icons/SettingTwoTone")); +const ShakeOutlined = lazy(() => import("@ant-design/icons/ShakeOutlined")); +const ShareAltOutlined = lazy(() => import("@ant-design/icons/ShareAltOutlined")); +const ShopFilled = lazy(() => import("@ant-design/icons/ShopFilled")); +const ShopOutlined = lazy(() => import("@ant-design/icons/ShopOutlined")); +const ShopTwoTone = lazy(() => import("@ant-design/icons/ShopTwoTone")); +const ShoppingCartOutlined = lazy(() => import("@ant-design/icons/ShoppingCartOutlined")); +const ShoppingFilled = lazy(() => import("@ant-design/icons/ShoppingFilled")); +const ShoppingOutlined = lazy(() => import("@ant-design/icons/ShoppingOutlined")); +const ShoppingTwoTone = lazy(() => import("@ant-design/icons/ShoppingTwoTone")); +const ShrinkOutlined = lazy(() => import("@ant-design/icons/ShrinkOutlined")); +const SignalFilled = lazy(() => import("@ant-design/icons/SignalFilled")); +const SisternodeOutlined = lazy(() => import("@ant-design/icons/SisternodeOutlined")); +const SketchCircleFilled = lazy(() => import("@ant-design/icons/SketchCircleFilled")); +const SketchOutlined = lazy(() => import("@ant-design/icons/SketchOutlined")); +const SketchSquareFilled = lazy(() => import("@ant-design/icons/SketchSquareFilled")); +const SkinFilled = lazy(() => import("@ant-design/icons/SkinFilled")); +const SkinOutlined = lazy(() => import("@ant-design/icons/SkinOutlined")); +const SkinTwoTone = lazy(() => import("@ant-design/icons/SkinTwoTone")); +const SkypeFilled = lazy(() => import("@ant-design/icons/SkypeFilled")); +const SkypeOutlined = lazy(() => import("@ant-design/icons/SkypeOutlined")); +const SlackCircleFilled = lazy(() => import("@ant-design/icons/SlackCircleFilled")); +const SlackOutlined = lazy(() => import("@ant-design/icons/SlackOutlined")); +const SlackSquareFilled = lazy(() => import("@ant-design/icons/SlackSquareFilled")); +const SlackSquareOutlined = lazy(() => import("@ant-design/icons/SlackSquareOutlined")); +const SlidersFilled = lazy(() => import("@ant-design/icons/SlidersFilled")); +const SlidersOutlined = lazy(() => import("@ant-design/icons/SlidersOutlined")); +const SlidersTwoTone = lazy(() => import("@ant-design/icons/SlidersTwoTone")); +const SmallDashOutlined = lazy(() => import("@ant-design/icons/SmallDashOutlined")); +const SmileFilled = lazy(() => import("@ant-design/icons/SmileFilled")); +const SmileOutlined = lazy(() => import("@ant-design/icons/SmileOutlined")); +const SmileTwoTone = lazy(() => import("@ant-design/icons/SmileTwoTone")); +const SnippetsFilled = lazy(() => import("@ant-design/icons/SnippetsFilled")); +const SnippetsOutlined = lazy(() => import("@ant-design/icons/SnippetsOutlined")); +const SnippetsTwoTone = lazy(() => import("@ant-design/icons/SnippetsTwoTone")); +const SolutionOutlined = lazy(() => import("@ant-design/icons/SolutionOutlined")); +const SortAscendingOutlined = lazy(() => import("@ant-design/icons/SortAscendingOutlined")); +const SortDescendingOutlined = lazy(() => import("@ant-design/icons/SortDescendingOutlined")); +const SoundFilled = lazy(() => import("@ant-design/icons/SoundFilled")); +const SoundOutlined = lazy(() => import("@ant-design/icons/SoundOutlined")); +const SoundTwoTone = lazy(() => import("@ant-design/icons/SoundTwoTone")); +const SplitCellsOutlined = lazy(() => import("@ant-design/icons/SplitCellsOutlined")); +const StarFilled = lazy(() => import("@ant-design/icons/StarFilled")); +const StarOutlined = lazy(() => import("@ant-design/icons/StarOutlined")); +const StarTwoTone = lazy(() => import("@ant-design/icons/StarTwoTone")); +const StepBackwardFilled = lazy(() => import("@ant-design/icons/StepBackwardFilled")); +const StepBackwardOutlined = lazy(() => import("@ant-design/icons/StepBackwardOutlined")); +const StepForwardFilled = lazy(() => import("@ant-design/icons/StepForwardFilled")); +const StepForwardOutlined = lazy(() => import("@ant-design/icons/StepForwardOutlined")); +const StockOutlined = lazy(() => import("@ant-design/icons/StockOutlined")); +const StopFilled = lazy(() => import("@ant-design/icons/StopFilled")); +const StopOutlined = lazy(() => import("@ant-design/icons/StopOutlined")); +const StopTwoTone = lazy(() => import("@ant-design/icons/StopTwoTone")); +const StrikethroughOutlined = lazy(() => import("@ant-design/icons/StrikethroughOutlined")); +const SubnodeOutlined = lazy(() => import("@ant-design/icons/SubnodeOutlined")); +const SwapLeftOutlined = lazy(() => import("@ant-design/icons/SwapLeftOutlined")); +const SwapOutlined = lazy(() => import("@ant-design/icons/SwapOutlined")); +const SwapRightOutlined = lazy(() => import("@ant-design/icons/SwapRightOutlined")); +const SwitcherFilled = lazy(() => import("@ant-design/icons/SwitcherFilled")); +const SwitcherOutlined = lazy(() => import("@ant-design/icons/SwitcherOutlined")); +const SwitcherTwoTone = lazy(() => import("@ant-design/icons/SwitcherTwoTone")); +const SyncOutlined = lazy(() => import("@ant-design/icons/SyncOutlined")); +const TableOutlined = lazy(() => import("@ant-design/icons/TableOutlined")); +const TabletFilled = lazy(() => import("@ant-design/icons/TabletFilled")); +const TabletOutlined = lazy(() => import("@ant-design/icons/TabletOutlined")); +const TabletTwoTone = lazy(() => import("@ant-design/icons/TabletTwoTone")); +const TagFilled = lazy(() => import("@ant-design/icons/TagFilled")); +const TagOutlined = lazy(() => import("@ant-design/icons/TagOutlined")); +const TagTwoTone = lazy(() => import("@ant-design/icons/TagTwoTone")); +const TagsFilled = lazy(() => import("@ant-design/icons/TagsFilled")); +const TagsOutlined = lazy(() => import("@ant-design/icons/TagsOutlined")); +const TagsTwoTone = lazy(() => import("@ant-design/icons/TagsTwoTone")); +const TaobaoCircleFilled = lazy(() => import("@ant-design/icons/TaobaoCircleFilled")); +const TaobaoCircleOutlined = lazy(() => import("@ant-design/icons/TaobaoCircleOutlined")); +const TaobaoOutlined = lazy(() => import("@ant-design/icons/TaobaoOutlined")); +const TaobaoSquareFilled = lazy(() => import("@ant-design/icons/TaobaoSquareFilled")); +const TeamOutlined = lazy(() => import("@ant-design/icons/TeamOutlined")); +const ThunderboltFilled = lazy(() => import("@ant-design/icons/ThunderboltFilled")); +const ThunderboltOutlined = lazy(() => import("@ant-design/icons/ThunderboltOutlined")); +const ThunderboltTwoTone = lazy(() => import("@ant-design/icons/ThunderboltTwoTone")); +const ToTopOutlined = lazy(() => import("@ant-design/icons/ToTopOutlined")); +const ToolFilled = lazy(() => import("@ant-design/icons/ToolFilled")); +const ToolOutlined = lazy(() => import("@ant-design/icons/ToolOutlined")); +const ToolTwoTone = lazy(() => import("@ant-design/icons/ToolTwoTone")); +const TrademarkCircleFilled = lazy(() => import("@ant-design/icons/TrademarkCircleFilled")); +const TrademarkCircleOutlined = lazy(() => import("@ant-design/icons/TrademarkCircleOutlined")); +const TrademarkCircleTwoTone = lazy(() => import("@ant-design/icons/TrademarkCircleTwoTone")); +const TrademarkOutlined = lazy(() => import("@ant-design/icons/TrademarkOutlined")); +const TransactionOutlined = lazy(() => import("@ant-design/icons/TransactionOutlined")); +const TranslationOutlined = lazy(() => import("@ant-design/icons/TranslationOutlined")); +const TrophyFilled = lazy(() => import("@ant-design/icons/TrophyFilled")); +const TrophyOutlined = lazy(() => import("@ant-design/icons/TrophyOutlined")); +const TrophyTwoTone = lazy(() => import("@ant-design/icons/TrophyTwoTone")); +const TwitterCircleFilled = lazy(() => import("@ant-design/icons/TwitterCircleFilled")); +const TwitterOutlined = lazy(() => import("@ant-design/icons/TwitterOutlined")); +const TwitterSquareFilled = lazy(() => import("@ant-design/icons/TwitterSquareFilled")); +const UnderlineOutlined = lazy(() => import("@ant-design/icons/UnderlineOutlined")); +const UndoOutlined = lazy(() => import("@ant-design/icons/UndoOutlined")); +const UngroupOutlined = lazy(() => import("@ant-design/icons/UngroupOutlined")); +const UnlockFilled = lazy(() => import("@ant-design/icons/UnlockFilled")); +const UnlockOutlined = lazy(() => import("@ant-design/icons/UnlockOutlined")); +const UnlockTwoTone = lazy(() => import("@ant-design/icons/UnlockTwoTone")); +const UnorderedListOutlined = lazy(() => import("@ant-design/icons/UnorderedListOutlined")); +const UpCircleFilled = lazy(() => import("@ant-design/icons/UpCircleFilled")); +const UpCircleOutlined = lazy(() => import("@ant-design/icons/UpCircleOutlined")); +const UpCircleTwoTone = lazy(() => import("@ant-design/icons/UpCircleTwoTone")); +const UpOutlined = lazy(() => import("@ant-design/icons/UpOutlined")); +const UpSquareFilled = lazy(() => import("@ant-design/icons/UpSquareFilled")); +const UpSquareOutlined = lazy(() => import("@ant-design/icons/UpSquareOutlined")); +const UpSquareTwoTone = lazy(() => import("@ant-design/icons/UpSquareTwoTone")); +const UploadOutlined = lazy(() => import("@ant-design/icons/UploadOutlined")); +const UsbFilled = lazy(() => import("@ant-design/icons/UsbFilled")); +const UsbOutlined = lazy(() => import("@ant-design/icons/UsbOutlined")); +const UsbTwoTone = lazy(() => import("@ant-design/icons/UsbTwoTone")); +const UserAddOutlined = lazy(() => import("@ant-design/icons/UserAddOutlined")); +const UserDeleteOutlined = lazy(() => import("@ant-design/icons/UserDeleteOutlined")); +const UserOutlined = lazy(() => import("@ant-design/icons/UserOutlined")); +const UserSwitchOutlined = lazy(() => import("@ant-design/icons/UserSwitchOutlined")); +const UsergroupAddOutlined = lazy(() => import("@ant-design/icons/UsergroupAddOutlined")); +const UsergroupDeleteOutlined = lazy(() => import("@ant-design/icons/UsergroupDeleteOutlined")); +const VerifiedOutlined = lazy(() => import("@ant-design/icons/VerifiedOutlined")); +const VerticalAlignBottomOutlined = lazy(() => import("@ant-design/icons/VerticalAlignBottomOutlined")); +const VerticalAlignMiddleOutlined = lazy(() => import("@ant-design/icons/VerticalAlignMiddleOutlined")); +const VerticalAlignTopOutlined = lazy(() => import("@ant-design/icons/VerticalAlignTopOutlined")); +const VerticalLeftOutlined = lazy(() => import("@ant-design/icons/VerticalLeftOutlined")); +const VerticalRightOutlined = lazy(() => import("@ant-design/icons/VerticalRightOutlined")); +const VideoCameraAddOutlined = lazy(() => import("@ant-design/icons/VideoCameraAddOutlined")); +const VideoCameraFilled = lazy(() => import("@ant-design/icons/VideoCameraFilled")); +const VideoCameraOutlined = lazy(() => import("@ant-design/icons/VideoCameraOutlined")); +const VideoCameraTwoTone = lazy(() => import("@ant-design/icons/VideoCameraTwoTone")); +const WalletFilled = lazy(() => import("@ant-design/icons/WalletFilled")); +const WalletOutlined = lazy(() => import("@ant-design/icons/WalletOutlined")); +const WalletTwoTone = lazy(() => import("@ant-design/icons/WalletTwoTone")); +const WarningFilled = lazy(() => import("@ant-design/icons/WarningFilled")); +const WarningOutlined = lazy(() => import("@ant-design/icons/WarningOutlined")); +const WarningTwoTone = lazy(() => import("@ant-design/icons/WarningTwoTone")); +const WechatFilled = lazy(() => import("@ant-design/icons/WechatFilled")); +const WechatOutlined = lazy(() => import("@ant-design/icons/WechatOutlined")); +const WeiboCircleFilled = lazy(() => import("@ant-design/icons/WeiboCircleFilled")); +const WeiboCircleOutlined = lazy(() => import("@ant-design/icons/WeiboCircleOutlined")); +const WeiboOutlined = lazy(() => import("@ant-design/icons/WeiboOutlined")); +const WeiboSquareFilled = lazy(() => import("@ant-design/icons/WeiboSquareFilled")); +const WeiboSquareOutlined = lazy(() => import("@ant-design/icons/WeiboSquareOutlined")); +const WhatsAppOutlined = lazy(() => import("@ant-design/icons/WhatsAppOutlined")); +const WifiOutlined = lazy(() => import("@ant-design/icons/WifiOutlined")); +const WindowsFilled = lazy(() => import("@ant-design/icons/WindowsFilled")); +const WindowsOutlined = lazy(() => import("@ant-design/icons/WindowsOutlined")); +const WomanOutlined = lazy(() => import("@ant-design/icons/WomanOutlined")); +const YahooFilled = lazy(() => import("@ant-design/icons/YahooFilled")); +const YahooOutlined = lazy(() => import("@ant-design/icons/YahooOutlined")); +const YoutubeFilled = lazy(() => import("@ant-design/icons/YoutubeFilled")); +const YoutubeOutlined = lazy(() => import("@ant-design/icons/YoutubeOutlined")); +const YuqueFilled = lazy(() => import("@ant-design/icons/YuqueFilled")); +const YuqueOutlined = lazy(() => import("@ant-design/icons/YuqueOutlined")); +const ZhihuCircleFilled = lazy(() => import("@ant-design/icons/ZhihuCircleFilled")); +const ZhihuOutlined = lazy(() => import("@ant-design/icons/ZhihuOutlined")); +const ZhihuSquareFilled = lazy(() => import("@ant-design/icons/ZhihuSquareFilled")); +const ZoomInOutlined = lazy(() => import("@ant-design/icons/ZoomInOutlined")); +const ZoomOutOutlined = lazy(() => import("@ant-design/icons/ZoomOutOutlined")); export const ANTDICON = { accountbookfilled: , diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ad.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ad.svg new file mode 100644 index 000000000..4bd91b72b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ad.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ae.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ae.svg new file mode 100644 index 000000000..b59e11352 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ae.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/af.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/af.svg new file mode 100644 index 000000000..0b7939c69 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/af.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ag.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ag.svg new file mode 100644 index 000000000..9b951b6a5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ag.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ai.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ai.svg new file mode 100644 index 000000000..eeaebcf64 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ai.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/al.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/al.svg new file mode 100644 index 000000000..15ee8bbe2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/al.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/am.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/am.svg new file mode 100644 index 000000000..a188adfe4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/am.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ao.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ao.svg new file mode 100644 index 000000000..46d6600ad --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/aq.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/aq.svg new file mode 100644 index 000000000..a4d9a201f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/aq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ar.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ar.svg new file mode 100644 index 000000000..984d6ea6a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ar.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/arab.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/arab.svg new file mode 100644 index 000000000..841f11adf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/arab.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/as.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/as.svg new file mode 100644 index 000000000..b0789e9c9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/as.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/at.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/at.svg new file mode 100644 index 000000000..473631911 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/at.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/au.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/au.svg new file mode 100644 index 000000000..38bb24505 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/au.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/aw.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/aw.svg new file mode 100644 index 000000000..1f03d61a2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/aw.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ax.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ax.svg new file mode 100644 index 000000000..481d2a33c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/az.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/az.svg new file mode 100644 index 000000000..d692e2250 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/az.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ba.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ba.svg new file mode 100644 index 000000000..456ca1236 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ba.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bb.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bb.svg new file mode 100644 index 000000000..5af2bd030 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bd.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bd.svg new file mode 100644 index 000000000..86fcfbab0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/be.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/be.svg new file mode 100644 index 000000000..31d6210c7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/be.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bf.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bf.svg new file mode 100644 index 000000000..a5078df3f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bg.svg new file mode 100644 index 000000000..16fe7e0ec --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bh.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bh.svg new file mode 100644 index 000000000..2d131aa59 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bh.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bi.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bi.svg new file mode 100644 index 000000000..36a0d3a68 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bi.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bj.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bj.svg new file mode 100644 index 000000000..bb27414c0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bl.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bl.svg new file mode 100644 index 000000000..65550d936 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bm.svg new file mode 100644 index 000000000..b4df19244 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bm.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bn.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bn.svg new file mode 100644 index 000000000..b536651cf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bn.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bo.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bo.svg new file mode 100644 index 000000000..b69b23089 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bo.svg @@ -0,0 +1,674 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bq.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bq.svg new file mode 100644 index 000000000..4b9168e13 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/br.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/br.svg new file mode 100644 index 000000000..be62f6ff9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/br.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bs.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bs.svg new file mode 100644 index 000000000..0faa4bbac --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bs.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bt.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bt.svg new file mode 100644 index 000000000..81f6788c0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bt.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bv.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bv.svg new file mode 100644 index 000000000..dcc6ad106 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bw.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bw.svg new file mode 100644 index 000000000..328e13c11 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bw.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/by.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/by.svg new file mode 100644 index 000000000..ab7984dc9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/by.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/bz.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/bz.svg new file mode 100644 index 000000000..e99106a56 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/bz.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ca.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ca.svg new file mode 100644 index 000000000..84cde348e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ca.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cc.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cc.svg new file mode 100644 index 000000000..f6c1755ce --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cc.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cd.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cd.svg new file mode 100644 index 000000000..ea1772873 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cefta.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cefta.svg new file mode 100644 index 000000000..ff1a19bb6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cefta.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cf.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cf.svg new file mode 100644 index 000000000..b0625db75 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cg.svg new file mode 100644 index 000000000..f7868842f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ch.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ch.svg new file mode 100644 index 000000000..52578bfde --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ci.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ci.svg new file mode 100644 index 000000000..2abf64119 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ci.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ck.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ck.svg new file mode 100644 index 000000000..43a105763 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ck.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cl.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cl.svg new file mode 100644 index 000000000..5fb6096b7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cm.svg new file mode 100644 index 000000000..ed4952b43 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cn.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cn.svg new file mode 100644 index 000000000..e152f0166 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/co.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/co.svg new file mode 100644 index 000000000..5804bfe48 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/co.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cp.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cp.svg new file mode 100644 index 000000000..ea3bfdcb4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cr.svg new file mode 100644 index 000000000..4e7889e22 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cu.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cu.svg new file mode 100644 index 000000000..a28490235 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cu.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cv.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cv.svg new file mode 100644 index 000000000..1170cd767 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cw.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cw.svg new file mode 100644 index 000000000..57062abaa --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cx.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cx.svg new file mode 100644 index 000000000..f14536f03 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cx.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cy.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cy.svg new file mode 100644 index 000000000..39a87c870 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/cz.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/cz.svg new file mode 100644 index 000000000..dcd0a6b1e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/cz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/de.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/de.svg new file mode 100644 index 000000000..05a0a69ae --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/de.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/dg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/dg.svg new file mode 100644 index 000000000..0b8baf149 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/dg.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/dj.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/dj.svg new file mode 100644 index 000000000..f5534d2a0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/dj.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/dk.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/dk.svg new file mode 100644 index 000000000..5aaaa1906 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/dk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/dm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/dm.svg new file mode 100644 index 000000000..6f8f36646 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/dm.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/do.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/do.svg new file mode 100644 index 000000000..867e12d1a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/do.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/dz.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/dz.svg new file mode 100644 index 000000000..8abcd258e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/dz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/eac.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/eac.svg new file mode 100644 index 000000000..385fe9d66 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/eac.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ec.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ec.svg new file mode 100644 index 000000000..9545c5ddd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ec.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ee.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ee.svg new file mode 100644 index 000000000..f1f0a8de2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ee.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/eg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/eg.svg new file mode 100644 index 000000000..3ef77112c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/eg.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/eh.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/eh.svg new file mode 100644 index 000000000..ae509fa8b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/eh.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/er.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/er.svg new file mode 100644 index 000000000..0f140e092 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/er.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/es-ct.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/es-ct.svg new file mode 100644 index 000000000..a06a2e3d3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/es-ct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/es-ga.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/es-ga.svg new file mode 100644 index 000000000..2fecfa090 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/es-ga.svg @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/es-pv.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/es-pv.svg new file mode 100644 index 000000000..7d383ed5e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/es-pv.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/es.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/es.svg new file mode 100644 index 000000000..0e6338fac --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/es.svg @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/et.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/et.svg new file mode 100644 index 000000000..eb7f3c423 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/et.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/eu.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/eu.svg new file mode 100644 index 000000000..4a07fbe58 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/eu.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/fi.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/fi.svg new file mode 100644 index 000000000..aba2ef3b0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/fi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/fj.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/fj.svg new file mode 100644 index 000000000..7a1cade2d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/fj.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/fk.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/fk.svg new file mode 100644 index 000000000..21e654f22 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/fk.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/fm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/fm.svg new file mode 100644 index 000000000..4f7d31324 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/fm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/fo.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/fo.svg new file mode 100644 index 000000000..eec994583 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/fo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/fr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/fr.svg new file mode 100644 index 000000000..0f60170fc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/fr.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ga.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ga.svg new file mode 100644 index 000000000..113a5b58a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ga.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gb-eng.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gb-eng.svg new file mode 100644 index 000000000..ee48fed99 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gb-eng.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gb-nir.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gb-nir.svg new file mode 100644 index 000000000..77a91f071 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gb-nir.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gb-sct.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gb-sct.svg new file mode 100644 index 000000000..44d38cc10 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gb-sct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gb-wls.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gb-wls.svg new file mode 100644 index 000000000..31268824c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gb-wls.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gb.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gb.svg new file mode 100644 index 000000000..ce4d1e000 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gb.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gd.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gd.svg new file mode 100644 index 000000000..c3b2cef56 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ge.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ge.svg new file mode 100644 index 000000000..53b709fc1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ge.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gf.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gf.svg new file mode 100644 index 000000000..9cf5aa2b1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gg.svg new file mode 100644 index 000000000..480f5503f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gh.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gh.svg new file mode 100644 index 000000000..a64271b84 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gh.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gi.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gi.svg new file mode 100644 index 000000000..7b26bb2e9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gi.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gl.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gl.svg new file mode 100644 index 000000000..eaa817b1a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gl.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gm.svg new file mode 100644 index 000000000..2a8f72443 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gm.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gn.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gn.svg new file mode 100644 index 000000000..ae81f9d7b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gp.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gp.svg new file mode 100644 index 000000000..9dd8e3bba --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gp.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gq.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gq.svg new file mode 100644 index 000000000..5fd7b6a17 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gq.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gr.svg new file mode 100644 index 000000000..a2688303a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gs.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gs.svg new file mode 100644 index 000000000..1db72cffb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gs.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gt.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gt.svg new file mode 100644 index 000000000..97ea6aa5b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gt.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gu.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gu.svg new file mode 100644 index 000000000..57024874f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gu.svg @@ -0,0 +1,23 @@ + + + + + + + + + + G + U + A + M + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gw.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gw.svg new file mode 100644 index 000000000..61a054812 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gw.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/gy.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/gy.svg new file mode 100644 index 000000000..35e2f08bb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/gy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/hk.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/hk.svg new file mode 100644 index 000000000..eef02a18b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/hk.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/hm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/hm.svg new file mode 100644 index 000000000..1f4d00704 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/hm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/hn.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/hn.svg new file mode 100644 index 000000000..847df20c7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/hn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/hr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/hr.svg new file mode 100644 index 000000000..91009eb7d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/hr.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ht.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ht.svg new file mode 100644 index 000000000..a61736cda --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ht.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/hu.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/hu.svg new file mode 100644 index 000000000..088242d93 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/hu.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ic.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ic.svg new file mode 100644 index 000000000..096603d4b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ic.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/id.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/id.svg new file mode 100644 index 000000000..df0801815 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/id.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ie.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ie.svg new file mode 100644 index 000000000..e13de22df --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ie.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/il.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/il.svg new file mode 100644 index 000000000..0a2a6d99b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/il.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/im.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/im.svg new file mode 100644 index 000000000..cff1c4b2b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/im.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/in.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/in.svg new file mode 100644 index 000000000..26a02cff0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/in.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/io.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/io.svg new file mode 100644 index 000000000..6f1a8ca20 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/io.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/iq.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/iq.svg new file mode 100644 index 000000000..a64456d4f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/iq.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ir.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ir.svg new file mode 100644 index 000000000..095d9717e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ir.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/is.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/is.svg new file mode 100644 index 000000000..26510b99e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/is.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/it.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/it.svg new file mode 100644 index 000000000..b9596d050 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/je.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/je.svg new file mode 100644 index 000000000..8a9fdd57e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/je.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/jm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/jm.svg new file mode 100644 index 000000000..07f023c79 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/jm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/jo.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/jo.svg new file mode 100644 index 000000000..fbbd68104 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/jo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/jp.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/jp.svg new file mode 100644 index 000000000..118686a0e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/jp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ke.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ke.svg new file mode 100644 index 000000000..110600ec9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ke.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/kg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/kg.svg new file mode 100644 index 000000000..2ab176a3b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/kg.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/kh.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/kh.svg new file mode 100644 index 000000000..4b63b327d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/kh.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ki.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ki.svg new file mode 100644 index 000000000..14dab1530 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ki.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/km.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/km.svg new file mode 100644 index 000000000..d9b775119 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/km.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/kn.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/kn.svg new file mode 100644 index 000000000..42d5adfe5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/kn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/kp.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/kp.svg new file mode 100644 index 000000000..253930406 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/kp.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/kr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/kr.svg new file mode 100644 index 000000000..af3d35eb5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/kr.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/kw.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/kw.svg new file mode 100644 index 000000000..b2fe54faa --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/kw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ky.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ky.svg new file mode 100644 index 000000000..e55d5207d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ky.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/kz.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/kz.svg new file mode 100644 index 000000000..f9f9b98fe --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/kz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/la.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/la.svg new file mode 100644 index 000000000..af70d0dcc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/la.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/lb.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/lb.svg new file mode 100644 index 000000000..65201091b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/lb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/lc.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/lc.svg new file mode 100644 index 000000000..aa18fac83 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/lc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/li.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/li.svg new file mode 100644 index 000000000..bf8181029 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/li.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/lk.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/lk.svg new file mode 100644 index 000000000..08212a5b8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/lk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/lr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/lr.svg new file mode 100644 index 000000000..74382abbe --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/lr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ls.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ls.svg new file mode 100644 index 000000000..605c087af --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ls.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/lt.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/lt.svg new file mode 100644 index 000000000..52ada948c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/lt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/lu.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/lu.svg new file mode 100644 index 000000000..5c0d6daf0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/lu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/lv.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/lv.svg new file mode 100644 index 000000000..5af883c70 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/lv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ly.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ly.svg new file mode 100644 index 000000000..4375a9eaf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ly.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ma.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ma.svg new file mode 100644 index 000000000..804166728 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ma.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mc.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mc.svg new file mode 100644 index 000000000..04173a415 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/md.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/md.svg new file mode 100644 index 000000000..18a77ea92 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/md.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/me.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/me.svg new file mode 100644 index 000000000..37e96b00a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/me.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mf.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mf.svg new file mode 100644 index 000000000..8d3285b86 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mg.svg new file mode 100644 index 000000000..4f901cad0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mh.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mh.svg new file mode 100644 index 000000000..1db268d22 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mh.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mk.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mk.svg new file mode 100644 index 000000000..0ee923a35 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ml.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ml.svg new file mode 100644 index 000000000..665d6b243 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ml.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mm.svg new file mode 100644 index 000000000..391f0c70b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mm.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mn.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mn.svg new file mode 100644 index 000000000..998fe5ceb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mo.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mo.svg new file mode 100644 index 000000000..bd5cbcd98 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mp.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mp.svg new file mode 100644 index 000000000..6179fb7d7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mp.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mq.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mq.svg new file mode 100644 index 000000000..dcf005443 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mr.svg new file mode 100644 index 000000000..ffe8c114f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ms.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ms.svg new file mode 100644 index 000000000..c06dfccf8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ms.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mt.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mt.svg new file mode 100644 index 000000000..dbfa6092c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mt.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mu.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mu.svg new file mode 100644 index 000000000..2afe1d384 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mu.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mv.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mv.svg new file mode 100644 index 000000000..c9a6c5bcc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mw.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mw.svg new file mode 100644 index 000000000..25bbf2efc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mw.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mx.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mx.svg new file mode 100644 index 000000000..bb991c17f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mx.svg @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/my.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/my.svg new file mode 100644 index 000000000..b10f76e61 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/my.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/mz.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/mz.svg new file mode 100644 index 000000000..bb751482c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/mz.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/na.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/na.svg new file mode 100644 index 000000000..36ac8d77e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/na.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/nc.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/nc.svg new file mode 100644 index 000000000..1cc81eb01 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/nc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ne.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ne.svg new file mode 100644 index 000000000..a96b027ab --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ne.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/nf.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/nf.svg new file mode 100644 index 000000000..d9be1566c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/nf.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ng.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ng.svg new file mode 100644 index 000000000..62813e861 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ng.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ni.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ni.svg new file mode 100644 index 000000000..847f33125 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ni.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/nl.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/nl.svg new file mode 100644 index 000000000..eb0e360f3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/nl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/no.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/no.svg new file mode 100644 index 000000000..939920d40 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/no.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/np.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/np.svg new file mode 100644 index 000000000..498a1000f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/np.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/nr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/nr.svg new file mode 100644 index 000000000..c8c827e70 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/nr.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/nu.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/nu.svg new file mode 100644 index 000000000..ce316723d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/nu.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/nz.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/nz.svg new file mode 100644 index 000000000..ee617d6f2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/nz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/om.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/om.svg new file mode 100644 index 000000000..2021f9386 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/om.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pa.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pa.svg new file mode 100644 index 000000000..108c40bff --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pa.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pc.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pc.svg new file mode 100644 index 000000000..a38dd212b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pc.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pe.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pe.svg new file mode 100644 index 000000000..9ba4c6124 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pe.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pf.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pf.svg new file mode 100644 index 000000000..92b2803c5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pf.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pg.svg new file mode 100644 index 000000000..8c8a2b8eb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pg.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ph.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ph.svg new file mode 100644 index 000000000..7ae39fec8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ph.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pk.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pk.svg new file mode 100644 index 000000000..e71cd9261 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pk.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pl.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pl.svg new file mode 100644 index 000000000..8c43577b0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pm.svg new file mode 100644 index 000000000..950c6e8c0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pm.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pn.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pn.svg new file mode 100644 index 000000000..0bae95e0d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pn.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pr.svg new file mode 100644 index 000000000..eb302ad45 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ps.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ps.svg new file mode 100644 index 000000000..2c10079c1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ps.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pt.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pt.svg new file mode 100644 index 000000000..95ad6d79d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pt.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/pw.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/pw.svg new file mode 100644 index 000000000..ef6be7983 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/pw.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/py.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/py.svg new file mode 100644 index 000000000..e7e1bced9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/py.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/qa.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/qa.svg new file mode 100644 index 000000000..897a21bca --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/qa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/re.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/re.svg new file mode 100644 index 000000000..41d87d938 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/re.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ro.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ro.svg new file mode 100644 index 000000000..e6cf0f6e1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ro.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/rs.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/rs.svg new file mode 100644 index 000000000..d10ebb3e4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/rs.svg @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ru.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ru.svg new file mode 100644 index 000000000..485c24e0d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ru.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/rw.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/rw.svg new file mode 100644 index 000000000..3d484fd90 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/rw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sa.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sa.svg new file mode 100644 index 000000000..fd6418eef --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sa.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sb.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sb.svg new file mode 100644 index 000000000..398c70847 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sb.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sc.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sc.svg new file mode 100644 index 000000000..2996bac45 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sd.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sd.svg new file mode 100644 index 000000000..0b9abdc8a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sd.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/se.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/se.svg new file mode 100644 index 000000000..8f3f134d2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/se.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sg.svg new file mode 100644 index 000000000..60625e97f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sh-ac.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sh-ac.svg new file mode 100644 index 000000000..85cd9d1c5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sh-ac.svg @@ -0,0 +1,690 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sh-hl.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sh-hl.svg new file mode 100644 index 000000000..4cb199048 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sh-hl.svg @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sh-ta.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sh-ta.svg new file mode 100644 index 000000000..7933fc21b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sh-ta.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sh.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sh.svg new file mode 100644 index 000000000..2fd372750 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sh.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/si.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/si.svg new file mode 100644 index 000000000..33a03c625 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/si.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sj.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sj.svg new file mode 100644 index 000000000..ecb9c796b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sj.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sk.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sk.svg new file mode 100644 index 000000000..d1868226c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sl.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sl.svg new file mode 100644 index 000000000..b649f1bd5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sl.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sm.svg new file mode 100644 index 000000000..30c249015 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sm.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sn.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sn.svg new file mode 100644 index 000000000..ff9cf2eb3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/so.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/so.svg new file mode 100644 index 000000000..4848dbe0b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/so.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sr.svg new file mode 100644 index 000000000..0ca359627 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ss.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ss.svg new file mode 100644 index 000000000..bb50fac15 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/st.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/st.svg new file mode 100644 index 000000000..c5e7c5ce6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/st.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sv.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sv.svg new file mode 100644 index 000000000..14e98b058 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sv.svg @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sx.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sx.svg new file mode 100644 index 000000000..758f483c9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sx.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sy.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sy.svg new file mode 100644 index 000000000..39e63f7fb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/sz.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/sz.svg new file mode 100644 index 000000000..12ae0cdc6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/sz.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tc.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tc.svg new file mode 100644 index 000000000..0b5af9811 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tc.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/td.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/td.svg new file mode 100644 index 000000000..8201312b6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/td.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tf.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tf.svg new file mode 100644 index 000000000..1ab7f6a8f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tg.svg new file mode 100644 index 000000000..32c28af4f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/th.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/th.svg new file mode 100644 index 000000000..35141d39a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/th.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tj.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tj.svg new file mode 100644 index 000000000..9232ec1d3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tj.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tk.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tk.svg new file mode 100644 index 000000000..9ff92e5ee --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tl.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tl.svg new file mode 100644 index 000000000..4fbb245e9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tm.svg new file mode 100644 index 000000000..ac39386b8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tm.svg @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tn.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tn.svg new file mode 100644 index 000000000..ab3e36e4b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tn.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/to.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/to.svg new file mode 100644 index 000000000..3f1b60079 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/to.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tr.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tr.svg new file mode 100644 index 000000000..0fe9017c9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tt.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tt.svg new file mode 100644 index 000000000..0f7f26e7e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tv.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tv.svg new file mode 100644 index 000000000..098b91610 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tv.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tw.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tw.svg new file mode 100644 index 000000000..83f4e442e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tw.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/tz.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/tz.svg new file mode 100644 index 000000000..846cbb5ad --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/tz.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ua.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ua.svg new file mode 100644 index 000000000..7ceb89463 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ug.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ug.svg new file mode 100644 index 000000000..a82a8fcf6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ug.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/um.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/um.svg new file mode 100644 index 000000000..b8d4502e6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/um.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/un.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/un.svg new file mode 100644 index 000000000..322569d14 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/un.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/us.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/us.svg new file mode 100644 index 000000000..a7220476a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/us.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/uy.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/uy.svg new file mode 100644 index 000000000..f6b08b280 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/uy.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/uz.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/uz.svg new file mode 100644 index 000000000..3385bc5aa --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/uz.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/va.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/va.svg new file mode 100644 index 000000000..9348ad238 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/va.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/vc.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/vc.svg new file mode 100644 index 000000000..21d41a805 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/vc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ve.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ve.svg new file mode 100644 index 000000000..665135ba6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ve.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/vg.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/vg.svg new file mode 100644 index 000000000..cfcbbba42 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/vg.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/vi.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/vi.svg new file mode 100644 index 000000000..081f8c6c9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/vi.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/vn.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/vn.svg new file mode 100644 index 000000000..49a68f02e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/vn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/vu.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/vu.svg new file mode 100644 index 000000000..0e695b95a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/vu.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/wf.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/wf.svg new file mode 100644 index 000000000..5ba64e4da --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/wf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ws.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ws.svg new file mode 100644 index 000000000..ab08fdb91 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ws.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/xk.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/xk.svg new file mode 100644 index 000000000..28bdeadbd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/xk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/xx.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/xx.svg new file mode 100644 index 000000000..5a44cb701 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/xx.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/ye.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/ye.svg new file mode 100644 index 000000000..2ccb23bf6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/ye.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/yt.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/yt.svg new file mode 100644 index 000000000..41a4408cb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/yt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/za.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/za.svg new file mode 100644 index 000000000..397696eda --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/za.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/zm.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/zm.svg new file mode 100644 index 000000000..a2084fb28 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/zm.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/1x1/zw.svg b/client/packages/lowcoder-design/src/icons/flags/1x1/zw.svg new file mode 100644 index 000000000..98e1a42d4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/1x1/zw.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ad.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ad.svg new file mode 100644 index 000000000..067ab772f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ad.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ae.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ae.svg new file mode 100644 index 000000000..651ac8523 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ae.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/af.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/af.svg new file mode 100644 index 000000000..521ac4cfd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/af.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ag.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ag.svg new file mode 100644 index 000000000..243c3d8f9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ag.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ai.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ai.svg new file mode 100644 index 000000000..628ad9be9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ai.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/al.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/al.svg new file mode 100644 index 000000000..1135b4b80 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/al.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/am.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/am.svg new file mode 100644 index 000000000..99fa4dc59 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/am.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ao.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ao.svg new file mode 100644 index 000000000..b1863bd0f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/aq.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/aq.svg new file mode 100644 index 000000000..53840cccb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/aq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ar.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ar.svg new file mode 100644 index 000000000..d20cbbdcd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ar.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/arab.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/arab.svg new file mode 100644 index 000000000..96d27157e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/arab.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/as.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/as.svg new file mode 100644 index 000000000..354355672 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/as.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/at.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/at.svg new file mode 100644 index 000000000..c28250887 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/at.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/au.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/au.svg new file mode 100644 index 000000000..96e80768b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/au.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/aw.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/aw.svg new file mode 100644 index 000000000..413b7c45b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/aw.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ax.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ax.svg new file mode 100644 index 000000000..0584d713b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/az.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/az.svg new file mode 100644 index 000000000..355752211 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/az.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ba.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ba.svg new file mode 100644 index 000000000..93bd9cf93 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ba.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bb.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bb.svg new file mode 100644 index 000000000..cecd5cc33 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bd.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bd.svg new file mode 100644 index 000000000..16b794deb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/be.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/be.svg new file mode 100644 index 000000000..ac706a0b5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/be.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bf.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bf.svg new file mode 100644 index 000000000..471382258 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bg.svg new file mode 100644 index 000000000..b100dd0dc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bh.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bh.svg new file mode 100644 index 000000000..7a2ea549b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bh.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bi.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bi.svg new file mode 100644 index 000000000..a4434a955 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bi.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bj.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bj.svg new file mode 100644 index 000000000..0846724d1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bl.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bl.svg new file mode 100644 index 000000000..f84cbbaeb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bm.svg new file mode 100644 index 000000000..bab3e0abe --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bm.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bn.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bn.svg new file mode 100644 index 000000000..4b416ebb7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bn.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bo.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bo.svg new file mode 100644 index 000000000..46dc76735 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bo.svg @@ -0,0 +1,674 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bq.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bq.svg new file mode 100644 index 000000000..0e6bc76e6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/br.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/br.svg new file mode 100644 index 000000000..22c908e7e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/br.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bs.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bs.svg new file mode 100644 index 000000000..5cc918e5a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bs.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bt.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bt.svg new file mode 100644 index 000000000..798c79b38 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bt.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bv.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bv.svg new file mode 100644 index 000000000..40e16d948 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bw.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bw.svg new file mode 100644 index 000000000..3435608d6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bw.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/by.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/by.svg new file mode 100644 index 000000000..7e90ff255 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/by.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/bz.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/bz.svg new file mode 100644 index 000000000..25386a51a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/bz.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ca.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ca.svg new file mode 100644 index 000000000..89da5b7b5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ca.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cc.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cc.svg new file mode 100644 index 000000000..ddfd18038 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cc.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cd.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cd.svg new file mode 100644 index 000000000..b9cf52894 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cd.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cefta.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cefta.svg new file mode 100644 index 000000000..f748d08a1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cefta.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cf.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cf.svg new file mode 100644 index 000000000..a6cd3670f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cg.svg new file mode 100644 index 000000000..f5a0e42d4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ch.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ch.svg new file mode 100644 index 000000000..b42d6709c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ci.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ci.svg new file mode 100644 index 000000000..e400f0c1c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ci.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ck.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ck.svg new file mode 100644 index 000000000..18e547b17 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ck.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cl.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cl.svg new file mode 100644 index 000000000..5b3c72fa7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cm.svg new file mode 100644 index 000000000..70adc8b68 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cn.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cn.svg new file mode 100644 index 000000000..10d3489a0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/co.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/co.svg new file mode 100644 index 000000000..ebd0a0fb2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/co.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cp.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cp.svg new file mode 100644 index 000000000..b8aa9cfd6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cr.svg new file mode 100644 index 000000000..5a409eebb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cu.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cu.svg new file mode 100644 index 000000000..053c9ee3a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cu.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cv.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cv.svg new file mode 100644 index 000000000..aec899490 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cw.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cw.svg new file mode 100644 index 000000000..bb0ece22e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cx.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cx.svg new file mode 100644 index 000000000..374ff2dab --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cx.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cy.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cy.svg new file mode 100644 index 000000000..7e3d883da --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/cz.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/cz.svg new file mode 100644 index 000000000..7913de389 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/cz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/de.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/de.svg new file mode 100644 index 000000000..71aa2d2c3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/de.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/dg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/dg.svg new file mode 100644 index 000000000..f163caf94 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/dg.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/dj.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/dj.svg new file mode 100644 index 000000000..9b00a8205 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/dj.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/dk.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/dk.svg new file mode 100644 index 000000000..563277f81 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/dk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/dm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/dm.svg new file mode 100644 index 000000000..f692094dd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/dm.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/do.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/do.svg new file mode 100644 index 000000000..b1be393ed --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/do.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/dz.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/dz.svg new file mode 100644 index 000000000..5ff29a74a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/dz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/eac.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/eac.svg new file mode 100644 index 000000000..aaf8133f3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/eac.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ec.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ec.svg new file mode 100644 index 000000000..397bfd982 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ec.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ee.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ee.svg new file mode 100644 index 000000000..2a86ee405 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ee.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/eg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/eg.svg new file mode 100644 index 000000000..00d1fa59e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/eg.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/eh.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/eh.svg new file mode 100644 index 000000000..6aec72883 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/eh.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/er.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/er.svg new file mode 100644 index 000000000..3f4f3f292 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/er.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/es-ct.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/es-ct.svg new file mode 100644 index 000000000..4d8591140 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/es-ct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/es-ga.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/es-ga.svg new file mode 100644 index 000000000..31657813e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/es-ga.svg @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/es-pv.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/es-pv.svg new file mode 100644 index 000000000..21c8759ec --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/es-pv.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/es.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/es.svg new file mode 100644 index 000000000..acdf927f2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/es.svg @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/et.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/et.svg new file mode 100644 index 000000000..3f99be486 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/et.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/eu.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/eu.svg new file mode 100644 index 000000000..b0874c1ed --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/eu.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/fi.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/fi.svg new file mode 100644 index 000000000..470be2d07 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/fi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/fj.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/fj.svg new file mode 100644 index 000000000..23fbe57a8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/fj.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/fk.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/fk.svg new file mode 100644 index 000000000..c65bf96de --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/fk.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/fm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/fm.svg new file mode 100644 index 000000000..c1b7c9778 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/fm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/fo.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/fo.svg new file mode 100644 index 000000000..f802d285a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/fo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/fr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/fr.svg new file mode 100644 index 000000000..4110e59e4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/fr.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ga.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ga.svg new file mode 100644 index 000000000..76edab429 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ga.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gb-eng.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gb-eng.svg new file mode 100644 index 000000000..12e3b67d5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gb-eng.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gb-nir.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gb-nir.svg new file mode 100644 index 000000000..e6be8dbc2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gb-nir.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gb-sct.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gb-sct.svg new file mode 100644 index 000000000..f50cd322a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gb-sct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gb-wls.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gb-wls.svg new file mode 100644 index 000000000..6e15fd015 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gb-wls.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gb.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gb.svg new file mode 100644 index 000000000..799138319 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gb.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gd.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gd.svg new file mode 100644 index 000000000..cb51e9618 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ge.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ge.svg new file mode 100644 index 000000000..d8126ec8d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ge.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gf.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gf.svg new file mode 100644 index 000000000..f8fe94c65 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gg.svg new file mode 100644 index 000000000..f8216c8bc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gh.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gh.svg new file mode 100644 index 000000000..5c3e3e69a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gh.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gi.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gi.svg new file mode 100644 index 000000000..e2b590afe --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gi.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gl.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gl.svg new file mode 100644 index 000000000..eb5a52e9e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gl.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gm.svg new file mode 100644 index 000000000..8fe9d6692 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gm.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gn.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gn.svg new file mode 100644 index 000000000..40d6ad4f0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gp.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gp.svg new file mode 100644 index 000000000..ee55c4bcd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gp.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gq.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gq.svg new file mode 100644 index 000000000..134e44217 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gq.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gr.svg new file mode 100644 index 000000000..599741eec --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gs.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gs.svg new file mode 100644 index 000000000..1536e073e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gs.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gt.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gt.svg new file mode 100644 index 000000000..f7cffbdc7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gt.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gu.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gu.svg new file mode 100644 index 000000000..0d66e1bfa --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gu.svg @@ -0,0 +1,23 @@ + + + + + + + + + + G + U + A + M + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gw.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gw.svg new file mode 100644 index 000000000..d470bac9f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/gy.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/gy.svg new file mode 100644 index 000000000..569fb5627 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/gy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/hk.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/hk.svg new file mode 100644 index 000000000..4fd55bc14 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/hk.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/hm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/hm.svg new file mode 100644 index 000000000..815c48208 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/hm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/hn.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/hn.svg new file mode 100644 index 000000000..11fde67db --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/hn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/hr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/hr.svg new file mode 100644 index 000000000..44fed27d5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/hr.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ht.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ht.svg new file mode 100644 index 000000000..5d48eb93b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ht.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/hu.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/hu.svg new file mode 100644 index 000000000..baddf7f5e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/hu.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ic.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ic.svg new file mode 100644 index 000000000..81e6ee2e1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ic.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/id.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/id.svg new file mode 100644 index 000000000..3b7c8fcfd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/id.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ie.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ie.svg new file mode 100644 index 000000000..049be14de --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ie.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/il.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/il.svg new file mode 100644 index 000000000..f43be7e8e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/il.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/im.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/im.svg new file mode 100644 index 000000000..f06f3d6fe --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/im.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/in.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/in.svg new file mode 100644 index 000000000..bc47d7491 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/in.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/io.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/io.svg new file mode 100644 index 000000000..77016679e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/io.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/iq.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/iq.svg new file mode 100644 index 000000000..259da9adc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/iq.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ir.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ir.svg new file mode 100644 index 000000000..8c6d51621 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ir.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/is.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/is.svg new file mode 100644 index 000000000..a6588afae --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/is.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/it.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/it.svg new file mode 100644 index 000000000..20a8bfdcc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/je.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/je.svg new file mode 100644 index 000000000..611180d42 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/je.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/jm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/jm.svg new file mode 100644 index 000000000..269df0383 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/jm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/jo.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/jo.svg new file mode 100644 index 000000000..d6f927d44 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/jo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/jp.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/jp.svg new file mode 100644 index 000000000..cc1c181ce --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/jp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ke.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ke.svg new file mode 100644 index 000000000..3a67ca3cc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ke.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/kg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/kg.svg new file mode 100644 index 000000000..68c210b1c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/kg.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/kh.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/kh.svg new file mode 100644 index 000000000..c658838f4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/kh.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ki.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ki.svg new file mode 100644 index 000000000..0c8032807 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ki.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/km.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/km.svg new file mode 100644 index 000000000..414d65e47 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/km.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/kn.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/kn.svg new file mode 100644 index 000000000..47fe64d61 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/kn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/kp.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/kp.svg new file mode 100644 index 000000000..4d1dbab24 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/kp.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/kr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/kr.svg new file mode 100644 index 000000000..6947eab2b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/kr.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/kw.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/kw.svg new file mode 100644 index 000000000..3dd89e996 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/kw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ky.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ky.svg new file mode 100644 index 000000000..74a2fea2a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ky.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/kz.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/kz.svg new file mode 100644 index 000000000..04a47f53e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/kz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/la.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/la.svg new file mode 100644 index 000000000..6aea6b72b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/la.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/lb.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/lb.svg new file mode 100644 index 000000000..8619f2410 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/lb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/lc.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/lc.svg new file mode 100644 index 000000000..bb256541c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/lc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/li.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/li.svg new file mode 100644 index 000000000..68ea26fa3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/li.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/lk.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/lk.svg new file mode 100644 index 000000000..2c5cdbe09 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/lk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/lr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/lr.svg new file mode 100644 index 000000000..e482ab9d7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/lr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ls.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ls.svg new file mode 100644 index 000000000..a7c01a98f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ls.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/lt.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/lt.svg new file mode 100644 index 000000000..90ec5d240 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/lt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/lu.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/lu.svg new file mode 100644 index 000000000..c31d2bfa2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/lu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/lv.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/lv.svg new file mode 100644 index 000000000..6a9e75ec9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/lv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ly.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ly.svg new file mode 100644 index 000000000..1eaa51e46 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ly.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ma.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ma.svg new file mode 100644 index 000000000..7ce56eff7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ma.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mc.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mc.svg new file mode 100644 index 000000000..9cb6c9e8a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/md.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/md.svg new file mode 100644 index 000000000..6dc441e17 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/md.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/me.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/me.svg new file mode 100644 index 000000000..d89189074 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/me.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mf.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mf.svg new file mode 100644 index 000000000..6305edc1c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mg.svg new file mode 100644 index 000000000..5fa2d2440 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mh.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mh.svg new file mode 100644 index 000000000..7b9f49075 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mh.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mk.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mk.svg new file mode 100644 index 000000000..4f5cae77e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ml.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ml.svg new file mode 100644 index 000000000..6f6b71695 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ml.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mm.svg new file mode 100644 index 000000000..42b4dee2b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mm.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mn.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mn.svg new file mode 100644 index 000000000..152c2fcb0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mo.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mo.svg new file mode 100644 index 000000000..d39985d05 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mp.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mp.svg new file mode 100644 index 000000000..ff59ebf87 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mp.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mq.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mq.svg new file mode 100644 index 000000000..b221951e3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mr.svg new file mode 100644 index 000000000..7558234cb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ms.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ms.svg new file mode 100644 index 000000000..faf07b07f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ms.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mt.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mt.svg new file mode 100644 index 000000000..f0c8194bc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mt.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mu.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mu.svg new file mode 100644 index 000000000..82d7a3bec --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mu.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mv.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mv.svg new file mode 100644 index 000000000..10450f984 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mw.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mw.svg new file mode 100644 index 000000000..d83ddb217 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mw.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mx.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mx.svg new file mode 100644 index 000000000..f98a89e17 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mx.svg @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/my.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/my.svg new file mode 100644 index 000000000..89576f69e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/my.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/mz.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/mz.svg new file mode 100644 index 000000000..2ee6ec14b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/mz.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/na.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/na.svg new file mode 100644 index 000000000..35b9f783e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/na.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/nc.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/nc.svg new file mode 100644 index 000000000..068f0c69a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/nc.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ne.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ne.svg new file mode 100644 index 000000000..39a82b827 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ne.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/nf.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/nf.svg new file mode 100644 index 000000000..c8b30938d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/nf.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ng.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ng.svg new file mode 100644 index 000000000..81eb35f78 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ng.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ni.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ni.svg new file mode 100644 index 000000000..6dcdc9a80 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ni.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/nl.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/nl.svg new file mode 100644 index 000000000..4faaf498e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/nl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/no.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/no.svg new file mode 100644 index 000000000..a5f2a152a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/no.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/np.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/np.svg new file mode 100644 index 000000000..8d71d106b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/np.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/nr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/nr.svg new file mode 100644 index 000000000..ff394c411 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/nr.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/nu.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/nu.svg new file mode 100644 index 000000000..4067bafff --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/nu.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/nz.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/nz.svg new file mode 100644 index 000000000..935d8a749 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/nz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/om.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/om.svg new file mode 100644 index 000000000..c003f86e4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/om.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pa.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pa.svg new file mode 100644 index 000000000..8dc03bc61 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pa.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pc.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pc.svg new file mode 100644 index 000000000..882197da6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pc.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pe.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pe.svg new file mode 100644 index 000000000..33e6cfd41 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pe.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pf.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pf.svg new file mode 100644 index 000000000..e06b236e8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pf.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pg.svg new file mode 100644 index 000000000..237cb6eee --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ph.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ph.svg new file mode 100644 index 000000000..65489e1cb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ph.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pk.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pk.svg new file mode 100644 index 000000000..491e58ab1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pk.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pl.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pl.svg new file mode 100644 index 000000000..0fa514524 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pm.svg new file mode 100644 index 000000000..19a9330a3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pm.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pn.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pn.svg new file mode 100644 index 000000000..07958aca1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pn.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pr.svg new file mode 100644 index 000000000..ec51831dc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ps.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ps.svg new file mode 100644 index 000000000..b33824a5d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ps.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pt.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pt.svg new file mode 100644 index 000000000..445cf7f53 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pt.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/pw.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/pw.svg new file mode 100644 index 000000000..9f89c5f14 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/pw.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/py.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/py.svg new file mode 100644 index 000000000..38e2051eb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/py.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/qa.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/qa.svg new file mode 100644 index 000000000..901f3fa76 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/qa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/re.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/re.svg new file mode 100644 index 000000000..64e788e01 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/re.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ro.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ro.svg new file mode 100644 index 000000000..fda0f7bec --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ro.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/rs.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/rs.svg new file mode 100644 index 000000000..2f971025b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/rs.svg @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ru.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ru.svg new file mode 100644 index 000000000..f4d27efc9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ru.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/rw.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/rw.svg new file mode 100644 index 000000000..06e26ae44 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/rw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sa.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sa.svg new file mode 100644 index 000000000..c0a148663 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sa.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sb.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sb.svg new file mode 100644 index 000000000..6066f94cd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sb.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sc.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sc.svg new file mode 100644 index 000000000..9a46b369b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sd.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sd.svg new file mode 100644 index 000000000..12818b411 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sd.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/se.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/se.svg new file mode 100644 index 000000000..8ba745aca --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/se.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sg.svg new file mode 100644 index 000000000..c4dd4ac9e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sh-ac.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sh-ac.svg new file mode 100644 index 000000000..22b365832 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sh-ac.svg @@ -0,0 +1,689 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sh-hl.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sh-hl.svg new file mode 100644 index 000000000..b92e703f2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sh-hl.svg @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sh-ta.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sh-ta.svg new file mode 100644 index 000000000..a103aac05 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sh-ta.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sh.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sh.svg new file mode 100644 index 000000000..7aba0aec8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sh.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/si.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/si.svg new file mode 100644 index 000000000..66a390dcd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/si.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sj.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sj.svg new file mode 100644 index 000000000..bb2799ce7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sj.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sk.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sk.svg new file mode 100644 index 000000000..81476940e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sl.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sl.svg new file mode 100644 index 000000000..a07baf75b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sm.svg new file mode 100644 index 000000000..00e9286c4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sm.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sn.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sn.svg new file mode 100644 index 000000000..7c0673d6d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/so.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/so.svg new file mode 100644 index 000000000..a581ac63c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/so.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sr.svg new file mode 100644 index 000000000..5e71c4002 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ss.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ss.svg new file mode 100644 index 000000000..b257aa0b3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/st.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/st.svg new file mode 100644 index 000000000..1294bcb70 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/st.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sv.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sv.svg new file mode 100644 index 000000000..c811e912f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sv.svg @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sx.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sx.svg new file mode 100644 index 000000000..18f7a1397 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sx.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sy.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sy.svg new file mode 100644 index 000000000..522555052 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/sz.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/sz.svg new file mode 100644 index 000000000..294a2cc1a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/sz.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tc.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tc.svg new file mode 100644 index 000000000..63f13c359 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tc.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/td.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/td.svg new file mode 100644 index 000000000..fa3bd927c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/td.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tf.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tf.svg new file mode 100644 index 000000000..fba233563 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tg.svg new file mode 100644 index 000000000..c63a6d1a9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/th.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/th.svg new file mode 100644 index 000000000..1e93a61e9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/th.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tj.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tj.svg new file mode 100644 index 000000000..9fba246cd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tj.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tk.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tk.svg new file mode 100644 index 000000000..05d3e86ce --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tl.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tl.svg new file mode 100644 index 000000000..3d0701a2c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tm.svg new file mode 100644 index 000000000..8b656cc2b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tm.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tn.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tn.svg new file mode 100644 index 000000000..5735c1984 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tn.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/to.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/to.svg new file mode 100644 index 000000000..d07233706 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/to.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tr.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tr.svg new file mode 100644 index 000000000..b96da21f0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tt.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tt.svg new file mode 100644 index 000000000..bc24938cf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tv.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tv.svg new file mode 100644 index 000000000..675210ec5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tv.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tw.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tw.svg new file mode 100644 index 000000000..57fd98b43 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tw.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/tz.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/tz.svg new file mode 100644 index 000000000..a2cfbca42 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/tz.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ua.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ua.svg new file mode 100644 index 000000000..a339eb1b9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ug.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ug.svg new file mode 100644 index 000000000..737eb2ce1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ug.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/um.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/um.svg new file mode 100644 index 000000000..9e9eddaa4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/um.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/un.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/un.svg new file mode 100644 index 000000000..e57793bc7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/un.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/us.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/us.svg new file mode 100644 index 000000000..9cfd0c927 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/us.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/uy.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/uy.svg new file mode 100644 index 000000000..62c36f8e5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/uy.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/uz.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/uz.svg new file mode 100644 index 000000000..0ccca1b1b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/uz.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/va.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/va.svg new file mode 100644 index 000000000..87e0fbbdc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/va.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/vc.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/vc.svg new file mode 100644 index 000000000..f26c2d8da --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/vc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ve.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ve.svg new file mode 100644 index 000000000..314e7f5f7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ve.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/vg.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/vg.svg new file mode 100644 index 000000000..0ee90fb28 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/vg.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/vi.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/vi.svg new file mode 100644 index 000000000..427025779 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/vi.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/vn.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/vn.svg new file mode 100644 index 000000000..7e4bac8f4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/vn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/vu.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/vu.svg new file mode 100644 index 000000000..91e1236a0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/vu.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/wf.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/wf.svg new file mode 100644 index 000000000..054c57df9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/wf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ws.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ws.svg new file mode 100644 index 000000000..0e758a7a9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ws.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/xk.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/xk.svg new file mode 100644 index 000000000..551e7a414 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/xk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/xx.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/xx.svg new file mode 100644 index 000000000..9333be363 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/xx.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/ye.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/ye.svg new file mode 100644 index 000000000..1c9e6d639 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/ye.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/yt.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/yt.svg new file mode 100644 index 000000000..e7776b307 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/yt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/za.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/za.svg new file mode 100644 index 000000000..d563adb90 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/za.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/zm.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/zm.svg new file mode 100644 index 000000000..13239f5e2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/zm.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/flags/4x3/zw.svg b/client/packages/lowcoder-design/src/icons/flags/4x3/zw.svg new file mode 100644 index 000000000..6399ab4ab --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/flags/4x3/zw.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/icon-autoComplete.svg b/client/packages/lowcoder-design/src/icons/icon-autoComplete.svg deleted file mode 100644 index 1446b6ca6..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-autoComplete.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-autocomplete-comp.svg b/client/packages/lowcoder-design/src/icons/icon-autocomplete-comp.svg deleted file mode 100644 index 505c59adb..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-autocomplete-comp.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-button.svg b/client/packages/lowcoder-design/src/icons/icon-button.svg deleted file mode 100644 index d1db05646..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-button.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - Btn - - - - - - Btn - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-calendar.svg b/client/packages/lowcoder-design/src/icons/icon-calendar.svg deleted file mode 100644 index 018b9229e..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-calendar.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-carousel.svg b/client/packages/lowcoder-design/src/icons/icon-carousel.svg deleted file mode 100644 index 1aae36725..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-carousel.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-cascader.svg b/client/packages/lowcoder-design/src/icons/icon-cascader.svg deleted file mode 100644 index c71c793ba..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-cascader.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-chart.svg b/client/packages/lowcoder-design/src/icons/icon-chart.svg deleted file mode 100644 index 459da3127..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-chart.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-checkboxes.svg b/client/packages/lowcoder-design/src/icons/icon-checkboxes.svg deleted file mode 100644 index 8e4640a79..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-checkboxes.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-code-editor.svg b/client/packages/lowcoder-design/src/icons/icon-code-editor.svg new file mode 100644 index 000000000..b0d66ee29 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/icon-code-editor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-comment-comp.svg b/client/packages/lowcoder-design/src/icons/icon-comment-comp.svg deleted file mode 100644 index 5a737ee86..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-comment-comp.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-comp-calendar.svg b/client/packages/lowcoder-design/src/icons/icon-comp-calendar.svg deleted file mode 100644 index 9845fb266..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-comp-calendar.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-container.svg b/client/packages/lowcoder-design/src/icons/icon-container.svg deleted file mode 100644 index e092f4abf..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-container.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-custom-component.svg b/client/packages/lowcoder-design/src/icons/icon-custom-component.svg deleted file mode 100644 index ea835be4c..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-custom-component.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-date.svg b/client/packages/lowcoder-design/src/icons/icon-date.svg deleted file mode 100644 index 79f515f1c..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-date.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-dateRange.svg b/client/packages/lowcoder-design/src/icons/icon-dateRange.svg deleted file mode 100644 index ce4f12a9a..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-dateRange.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-drawer.svg b/client/packages/lowcoder-design/src/icons/icon-drawer.svg deleted file mode 100644 index afdec113a..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-drawer.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-fileViewer.svg b/client/packages/lowcoder-design/src/icons/icon-fileViewer.svg deleted file mode 100644 index b19efa3eb..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-fileViewer.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-form.svg b/client/packages/lowcoder-design/src/icons/icon-form.svg deleted file mode 100644 index 70a03fa29..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-form.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-grid.svg b/client/packages/lowcoder-design/src/icons/icon-grid.svg deleted file mode 100644 index 42d829653..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-grid.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-audio.svg b/client/packages/lowcoder-design/src/icons/icon-insert-audio.svg deleted file mode 100644 index 034997d6c..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-audio.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-divider.svg b/client/packages/lowcoder-design/src/icons/icon-insert-divider.svg deleted file mode 100644 index d05ec8d2c..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-divider.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-dropdown.svg b/client/packages/lowcoder-design/src/icons/icon-insert-dropdown.svg deleted file mode 100644 index 580597be9..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-dropdown.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-grid.svg b/client/packages/lowcoder-design/src/icons/icon-insert-grid.svg deleted file mode 100644 index a8d4c81fa..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-grid.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-iframe.svg b/client/packages/lowcoder-design/src/icons/icon-insert-iframe.svg deleted file mode 100644 index 04cead94c..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-iframe.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-imageEditor.svg b/client/packages/lowcoder-design/src/icons/icon-insert-imageEditor.svg deleted file mode 100644 index 05b701260..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-imageEditor.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-input.svg b/client/packages/lowcoder-design/src/icons/icon-insert-input.svg deleted file mode 100644 index 228527125..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-input.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-link.svg b/client/packages/lowcoder-design/src/icons/icon-insert-link.svg deleted file mode 100644 index c915da299..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-link.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-listView.svg b/client/packages/lowcoder-design/src/icons/icon-insert-listView.svg deleted file mode 100644 index 2a573be09..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-listView.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-multiSelect.svg b/client/packages/lowcoder-design/src/icons/icon-insert-multiSelect.svg deleted file mode 100644 index 7f5923d77..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-multiSelect.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-numberInput.svg b/client/packages/lowcoder-design/src/icons/icon-insert-numberInput.svg deleted file mode 100644 index 9371505aa..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-numberInput.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-password.svg b/client/packages/lowcoder-design/src/icons/icon-insert-password.svg deleted file mode 100644 index c0397816e..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-password.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-rangeSlider.svg b/client/packages/lowcoder-design/src/icons/icon-insert-rangeSlider.svg deleted file mode 100644 index f7da73988..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-rangeSlider.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-rich-text-editor.svg b/client/packages/lowcoder-design/src/icons/icon-insert-rich-text-editor.svg deleted file mode 100644 index 0c2b09723..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-rich-text-editor.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-segmentedControl.svg b/client/packages/lowcoder-design/src/icons/icon-insert-segmentedControl.svg deleted file mode 100644 index 7cecae8ee..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-segmentedControl.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-select.svg b/client/packages/lowcoder-design/src/icons/icon-insert-select.svg deleted file mode 100644 index 4d9be97b4..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-select.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-slider.svg b/client/packages/lowcoder-design/src/icons/icon-insert-slider.svg deleted file mode 100644 index 93a4ae025..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-slider.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-tabbedContainer.svg b/client/packages/lowcoder-design/src/icons/icon-insert-tabbedContainer.svg deleted file mode 100644 index 2631d1a3e..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-tabbedContainer.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-textarea.svg b/client/packages/lowcoder-design/src/icons/icon-insert-textarea.svg deleted file mode 100644 index cfb03457c..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-textarea.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-insert-video.svg b/client/packages/lowcoder-design/src/icons/icon-insert-video.svg deleted file mode 100644 index 21b0da2b4..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-insert-video.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-json-editor.svg b/client/packages/lowcoder-design/src/icons/icon-json-editor.svg deleted file mode 100644 index 590a82ce1..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-json-editor.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - J - - - S - - - O - - - N - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-json-explorer.svg b/client/packages/lowcoder-design/src/icons/icon-json-explorer.svg deleted file mode 100644 index daf6aa4e8..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-json-explorer.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - J - - - S - - - O - - - N - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-jsonForm.svg b/client/packages/lowcoder-design/src/icons/icon-jsonForm.svg deleted file mode 100644 index 75ad099b0..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-jsonForm.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - J - - - S - - - O - - - N - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-layout.svg b/client/packages/lowcoder-design/src/icons/icon-layout.svg deleted file mode 100644 index 84a970a4d..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-layout.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-audio.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-audio.svg deleted file mode 100644 index 31cd55999..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-audio.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-button.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-button.svg deleted file mode 100644 index 07476f9e8..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-button.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-chart.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-chart.svg deleted file mode 100644 index 3520afcfe..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-chart.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-checkbox.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-checkbox.svg deleted file mode 100644 index 7d96676ae..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-checkbox.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-container.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-container.svg deleted file mode 100644 index 8fd24da34..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-container.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-date.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-date.svg deleted file mode 100644 index 82cf4875e..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-date.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-divider.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-divider.svg deleted file mode 100644 index 324b054f0..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-divider.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-drawer.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-drawer.svg deleted file mode 100644 index 645f6dfcb..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-drawer.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-file.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-file.svg deleted file mode 100644 index ce2a4cc44..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-file.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-fileViewer.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-fileViewer.svg deleted file mode 100644 index a895db4b1..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-fileViewer.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-form.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-form.svg deleted file mode 100644 index 0f49d32a4..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-form.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-iframe.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-iframe.svg deleted file mode 100644 index f0f36261e..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-iframe.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-image.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-image.svg deleted file mode 100644 index 258403c3e..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-image.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-input.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-input.svg deleted file mode 100644 index 1276caf11..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-input.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-jsonEditor.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-jsonEditor.svg deleted file mode 100644 index 816a88309..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-jsonEditor.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-link.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-link.svg deleted file mode 100644 index 5b7a40772..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-link.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-listView.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-listView.svg deleted file mode 100644 index 0bac994ea..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-listView.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-modal.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-modal.svg deleted file mode 100644 index 1407e1cf6..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-modal.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-navigation.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-navigation.svg deleted file mode 100644 index e0a328d59..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-navigation.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-numberInput.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-numberInput.svg deleted file mode 100644 index 68b3dbd7d..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-numberInput.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-password.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-password.svg deleted file mode 100644 index 1a3a98805..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-password.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-progress.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-progress.svg deleted file mode 100644 index 6c0dd3735..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-progress.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-qrCode.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-qrCode.svg deleted file mode 100644 index 53f6adf08..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-qrCode.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-radio.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-radio.svg deleted file mode 100644 index a1f59b732..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-radio.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-rating.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-rating.svg deleted file mode 100644 index 184bfe6d5..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-rating.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-segmentedControl.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-segmentedControl.svg deleted file mode 100644 index f7dffcee8..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-segmentedControl.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-select.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-select.svg deleted file mode 100644 index da4654c0b..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-select.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-slider.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-slider.svg deleted file mode 100644 index 62db0f2a8..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-slider.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-switch.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-switch.svg deleted file mode 100644 index e74a2840a..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-switch.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-table.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-table.svg deleted file mode 100644 index 22975f5ca..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-table.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-text.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-text.svg deleted file mode 100644 index 6f438bd29..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-text.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-time.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-time.svg deleted file mode 100644 index 646bbcd9a..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-time.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-tree.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-tree.svg deleted file mode 100644 index 84407ed14..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-tree.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-left-comp-video.svg b/client/packages/lowcoder-design/src/icons/icon-left-comp-video.svg deleted file mode 100644 index 8bdb1996c..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-left-comp-video.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-lottie.svg b/client/packages/lowcoder-design/src/icons/icon-lottie.svg deleted file mode 100644 index 90ca02dbd..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-lottie.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-mention-comp.svg b/client/packages/lowcoder-design/src/icons/icon-mention-comp.svg deleted file mode 100644 index 5b311e0b4..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-mention-comp.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-mermaid.svg b/client/packages/lowcoder-design/src/icons/icon-mermaid.svg deleted file mode 100644 index de1181bf2..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-mermaid.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-modal.svg b/client/packages/lowcoder-design/src/icons/icon-modal.svg deleted file mode 100644 index 2a1b36589..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-modal.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-progress.svg b/client/packages/lowcoder-design/src/icons/icon-progress.svg deleted file mode 100644 index c3727a8f5..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-progress.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-qrcode.svg b/client/packages/lowcoder-design/src/icons/icon-qrcode.svg deleted file mode 100644 index 867574a1b..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-qrcode.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-radio.svg b/client/packages/lowcoder-design/src/icons/icon-radio.svg deleted file mode 100644 index c94c2a359..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-radio.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-responsive-layout-comp.svg b/client/packages/lowcoder-design/src/icons/icon-responsive-layout-comp.svg deleted file mode 100644 index f26e79095..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-responsive-layout-comp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-scanner.svg b/client/packages/lowcoder-design/src/icons/icon-scanner.svg deleted file mode 100644 index db976933e..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-scanner.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-signature.svg b/client/packages/lowcoder-design/src/icons/icon-signature.svg deleted file mode 100644 index d858bfd2f..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-signature.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-sliderCircle.svg b/client/packages/lowcoder-design/src/icons/icon-sliderCircle.svg deleted file mode 100644 index 94041debf..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-sliderCircle.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-switch.svg b/client/packages/lowcoder-design/src/icons/icon-switch.svg deleted file mode 100644 index 18a70025e..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-switch.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-table.svg b/client/packages/lowcoder-design/src/icons/icon-table.svg deleted file mode 100644 index 4319a5bbe..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-table.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-text.svg b/client/packages/lowcoder-design/src/icons/icon-text.svg deleted file mode 100644 index d748ef099..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-text.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-textbox.svg b/client/packages/lowcoder-design/src/icons/icon-textbox.svg deleted file mode 100644 index e69439d55..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-textbox.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-time.svg b/client/packages/lowcoder-design/src/icons/icon-time.svg deleted file mode 100644 index 21814c7eb..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-time.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-timeRange.svg b/client/packages/lowcoder-design/src/icons/icon-timeRange.svg deleted file mode 100644 index 8dec1828d..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-timeRange.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-timeline-comp.svg b/client/packages/lowcoder-design/src/icons/icon-timeline-comp.svg deleted file mode 100644 index e47f5fc79..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-timeline-comp.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-toggle-button.svg b/client/packages/lowcoder-design/src/icons/icon-toggle-button.svg deleted file mode 100644 index ac664182c..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-toggle-button.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/icon-tree-select.svg b/client/packages/lowcoder-design/src/icons/icon-tree-select.svg deleted file mode 100644 index 8374433e0..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-tree-select.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-tree.svg b/client/packages/lowcoder-design/src/icons/icon-tree.svg deleted file mode 100644 index a0cb01436..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-tree.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-upload.svg b/client/packages/lowcoder-design/src/icons/icon-upload.svg deleted file mode 100644 index 12db002ce..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-upload.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/client/packages/lowcoder-design/src/icons/icon-video-play-triangle.svg b/client/packages/lowcoder-design/src/icons/icon-video-play-triangle.svg deleted file mode 100644 index 57ec84508..000000000 --- a/client/packages/lowcoder-design/src/icons/icon-video-play-triangle.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/client/packages/lowcoder-design/src/icons/index.ts b/client/packages/lowcoder-design/src/icons/index.ts index 71c1df6ab..bac14e692 100644 --- a/client/packages/lowcoder-design/src/icons/index.ts +++ b/client/packages/lowcoder-design/src/icons/index.ts @@ -1,7 +1,7 @@ export { ReactComponent as AppSnapshotIcon } from "./app-snapshot.svg"; export { ReactComponent as HookCompDropIcon } from "./hook-comp-drop.svg"; export { ReactComponent as HookCompIcon } from "./hook-comp.svg"; -export { ReactComponent as IconsIcon } from "./icon-Icons.svg"; + export { ReactComponent as JsGrayIcon } from "./icon-Js-Gray.svg"; export { ReactComponent as JsColorsIcon } from "./icon-Js-colors.svg"; export { ReactComponent as AdminIcon } from "./icon-admin.svg"; @@ -13,8 +13,7 @@ export { ReactComponent as TreeFoldIcon } from "./icon-audit-fold.svg"; export { ReactComponent as AuditQueryIcon } from "./icon-audit-query.svg"; export { ReactComponent as AuditUserIcon } from "./icon-audit-user.svg"; export { ReactComponent as AuditFolderIcon } from "./icon-audit-folder.svg"; -export { ReactComponent as AutoCompleteIcon } from "./icon-autoComplete.svg"; -export { ReactComponent as CalendarIcon } from "./icon-calendar.svg"; + export { ReactComponent as CaptchaIcon } from "./icon-captcha.svg"; export { ReactComponent as CheckboxIcon } from "./icon-checkbox.svg"; export { ReactComponent as CheckoutIcon } from "./icon-checkout.svg"; @@ -22,6 +21,8 @@ export { ReactComponent as ClickLinkIcon } from "./icon-clickLink.svg"; export { ReactComponent as CloseEyeIcon } from "./icon-closeEye.svg"; export { ReactComponent as CodeEditorCloseIcon } from "./icon-code-editor-close.svg"; export { ReactComponent as CodeEditorOpenIcon } from "./icon-code-editor-open.svg"; +export { ReactComponent as CodeEditorPinnedIcon} from "./remix/pushpin-2-fill.svg" +export { ReactComponent as CodeEditorUnPinnedIcon} from "./remix/pushpin-line.svg" export { ReactComponent as ColorHexIcon } from "./icon-colorHex.svg"; export { ReactComponent as ContainerDragIcon } from "./icon-container-drag.svg"; export { ReactComponent as CopyIcon } from "./icon-copy.svg"; @@ -32,10 +33,8 @@ export { ReactComponent as DragWhiteIcon } from "./icon-drag-white.svg"; export { ReactComponent as EmptyDataIcon } from "./icon-empty-data.svg"; export { ReactComponent as FlokcloseIcon } from "./icon-flokclose.svg"; export { ReactComponent as FoldedIcon } from "./icon-folded.svg"; -export { ReactComponent as GridIcon } from "./icon-grid.svg"; export { ReactComponent as GroupIcon } from "./icon-group.svg"; export { ReactComponent as HelpIcon } from "./icon-help.svg"; -export { ReactComponent as LayoutIcon } from "./icon-layout.svg"; export { ReactComponent as LockIcon } from "./icon-lock.svg"; export { ReactComponent as MembersIcon } from "./icon-members.svg"; export { ReactComponent as MoreActionIcon } from "./icon-more-action.svg"; @@ -55,7 +54,6 @@ export { ReactComponent as StarIcon } from "./icon-star.svg"; export { ReactComponent as SuperUserIcon } from "./icon-super-user.svg"; export { ReactComponent as SwitchCheckedIcon } from "./icon-switch-checked.svg"; export { ReactComponent as TextEditIcon } from "./icon-text-edit.svg"; -export { ReactComponent as TextboxIcon } from "./icon-textbox.svg"; export { ReactComponent as TriangleIcon } from "./icon-triangle.svg"; export { ReactComponent as TypographyIcon } from "./icon-typography.svg"; export { ReactComponent as UnfoldWhiteIcon } from "./icon-unfold-white.svg"; @@ -82,14 +80,9 @@ export { ReactComponent as AlignClose } from "./icon-align-close.svg"; export { ReactComponent as AlignTop } from "./icon-align-top.svg"; export { ReactComponent as AlignBottom } from "./icon-align-bottom.svg"; export { ReactComponent as AddIcon } from "./icon-add.svg"; -export { ReactComponent as ApplicationDocIcon } from "./icon-application-doc.svg"; export { ReactComponent as ImportAppIcon } from "./icon-app-import.svg"; -export { ReactComponent as ModuleDocIcon } from "./icon-module-doc.svg"; export { ReactComponent as ImportIcon } from "./icon-import.svg"; export { ReactComponent as ImportIconV2 } from "./icon-import-v2.svg"; -export { ReactComponent as ModuleMenuIcon } from "./icon-module-menu.svg"; -export { ReactComponent as ModuleIcon } from "./icon-module.svg"; -export { ReactComponent as AllAppIcon } from "./icon-all-app.svg"; export { ReactComponent as DatasourceIcon } from "./icon-datasource.svg"; export { ReactComponent as QueryLibraryIcon } from "./icon-query-library.svg"; export { ReactComponent as TransformerIcon } from "./icon-transformer.svg"; @@ -97,49 +90,6 @@ export { ReactComponent as TempStateIcon } from "./icon-temp-state.svg"; export { ReactComponent as IconDep } from "./icon-style-dep.svg"; export { ReactComponent as IconRadius } from "./icon-style-border-radius.svg"; export { ReactComponent as IconReset } from "./icon-style-reset.svg"; -export { ReactComponent as NavComIcon } from "./icon-nav.svg"; -export { ReactComponent as ButtonCompIcon } from "./icon-button.svg"; -export { ReactComponent as InputCompIcon } from "./icon-insert-input.svg"; -export { ReactComponent as TextCompIcon } from "./icon-text.svg"; -export { ReactComponent as SwitchCompIcon } from "./icon-switch.svg"; -export { ReactComponent as TableCompIcon } from "./icon-table.svg"; -export { ReactComponent as SelectCompIcon } from "./icon-insert-select.svg"; -export { ReactComponent as CheckboxCompIcon } from "./icon-checkboxes.svg"; -export { ReactComponent as RadioCompIcon } from "./icon-radio.svg"; -export { ReactComponent as TimeCompIcon } from "./icon-time.svg"; -export { ReactComponent as TimeRangeCompIcon } from "./icon-timeRange.svg"; -export { ReactComponent as DateCompIcon } from "./icon-date.svg"; -export { ReactComponent as DateRangeCompIcon } from "./icon-dateRange.svg"; -export { ReactComponent as UploadCompIcon } from "./icon-upload.svg"; -export { ReactComponent as ImageCompIcon } from "./icon-image.svg"; -export { ReactComponent as RatingCompIcon } from "./icon-rating.svg"; -export { ReactComponent as SliderCompIcon } from "./icon-insert-slider.svg"; -export { ReactComponent as ProcessCircleCompIcon } from "./icon-sliderCircle.svg"; -export { ReactComponent as ChartCompIcon } from "./icon-chart.svg"; -export { ReactComponent as JsonFormCompIcon } from "./icon-jsonForm.svg"; -export { ReactComponent as FormCompIcon } from "./icon-form.svg"; -export { ReactComponent as ProgressCompIcon } from "./icon-progress.svg"; -export { ReactComponent as FileViewerCompIcon } from "./icon-fileViewer.svg"; -export { ReactComponent as ContainerCompIcon } from "./icon-container.svg"; -export { ReactComponent as LinkCompIcon } from "./icon-insert-link.svg"; -export { ReactComponent as MultiSelectCompIcon } from "./icon-insert-multiSelect.svg"; -export { ReactComponent as PasswordCompIcon } from "./icon-insert-password.svg"; -export { ReactComponent as RangeSliderCompIcon } from "./icon-insert-rangeSlider.svg"; -export { ReactComponent as SegmentedCompIcon } from "./icon-insert-segmentedControl.svg"; -export { ReactComponent as TextAreaCompIcon } from "./icon-insert-textarea.svg"; -export { ReactComponent as NumberInputCompIcon } from "./icon-insert-numberInput.svg"; -export { ReactComponent as DropdownCompIcon } from "./icon-insert-dropdown.svg"; -export { ReactComponent as DividerCompIcon } from "./icon-insert-divider.svg"; -export { ReactComponent as RichTextEditorCompIcon } from "./icon-insert-rich-text-editor.svg"; -export { ReactComponent as ModalCompIcon } from "./icon-modal.svg"; -export { ReactComponent as TabbedContainerCompIcon } from "./icon-insert-tabbedContainer.svg"; -export { ReactComponent as CascaderCompIcon } from "./icon-cascader.svg"; -export { ReactComponent as TreeIcon } from "./icon-tree.svg"; -export { ReactComponent as TreeSelectIcon } from "./icon-tree-select.svg"; -export { ReactComponent as CustomCompIcon } from "./icon-custom-component.svg"; -export { ReactComponent as IFrameCompIcon } from "./icon-insert-iframe.svg"; -export { ReactComponent as ListViewIcon } from "./icon-insert-listView.svg"; -export { ReactComponent as GridCompIcon } from "./icon-insert-grid.svg"; export { ReactComponent as PackUpIcon } from "./icon-Pack-up.svg"; export { ReactComponent as SearchIcon } from "./icon-Search.svg"; export { ReactComponent as SearchOutlinedIcon } from "./icon-SearchOutlined.svg"; @@ -158,29 +108,42 @@ export { ReactComponent as SuccessIcon } from "./icon-success.svg"; export { ReactComponent as ErrorIcon } from "./icon-err-warning.svg"; export { ReactComponent as DocIcon } from "./icon-tutorial.svg"; export { ReactComponent as DocBoldIcon } from "./icon-tutorial-bold.svg"; -export { ReactComponent as QRCodeCompIcon } from "./icon-qrcode.svg"; -export { ReactComponent as NavDocIcon } from "./icon-nav-doc.svg"; export { ReactComponent as LabIcon } from "./icon-laboratory.svg"; -export { ReactComponent as JsonExplorerCompIcon } from "./icon-json-explorer.svg"; -export { ReactComponent as JsonEditorCompIcon } from "./icon-json-editor.svg"; export { ReactComponent as ArrowIcon } from "./icon-arrow.svg"; export { ReactComponent as ArrowSolidIcon } from "./icon-arrow-solid.svg"; -export { ReactComponent as AudioCompIcon } from "./icon-insert-audio.svg"; -export { ReactComponent as VideoCompIcon } from "./icon-insert-video.svg"; -export { ReactComponent as videoPlayTriangle } from "./icon-video-play-triangle.svg"; -export { ReactComponent as DrawerCompIcon } from "./icon-drawer.svg"; -export { ReactComponent as LeftMeetingIcon } from "./icon-left-comp-video.svg"; + +// Home Section export { ReactComponent as PlusIcon } from "./icon-plus.svg"; -export { ReactComponent as FolderIcon } from "./icon-application-folder.svg"; +export { ReactComponent as ApplicationDocIcon } from "./v2/app-m.svg"; +export { ReactComponent as ModuleMenuIcon } from "./v2/module-m.svg"; +export { ReactComponent as ModuleIcon } from "./v2/module-m.svg"; +export { ReactComponent as ModuleDocIcon } from "./v2/module-m.svg"; +export { ReactComponent as NavDocIcon } from "./v2/entry-page-m.svg"; +export { ReactComponent as FolderIcon } from "./remix/folder-6-line.svg"; export { ReactComponent as AllTypesIcon } from "./icon-application-all.svg"; export { ReactComponent as InviteUserIcon } from "./icon-application-invite-user.svg"; export { ReactComponent as HomeEmptyIcon } from "./icon-application-empty.svg"; export { ReactComponent as HomeListIcon } from "./icon-application-list.svg"; export { ReactComponent as HomeCardIcon } from "./icon-application-card.svg"; -export { ReactComponent as CarouselCompIcon } from "./icon-carousel.svg"; +// export { ReactComponent as AllAppIcon } from "./icon-all-app.svg"; + + +// Data Sources export { ReactComponent as MysqlIcon } from "./icon-query-MySQL.svg"; -export { ReactComponent as DataResponderIcon } from "./icon-query-data-responder.svg"; export { ReactComponent as MongoIcon } from "./icon-query-MongoDB.svg"; +export { ReactComponent as PostgresIcon } from "./icon-query-postgres.svg"; +export { ReactComponent as RedisIcon } from "./icon-query-Redis.svg"; +export { ReactComponent as MSSQLIcon } from "./icon-query-mssql.svg"; +export { ReactComponent as SMTPIcon } from "./icon-query-SMTP.svg"; +export { ReactComponent as OracleIcon } from "./icon-query-OracleDB.svg"; +export { ReactComponent as ClickHouseIcon } from "./icon-query-ClickHouse.svg"; +export { ReactComponent as GoogleSheetsIcon } from "./icon-query-GoogleSheets.svg"; +export { ReactComponent as GraphqlIcon } from "./icon-query-Graphql.svg"; +export { ReactComponent as SnowflakeIcon } from "./icon-query-snowflake.svg"; +export { ReactComponent as MariaDBIcon } from "./icon-query-MariaDB.svg"; + +// Data Queries +export { ReactComponent as DataResponderIcon } from "./icon-query-data-responder.svg"; export { ReactComponent as RestApiIcon } from "./icon-query-API.svg"; export { ReactComponent as DeleteApiIcon } from "./icon-query-delete.svg"; export { ReactComponent as GetApiIcon } from "./icon-query-get.svg"; @@ -190,15 +153,10 @@ export { ReactComponent as PutApiIcon } from "./icon-query-put.svg"; export { ReactComponent as OptionsApiIcon } from "./icon-query-options.svg"; export { ReactComponent as HeadApiIcon } from "./icon-query-head.svg"; export { ReactComponent as TraceApiIcon } from "./icon-query-trace.svg"; -export { ReactComponent as PostgresIcon } from "./icon-query-postgres.svg"; export { ReactComponent as JSIcon } from "./icon-query-JS.svg"; export { ReactComponent as LowcoderQueryIcon } from "./icon-query-lowcoder.svg"; -export { ReactComponent as RedisIcon } from "./icon-query-Redis.svg"; export { ReactComponent as EsIcon } from "./icon-query-ElasticSearch.svg"; -export { ReactComponent as MSSQLIcon } from "./icon-query-mssql.svg"; -export { ReactComponent as SMTPIcon } from "./icon-query-SMTP.svg"; -export { ReactComponent as OracleIcon } from "./icon-query-OracleDB.svg"; -export { ReactComponent as ClickHouseIcon } from "./icon-query-ClickHouse.svg"; + 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"; @@ -207,66 +165,20 @@ 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"; export { ReactComponent as LeftPreloadIcon } from "./icon-left-preload.svg"; -export { ReactComponent as CollapsibleContainerCompIcon } from "./icon-collapsible-container.svg"; -export { ReactComponent as ToggleButtonCompIcon } from "./icon-toggle-button.svg"; -export { ReactComponent as GoogleSheetsIcon } from "./icon-query-GoogleSheets.svg"; -export { ReactComponent as GraphqlIcon } from "./icon-query-Graphql.svg"; -export { ReactComponent as SnowflakeIcon } from "./icon-query-snowflake.svg"; -export { ReactComponent as MariaDBIcon } from "./icon-query-MariaDB.svg"; -export { ReactComponent as imageEditorIcon } from "./icon-insert-imageEditor.svg"; -export { ReactComponent as MermaidIcon } from "./icon-mermaid.svg"; + + export { ReactComponent as HomeSettingsIcon } from "./icon-home-settings.svg"; export { ReactComponent as HomeSettingsActiveIcon } from "./icon-home-settings-active.svg"; export { ReactComponent as HelpGithubIcon } from "./icon-help-github.svg"; export { ReactComponent as HelpDiscordIcon } from "./icon-help-discord.svg"; -export { ReactComponent as LeftAudio } from "./icon-left-comp-audio.svg"; -export { ReactComponent as LeftButton } from "./icon-left-comp-button.svg"; -export { ReactComponent as LeftChart } from "./icon-left-comp-chart.svg"; -export { ReactComponent as LeftCheckbox } from "./icon-left-comp-checkbox.svg"; -export { ReactComponent as LeftCommon } from "./icon-left-comp-common.svg"; -export { ReactComponent as LeftContainer } from "./icon-left-comp-container.svg"; -export { ReactComponent as LeftDate } from "./icon-left-comp-date.svg"; -export { ReactComponent as LeftDivider } from "./icon-left-comp-divider.svg"; -export { ReactComponent as LeftDrawer } from "./icon-left-comp-drawer.svg"; -export { ReactComponent as LeftMeeting } from "./icon-left-comp-video.svg"; -export { ReactComponent as LeftFile } from "./icon-left-comp-file.svg"; -export { ReactComponent as LeftFileViewer } from "./icon-left-comp-fileViewer.svg"; -export { ReactComponent as LeftForm } from "./icon-left-comp-form.svg"; -export { ReactComponent as LeftIframe } from "./icon-left-comp-iframe.svg"; -export { ReactComponent as LeftImage } from "./icon-left-comp-image.svg"; -export { ReactComponent as LeftInput } from "./icon-left-comp-input.svg"; -export { ReactComponent as LeftJsonEditor } from "./icon-left-comp-jsonEditor.svg"; -export { ReactComponent as LeftLink } from "./icon-left-comp-link.svg"; -export { ReactComponent as LeftListView } from "./icon-left-comp-listView.svg"; -export { ReactComponent as LeftModal } from "./icon-left-comp-modal.svg"; -export { ReactComponent as LeftNavigation } from "./icon-left-comp-navigation.svg"; -export { ReactComponent as LeftNumberInput } from "./icon-left-comp-numberInput.svg"; -export { ReactComponent as LeftPassword } from "./icon-left-comp-password.svg"; -export { ReactComponent as LeftProgress } from "./icon-left-comp-progress.svg"; -export { ReactComponent as LeftQrCode } from "./icon-left-comp-qrCode.svg"; -export { ReactComponent as LeftRadio } from "./icon-left-comp-radio.svg"; -export { ReactComponent as LeftRating } from "./icon-left-comp-rating.svg"; -export { ReactComponent as LeftSegmentedControl } from "./icon-left-comp-segmentedControl.svg"; -export { ReactComponent as LeftSelect } from "./icon-left-comp-select.svg"; -export { ReactComponent as LeftSlider } from "./icon-left-comp-slider.svg"; -export { ReactComponent as LeftSwitch } from "./icon-left-comp-switch.svg"; -export { ReactComponent as LeftTable } from "./icon-left-comp-table.svg"; -export { ReactComponent as LeftText } from "./icon-left-comp-text.svg"; -export { ReactComponent as LeftTime } from "./icon-left-comp-time.svg"; -export { ReactComponent as LeftTree } from "./icon-left-comp-tree.svg"; -export { ReactComponent as LeftVideo } from "./icon-left-comp-video.svg"; export { ReactComponent as LeftOpen } from "./icon-left-comp-open.svg"; export { ReactComponent as LeftClose } from "./icon-left-comp-close.svg"; -export { ReactComponent as ScannerIcon } from "./icon-scanner.svg"; export { ReactComponent as MaterialUploadIcon } from "./icon-material-upload.svg"; -export { ReactComponent as CalendarCompIcon } from "./icon-comp-calendar.svg"; -export { ReactComponent as LeftSignature } from "./icon-left-signature.svg"; export { ReactComponent as UndoIcon } from "./icon-undo.svg"; -export { ReactComponent as SignatureIcon } from "./icon-signature.svg"; + export { ReactComponent as ManualIcon } from "./icon-manual.svg"; export { ReactComponent as WarnIcon } from "./icon-warn.svg"; export { ReactComponent as SyncManualIcon } from "./icon-sync-manual.svg"; -export { ReactComponent as IconCompIcon } from "icons/IconCompIcon.svg"; export { ReactComponent as DangerIcon } from "./icon-danger.svg"; export { ReactComponent as TableMinusIcon } from "./icon-table-minus.svg"; export { ReactComponent as TablePlusIcon } from "./icon-table-plus.svg"; @@ -281,17 +193,26 @@ export { ReactComponent as FileFolderIcon } from "./icon-editor-folder.svg"; export { ReactComponent as ExpandIcon } from "./icon-expand.svg"; export { ReactComponent as CompressIcon } from "./icon-compress.svg"; export { ReactComponent as TableCellsIcon } from "./icon-table-cells.svg"; // Added By Aqib Mirza -export { ReactComponent as TimeLineIcon } from "./icon-timeline-comp.svg" -export { ReactComponent as LottieIcon } from "./icon-lottie.svg"; -export { ReactComponent as CommentIcon } from "./icon-comment-comp.svg"; -export { ReactComponent as MentionIcon } from "./icon-mention-comp.svg"; -export { ReactComponent as AutoCompleteCompIcon } from "./icon-autocomplete-comp.svg"; + +// Style Props export { ReactComponent as WidthIcon } from "./icon-width.svg"; -export { ReactComponent as ResponsiveLayoutCompIcon } from "./icon-responsive-layout-comp.svg"; -export { ReactComponent as TextSizeIcon } from "./remix/font-size-2.svg"; +export { ReactComponent as TextSizeIcon } from "./remix/font-size.svg"; +export { ReactComponent as TextTransformationIcon } from "./remix/font-size-2.svg"; export { ReactComponent as FontFamilyIcon } from "./remix/font-sans-serif.svg"; export { ReactComponent as TextWeightIcon } from "./remix/bold.svg"; -export { ReactComponent as BorderWidthIcon } from "./remix/expand-width-line.svg"; +export { ReactComponent as TextDecorationIcon } from "./remix/underline.svg"; +export { ReactComponent as TextStyleIcon } from "./remix/italic.svg"; +export { ReactComponent as BorderWidthIcon } from "./remix/space.svg"; +export { ReactComponent as BorderStyleIcon } from "./remix/separator.svg"; +export { ReactComponent as RotationIcon } from "./remix/clockwise-line.svg"; +export { ReactComponent as BorderRadiusIcon } from "./remix/rounded-corner.svg"; + +// Falk: TODO +export { ReactComponent as ShadowIcon } from "./remix/shadow-line.svg"; +export { ReactComponent as OpacityIcon } from "./remix/contrast-drop-2-line.svg"; +export { ReactComponent as AnimationIcon } from "./remix/loader-line.svg"; + + export { ReactComponent as LeftInfoLine } from "./remix/information-line.svg"; export { ReactComponent as LeftInfoFill } from "./remix/information-fill.svg"; export { ReactComponent as LeftShow } from "./remix/eye-off-line.svg"; @@ -308,6 +229,7 @@ export { ReactComponent as AppsIcon } from "./remix/apps-2-line.svg"; export { ReactComponent as WorkspacesIcon } from "./remix/hotel-line.svg"; export { ReactComponent as HomeIcon } from "./remix/home-3-line.svg"; +export { ReactComponent as NewsIcon } from "./remix/megaphone-line.svg"; export { ReactComponent as HomeModuleIcon } from "./remix/focus-mode.svg"; export { ReactComponent as HomeQueryLibraryIcon } from "./remix/braces-line.svg"; export { ReactComponent as HomeDataSourceIcon } from "./remix/database-2-line.svg"; @@ -315,308 +237,476 @@ export { ReactComponent as RecyclerIcon } from "./remix/delete-bin-line.svg"; export { ReactComponent as MarketplaceIcon } from "./icon-application-marketplace.svg"; export { ReactComponent as FavoritesIcon } from "./icon-application-favorites.svg"; export { ReactComponent as HomeSettingIcon } from "./remix/settings-4-line.svg"; +export { ReactComponent as EnterpriseIcon } from "./remix/earth-line.svg"; -// new -/* export { ReactComponent as AppSnapshotIcon } from "./remix/screenshot-2-line.svg"; // Closest match for app snapshot -export { ReactComponent as HookCompDropIcon } from "./hook-comp-drop.svg"; -export { ReactComponent as HookCompIcon } from "./hook-comp.svg"; -export { ReactComponent as IconsIcon } from "./remix/apps-line.svg"; // Closest match for icons -export { ReactComponent as JsGrayIcon } from "./icon-Js-Gray.svg"; -export { ReactComponent as JsColorsIcon } from "./icon-Js-colors.svg"; -export { ReactComponent as AdminIcon } from "./remix/admin-line.svg"; // Exact match -export { ReactComponent as AlignVerticalCent } from "./icon-align-vertical-center.svg"; -export { ReactComponent as AppEditIcon } from "./remix/edit-box-line.svg"; // Closest match for app edit -export { ReactComponent as AuditAppIcon } from "./icon-audit-app.svg"; -export { ReactComponent as AuditDbIcon } from "./icon-audit-db.svg"; -export { ReactComponent as TreeFoldIcon } from "./remix/tree-line.svg"; // Closest match for tree fold -export { ReactComponent as AuditQueryIcon } from "./icon-audit-query.svg"; -export { ReactComponent as AuditUserIcon } from "./icon-audit-user.svg"; -export { ReactComponent as AuditFolderIcon } from "./remix/folder-line.svg"; // Closest match for audit folder -export { ReactComponent as AutoCompleteIcon } from "./icon-autoComplete.svg"; -export { ReactComponent as CalendarIcon } from "./remix/calendar-2-line.svg"; // Exact match -export { ReactComponent as CaptchaIcon } from "./icon-captcha.svg"; -export { ReactComponent as CheckboxIcon } from "./remix/checkbox-line.svg"; // Exact match -export { ReactComponent as CheckoutIcon } from "./icon-checkout.svg"; -export { ReactComponent as ClickLinkIcon } from "./icon-clickLink.svg"; -export { ReactComponent as CloseEyeIcon } from "./remix/eye-off-line.svg"; // Closest match for close eye -export { ReactComponent as CodeEditorCloseIcon } from "./icon-code-editor-close.svg"; -export { ReactComponent as CodeEditorOpenIcon } from "./icon-code-editor-open.svg"; -export { ReactComponent as ColorHexIcon } from "./remix/palette-line.svg"; // Closest match for color hex -export { ReactComponent as ContainerDragIcon } from "./icon-container-drag.svg"; -export { ReactComponent as CopyIcon } from "./remix/file-copy-line.svg"; // Closest match for copy -export { ReactComponent as CreateModuleIcon } from "./icon-create-module.svg"; -export { ReactComponent as PrevIcon } from "./icon-date-prev.svg"; -export { ReactComponent as SuperPrevIcon } from "./icon-date-super-prev.svg"; -export { ReactComponent as DragWhiteIcon } from "./icon-drag-white.svg"; -export { ReactComponent as EmptyDataIcon } from "./remix/emotion-unhappy-line.svg"; // Closest match for empty data -export { ReactComponent as FlokcloseIcon } from "./icon-flokclose.svg"; -export { ReactComponent as FoldedIcon } from "./icon-folded.svg"; -export { ReactComponent as GridIcon } from "./remix/grid-line.svg"; // Exact match -export { ReactComponent as GroupIcon } from "./remix/group-line.svg"; // Closest match for group -export { ReactComponent as HelpIcon } from "./remix/question-answer-line.svg"; // Closest match for help -export { ReactComponent as LayoutIcon } from "./remix/layout-6-line.svg"; // Closest match for layout -export { ReactComponent as LockIcon } from "./remix/lock-line.svg"; // Exact match -export { ReactComponent as MembersIcon } from "./remix/group-line.svg"; // Closest match for members -export { ReactComponent as MoreActionIcon } from "./remix/more-2-line.svg"; // Closest match for more action -export { ReactComponent as MultiselectTagIcon } from "./remix/price-tag-3-line.svg"; // Closest match for multiselect tag -export { ReactComponent as MustFillStarIcon } from "./remix/star-line.svg"; // Closest match for must fill star -export { ReactComponent as NofileIcon } from "./remix/file-unknow-line.svg"; // Closest match for nofile -export { ReactComponent as OmitIcon } from "./icon-omit.svg"; -export { ReactComponent as OpenEyeIcon } from "./remix/eye-line.svg"; // Closest match for open eye -export { ReactComponent as PasswordIcon } from "./remix/lock-password-line.svg"; // Closest match for password -export { ReactComponent as RadioCheckedIcon } from "./remix/list-radio.svg"; // Closest match for radio checked -export { ReactComponent as RequiredIcon } from "./remix/alert-line.svg"; // Closest match for required -export { ReactComponent as AttributeIcon } from "./icon-right-attribute.svg"; -export { ReactComponent as InsertIcon } from "./icon-right-insert.svg"; -export { ReactComponent as ShowBorderIcon } from "./icon-show-border.svg"; -export { ReactComponent as SpaceIcon } from "./icon-space.svg"; -export { ReactComponent as StarIcon } from "./remix/star-line.svg"; // Exact match -export { ReactComponent as SuperUserIcon } from "./icon-super-user.svg"; -export { ReactComponent as SwitchCheckedIcon } from "./remix/toggle-line.svg"; // Closest match for switch checked -export { ReactComponent as TextEditIcon } from "./icon-text-edit.svg"; -export { ReactComponent as TextboxIcon } from "./icon-textbox.svg"; -export { ReactComponent as TriangleIcon } from "./remix/arrow-up-line.svg"; // Closest match for triangle -export { ReactComponent as TypographyIcon } from "./remix/file-text-line.svg"; // Closest match for typography -export { ReactComponent as UnfoldWhiteIcon } from "./icon-unfold-white.svg"; -export { ReactComponent as UnfoldIcon } from "./icon-unfold.svg"; -export { ReactComponent as WarningWhiteIcon } from "./icon-warning-white.svg"; -export { ReactComponent as WarningIcon } from "./remix/error-warning-line.svg"; // Closest match for warning -export { ReactComponent as WidthDragIcon } from "./icon-widthDrag.svg"; -export { ReactComponent as ManyCheckboxIcon } from "./remix/checkbox-multiple-line.svg"; // Closest match for many checkbox -export { ReactComponent as Layout } from "./remix/layout-2-line.svg"; // Closest match for layout -export { ReactComponent as Left } from "./remix/arrow-left-s-line.svg"; // Closest match for left -export { ReactComponent as Middle } from "./remix/align-vertically.svg"; // Closest match for middle -export { ReactComponent as Right } from "./remix/arrow-right-s-line.svg"; // Closest match for right -export { ReactComponent as DeployIcon } from "./icon-rocket.svg"; -export { ReactComponent as ExportIcon } from "./remix/share-forward-line.svg"; // Closest match for export -export { ReactComponent as BluePlusIcon } from "./icon-blue-add.svg"; -export { ReactComponent as PencilIcon } from "./remix/pencil-line.svg"; // Closest match for pencil -export { ReactComponent as DragIcon } from "./remix/drag-move-2-line.svg"; // Closest match for drag -export { ReactComponent as PointIcon } from "./icon-three-point.svg"; -export { ReactComponent as AlignJustify } from "./remix/align-justify.svg"; // Exact match -export { ReactComponent as AlignRight } from "./remix/align-right.svg"; // Exact match -export { ReactComponent as AlignCenter } from "./remix/align-center.svg"; // Exact match -export { ReactComponent as AlignLeft } from "./remix/align-left.svg"; // Exact match -export { ReactComponent as AlignClose } from "./icon-align-close.svg"; -export { ReactComponent as AlignTop } from "./icon-align-top.svg"; -export { ReactComponent as AlignBottom } from "./icon-align-bottom.svg"; -export { ReactComponent as AddIcon } from "./remix/add-line.svg"; // Closest match for add -export { ReactComponent as ApplicationDocIcon } from "./icon-application-doc.svg"; -export { ReactComponent as ImportAppIcon } from "./remix/download-cloud-line.svg"; // Closest match for import app -export { ReactComponent as ModuleDocIcon } from "./icon-module-doc.svg"; -export { ReactComponent as ImportIcon } from "./remix/download-cloud-line.svg"; // Closest match for import -export { ReactComponent as ImportIconV2 } from "./remix/download-cloud-line.svg"; // Closest match for import v2 -export { ReactComponent as ModuleMenuIcon } from "./icon-module-menu.svg"; -export { ReactComponent as ModuleIcon } from "./remix/stack-line.svg"; // Closest match for module -export { ReactComponent as AllAppIcon } from "./icon-all-app.svg"; -export { ReactComponent as DatasourceIcon } from "./icon-datasource.svg"; -export { ReactComponent as QueryLibraryIcon } from "./icon-query-library.svg"; -export { ReactComponent as TransformerIcon } from "./icon-transformer.svg"; // Original -export { ReactComponent as TempStateIcon } from "./icon-temp-state.svg"; -export { ReactComponent as IconDep } from "./icon-style-dep.svg"; -export { ReactComponent as IconRadius } from "./icon-style-border-radius.svg"; -export { ReactComponent as IconReset } from "./remix/refresh-line.svg"; -export { ReactComponent as NavComIcon } from "./icon-nav.svg"; -export { ReactComponent as ButtonCompIcon } from "./icon-button.svg"; -export { ReactComponent as InputCompIcon } from "./remix/input-method-line.svg"; // Closest match for input component -export { ReactComponent as TextCompIcon } from "./remix/file-text-line.svg"; // Closest match for text component -export { ReactComponent as SwitchCompIcon } from "./remix/switch-line.svg"; // Closest match for switch component -export { ReactComponent as TableCompIcon } from "./remix/table-line.svg"; // Closest match for table component -export { ReactComponent as SelectCompIcon } from "./remix/dropdown-list.svg"; // Closest match for select component -export { ReactComponent as CheckboxCompIcon } from "./remix/checkbox-line.svg"; // Closest match for checkbox component -export { ReactComponent as RadioCompIcon } from "./remix/radio-line.svg"; // Closest match for radio component -export { ReactComponent as TimeCompIcon } from "./remix/time-line.svg"; // Closest match for time component -export { ReactComponent as TimeRangeCompIcon } from "./icon-timeRange.svg"; -export { ReactComponent as DateCompIcon } from "./remix/calendar-2-line.svg"; // Closest match for date component -export { ReactComponent as DateRangeCompIcon } from "./icon-dateRange.svg"; -export { ReactComponent as UploadCompIcon } from "./remix/upload-cloud-2-line.svg"; // Closest match for upload component -export { ReactComponent as ImageCompIcon } from "./remix/image-line.svg"; // Closest match for image component -export { ReactComponent as RatingCompIcon } from "./remix/star-line.svg"; // Closest match for rating component -export { ReactComponent as SliderCompIcon } from "./remix/git-commit-line.svg"; // Closest match for slider component -export { ReactComponent as ProcessCircleCompIcon } from "./icon-sliderCircle.svg"; -export { ReactComponent as ChartCompIcon } from "./remix/pie-chart-2-line.svg"; // Closest match for chart component -export { ReactComponent as JsonFormCompIcon } from "./icon-jsonForm.svg"; -export { ReactComponent as FormCompIcon } from "./remix/draft-line.svg"; // Closest match for form component -export { ReactComponent as ProgressCompIcon } from "./icon-progress.svg"; -export { ReactComponent as FileViewerCompIcon } from "./icon-fileViewer.svg"; -export { ReactComponent as ContainerCompIcon } from "./icon-container.svg"; -export { ReactComponent as LinkCompIcon } from "./remix/links-line.svg"; // Closest match for link component -export { ReactComponent as MultiSelectCompIcon } from "./remix/list-check-3.svg"; // Closest match for multiselect component -export { ReactComponent as PasswordCompIcon } from "./remix/key-2-line.svg"; // Closest match for password component -export { ReactComponent as RangeSliderCompIcon } from "./remix/switch-line.svg"; // Closest match for range slider component -export { ReactComponent as SegmentedCompIcon } from "./icon-insert-segmentedControl.svg"; -export { ReactComponent as TextAreaCompIcon } from "./remix/text-block.svg"; // Closest match for textarea component -export { ReactComponent as NumberInputCompIcon } from "./icon-insert-numberInput.svg"; -export { ReactComponent as DropdownCompIcon } from "./remix/dropdown-list.svg"; // Closest match for dropdown component -export { ReactComponent as DividerCompIcon } from "./icon-insert-divider.svg"; -export { ReactComponent as RichTextEditorCompIcon } from "./icon-insert-rich-text-editor.svg"; -export { ReactComponent as ModalCompIcon } from "./remix/window-line.svg"; // Closest match for modal component -export { ReactComponent as TabbedContainerCompIcon } from "./remix/layout-column-line.svg"; // Closest match for tabbed container -export { ReactComponent as CascaderCompIcon } from "./icon-cascader.svg"; -export { ReactComponent as TreeIcon } from "./remix/node-tree.svg"; // Closest match for tree icon -export { ReactComponent as TreeSelectIcon } from "./icon-tree-select.svg"; -export { ReactComponent as CustomCompIcon } from "./icon-custom-component.svg"; -export { ReactComponent as IFrameCompIcon } from "./remix/window-2-line.svg"; // Closest match for iframe component -export { ReactComponent as ListViewIcon } from "./icon-insert-listView.svg"; -export { ReactComponent as GridCompIcon } from "./remix/grid-line.svg"; // Closest match for grid component -export { ReactComponent as PackUpIcon } from "./icon-Pack-up.svg"; -export { ReactComponent as SearchIcon } from "./remix/search-line.svg"; // Closest match for search icon -export { ReactComponent as SearchOutlinedIcon } from "./remix/search-eye-line.svg"; // Closest match for search outlined icon -export { ReactComponent as FilterIcon } from "./remix/filter-line.svg"; // Closest match for filter icon -export { ReactComponent as DownloadIcon } from "./remix/download-line.svg"; // Closest match for download icon -export { ReactComponent as DownloadBoldIcon } from "./remix/download-2-line.svg"; // Closest match for download bold icon -export { ReactComponent as DownloadedIcon } from "./icon-downloaded.svg"; -export { ReactComponent as SettingIcon } from "./remix/settings-line.svg"; // Closest match for setting icon -export { ReactComponent as RefreshIcon } from "./remix/refresh-line.svg"; // Closest match for refresh icon -export { ReactComponent as DeleteIcon } from "./remix/delete-bin-6-line.svg"; // Closest match for delete icon -export { ReactComponent as DeleteInputIcon } from "./icon-deleteinput.svg"; -export { ReactComponent as UpgradeIcon } from "./icon-upgrade.svg"; -export { ReactComponent as QuestionIcon } from "./remix/question-line.svg"; // Closest match for question icon -export { ReactComponent as CloseIcon } from "./remix/close-line.svg"; // Closest match for close icon -export { ReactComponent as SuccessIcon } from "./remix/check-double-line.svg"; // Closest match for success icon -export { ReactComponent as ErrorIcon } from "./remix/error-warning-line.svg"; // Closest match for error icon -export { ReactComponent as DocIcon } from "./remix/file-text-line.svg"; // Closest match for document icon -export { ReactComponent as DocBoldIcon } from "./icon-tutorial-bold.svg"; -export { ReactComponent as QRCodeCompIcon } from "./remix/qr-code-line.svg"; // Closest match for QR code component -export { ReactComponent as NavDocIcon } from "./icon-nav-doc.svg"; -export { ReactComponent as LabIcon } from "./icon-laboratory.svg"; -export { ReactComponent as JsonExplorerCompIcon } from "./icon-json-explorer.svg"; -export { ReactComponent as JsonEditorCompIcon } from "./icon-json-editor.svg"; -export { ReactComponent as ArrowIcon } from "./remix/arrow-right-s-line.svg"; // Closest generic match for arrow icon -export { ReactComponent as ArrowSolidIcon } from "./remix/arrow-right-line.svg"; // Closest match for solid arrow icon -export { ReactComponent as AudioCompIcon } from "./remix/speaker-3-line.svg"; // Closest match for audio component -export { ReactComponent as VideoCompIcon } from "./remix/video-line.svg"; // Closest match for video component -export { ReactComponent as videoPlayTriangle } from "./icon-video-play-triangle.svg"; -export { ReactComponent as DrawerCompIcon } from "./remix/sidebar-unfold-line.svg"; // Closest match for drawer component -export { ReactComponent as LeftMeetingIcon } from "./remix/team-line.svg"; // Closest match for left meeting icon -export { ReactComponent as PlusIcon } from "./remix/add-line.svg"; // Closest match for plus icon -export { ReactComponent as HomeIcon } from "./remix/home-2-line.svg"; // Closest match for home icon -export { ReactComponent as HomeModuleIcon } from "./icon-application-module.svg"; -export { ReactComponent as HomeQueryLibraryIcon } from "./icon-application-query-library.svg"; -export { ReactComponent as HomeDataSourceIcon } from "./icon-application-datasource.svg"; -export { ReactComponent as RecyclerIcon } from "./icon-application-recycler.svg"; -export { ReactComponent as HomeActiveIcon } from "./icon-application-home-active.svg"; -export { ReactComponent as HomeModuleActiveIcon } from "./icon-application-module-active.svg"; -export { ReactComponent as HomeQueryLibraryActiveIcon } from "./icon-application-query-library-active.svg"; -export { ReactComponent as HomeDataSourceActiveIcon } from "./icon-application-datasource-active.svg"; -export { ReactComponent as RecyclerActiveIcon } from "./icon-application-recycler-active.svg"; -export { ReactComponent as FavoritesIcon } from "./icon-application-favorites.svg"; -export { ReactComponent as HomeSettingIcon } from "./remix/settings-5-line.svg"; // Closest match for home setting icon -export { ReactComponent as FolderIcon } from "./remix/folder-4-line.svg"; // Closest match for folder icon -export { ReactComponent as AllTypesIcon } from "./icon-application-all.svg"; -export { ReactComponent as InviteUserIcon } from "./icon-application-invite-user.svg"; -export { ReactComponent as HomeEmptyIcon } from "./icon-application-empty.svg"; -export { ReactComponent as HomeListIcon } from "./icon-application-list.svg"; -export { ReactComponent as HomeCardIcon } from "./icon-application-card.svg"; -export { ReactComponent as CarouselCompIcon } from "./icon-carousel.svg"; -export { ReactComponent as MysqlIcon } from "./icon-query-MySQL.svg"; -export { ReactComponent as DataResponderIcon } from "./icon-query-data-responder.svg"; -export { ReactComponent as MongoIcon } from "./icon-query-MongoDB.svg"; -export { ReactComponent as RestApiIcon } from "./icon-query-API.svg"; -export { ReactComponent as DeleteApiIcon } from "./icon-query-delete.svg"; -export { ReactComponent as GetApiIcon } from "./icon-query-get.svg"; -export { ReactComponent as PatchApiIcon } from "./icon-query-patch.svg"; -export { ReactComponent as PostApiIcon } from "./icon-query-post.svg"; -export { ReactComponent as PutApiIcon } from "./icon-query-put.svg"; -export { ReactComponent as OptionsApiIcon } from "./icon-query-options.svg"; -export { ReactComponent as HeadApiIcon } from "./icon-query-head.svg"; -export { ReactComponent as TraceApiIcon } from "./icon-query-trace.svg"; -export { ReactComponent as PostgresIcon } from "./icon-query-postgres.svg"; -export { ReactComponent as JSIcon } from "./icon-query-JS.svg"; -export { ReactComponent as LowcoderQueryIcon } from "./icon-query-lowcoder.svg"; -export { ReactComponent as RedisIcon } from "./icon-query-Redis.svg"; -export { ReactComponent as EsIcon } from "./icon-query-ElasticSearch.svg"; -export { ReactComponent as MSSQLIcon } from "./icon-query-mssql.svg"; -export { ReactComponent as SMTPIcon } from "./icon-query-SMTP.svg"; -export { ReactComponent as OracleIcon } from "./icon-query-OracleDB.svg"; -export { ReactComponent as ClickHouseIcon } from "./icon-query-ClickHouse.svg"; -export { ReactComponent as ResetIcon } from "./remix/refresh-line.svg"; // Closest match for reset icon -export { ReactComponent as EditIcon } from "./remix/edit-2-line.svg"; // Closest match for edit icon -export { ReactComponent as EditableIcon } from "./icon-editable.svg"; -export { ReactComponent as LeftStateIcon } from "./icon-left-state.svg"; -export { ReactComponent as LeftSettingIcon } from "./icon-left-setting.svg"; -export { ReactComponent as LeftHelpIcon } from "./icon-left-help.svg"; -export { ReactComponent as LeftPreloadIcon } from "./icon-left-preload.svg"; -export { ReactComponent as CollapsibleContainerCompIcon } from "./icon-collapsible-container.svg"; -export { ReactComponent as ToggleButtonCompIcon } from "./remix/switch-line.svg"; // Closest match for toggle button component -export { ReactComponent as GoogleSheetsIcon } from "./icon-query-GoogleSheets.svg"; -export { ReactComponent as GraphqlIcon } from "./icon-query-Graphql.svg"; -export { ReactComponent as SnowflakeIcon } from "./icon-query-snowflake.svg"; -export { ReactComponent as MariaDBIcon } from "./icon-query-MariaDB.svg"; -export { ReactComponent as imageEditorIcon } from "./icon-insert-imageEditor.svg"; -export { ReactComponent as MermaidIcon } from "./icon-mermaid.svg"; -export { ReactComponent as HomeSettingsIcon } from "./icon-home-settings.svg"; -export { ReactComponent as HomeSettingsActiveIcon } from "./icon-home-settings-active.svg"; -export { ReactComponent as HelpGithubIcon } from "./icon-help-github.svg"; -export { ReactComponent as HelpDiscordIcon } from "./icon-help-discord.svg"; -export { ReactComponent as LeftAudio } from "./icon-left-comp-audio.svg"; -export { ReactComponent as LeftButton } from "./remix/rectangle-line.svg"; // Closest match for left button -export { ReactComponent as LeftChart } from "./remix/bar-chart-2-line.svg"; // Closest match for left chart -export { ReactComponent as LeftCheckbox } from "./remix/checkbox-line.svg"; // Closest match for left checkbox -export { ReactComponent as LeftCommon } from "./icon-left-comp-common.svg"; -export { ReactComponent as LeftContainer } from "./icon-left-comp-container.svg"; -export { ReactComponent as LeftDate } from "./remix/calendar-2-line.svg"; // Closest match for left date -export { ReactComponent as LeftDivider } from "./icon-left-comp-divider.svg"; -export { ReactComponent as LeftDrawer } from "./remix/sidebar-unfold-line.svg"; // Closest match for drawer component -export { ReactComponent as LeftMeeting } from "./remix/team-line.svg"; // Closest match for left meeting icon -export { ReactComponent as LeftFile } from "./remix/file-line.svg"; // Closest match for left file -export { ReactComponent as LeftFileViewer } from "./icon-left-comp-fileViewer.svg"; -export { ReactComponent as LeftForm } from "./remix/draft-line.svg"; // Closest match for left form -export { ReactComponent as LeftIframe } from "./remix/window-2-line.svg"; // Closest match for left iframe -export { ReactComponent as LeftImage } from "./remix/image-line.svg"; // Closest match for left image -export { ReactComponent as LeftInput } from "./remix/input-method-line.svg"; // Closest match for left input -export { ReactComponent as LeftJsonEditor } from "./icon-left-comp-jsonEditor.svg"; -export { ReactComponent as LeftLink } from "./remix/links-line.svg"; // Closest match for left link -export { ReactComponent as LeftListView } from "./icon-left-comp-listView.svg"; -export { ReactComponent as LeftModal } from "./remix/shadow-line.svg"; // Closest match for left modal -export { ReactComponent as LeftNavigation } from "./remix/compass-line.svg"; // Closest match for left navigation -export { ReactComponent as LeftNumberInput } from "./icon-insert-numberInput.svg"; -export { ReactComponent as LeftPassword } from "./remix/key-2-line.svg"; // Closest match for left password -export { ReactComponent as LeftProgress } from "./icon-progress.svg"; -export { ReactComponent as LeftQrCode } from "./remix/qr-code-line.svg"; // Closest match for left QR code -export { ReactComponent as LeftRadio } from "./remix/radio-line.svg"; // Closest match for left radio -export { ReactComponent as LeftRating } from "./remix/star-line.svg"; // Closest match for left rating -export { ReactComponent as LeftSegmentedControl } from "./icon-left-comp-segmentedControl.svg"; -export { ReactComponent as LeftSelect } from "./remix/dropdown-list.svg"; // Closest match for left select -export { ReactComponent as LeftSlider } from "./remix/git-commit-line.svg"; // Closest match for left slider -export { ReactComponent as LeftSwitch } from "./remix/switch-line.svg"; // Closest match for left switch -export { ReactComponent as LeftTable } from "./remix/table-line.svg"; // Closest match for left table -export { ReactComponent as LeftText } from "./remix/file-text-line.svg"; // Closest match for left text -export { ReactComponent as LeftTime } from "./remix/time-line.svg"; // Closest match for left time -export { ReactComponent as LeftTree } from "./remix/node-tree.svg"; // Closest match for left tree -export { ReactComponent as LeftVideo } from "./remix/video-line.svg"; // Closest match for left video -export { ReactComponent as LeftOpen } from "./remix/door-open-line.svg"; // Closest match for left open -export { ReactComponent as LeftClose } from "./remix/door-closed-line.svg"; // Closest match for left close -export { ReactComponent as ScannerIcon } from "./remix/scan-line.svg"; // Closest match for scanner icon -export { ReactComponent as MaterialUploadIcon } from "./icon-material-upload.svg"; -export { ReactComponent as CalendarCompIcon } from "./remix/calendar-2-line.svg"; // Closest match for calendar component -export { ReactComponent as LeftSignature } from "./icon-left-signature.svg"; -export { ReactComponent as UndoIcon } from "./remix/arrow-go-back-line.svg"; // Closest match for undo icon -export { ReactComponent as SignatureIcon } from "./remix/pen-nib-line.svg"; // Closest match for signature icon -export { ReactComponent as ManualIcon } from "./icon-manual.svg"; -export { ReactComponent as WarnIcon } from "./remix/alert-line.svg"; // Closest match for warn icon -export { ReactComponent as SyncManualIcon } from "./icon-sync-manual.svg"; -export { ReactComponent as DangerIcon } from "./remix/error-warning-line.svg"; // Closest match for danger icon -export { ReactComponent as TableMinusIcon } from "./remix/checkbox-indeterminate-line.svg"; // Closest match for table minus icon -export { ReactComponent as TablePlusIcon } from "./remix/add-box-line.svg"; // Closest match for table plus icon -export { ReactComponent as MobileAppIcon } from "./remix/smartphone-line.svg"; // Closest match for mobile app icon -export { ReactComponent as MobileNavIcon } from "./remix/navigation-line.svg"; // Closest match for mobile navigation icon -export { ReactComponent as PcNavIcon } from "./remix/computer-line.svg"; // Closest match for PC navigation icon -export { ReactComponent as UnLockIcon } from "./remix/lock-unlock-line.svg"; // Closest match for unlock icon -export { ReactComponent as CalendarDeleteIcon } from "./remix/calendar-2-line.svg"; // Closest match for calendar delete icon -export { ReactComponent as TableCheckedIcon } from "./remix/checkbox-circle-line.svg"; // Closest match for table checked icon -export { ReactComponent as TableUnCheckedIcon } from "./remix/checkbox-blank-circle-line.svg"; // Closest match for table unchecked icon -export { ReactComponent as FileFolderIcon } from "./remix/folder-2-line.svg"; // Closest match for file folder icon -export { ReactComponent as ExpandIcon } from "./remix/menu-unfold-line.svg"; // Closest match for expand icon -export { ReactComponent as CompressIcon } from "./remix/menu-fold-line.svg"; // Closest match for compress icon -export { ReactComponent as TableCellsIcon } from "./remix/grid-line.svg"; // Closest match for table cells icon -export { ReactComponent as TimeLineIcon } from "./remix/time-line.svg"; // Closest match for timeline icon -export { ReactComponent as LottieIcon } from "./icon-lottie.svg"; -export { ReactComponent as CommentIcon } from "./icon-comment-comp.svg"; -export { ReactComponent as MentionIcon } from "./icon-mention-comp.svg"; -export { ReactComponent as AutoCompleteCompIcon } from "./icon-autocomplete-comp.svg"; -export { ReactComponent as WidthIcon } from "./icon-width.svg"; -export { ReactComponent as ResponsiveLayoutCompIcon } from "./remix/layout-column-line.svg"; // Closest match for responsive layout component -export { ReactComponent as TextSizeIcon } from "./icon-text-size.svg"; */ +// components + +// small +export { ReactComponent as LeftCommon } from "./icon-left-comp-common.svg"; // generic + +export { ReactComponent as AvatarCompIconSmall } from "./v2/avatar-s.svg"; +export { ReactComponent as AvatarGroupCompIconSmall } from "./v2/avatargroup-s.svg"; +export { ReactComponent as AudioCompIconSmall } from "./v2/audio-player-s.svg"; +export { ReactComponent as AutoCompleteCompIconSmall } from "./v2/auto-complete-input-s.svg"; // new +export { ReactComponent as ButtonCompIconSmall } from "./v2/button-s.svg"; +export { ReactComponent as IconButtonCompIconSmall } from "./v2/icon-button-s.svg"; // new +export { ReactComponent as CardCompIconSmall } from "./v2/card-layout-s.svg"; +export { ReactComponent as CalendarCompIconSmall } from "./v2/calendar-s.svg"; +export { ReactComponent as CascaderCompIconSmall } from "./v2/cascader-s.svg"; +export { ReactComponent as CarouselCompIconSmall } from "./v2/image-carousel-s.svg"; // new +export { ReactComponent as ChartCompIconSmall } from "./v2/pie-chart-s.svg"; +export { ReactComponent as CheckboxCompIconSmall } from "./v2/checkbox-s.svg"; +export { ReactComponent as ColorPickerCompIconSmall } from "./v2/colorpicker-s.svg"; // new +export { ReactComponent as CollapsibleContainerCompIconSmall } from "./v2/collapsible-container-s.svg"; // new +export { ReactComponent as CommentCompIconSmall } from "./v2/comment-s.svg"; +export { ReactComponent as ContainerCompIconSmall } from "./v2/container-s.svg"; +export { ReactComponent as CustomCompIconSmall } from "./v2/custom-code-s.svg"; // new +export { ReactComponent as DateCompIconSmall } from "./v2/date-select-s.svg"; +export { ReactComponent as DateRangeCompIconSmall } from "./v2/date-range-select-s.svg"; // new +export { ReactComponent as DividerCompIconSmall } from "./v2/divider-s.svg"; +export { ReactComponent as DrawerCompIconSmall } from "./v2/drawer-s.svg"; +export { ReactComponent as DropdownCompIconSmall } from "./v2/dropdown-s.svg"; // new +export { ReactComponent as UploadCompIconSmall } from "./v2/file-upload-s.svg"; +export { ReactComponent as FileViewerCompIconSmall } from "./v2/file-viewer-s.svg"; +export { ReactComponent as FloatingButtonCompIconSmall } from "./v2/floating-button-s.svg"; // new +export { ReactComponent as FloatingTextCompIconSmall } from "./v2/floating-text-layout-s.svg"; // new +export { ReactComponent as FormCompIconSmall } from "./v2/form-s.svg"; +export { ReactComponent as GridCompIconSmall } from "./v2/grid-view-s.svg"; // new +export { ReactComponent as IconCompIconSmall } from "./v2/icon-s.svg"; // new +export { ReactComponent as IFrameCompIconSmall } from "./v2/iframe-s.svg"; +export { ReactComponent as ImageEditorCompIconSmall } from "./v2/image-editor-s.svg"; // new +export { ReactComponent as ImageCompIconSmall } from "./v2/image-s.svg"; +export { ReactComponent as InputCompIconSmall } from "./v2/input-s.svg"; +export { ReactComponent as JsonEditorCompIconSmall } from "./v2/json-editor-s.svg"; +export { ReactComponent as JsonExplorerCompIconSmall } from "./v2/json-viewer-s.svg"; // new +export { ReactComponent as JsonFormCompIconSmall } from "./v2/json-schema-form-s.svg"; // new +export { ReactComponent as PageLayoutCompIconSmall } from "./v2/page-layout-s.svg"; // new +export { ReactComponent as LinkCompIconSmall } from "./v2/link-s.svg"; +export { ReactComponent as ListViewCompIconSmall } from "./v2/list-view-s.svg"; +export { ReactComponent as LottieAnimationCompIconSmall } from "./v2/lottie-animation-s.svg"; // new +export { ReactComponent as MentionCompIconSmall } from "./v2/mention-s.svg"; // new +export { ReactComponent as MermaidCompIconSmall } from "./v2/mermaid-chart-s.svg"; // new +export { ReactComponent as ModalCompIconSmall } from "./v2/modal-s.svg"; +export { ReactComponent as ModuleIconSmall } from "./v2/module-s.svg"; +export { ReactComponent as MultiSelectCompIconSmall } from "./v2/multiselect-s.svg"; // new +export { ReactComponent as NavComIconSmall } from "./v2/navigation-s.svg"; +export { ReactComponent as NumberInputCompIconSmall } from "./v2/number-input-s.svg"; +export { ReactComponent as PasswordCompIconSmall } from "./v2/password-s.svg"; +export { ReactComponent as ProgressCompIconSmall } from "./v2/progress-s.svg"; +export { ReactComponent as ProcessCircleCompIconSmall } from "./v2/progress-circle-s.svg"; // new +export { ReactComponent as QRCodeCompIconSmall } from "./v2/qr-code-display-s.svg"; +export { ReactComponent as RadioCompIconSmall } from "./v2/radio-button-s.svg"; +export { ReactComponent as RangeSliderCompIconSmall } from "./v2/range-slider-s.svg"; // new +export { ReactComponent as RatingCompIconSmall } from "./v2/rating-s.svg"; +export { ReactComponent as ResponsiveLayoutCompIconSmall } from "./v2/resposive-layout-s.svg"; // new +export { ReactComponent as RichTextEditorCompIconSmall } from "./v2/rich-text-editor-s.svg"; // new +export { ReactComponent as ScannerCompIconSmall } from "./v2/scanner-s.svg"; // new +export { ReactComponent as ShapesCompIconSmall } from "./v2/shapes-s.svg"; // new +export { ReactComponent as SegmentedCompIconSmall } from "./v2/segmented-control-s.svg"; +export { ReactComponent as SelectCompIconSmall } from "./v2/select-s.svg"; +export { ReactComponent as SliderCompIconSmall } from "./v2/slider-s.svg"; +// export { ReactComponent as StepsTextIconSmall } from "./icon-steps-comp.svg"; // new +export { ReactComponent as SwitchCompIconSmall } from "./v2/switch-s.svg"; +export { ReactComponent as TabbedContainerCompIconSmall } from "./v2/tabbed-container-s.svg"; // new +export { ReactComponent as TableCompIconSmall } from "./v2/table-s.svg"; +export { ReactComponent as TextAreaCompIconSmall } from "./v2/text-area-input-s.svg"; // new +export { ReactComponent as TextCompIconSmall } from "./v2/text-display-s.svg"; +export { ReactComponent as TimeCompIconSmall } from "./v2/time-select-s.svg"; +export { ReactComponent as TimeLineCompIconSmall } from "./v2/timeline-s.svg"; // new +export { ReactComponent as TimeRangeCompIconSmall } from "./v2/time-range-select-s.svg"; // new +export { ReactComponent as ToggleButtonCompIconSmall } from "./v2/toggle-button-s.svg"; // new +export { ReactComponent as TourCompIconSmall } from "./v2/modal-s.svg"; // new +export { ReactComponent as TransferCompIconSmall } from "./v2/transfer-list-s.svg"; // new +export { ReactComponent as TreeDisplayCompIconSmall } from "./v2/tree-display-s.svg"; +export { ReactComponent as TreeSelectCompIconSmall } from "./v2/tree-select-s.svg"; // new +export { ReactComponent as VideoCompIconSmall } from "./v2/video-player-s.svg"; +export { ReactComponent as VideoMeetingRoomCompIconSmall } from "./v2/meeting-room-s.svg"; +export { ReactComponent as VideoCameraStreamCompIconSmall } from "./v2/camera-stream-s.svg"; // new +export { ReactComponent as VideoScreenshareCompIconSmall } from "./v2/screen-share-stream-s.svg"; // new +export { ReactComponent as SignatureCompIconSmall } from "./v2/signature-s.svg"; +export { ReactComponent as StepCompIconSmall } from "./v2/steps-s.svg"; + +export { ReactComponent as CandlestickChartCompIconSmall } from "./v2/candlestick-chart-s.svg"; // new +export { ReactComponent as FunnelChartCompIconSmall } from "./v2/funnel-chart-s.svg"; // new +export { ReactComponent as GaugeChartCompIconSmall } from "./v2/gauge-chart-s.svg"; // new +export { ReactComponent as GraphChartCompIconSmall } from "./v2/graph-chart-s.svg"; // new +export { ReactComponent as HeatmapChartCompIconSmall } from "./v2/heatmap-chart-s.svg"; // new +export { ReactComponent as RadarChartCompIconSmall } from "./v2/radar-chart-s.svg"; // new +export { ReactComponent as SankeyChartCompIconSmall } from "./v2/sankey-chart-s.svg"; // new +export { ReactComponent as SunburstChartCompIconSmall } from "./v2/sunburst-chart-s.svg"; // new +export { ReactComponent as ThemeriverChartCompIconSmall } from "./v2/themeriver-chart-s.svg"; // new +export { ReactComponent as TreeChartCompIconSmall } from "./v2/tree-chart-s.svg"; // new +export { ReactComponent as TreemapChartCompIconSmall } from "./v2/treemap-chart-s.svg"; // new +export { ReactComponent as BPMNEditorCompIconSmall } from "./v2/bpmn-editor-s.svg"; // new +export { ReactComponent as GeoMapChartsCompIconSmall } from "./v2/geomap-charts-s.svg"; // new +export { ReactComponent as GeoMapLayersCompIconSmall } from "./v2/geomap-layers-s.svg"; // new +export { ReactComponent as HillchartCompIconSmall } from "./v2/hillchart-s.svg"; // new +export { ReactComponent as PivotTableCompIconSmall } from "./v2/pivot-table-s.svg"; // new +export { ReactComponent as TurnstileCaptchaCompIconSmall } from "./v2/turnstile-captcha-s.svg"; // new + + +// medium +export { ReactComponent as AudioCompIcon } from "./v2/audio-player-m.svg"; +export { ReactComponent as AutoCompleteCompIcon } from "./v2/auto-complete-input-m.svg"; +export { ReactComponent as AvatarCompIcon } from "./v2/avatar-m.svg"; +export { ReactComponent as ButtonCompIcon } from "./v2/button-m.svg"; +export { ReactComponent as AvatarGroupCompIcon } from "./v2/avatargroup-m.svg"; +export { ReactComponent as IconButtonCompIcon } from "./v2/icon-button-m.svg"; +export { ReactComponent as CalendarCompIcon } from "./v2/calendar-m.svg"; +export { ReactComponent as CardCompIcon } from "./v2/card-layout-m.svg"; +export { ReactComponent as CarouselCompIcon } from "./v2/image-carousel-m.svg"; +export { ReactComponent as CascaderCompIcon } from "./v2/cascader-m.svg"; +export { ReactComponent as ChartCompIcon } from "./v2/pie-chart-m.svg"; +export { ReactComponent as CheckboxCompIcon } from "./v2/checkbox-m.svg"; +export { ReactComponent as CollapsibleContainerCompIcon } from "./v2/collapsible-container-m.svg"; +export { ReactComponent as CommentCompIcon } from "./v2/comment-m.svg"; +export { ReactComponent as ColorPickerCompIcon } from "./v2/colorpicker-m.svg"; +export { ReactComponent as ContainerCompIcon } from "./v2/container-m.svg"; +export { ReactComponent as CustomCompIcon } from "./v2/custom-code-m.svg"; +export { ReactComponent as DateCompIcon } from "./v2/date-select-m.svg"; +export { ReactComponent as DateRangeCompIcon } from "./v2/date-range-select-m.svg"; +export { ReactComponent as DividerCompIcon } from "./v2/divider-m.svg"; +export { ReactComponent as DrawerCompIcon } from "./v2/drawer-m.svg"; +export { ReactComponent as DropdownCompIcon } from "./v2/dropdown-m.svg"; +export { ReactComponent as FileViewerCompIcon } from "./v2/file-viewer-m.svg"; +export { ReactComponent as FloatingButtonCompIcon } from "./v2/floating-button-m.svg"; +export { ReactComponent as FloatingTextCompIcon } from "./v2/floating-text-layout-m.svg"; +export { ReactComponent as FormCompIcon } from "./v2/form-m.svg"; +export { ReactComponent as GridCompIcon } from "./v2/grid-view-m.svg"; +export { ReactComponent as IconCompIcon } from "./v2/icon-m.svg"; +export { ReactComponent as IFrameCompIcon } from "./v2/iframe-m.svg"; +export { ReactComponent as ImageEditorCompIcon } from "./v2/image-editor-m.svg"; +export { ReactComponent as ImageCompIcon } from "./v2/image-m.svg"; +export { ReactComponent as InputCompIcon } from "./v2/input-m.svg"; +export { ReactComponent as JsonEditorCompIcon } from "./v2/json-editor-m.svg"; +export { ReactComponent as JsonExplorerCompIcon } from "./v2/json-viewer-m.svg"; +export { ReactComponent as JsonFormCompIcon } from "./v2/json-schema-form-m.svg"; +export { ReactComponent as PageLayoutCompIcon } from "./v2/page-layout-m.svg"; +export { ReactComponent as LinkCompIcon } from "./v2/link-m.svg"; +export { ReactComponent as ListViewCompIcon } from "./v2/list-view-m.svg"; +export { ReactComponent as LottieAnimationCompIcon } from "./v2/lottie-animation-m.svg"; +export { ReactComponent as MentionCompIcon } from "./v2/mention-m.svg"; +export { ReactComponent as MermaidCompIcon } from "./v2/mermaid-chart-m.svg"; +export { ReactComponent as ModalCompIcon } from "./v2/modal-m.svg"; +export { ReactComponent as MultiSelectCompIcon } from "./v2/multiselect-m.svg"; +export { ReactComponent as NavComIcon } from "./v2/navigation-m.svg"; +export { ReactComponent as NumberInputCompIcon } from "./v2/number-input-m.svg"; +export { ReactComponent as PasswordCompIcon } from "./v2/password-m.svg"; +export { ReactComponent as ProcessCircleCompIcon } from "./v2/progress-circle-m.svg"; +export { ReactComponent as ProgressCompIcon } from "./v2/progress-m.svg"; +export { ReactComponent as QRCodeCompIcon } from "./v2/qr-code-display-m.svg"; +export { ReactComponent as RadioCompIcon } from "./v2/radio-button-m.svg"; +export { ReactComponent as RangeSliderCompIcon } from "./v2/range-slider-m.svg"; +export { ReactComponent as RatingCompIcon } from "./v2/rating-m.svg"; +export { ReactComponent as ResponsiveLayoutCompIcon } from "./v2/resposive-layout-m.svg"; +export { ReactComponent as RichTextEditorCompIcon } from "./v2/rich-text-editor-m.svg"; +export { ReactComponent as ScannerCompIcon } from "./v2/scanner-m.svg"; +export { ReactComponent as ShapesCompIcon } from "./v2/shapes-m.svg"; +export { ReactComponent as SegmentedCompIcon } from "./v2/segmented-control-m.svg"; +export { ReactComponent as SelectCompIcon } from "./v2/select-m.svg"; +export { ReactComponent as SliderCompIcon } from "./v2/slider-m.svg"; +// export { ReactComponent as StepsTextIcon } from "./icon-steps-comp.svg"; // to check +export { ReactComponent as SwitchCompIcon } from "./v2/switch-m.svg"; +export { ReactComponent as TabbedContainerCompIcon } from "./v2/tabbed-container-m.svg"; +export { ReactComponent as TableCompIcon } from "./v2/mighty-table-m.svg"; +export { ReactComponent as TextAreaCompIcon } from "./v2/text-area-input-m.svg"; +export { ReactComponent as TextCompIcon } from "./v2/text-display-m.svg"; +export { ReactComponent as TimeCompIcon } from "./v2/time-select-m.svg"; +export { ReactComponent as TimerCompIcon } from "./v2/timer-m.svg"; +export { ReactComponent as TimeLineCompIcon } from "./v2/timeline-m.svg"; +export { ReactComponent as TimeRangeCompIcon } from "./v2/time-range-select-m.svg"; +export { ReactComponent as ToggleButtonCompIcon } from "./v2/toggle-button-m.svg"; +export { ReactComponent as TourCompIcon } from "./v2/modal-m.svg"; +export { ReactComponent as TransferCompIcon } from "./v2/transfer-list-m.svg"; +export { ReactComponent as TreeDisplayCompIcon } from "./v2/tree-display-m.svg"; +export { ReactComponent as TreeSelectCompIcon } from "./v2/tree-select-m.svg"; +export { ReactComponent as UploadCompIcon } from "./v2/file-upload-m.svg"; +export { ReactComponent as VideoCompIcon } from "./v2/video-player-m.svg"; +export { ReactComponent as VideoMeetingRoomCompIcon } from "./v2/meeting-room-m.svg"; +export { ReactComponent as VideoCameraStreamCompIcon } from "./v2/camera-stream-m.svg"; +export { ReactComponent as VideoScreenshareCompIcon } from "./v2/screen-share-stream-m.svg"; +export { ReactComponent as StepCompIcon } from "./v2/steps-m.svg"; +export { ReactComponent as SignatureCompIcon } from "./v2/signature-m.svg"; + +export { ReactComponent as CandlestickChartCompIcon } from "./v2/candlestick-chart-m.svg"; +export { ReactComponent as FunnelChartCompIcon } from "./v2/funnel-chart-m.svg"; +export { ReactComponent as GaugeChartCompIcon } from "./v2/gauge-chart-m.svg"; +export { ReactComponent as GraphChartCompIcon } from "./v2/graph-chart-m.svg"; +export { ReactComponent as HeatmapChartCompIcon } from "./v2/heatmap-chart-m.svg"; +export { ReactComponent as RadarChartCompIcon } from "./v2/radar-chart-m.svg"; +export { ReactComponent as SankeyChartCompIcon } from "./v2/sankey-chart-m.svg"; +export { ReactComponent as SunburstChartCompIcon } from "./v2/sunburst-chart-m.svg"; +export { ReactComponent as ThemeriverChartCompIcon } from "./v2/themeriver-chart-m.svg"; +export { ReactComponent as TreeChartCompIcon } from "./v2/tree-chart-m.svg"; +export { ReactComponent as TreemapChartCompIcon } from "./v2/treemap-chart-m.svg"; + +export { ReactComponent as BPMNEditorCompIcon } from "./v2/bpmn-editor-m.svg"; +export { ReactComponent as GeoMapChartsCompIcon } from "./v2/geomap-charts-m.svg"; +export { ReactComponent as GeoMapLayersCompIcon } from "./v2/geomap-layers-m.svg"; +export { ReactComponent as HillchartCompIcon } from "./v2/hillchart-m.svg"; +export { ReactComponent as TurnstileCaptchaCompIcon } from "./v2/turnstile-captcha-m.svg"; +export { ReactComponent as PivotTableCompIcon } from "./v2/pivot-table-m.svg"; + +// flags +export { ReactComponent as Flag_af } from './flags/4x3/af.svg'; +export { ReactComponent as Flag_ax } from './flags/4x3/ax.svg'; +export { ReactComponent as Flag_al } from './flags/4x3/al.svg'; +export { ReactComponent as Flag_dz } from './flags/4x3/dz.svg'; +export { ReactComponent as Flag_as } from './flags/4x3/as.svg'; +export { ReactComponent as Flag_ad } from './flags/4x3/ad.svg'; +export { ReactComponent as Flag_ao } from './flags/4x3/ao.svg'; +export { ReactComponent as Flag_ai } from './flags/4x3/ai.svg'; +export { ReactComponent as Flag_aq } from './flags/4x3/aq.svg'; +export { ReactComponent as Flag_ag } from './flags/4x3/ag.svg'; +export { ReactComponent as Flag_ar } from './flags/4x3/ar.svg'; +export { ReactComponent as Flag_am } from './flags/4x3/am.svg'; +export { ReactComponent as Flag_aw } from './flags/4x3/aw.svg'; +export { ReactComponent as Flag_sh_ac } from './flags/4x3/sh-ac.svg'; +export { ReactComponent as Flag_au } from './flags/4x3/au.svg'; +export { ReactComponent as Flag_at } from './flags/4x3/at.svg'; +export { ReactComponent as Flag_az } from './flags/4x3/az.svg'; +export { ReactComponent as Flag_bs } from './flags/4x3/bs.svg'; +export { ReactComponent as Flag_bh } from './flags/4x3/bh.svg'; +export { ReactComponent as Flag_bd } from './flags/4x3/bd.svg'; +export { ReactComponent as Flag_bb } from './flags/4x3/bb.svg'; +export { ReactComponent as Flag_by } from './flags/4x3/by.svg'; +export { ReactComponent as Flag_be } from './flags/4x3/be.svg'; +export { ReactComponent as Flag_bz } from './flags/4x3/bz.svg'; +export { ReactComponent as Flag_bj } from './flags/4x3/bj.svg'; +export { ReactComponent as Flag_bm } from './flags/4x3/bm.svg'; +export { ReactComponent as Flag_bt } from './flags/4x3/bt.svg'; +export { ReactComponent as Flag_bo } from './flags/4x3/bo.svg'; +export { ReactComponent as Flag_bq } from './flags/4x3/bq.svg'; +export { ReactComponent as Flag_ba } from './flags/4x3/ba.svg'; +export { ReactComponent as Flag_bw } from './flags/4x3/bw.svg'; +export { ReactComponent as Flag_bv } from './flags/4x3/bv.svg'; +export { ReactComponent as Flag_br } from './flags/4x3/br.svg'; +export { ReactComponent as Flag_io } from './flags/4x3/io.svg'; +export { ReactComponent as Flag_bn } from './flags/4x3/bn.svg'; +export { ReactComponent as Flag_bg } from './flags/4x3/bg.svg'; +export { ReactComponent as Flag_bf } from './flags/4x3/bf.svg'; +export { ReactComponent as Flag_bi } from './flags/4x3/bi.svg'; +export { ReactComponent as Flag_cv } from './flags/4x3/cv.svg'; +export { ReactComponent as Flag_kh } from './flags/4x3/kh.svg'; +export { ReactComponent as Flag_cm } from './flags/4x3/cm.svg'; +export { ReactComponent as Flag_ca } from './flags/4x3/ca.svg'; +export { ReactComponent as Flag_ic } from './flags/4x3/ic.svg'; +export { ReactComponent as Flag_es_ct } from './flags/4x3/es-ct.svg'; +export { ReactComponent as Flag_ky } from './flags/4x3/ky.svg'; +export { ReactComponent as Flag_cf } from './flags/4x3/cf.svg'; +export { ReactComponent as Flag_td } from './flags/4x3/td.svg'; +export { ReactComponent as Flag_cl } from './flags/4x3/cl.svg'; +export { ReactComponent as Flag_cn } from './flags/4x3/cn.svg'; +export { ReactComponent as Flag_cx } from './flags/4x3/cx.svg'; +export { ReactComponent as Flag_cc } from './flags/4x3/cc.svg'; +export { ReactComponent as Flag_co } from './flags/4x3/co.svg'; +export { ReactComponent as Flag_km } from './flags/4x3/km.svg'; +export { ReactComponent as Flag_ck } from './flags/4x3/ck.svg'; +export { ReactComponent as Flag_cr } from './flags/4x3/cr.svg'; +export { ReactComponent as Flag_hr } from './flags/4x3/hr.svg'; +export { ReactComponent as Flag_cu } from './flags/4x3/cu.svg'; +export { ReactComponent as Flag_cw } from './flags/4x3/cw.svg'; +export { ReactComponent as Flag_cy } from './flags/4x3/cy.svg'; +export { ReactComponent as Flag_cz } from './flags/4x3/cz.svg'; +export { ReactComponent as Flag_ci } from './flags/4x3/ci.svg'; +export { ReactComponent as Flag_cd } from './flags/4x3/cd.svg'; +export { ReactComponent as Flag_dk } from './flags/4x3/dk.svg'; +export { ReactComponent as Flag_dj } from './flags/4x3/dj.svg'; +export { ReactComponent as Flag_dm } from './flags/4x3/dm.svg'; +export { ReactComponent as Flag_do } from './flags/4x3/do.svg'; +export { ReactComponent as Flag_ec } from './flags/4x3/ec.svg'; +export { ReactComponent as Flag_eg } from './flags/4x3/eg.svg'; +export { ReactComponent as Flag_sv } from './flags/4x3/sv.svg'; +export { ReactComponent as Flag_gq } from './flags/4x3/gq.svg'; +export { ReactComponent as Flag_er } from './flags/4x3/er.svg'; +export { ReactComponent as Flag_ee } from './flags/4x3/ee.svg'; +export { ReactComponent as Flag_sz } from './flags/4x3/sz.svg'; +export { ReactComponent as Flag_et } from './flags/4x3/et.svg'; +export { ReactComponent as Flag_eu } from './flags/4x3/eu.svg'; +export { ReactComponent as Flag_fk } from './flags/4x3/fk.svg'; +export { ReactComponent as Flag_fo } from './flags/4x3/fo.svg'; +export { ReactComponent as Flag_fm } from './flags/4x3/fm.svg'; +export { ReactComponent as Flag_fj } from './flags/4x3/fj.svg'; +export { ReactComponent as Flag_fi } from './flags/4x3/fi.svg'; +export { ReactComponent as Flag_fr } from './flags/4x3/fr.svg'; +export { ReactComponent as Flag_gf } from './flags/4x3/gf.svg'; +export { ReactComponent as Flag_pf } from './flags/4x3/pf.svg'; +export { ReactComponent as Flag_tf } from './flags/4x3/tf.svg'; +export { ReactComponent as Flag_ga } from './flags/4x3/ga.svg'; +export { ReactComponent as Flag_gm } from './flags/4x3/gm.svg'; +export { ReactComponent as Flag_ge } from './flags/4x3/ge.svg'; +export { ReactComponent as Flag_de } from './flags/4x3/de.svg'; +export { ReactComponent as Flag_gh } from './flags/4x3/gh.svg'; +export { ReactComponent as Flag_gi } from './flags/4x3/gi.svg'; +export { ReactComponent as Flag_gr } from './flags/4x3/gr.svg'; +export { ReactComponent as Flag_gl } from './flags/4x3/gl.svg'; +export { ReactComponent as Flag_gd } from './flags/4x3/gd.svg'; +export { ReactComponent as Flag_gp } from './flags/4x3/gp.svg'; +export { ReactComponent as Flag_gu } from './flags/4x3/gu.svg'; +export { ReactComponent as Flag_gt } from './flags/4x3/gt.svg'; +export { ReactComponent as Flag_gg } from './flags/4x3/gg.svg'; +export { ReactComponent as Flag_gn } from './flags/4x3/gn.svg'; +export { ReactComponent as Flag_gw } from './flags/4x3/gw.svg'; +export { ReactComponent as Flag_gy } from './flags/4x3/gy.svg'; +export { ReactComponent as Flag_ht } from './flags/4x3/ht.svg'; +export { ReactComponent as Flag_hm } from './flags/4x3/hm.svg'; +export { ReactComponent as Flag_va } from './flags/4x3/va.svg'; +export { ReactComponent as Flag_hn } from './flags/4x3/hn.svg'; +export { ReactComponent as Flag_hk } from './flags/4x3/hk.svg'; +export { ReactComponent as Flag_hu } from './flags/4x3/hu.svg'; +export { ReactComponent as Flag_is } from './flags/4x3/is.svg'; +export { ReactComponent as Flag_in } from './flags/4x3/in.svg'; +export { ReactComponent as Flag_id } from './flags/4x3/id.svg'; +export { ReactComponent as Flag_ir } from './flags/4x3/ir.svg'; +export { ReactComponent as Flag_iq } from './flags/4x3/iq.svg'; +export { ReactComponent as Flag_ie } from './flags/4x3/ie.svg'; +export { ReactComponent as Flag_im } from './flags/4x3/im.svg'; +export { ReactComponent as Flag_il } from './flags/4x3/il.svg'; +export { ReactComponent as Flag_it } from './flags/4x3/it.svg'; +export { ReactComponent as Flag_jm } from './flags/4x3/jm.svg'; +export { ReactComponent as Flag_jp } from './flags/4x3/jp.svg'; +export { ReactComponent as Flag_je } from './flags/4x3/je.svg'; +export { ReactComponent as Flag_jo } from './flags/4x3/jo.svg'; +export { ReactComponent as Flag_kz } from './flags/4x3/kz.svg'; +export { ReactComponent as Flag_ke } from './flags/4x3/ke.svg'; +export { ReactComponent as Flag_ki } from './flags/4x3/ki.svg'; +export { ReactComponent as Flag_xk } from './flags/4x3/xk.svg'; +export { ReactComponent as Flag_kw } from './flags/4x3/kw.svg'; +export { ReactComponent as Flag_kg } from './flags/4x3/kg.svg'; +export { ReactComponent as Flag_la } from './flags/4x3/la.svg'; +export { ReactComponent as Flag_lv } from './flags/4x3/lv.svg'; +export { ReactComponent as Flag_lb } from './flags/4x3/lb.svg'; +export { ReactComponent as Flag_ls } from './flags/4x3/ls.svg'; +export { ReactComponent as Flag_lr } from './flags/4x3/lr.svg'; +export { ReactComponent as Flag_ly } from './flags/4x3/ly.svg'; +export { ReactComponent as Flag_li } from './flags/4x3/li.svg'; +export { ReactComponent as Flag_lt } from './flags/4x3/lt.svg'; +export { ReactComponent as Flag_lu } from './flags/4x3/lu.svg'; +export { ReactComponent as Flag_mo } from './flags/4x3/mo.svg'; +export { ReactComponent as Flag_mg } from './flags/4x3/mg.svg'; +export { ReactComponent as Flag_mw } from './flags/4x3/mw.svg'; +export { ReactComponent as Flag_my } from './flags/4x3/my.svg'; +export { ReactComponent as Flag_mv } from './flags/4x3/mv.svg'; +export { ReactComponent as Flag_ml } from './flags/4x3/ml.svg'; +export { ReactComponent as Flag_mt } from './flags/4x3/mt.svg'; +export { ReactComponent as Flag_mh } from './flags/4x3/mh.svg'; +export { ReactComponent as Flag_mq } from './flags/4x3/mq.svg'; +export { ReactComponent as Flag_mr } from './flags/4x3/mr.svg'; +export { ReactComponent as Flag_mu } from './flags/4x3/mu.svg'; +export { ReactComponent as Flag_yt } from './flags/4x3/yt.svg'; +export { ReactComponent as Flag_mx } from './flags/4x3/mx.svg'; +export { ReactComponent as Flag_md } from './flags/4x3/md.svg'; +export { ReactComponent as Flag_mc } from './flags/4x3/mc.svg'; +export { ReactComponent as Flag_mn } from './flags/4x3/mn.svg'; +export { ReactComponent as Flag_me } from './flags/4x3/me.svg'; +export { ReactComponent as Flag_ms } from './flags/4x3/ms.svg'; +export { ReactComponent as Flag_ma } from './flags/4x3/ma.svg'; +export { ReactComponent as Flag_mz } from './flags/4x3/mz.svg'; +export { ReactComponent as Flag_mm } from './flags/4x3/mm.svg'; +export { ReactComponent as Flag_na } from './flags/4x3/na.svg'; +export { ReactComponent as Flag_nr } from './flags/4x3/nr.svg'; +export { ReactComponent as Flag_np } from './flags/4x3/np.svg'; +export { ReactComponent as Flag_nl } from './flags/4x3/nl.svg'; +export { ReactComponent as Flag_nc } from './flags/4x3/nc.svg'; +export { ReactComponent as Flag_nz } from './flags/4x3/nz.svg'; +export { ReactComponent as Flag_ni } from './flags/4x3/ni.svg'; +export { ReactComponent as Flag_ne } from './flags/4x3/ne.svg'; +export { ReactComponent as Flag_ng } from './flags/4x3/ng.svg'; +export { ReactComponent as Flag_nu } from './flags/4x3/nu.svg'; +export { ReactComponent as Flag_nf } from './flags/4x3/nf.svg'; +export { ReactComponent as Flag_kp } from './flags/4x3/kp.svg'; +export { ReactComponent as Flag_mk } from './flags/4x3/mk.svg'; +export { ReactComponent as Flag_gb_nir } from './flags/4x3/gb-nir.svg'; +export { ReactComponent as Flag_mp } from './flags/4x3/mp.svg'; +export { ReactComponent as Flag_no } from './flags/4x3/no.svg'; +export { ReactComponent as Flag_om } from './flags/4x3/om.svg'; +export { ReactComponent as Flag_pk } from './flags/4x3/pk.svg'; +export { ReactComponent as Flag_pw } from './flags/4x3/pw.svg'; +export { ReactComponent as Flag_pa } from './flags/4x3/pa.svg'; +export { ReactComponent as Flag_pg } from './flags/4x3/pg.svg'; +export { ReactComponent as Flag_py } from './flags/4x3/py.svg'; +export { ReactComponent as Flag_pe } from './flags/4x3/pe.svg'; +export { ReactComponent as Flag_ph } from './flags/4x3/ph.svg'; +export { ReactComponent as Flag_pn } from './flags/4x3/pn.svg'; +export { ReactComponent as Flag_pl } from './flags/4x3/pl.svg'; +export { ReactComponent as Flag_pt } from './flags/4x3/pt.svg'; +export { ReactComponent as Flag_pr } from './flags/4x3/pr.svg'; +export { ReactComponent as Flag_qa } from './flags/4x3/qa.svg'; +export { ReactComponent as Flag_cg } from './flags/4x3/cg.svg'; +export { ReactComponent as Flag_ro } from './flags/4x3/ro.svg'; +export { ReactComponent as Flag_ru } from './flags/4x3/ru.svg'; +export { ReactComponent as Flag_rw } from './flags/4x3/rw.svg'; +export { ReactComponent as Flag_re } from './flags/4x3/re.svg'; +export { ReactComponent as Flag_bl } from './flags/4x3/bl.svg'; +export { ReactComponent as Flag_sh_hl } from './flags/4x3/sh-hl.svg'; +export { ReactComponent as Flag_sh } from './flags/4x3/sh.svg'; +export { ReactComponent as Flag_kn } from './flags/4x3/kn.svg'; +export { ReactComponent as Flag_lc } from './flags/4x3/lc.svg'; +export { ReactComponent as Flag_mf } from './flags/4x3/mf.svg'; +export { ReactComponent as Flag_pm } from './flags/4x3/pm.svg'; +export { ReactComponent as Flag_vc } from './flags/4x3/vc.svg'; +export { ReactComponent as Flag_ws } from './flags/4x3/ws.svg'; +export { ReactComponent as Flag_sm } from './flags/4x3/sm.svg'; +export { ReactComponent as Flag_st } from './flags/4x3/st.svg'; +export { ReactComponent as Flag_sa } from './flags/4x3/sa.svg'; +export { ReactComponent as Flag_gb_sct } from './flags/4x3/gb-sct.svg'; +export { ReactComponent as Flag_sn } from './flags/4x3/sn.svg'; +export { ReactComponent as Flag_rs } from './flags/4x3/rs.svg'; +export { ReactComponent as Flag_sc } from './flags/4x3/sc.svg'; +export { ReactComponent as Flag_sl } from './flags/4x3/sl.svg'; +export { ReactComponent as Flag_sg } from './flags/4x3/sg.svg'; +export { ReactComponent as Flag_sx } from './flags/4x3/sx.svg'; +export { ReactComponent as Flag_sk } from './flags/4x3/sk.svg'; +export { ReactComponent as Flag_si } from './flags/4x3/si.svg'; +export { ReactComponent as Flag_sb } from './flags/4x3/sb.svg'; +export { ReactComponent as Flag_so } from './flags/4x3/so.svg'; +export { ReactComponent as Flag_za } from './flags/4x3/za.svg'; +export { ReactComponent as Flag_gs } from './flags/4x3/gs.svg'; +export { ReactComponent as Flag_kr } from './flags/4x3/kr.svg'; +export { ReactComponent as Flag_ss } from './flags/4x3/ss.svg'; +export { ReactComponent as Flag_es } from './flags/4x3/es.svg'; +export { ReactComponent as Flag_lk } from './flags/4x3/lk.svg'; +export { ReactComponent as Flag_ps } from './flags/4x3/ps.svg'; +export { ReactComponent as Flag_sd } from './flags/4x3/sd.svg'; +export { ReactComponent as Flag_sr } from './flags/4x3/sr.svg'; +export { ReactComponent as Flag_sj } from './flags/4x3/sj.svg'; +export { ReactComponent as Flag_se } from './flags/4x3/se.svg'; +export { ReactComponent as Flag_ch } from './flags/4x3/ch.svg'; +export { ReactComponent as Flag_sy } from './flags/4x3/sy.svg'; +export { ReactComponent as Flag_tw } from './flags/4x3/tw.svg'; +export { ReactComponent as Flag_tj } from './flags/4x3/tj.svg'; +export { ReactComponent as Flag_tz } from './flags/4x3/tz.svg'; +export { ReactComponent as Flag_th } from './flags/4x3/th.svg'; +export { ReactComponent as Flag_tl } from './flags/4x3/tl.svg'; +export { ReactComponent as Flag_tg } from './flags/4x3/tg.svg'; +export { ReactComponent as Flag_tk } from './flags/4x3/tk.svg'; +export { ReactComponent as Flag_to } from './flags/4x3/to.svg'; +export { ReactComponent as Flag_tt } from './flags/4x3/tt.svg'; +export { ReactComponent as Flag_sh_ta } from './flags/4x3/sh-ta.svg'; +export { ReactComponent as Flag_tn } from './flags/4x3/tn.svg'; +export { ReactComponent as Flag_tm } from './flags/4x3/tm.svg'; +export { ReactComponent as Flag_tc } from './flags/4x3/tc.svg'; +export { ReactComponent as Flag_tv } from './flags/4x3/tv.svg'; +export { ReactComponent as Flag_tr } from './flags/4x3/tr.svg'; +export { ReactComponent as Flag_ug } from './flags/4x3/ug.svg'; +export { ReactComponent as Flag_ua } from './flags/4x3/ua.svg'; +export { ReactComponent as Flag_ae } from './flags/4x3/ae.svg'; +export { ReactComponent as Flag_gb } from './flags/4x3/gb.svg'; +export { ReactComponent as Flag_un } from './flags/4x3/un.svg'; +export { ReactComponent as Flag_um } from './flags/4x3/um.svg'; +export { ReactComponent as Flag_us } from './flags/4x3/us.svg'; +export { ReactComponent as Flag_uy } from './flags/4x3/uy.svg'; +export { ReactComponent as Flag_uz } from './flags/4x3/uz.svg'; +export { ReactComponent as Flag_vu } from './flags/4x3/vu.svg'; +export { ReactComponent as Flag_ve } from './flags/4x3/ve.svg'; +export { ReactComponent as Flag_vn } from './flags/4x3/vn.svg'; +export { ReactComponent as Flag_vg } from './flags/4x3/vg.svg'; +export { ReactComponent as Flag_vi } from './flags/4x3/vi.svg'; +export { ReactComponent as Flag_gb_wls } from './flags/4x3/gb-wls.svg'; +export { ReactComponent as Flag_wf } from './flags/4x3/wf.svg'; +export { ReactComponent as Flag_eh } from './flags/4x3/eh.svg'; +export { ReactComponent as Flag_ye } from './flags/4x3/ye.svg'; +export { ReactComponent as Flag_zm } from './flags/4x3/zm.svg'; +export { ReactComponent as Flag_zw } from './flags/4x3/zw.svg'; \ No newline at end of file diff --git a/client/packages/lowcoder-design/src/icons/v2/New.svg b/client/packages/lowcoder-design/src/icons/v2/New.svg new file mode 100644 index 000000000..d58178618 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/New.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/app-l.svg b/client/packages/lowcoder-design/src/icons/v2/app-l.svg new file mode 100644 index 000000000..aa73562fa --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/app-l.svg @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/app-m.svg b/client/packages/lowcoder-design/src/icons/v2/app-m.svg new file mode 100644 index 000000000..2623df04e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/app-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/app-s.svg b/client/packages/lowcoder-design/src/icons/v2/app-s.svg new file mode 100644 index 000000000..e6e7ee803 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/app-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/audio-player-l.svg b/client/packages/lowcoder-design/src/icons/v2/audio-player-l.svg new file mode 100644 index 000000000..4c74fa13c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/audio-player-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/audio-player-m.svg b/client/packages/lowcoder-design/src/icons/v2/audio-player-m.svg new file mode 100644 index 000000000..0c453c81a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/audio-player-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/audio-player-s.svg b/client/packages/lowcoder-design/src/icons/v2/audio-player-s.svg new file mode 100644 index 000000000..28e85273a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/audio-player-s.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/auto-complete-input-l.svg b/client/packages/lowcoder-design/src/icons/v2/auto-complete-input-l.svg new file mode 100644 index 000000000..b2b6318a3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/auto-complete-input-l.svg @@ -0,0 +1,1268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/auto-complete-input-m.svg b/client/packages/lowcoder-design/src/icons/v2/auto-complete-input-m.svg new file mode 100644 index 000000000..24bf05d6c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/auto-complete-input-m.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/auto-complete-input-s.svg b/client/packages/lowcoder-design/src/icons/v2/auto-complete-input-s.svg new file mode 100644 index 000000000..5af176292 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/auto-complete-input-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/avatar-l.svg b/client/packages/lowcoder-design/src/icons/v2/avatar-l.svg new file mode 100644 index 000000000..1ed059cff --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/avatar-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/avatar-m.svg b/client/packages/lowcoder-design/src/icons/v2/avatar-m.svg new file mode 100644 index 000000000..cac272ba2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/avatar-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/avatar-s.svg b/client/packages/lowcoder-design/src/icons/v2/avatar-s.svg new file mode 100644 index 000000000..b342e7272 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/avatar-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/avatargroup-l.svg b/client/packages/lowcoder-design/src/icons/v2/avatargroup-l.svg new file mode 100644 index 000000000..77e61333c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/avatargroup-l.svg @@ -0,0 +1,1278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/avatargroup-m.svg b/client/packages/lowcoder-design/src/icons/v2/avatargroup-m.svg new file mode 100644 index 000000000..7b418dfac --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/avatargroup-m.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/avatargroup-s.svg b/client/packages/lowcoder-design/src/icons/v2/avatargroup-s.svg new file mode 100644 index 000000000..afe602a1b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/avatargroup-s.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/bar-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/bar-chart-l.svg new file mode 100644 index 000000000..d10cc0b66 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/bar-chart-l.svg @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/bar-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/bar-chart-m.svg new file mode 100644 index 000000000..efa357b58 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/bar-chart-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/bar-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/bar-chart-s.svg new file mode 100644 index 000000000..da7e03ae2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/bar-chart-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/bpmn-editor-l.svg b/client/packages/lowcoder-design/src/icons/v2/bpmn-editor-l.svg new file mode 100644 index 000000000..79f998adf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/bpmn-editor-l.svg @@ -0,0 +1,1272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/bpmn-editor-m.svg b/client/packages/lowcoder-design/src/icons/v2/bpmn-editor-m.svg new file mode 100644 index 000000000..71b6ea082 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/bpmn-editor-m.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/bpmn-editor-s.svg b/client/packages/lowcoder-design/src/icons/v2/bpmn-editor-s.svg new file mode 100644 index 000000000..19570c2b0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/bpmn-editor-s.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/button-l.svg b/client/packages/lowcoder-design/src/icons/v2/button-l.svg new file mode 100644 index 000000000..5290897a6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/button-l.svg @@ -0,0 +1,1262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/button-m.svg b/client/packages/lowcoder-design/src/icons/v2/button-m.svg new file mode 100644 index 000000000..b6fe82020 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/button-m.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/button-s.svg b/client/packages/lowcoder-design/src/icons/v2/button-s.svg new file mode 100644 index 000000000..42ad0dba0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/button-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/calendar-l.svg b/client/packages/lowcoder-design/src/icons/v2/calendar-l.svg new file mode 100644 index 000000000..27c4ae40e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/calendar-l.svg @@ -0,0 +1,1268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/calendar-m.svg b/client/packages/lowcoder-design/src/icons/v2/calendar-m.svg new file mode 100644 index 000000000..01952be36 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/calendar-m.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/calendar-s.svg b/client/packages/lowcoder-design/src/icons/v2/calendar-s.svg new file mode 100644 index 000000000..58447a3c1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/calendar-s.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/camera-stream-l.svg b/client/packages/lowcoder-design/src/icons/v2/camera-stream-l.svg new file mode 100644 index 000000000..50c314346 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/camera-stream-l.svg @@ -0,0 +1,1266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/camera-stream-m.svg b/client/packages/lowcoder-design/src/icons/v2/camera-stream-m.svg new file mode 100644 index 000000000..3a5e23d0f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/camera-stream-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/camera-stream-s.svg b/client/packages/lowcoder-design/src/icons/v2/camera-stream-s.svg new file mode 100644 index 000000000..2fae9d0a5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/camera-stream-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/candlestick-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/candlestick-chart-l.svg new file mode 100644 index 000000000..a5043d4e7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/candlestick-chart-l.svg @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/candlestick-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/candlestick-chart-m.svg new file mode 100644 index 000000000..68c70b089 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/candlestick-chart-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/candlestick-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/candlestick-chart-s.svg new file mode 100644 index 000000000..4fa20815f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/candlestick-chart-s.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/card-layout-l.svg b/client/packages/lowcoder-design/src/icons/v2/card-layout-l.svg new file mode 100644 index 000000000..434d00b9d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/card-layout-l.svg @@ -0,0 +1,1266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/card-layout-m.svg b/client/packages/lowcoder-design/src/icons/v2/card-layout-m.svg new file mode 100644 index 000000000..351d52719 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/card-layout-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/card-layout-s.svg b/client/packages/lowcoder-design/src/icons/v2/card-layout-s.svg new file mode 100644 index 000000000..fe3d18d4e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/card-layout-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/cascader-l.svg b/client/packages/lowcoder-design/src/icons/v2/cascader-l.svg new file mode 100644 index 000000000..426b5b804 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/cascader-l.svg @@ -0,0 +1,1270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/cascader-m.svg b/client/packages/lowcoder-design/src/icons/v2/cascader-m.svg new file mode 100644 index 000000000..cfeb4c07f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/cascader-m.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/cascader-s.svg b/client/packages/lowcoder-design/src/icons/v2/cascader-s.svg new file mode 100644 index 000000000..2de93335c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/cascader-s.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/checkbox-l.svg b/client/packages/lowcoder-design/src/icons/v2/checkbox-l.svg new file mode 100644 index 000000000..421d8b646 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/checkbox-l.svg @@ -0,0 +1,1262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/checkbox-m.svg b/client/packages/lowcoder-design/src/icons/v2/checkbox-m.svg new file mode 100644 index 000000000..131704d54 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/checkbox-m.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/checkbox-s.svg b/client/packages/lowcoder-design/src/icons/v2/checkbox-s.svg new file mode 100644 index 000000000..82bff9425 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/checkbox-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/collapsible-container-l.svg b/client/packages/lowcoder-design/src/icons/v2/collapsible-container-l.svg new file mode 100644 index 000000000..1d09984d0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/collapsible-container-l.svg @@ -0,0 +1,1266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/collapsible-container-m.svg b/client/packages/lowcoder-design/src/icons/v2/collapsible-container-m.svg new file mode 100644 index 000000000..ced001019 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/collapsible-container-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/collapsible-container-s.svg b/client/packages/lowcoder-design/src/icons/v2/collapsible-container-s.svg new file mode 100644 index 000000000..7173b0d15 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/collapsible-container-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/colorpicker-l.svg b/client/packages/lowcoder-design/src/icons/v2/colorpicker-l.svg new file mode 100644 index 000000000..04834fad8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/colorpicker-l.svg @@ -0,0 +1,1273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/colorpicker-m.svg b/client/packages/lowcoder-design/src/icons/v2/colorpicker-m.svg new file mode 100644 index 000000000..8ef3a4efb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/colorpicker-m.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/colorpicker-s.svg b/client/packages/lowcoder-design/src/icons/v2/colorpicker-s.svg new file mode 100644 index 000000000..645b900d7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/colorpicker-s.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/column-layout-l.svg b/client/packages/lowcoder-design/src/icons/v2/column-layout-l.svg new file mode 100644 index 000000000..7ee763ff1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/column-layout-l.svg @@ -0,0 +1,1266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/column-layout-m.svg b/client/packages/lowcoder-design/src/icons/v2/column-layout-m.svg new file mode 100644 index 000000000..94ef19e21 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/column-layout-m.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/column-layout-s.svg b/client/packages/lowcoder-design/src/icons/v2/column-layout-s.svg new file mode 100644 index 000000000..b12103331 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/column-layout-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/comment-l.svg b/client/packages/lowcoder-design/src/icons/v2/comment-l.svg new file mode 100644 index 000000000..5ff342d95 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/comment-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/comment-m.svg b/client/packages/lowcoder-design/src/icons/v2/comment-m.svg new file mode 100644 index 000000000..794a42ce3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/comment-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/comment-s.svg b/client/packages/lowcoder-design/src/icons/v2/comment-s.svg new file mode 100644 index 000000000..28c28390f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/comment-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/container-l.svg b/client/packages/lowcoder-design/src/icons/v2/container-l.svg new file mode 100644 index 000000000..352bf58d3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/container-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/container-m.svg b/client/packages/lowcoder-design/src/icons/v2/container-m.svg new file mode 100644 index 000000000..deb9bfcda --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/container-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/container-s.svg b/client/packages/lowcoder-design/src/icons/v2/container-s.svg new file mode 100644 index 000000000..91db2de00 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/container-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/custom-code-l.svg b/client/packages/lowcoder-design/src/icons/v2/custom-code-l.svg new file mode 100644 index 000000000..cbc55b22f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/custom-code-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/custom-code-m.svg b/client/packages/lowcoder-design/src/icons/v2/custom-code-m.svg new file mode 100644 index 000000000..e43f5e58b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/custom-code-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/custom-code-s.svg b/client/packages/lowcoder-design/src/icons/v2/custom-code-s.svg new file mode 100644 index 000000000..29d0fcb14 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/custom-code-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/date-range-select-l.svg b/client/packages/lowcoder-design/src/icons/v2/date-range-select-l.svg new file mode 100644 index 000000000..7f58b0f49 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/date-range-select-l.svg @@ -0,0 +1,1270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/date-range-select-m.svg b/client/packages/lowcoder-design/src/icons/v2/date-range-select-m.svg new file mode 100644 index 000000000..a0c15d027 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/date-range-select-m.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/date-range-select-s.svg b/client/packages/lowcoder-design/src/icons/v2/date-range-select-s.svg new file mode 100644 index 000000000..e1e7a35ee --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/date-range-select-s.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/date-select-l.svg b/client/packages/lowcoder-design/src/icons/v2/date-select-l.svg new file mode 100644 index 000000000..0cc27adb1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/date-select-l.svg @@ -0,0 +1,1270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/date-select-m.svg b/client/packages/lowcoder-design/src/icons/v2/date-select-m.svg new file mode 100644 index 000000000..664cece8a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/date-select-m.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/date-select-s.svg b/client/packages/lowcoder-design/src/icons/v2/date-select-s.svg new file mode 100644 index 000000000..4164956bf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/date-select-s.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/divider-l.svg b/client/packages/lowcoder-design/src/icons/v2/divider-l.svg new file mode 100644 index 000000000..5628a66e7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/divider-l.svg @@ -0,0 +1,1262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/divider-m.svg b/client/packages/lowcoder-design/src/icons/v2/divider-m.svg new file mode 100644 index 000000000..e2f30e628 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/divider-m.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/divider-s.svg b/client/packages/lowcoder-design/src/icons/v2/divider-s.svg new file mode 100644 index 000000000..20ad107d0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/divider-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/drawer-l.svg b/client/packages/lowcoder-design/src/icons/v2/drawer-l.svg new file mode 100644 index 000000000..e51f4883f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/drawer-l.svg @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/drawer-m.svg b/client/packages/lowcoder-design/src/icons/v2/drawer-m.svg new file mode 100644 index 000000000..0328721f7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/drawer-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/drawer-s.svg b/client/packages/lowcoder-design/src/icons/v2/drawer-s.svg new file mode 100644 index 000000000..b65dcbc4a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/drawer-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/dropdown-l.svg b/client/packages/lowcoder-design/src/icons/v2/dropdown-l.svg new file mode 100644 index 000000000..3362cee3c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/dropdown-l.svg @@ -0,0 +1,1261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/dropdown-m.svg b/client/packages/lowcoder-design/src/icons/v2/dropdown-m.svg new file mode 100644 index 000000000..2358cd330 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/dropdown-m.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/dropdown-s.svg b/client/packages/lowcoder-design/src/icons/v2/dropdown-s.svg new file mode 100644 index 000000000..9cd5014f1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/dropdown-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/entry-page-l.svg b/client/packages/lowcoder-design/src/icons/v2/entry-page-l.svg new file mode 100644 index 000000000..bcc79a696 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/entry-page-l.svg @@ -0,0 +1,1267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/entry-page-m.svg b/client/packages/lowcoder-design/src/icons/v2/entry-page-m.svg new file mode 100644 index 000000000..cbb3f6ba6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/entry-page-m.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/entry-page-s.svg b/client/packages/lowcoder-design/src/icons/v2/entry-page-s.svg new file mode 100644 index 000000000..fe9ac05a5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/entry-page-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/file-upload-l.svg b/client/packages/lowcoder-design/src/icons/v2/file-upload-l.svg new file mode 100644 index 000000000..f685ba225 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/file-upload-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/file-upload-m.svg b/client/packages/lowcoder-design/src/icons/v2/file-upload-m.svg new file mode 100644 index 000000000..ff0e07844 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/file-upload-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/file-upload-s.svg b/client/packages/lowcoder-design/src/icons/v2/file-upload-s.svg new file mode 100644 index 000000000..a2fab5dd8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/file-upload-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/file-viewer-l.svg b/client/packages/lowcoder-design/src/icons/v2/file-viewer-l.svg new file mode 100644 index 000000000..ce9e568d8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/file-viewer-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/file-viewer-m.svg b/client/packages/lowcoder-design/src/icons/v2/file-viewer-m.svg new file mode 100644 index 000000000..ab1fc32dc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/file-viewer-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/file-viewer-s.svg b/client/packages/lowcoder-design/src/icons/v2/file-viewer-s.svg new file mode 100644 index 000000000..2d1b3b702 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/file-viewer-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/floating-button-l.svg b/client/packages/lowcoder-design/src/icons/v2/floating-button-l.svg new file mode 100644 index 000000000..28ca4563b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/floating-button-l.svg @@ -0,0 +1,1267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/floating-button-m.svg b/client/packages/lowcoder-design/src/icons/v2/floating-button-m.svg new file mode 100644 index 000000000..988f33413 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/floating-button-m.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/floating-button-s.svg b/client/packages/lowcoder-design/src/icons/v2/floating-button-s.svg new file mode 100644 index 000000000..1df9554b2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/floating-button-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/floating-text-layout-l.svg b/client/packages/lowcoder-design/src/icons/v2/floating-text-layout-l.svg new file mode 100644 index 000000000..42f93274a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/floating-text-layout-l.svg @@ -0,0 +1,1268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/floating-text-layout-m.svg b/client/packages/lowcoder-design/src/icons/v2/floating-text-layout-m.svg new file mode 100644 index 000000000..acf0bf6c9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/floating-text-layout-m.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/floating-text-layout-s.svg b/client/packages/lowcoder-design/src/icons/v2/floating-text-layout-s.svg new file mode 100644 index 000000000..829ab61b0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/floating-text-layout-s.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/form-l.svg b/client/packages/lowcoder-design/src/icons/v2/form-l.svg new file mode 100644 index 000000000..7becfa625 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/form-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/form-m.svg b/client/packages/lowcoder-design/src/icons/v2/form-m.svg new file mode 100644 index 000000000..32e454e28 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/form-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/form-s.svg b/client/packages/lowcoder-design/src/icons/v2/form-s.svg new file mode 100644 index 000000000..679548ad5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/form-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/funnel-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/funnel-chart-l.svg new file mode 100644 index 000000000..64ffd0806 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/funnel-chart-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/funnel-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/funnel-chart-m.svg new file mode 100644 index 000000000..349fc4921 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/funnel-chart-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/funnel-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/funnel-chart-s.svg new file mode 100644 index 000000000..61abf5e7e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/funnel-chart-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/gauge-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/gauge-chart-l.svg new file mode 100644 index 000000000..0399ab01a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/gauge-chart-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/gauge-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/gauge-chart-m.svg new file mode 100644 index 000000000..c0f1a80e5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/gauge-chart-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/gauge-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/gauge-chart-s.svg new file mode 100644 index 000000000..bc59fa879 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/gauge-chart-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/geomap-charts-l.svg b/client/packages/lowcoder-design/src/icons/v2/geomap-charts-l.svg new file mode 100644 index 000000000..baee36aa0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/geomap-charts-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/geomap-charts-m.svg b/client/packages/lowcoder-design/src/icons/v2/geomap-charts-m.svg new file mode 100644 index 000000000..586b2a58e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/geomap-charts-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/geomap-charts-s.svg b/client/packages/lowcoder-design/src/icons/v2/geomap-charts-s.svg new file mode 100644 index 000000000..01a380eb3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/geomap-charts-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/geomap-layers-l.svg b/client/packages/lowcoder-design/src/icons/v2/geomap-layers-l.svg new file mode 100644 index 000000000..1d1df6db8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/geomap-layers-l.svg @@ -0,0 +1,1266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/geomap-layers-m.svg b/client/packages/lowcoder-design/src/icons/v2/geomap-layers-m.svg new file mode 100644 index 000000000..8964b06f7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/geomap-layers-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/geomap-layers-s.svg b/client/packages/lowcoder-design/src/icons/v2/geomap-layers-s.svg new file mode 100644 index 000000000..aebbfe442 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/geomap-layers-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/graph-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/graph-chart-l.svg new file mode 100644 index 000000000..560a6082e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/graph-chart-l.svg @@ -0,0 +1,1281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/graph-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/graph-chart-m.svg new file mode 100644 index 000000000..45bf268d8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/graph-chart-m.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/graph-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/graph-chart-s.svg new file mode 100644 index 000000000..630d8f075 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/graph-chart-s.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/grid-view-l.svg b/client/packages/lowcoder-design/src/icons/v2/grid-view-l.svg new file mode 100644 index 000000000..30dafc061 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/grid-view-l.svg @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/grid-view-m.svg b/client/packages/lowcoder-design/src/icons/v2/grid-view-m.svg new file mode 100644 index 000000000..d99c05731 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/grid-view-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/grid-view-s.svg b/client/packages/lowcoder-design/src/icons/v2/grid-view-s.svg new file mode 100644 index 000000000..1b43775d6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/grid-view-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/heatmap-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/heatmap-chart-l.svg new file mode 100644 index 000000000..5dce64bb1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/heatmap-chart-l.svg @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/heatmap-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/heatmap-chart-m.svg new file mode 100644 index 000000000..4ddf16727 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/heatmap-chart-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/heatmap-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/heatmap-chart-s.svg new file mode 100644 index 000000000..2f4383b6a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/heatmap-chart-s.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/hillchart-l.svg b/client/packages/lowcoder-design/src/icons/v2/hillchart-l.svg new file mode 100644 index 000000000..7ef8f70a3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/hillchart-l.svg @@ -0,0 +1,1268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/hillchart-m.svg b/client/packages/lowcoder-design/src/icons/v2/hillchart-m.svg new file mode 100644 index 000000000..a38abdc58 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/hillchart-m.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/hillchart-s.svg b/client/packages/lowcoder-design/src/icons/v2/hillchart-s.svg new file mode 100644 index 000000000..1b7d9e072 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/hillchart-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/icon-button-l.svg b/client/packages/lowcoder-design/src/icons/v2/icon-button-l.svg new file mode 100644 index 000000000..cfa8f5956 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/icon-button-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/icon-button-m.svg b/client/packages/lowcoder-design/src/icons/v2/icon-button-m.svg new file mode 100644 index 000000000..28473d010 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/icon-button-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/icon-button-s.svg b/client/packages/lowcoder-design/src/icons/v2/icon-button-s.svg new file mode 100644 index 000000000..3613dff7f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/icon-button-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/icon-l.svg b/client/packages/lowcoder-design/src/icons/v2/icon-l.svg new file mode 100644 index 000000000..ae5be150d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/icon-l.svg @@ -0,0 +1,1267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/icon-m.svg b/client/packages/lowcoder-design/src/icons/v2/icon-m.svg new file mode 100644 index 000000000..fab77d3a3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/icon-m.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/icon-s.svg b/client/packages/lowcoder-design/src/icons/v2/icon-s.svg new file mode 100644 index 000000000..bc9fcaceb --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/icon-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/icon-table.svg b/client/packages/lowcoder-design/src/icons/v2/icon-table.svg new file mode 100644 index 000000000..4cd2f07ae --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/icon-table.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/iframe-l.svg b/client/packages/lowcoder-design/src/icons/v2/iframe-l.svg new file mode 100644 index 000000000..832e0bfae --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/iframe-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/iframe-m.svg b/client/packages/lowcoder-design/src/icons/v2/iframe-m.svg new file mode 100644 index 000000000..f37fb612e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/iframe-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/iframe-s.svg b/client/packages/lowcoder-design/src/icons/v2/iframe-s.svg new file mode 100644 index 000000000..97e0301c3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/iframe-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/image-carousel-l.svg b/client/packages/lowcoder-design/src/icons/v2/image-carousel-l.svg new file mode 100644 index 000000000..d54b21b89 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/image-carousel-l.svg @@ -0,0 +1,1266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/image-carousel-m.svg b/client/packages/lowcoder-design/src/icons/v2/image-carousel-m.svg new file mode 100644 index 000000000..5f71cedec --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/image-carousel-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/image-carousel-s.svg b/client/packages/lowcoder-design/src/icons/v2/image-carousel-s.svg new file mode 100644 index 000000000..fac497410 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/image-carousel-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/image-editor-l.svg b/client/packages/lowcoder-design/src/icons/v2/image-editor-l.svg new file mode 100644 index 000000000..bfb46f60b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/image-editor-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/image-editor-m.svg b/client/packages/lowcoder-design/src/icons/v2/image-editor-m.svg new file mode 100644 index 000000000..6491bd56f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/image-editor-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/image-editor-s.svg b/client/packages/lowcoder-design/src/icons/v2/image-editor-s.svg new file mode 100644 index 000000000..af7b020f8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/image-editor-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/image-l.svg b/client/packages/lowcoder-design/src/icons/v2/image-l.svg new file mode 100644 index 000000000..729202e0d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/image-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/image-m.svg b/client/packages/lowcoder-design/src/icons/v2/image-m.svg new file mode 100644 index 000000000..c8a4e6a9a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/image-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/image-s.svg b/client/packages/lowcoder-design/src/icons/v2/image-s.svg new file mode 100644 index 000000000..93ebeed1c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/image-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/input-l.svg b/client/packages/lowcoder-design/src/icons/v2/input-l.svg new file mode 100644 index 000000000..cfd98ad2d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/input-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/input-m.svg b/client/packages/lowcoder-design/src/icons/v2/input-m.svg new file mode 100644 index 000000000..3c2c84cdd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/input-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/input-s.svg b/client/packages/lowcoder-design/src/icons/v2/input-s.svg new file mode 100644 index 000000000..083ad347b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/input-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/itime-range-l.svg b/client/packages/lowcoder-design/src/icons/v2/itime-range-l.svg new file mode 100644 index 000000000..4eb66f459 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/itime-range-l.svg @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/itime-range-m.svg b/client/packages/lowcoder-design/src/icons/v2/itime-range-m.svg new file mode 100644 index 000000000..5f3ab9f4b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/itime-range-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/itime-range-s.svg b/client/packages/lowcoder-design/src/icons/v2/itime-range-s.svg new file mode 100644 index 000000000..edacfe931 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/itime-range-s.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/json-editor-l.svg b/client/packages/lowcoder-design/src/icons/v2/json-editor-l.svg new file mode 100644 index 000000000..236bc9226 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/json-editor-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/json-editor-m.svg b/client/packages/lowcoder-design/src/icons/v2/json-editor-m.svg new file mode 100644 index 000000000..bf61bf25e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/json-editor-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/json-editor-s.svg b/client/packages/lowcoder-design/src/icons/v2/json-editor-s.svg new file mode 100644 index 000000000..348f0636b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/json-editor-s.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/json-schema-form-l.svg b/client/packages/lowcoder-design/src/icons/v2/json-schema-form-l.svg new file mode 100644 index 000000000..e4e0456d2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/json-schema-form-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/json-schema-form-m.svg b/client/packages/lowcoder-design/src/icons/v2/json-schema-form-m.svg new file mode 100644 index 000000000..05ebdaa3f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/json-schema-form-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/json-schema-form-s.svg b/client/packages/lowcoder-design/src/icons/v2/json-schema-form-s.svg new file mode 100644 index 000000000..fad6aeaef --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/json-schema-form-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/json-viewer-l.svg b/client/packages/lowcoder-design/src/icons/v2/json-viewer-l.svg new file mode 100644 index 000000000..556b92bf9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/json-viewer-l.svg @@ -0,0 +1,1268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/json-viewer-m.svg b/client/packages/lowcoder-design/src/icons/v2/json-viewer-m.svg new file mode 100644 index 000000000..efa2ac222 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/json-viewer-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/json-viewer-s.svg b/client/packages/lowcoder-design/src/icons/v2/json-viewer-s.svg new file mode 100644 index 000000000..63014f50e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/json-viewer-s.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/link-l.svg b/client/packages/lowcoder-design/src/icons/v2/link-l.svg new file mode 100644 index 000000000..c1638c0b9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/link-l.svg @@ -0,0 +1,1262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/link-m.svg b/client/packages/lowcoder-design/src/icons/v2/link-m.svg new file mode 100644 index 000000000..5d673b6dd --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/link-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/link-s.svg b/client/packages/lowcoder-design/src/icons/v2/link-s.svg new file mode 100644 index 000000000..42f88c62e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/link-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/list-view-l.svg b/client/packages/lowcoder-design/src/icons/v2/list-view-l.svg new file mode 100644 index 000000000..f685dd421 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/list-view-l.svg @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/list-view-m.svg b/client/packages/lowcoder-design/src/icons/v2/list-view-m.svg new file mode 100644 index 000000000..8faeb52f4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/list-view-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/list-view-s.svg b/client/packages/lowcoder-design/src/icons/v2/list-view-s.svg new file mode 100644 index 000000000..f6b8cab2f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/list-view-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/lottie-animation-l.svg b/client/packages/lowcoder-design/src/icons/v2/lottie-animation-l.svg new file mode 100644 index 000000000..e0694e93a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/lottie-animation-l.svg @@ -0,0 +1,1262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/lottie-animation-m.svg b/client/packages/lowcoder-design/src/icons/v2/lottie-animation-m.svg new file mode 100644 index 000000000..7256f127d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/lottie-animation-m.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/lottie-animation-s.svg b/client/packages/lowcoder-design/src/icons/v2/lottie-animation-s.svg new file mode 100644 index 000000000..75983f30e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/lottie-animation-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/meeting-room-l.svg b/client/packages/lowcoder-design/src/icons/v2/meeting-room-l.svg new file mode 100644 index 000000000..00b8ff4c8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/meeting-room-l.svg @@ -0,0 +1,1266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/meeting-room-m.svg b/client/packages/lowcoder-design/src/icons/v2/meeting-room-m.svg new file mode 100644 index 000000000..f486ff131 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/meeting-room-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/meeting-room-s.svg b/client/packages/lowcoder-design/src/icons/v2/meeting-room-s.svg new file mode 100644 index 000000000..ebba0ff6d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/meeting-room-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/mention-l.svg b/client/packages/lowcoder-design/src/icons/v2/mention-l.svg new file mode 100644 index 000000000..d4f68261e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/mention-l.svg @@ -0,0 +1,1266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/mention-m.svg b/client/packages/lowcoder-design/src/icons/v2/mention-m.svg new file mode 100644 index 000000000..294c01747 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/mention-m.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/mention-s.svg b/client/packages/lowcoder-design/src/icons/v2/mention-s.svg new file mode 100644 index 000000000..bf684fd06 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/mention-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/mermaid-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/mermaid-chart-l.svg new file mode 100644 index 000000000..5279f8f43 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/mermaid-chart-l.svg @@ -0,0 +1,1262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/mermaid-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/mermaid-chart-m.svg new file mode 100644 index 000000000..9b654e5f6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/mermaid-chart-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/mermaid-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/mermaid-chart-s.svg new file mode 100644 index 000000000..d8b7c4903 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/mermaid-chart-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/mighty-table-l.svg b/client/packages/lowcoder-design/src/icons/v2/mighty-table-l.svg new file mode 100644 index 000000000..3ab8556e7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/mighty-table-l.svg @@ -0,0 +1,1280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/mighty-table-m.svg b/client/packages/lowcoder-design/src/icons/v2/mighty-table-m.svg new file mode 100644 index 000000000..9bbd915c9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/mighty-table-m.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/mighty-table-s.svg b/client/packages/lowcoder-design/src/icons/v2/mighty-table-s.svg new file mode 100644 index 000000000..cac13a5ef --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/mighty-table-s.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/modal-l.svg b/client/packages/lowcoder-design/src/icons/v2/modal-l.svg new file mode 100644 index 000000000..5274d13d0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/modal-l.svg @@ -0,0 +1,1267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/modal-m.svg b/client/packages/lowcoder-design/src/icons/v2/modal-m.svg new file mode 100644 index 000000000..e176d3609 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/modal-m.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/modal-s.svg b/client/packages/lowcoder-design/src/icons/v2/modal-s.svg new file mode 100644 index 000000000..cdd0e1f6d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/modal-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/module-l.svg b/client/packages/lowcoder-design/src/icons/v2/module-l.svg new file mode 100644 index 000000000..8b9cc72f2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/module-l.svg @@ -0,0 +1,1268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/module-m.svg b/client/packages/lowcoder-design/src/icons/v2/module-m.svg new file mode 100644 index 000000000..4113ca7bc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/module-m.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/module-s.svg b/client/packages/lowcoder-design/src/icons/v2/module-s.svg new file mode 100644 index 000000000..66c53f658 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/module-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/multiselect-l.svg b/client/packages/lowcoder-design/src/icons/v2/multiselect-l.svg new file mode 100644 index 000000000..22de03da4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/multiselect-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/multiselect-m.svg b/client/packages/lowcoder-design/src/icons/v2/multiselect-m.svg new file mode 100644 index 000000000..aaf5d3c1e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/multiselect-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/multiselect-s.svg b/client/packages/lowcoder-design/src/icons/v2/multiselect-s.svg new file mode 100644 index 000000000..cf3e94a80 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/multiselect-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/navigation-l.svg b/client/packages/lowcoder-design/src/icons/v2/navigation-l.svg new file mode 100644 index 000000000..5c7ce021c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/navigation-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/navigation-m.svg b/client/packages/lowcoder-design/src/icons/v2/navigation-m.svg new file mode 100644 index 000000000..a5157a3a8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/navigation-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/navigation-s.svg b/client/packages/lowcoder-design/src/icons/v2/navigation-s.svg new file mode 100644 index 000000000..529deef65 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/navigation-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/number-input-l.svg b/client/packages/lowcoder-design/src/icons/v2/number-input-l.svg new file mode 100644 index 000000000..ad8afd89e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/number-input-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/number-input-m.svg b/client/packages/lowcoder-design/src/icons/v2/number-input-m.svg new file mode 100644 index 000000000..f9229b23c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/number-input-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/number-input-s.svg b/client/packages/lowcoder-design/src/icons/v2/number-input-s.svg new file mode 100644 index 000000000..a6e84c066 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/number-input-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/off-m.svg b/client/packages/lowcoder-design/src/icons/v2/off-m.svg new file mode 100644 index 000000000..391adbde7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/off-m.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/off-s-1.svg b/client/packages/lowcoder-design/src/icons/v2/off-s-1.svg new file mode 100644 index 000000000..02b02c8e3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/off-s-1.svg @@ -0,0 +1,1271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/off-s.svg b/client/packages/lowcoder-design/src/icons/v2/off-s.svg new file mode 100644 index 000000000..c22ae54ed --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/off-s.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/page-layout-l.svg b/client/packages/lowcoder-design/src/icons/v2/page-layout-l.svg new file mode 100644 index 000000000..925031028 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/page-layout-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/page-layout-m.svg b/client/packages/lowcoder-design/src/icons/v2/page-layout-m.svg new file mode 100644 index 000000000..8d3fa45c5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/page-layout-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/page-layout-s.svg b/client/packages/lowcoder-design/src/icons/v2/page-layout-s.svg new file mode 100644 index 000000000..60089c801 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/page-layout-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/password-l.svg b/client/packages/lowcoder-design/src/icons/v2/password-l.svg new file mode 100644 index 000000000..e9f39f900 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/password-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/password-m.svg b/client/packages/lowcoder-design/src/icons/v2/password-m.svg new file mode 100644 index 000000000..a27a0635a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/password-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/password-s.svg b/client/packages/lowcoder-design/src/icons/v2/password-s.svg new file mode 100644 index 000000000..ffc01c3a8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/password-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/pie-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/pie-chart-l.svg new file mode 100644 index 000000000..82539d530 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/pie-chart-l.svg @@ -0,0 +1,1262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/pie-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/pie-chart-m.svg new file mode 100644 index 000000000..bc5b872e5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/pie-chart-m.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/pie-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/pie-chart-s.svg new file mode 100644 index 000000000..bc1884d25 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/pie-chart-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/pivot-table-l.svg b/client/packages/lowcoder-design/src/icons/v2/pivot-table-l.svg new file mode 100644 index 000000000..1599edc35 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/pivot-table-l.svg @@ -0,0 +1,1268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/pivot-table-m.svg b/client/packages/lowcoder-design/src/icons/v2/pivot-table-m.svg new file mode 100644 index 000000000..5d0730c4e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/pivot-table-m.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/pivot-table-s.svg b/client/packages/lowcoder-design/src/icons/v2/pivot-table-s.svg new file mode 100644 index 000000000..43e68b417 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/pivot-table-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/progress-circle-l.svg b/client/packages/lowcoder-design/src/icons/v2/progress-circle-l.svg new file mode 100644 index 000000000..74134435c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/progress-circle-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/progress-circle-m.svg b/client/packages/lowcoder-design/src/icons/v2/progress-circle-m.svg new file mode 100644 index 000000000..0ab052e37 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/progress-circle-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/progress-circle-s.svg b/client/packages/lowcoder-design/src/icons/v2/progress-circle-s.svg new file mode 100644 index 000000000..cc7c31946 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/progress-circle-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/progress-l.svg b/client/packages/lowcoder-design/src/icons/v2/progress-l.svg new file mode 100644 index 000000000..d3a07be58 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/progress-l.svg @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/progress-m.svg b/client/packages/lowcoder-design/src/icons/v2/progress-m.svg new file mode 100644 index 000000000..86d113315 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/progress-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/progress-s.svg b/client/packages/lowcoder-design/src/icons/v2/progress-s.svg new file mode 100644 index 000000000..c516f9489 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/progress-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/qr-code-display-l.svg b/client/packages/lowcoder-design/src/icons/v2/qr-code-display-l.svg new file mode 100644 index 000000000..fb372da03 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/qr-code-display-l.svg @@ -0,0 +1,1271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/qr-code-display-m.svg b/client/packages/lowcoder-design/src/icons/v2/qr-code-display-m.svg new file mode 100644 index 000000000..d0d976088 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/qr-code-display-m.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/qr-code-display-s.svg b/client/packages/lowcoder-design/src/icons/v2/qr-code-display-s.svg new file mode 100644 index 000000000..f3efaf049 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/qr-code-display-s.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/radar-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/radar-chart-l.svg new file mode 100644 index 000000000..018834146 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/radar-chart-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/radar-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/radar-chart-m.svg new file mode 100644 index 000000000..5e32a456f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/radar-chart-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/radar-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/radar-chart-s.svg new file mode 100644 index 000000000..581454439 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/radar-chart-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/radio-button-l.svg b/client/packages/lowcoder-design/src/icons/v2/radio-button-l.svg new file mode 100644 index 000000000..ff116d28a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/radio-button-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/radio-button-m.svg b/client/packages/lowcoder-design/src/icons/v2/radio-button-m.svg new file mode 100644 index 000000000..b9155dfad --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/radio-button-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/radio-button-s.svg b/client/packages/lowcoder-design/src/icons/v2/radio-button-s.svg new file mode 100644 index 000000000..5a91617bf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/radio-button-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/range-slider-l.svg b/client/packages/lowcoder-design/src/icons/v2/range-slider-l.svg new file mode 100644 index 000000000..88a4dd6ae --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/range-slider-l.svg @@ -0,0 +1,1267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/range-slider-m.svg b/client/packages/lowcoder-design/src/icons/v2/range-slider-m.svg new file mode 100644 index 000000000..123bea1ef --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/range-slider-m.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/range-slider-s-1.svg b/client/packages/lowcoder-design/src/icons/v2/range-slider-s-1.svg new file mode 100644 index 000000000..123bea1ef --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/range-slider-s-1.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/range-slider-s.svg b/client/packages/lowcoder-design/src/icons/v2/range-slider-s.svg new file mode 100644 index 000000000..fbd373b1e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/range-slider-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/rating-l.svg b/client/packages/lowcoder-design/src/icons/v2/rating-l.svg new file mode 100644 index 000000000..f39f58925 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/rating-l.svg @@ -0,0 +1,1260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/rating-m.svg b/client/packages/lowcoder-design/src/icons/v2/rating-m.svg new file mode 100644 index 000000000..2a9b37ea0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/rating-m.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/rating-s.svg b/client/packages/lowcoder-design/src/icons/v2/rating-s.svg new file mode 100644 index 000000000..e9e8977c3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/rating-s.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/resposive-layout-l.svg b/client/packages/lowcoder-design/src/icons/v2/resposive-layout-l.svg new file mode 100644 index 000000000..638b53957 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/resposive-layout-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/resposive-layout-m.svg b/client/packages/lowcoder-design/src/icons/v2/resposive-layout-m.svg new file mode 100644 index 000000000..c67618e7c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/resposive-layout-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/resposive-layout-s.svg b/client/packages/lowcoder-design/src/icons/v2/resposive-layout-s.svg new file mode 100644 index 000000000..113f01090 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/resposive-layout-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/rich-text-editor-l.svg b/client/packages/lowcoder-design/src/icons/v2/rich-text-editor-l.svg new file mode 100644 index 000000000..46053b364 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/rich-text-editor-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/rich-text-editor-m.svg b/client/packages/lowcoder-design/src/icons/v2/rich-text-editor-m.svg new file mode 100644 index 000000000..f419797a4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/rich-text-editor-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/rich-text-editor-s.svg b/client/packages/lowcoder-design/src/icons/v2/rich-text-editor-s.svg new file mode 100644 index 000000000..baea246cf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/rich-text-editor-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/sankey-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/sankey-chart-l.svg new file mode 100644 index 000000000..470719029 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/sankey-chart-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/sankey-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/sankey-chart-m.svg new file mode 100644 index 000000000..20db32dce --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/sankey-chart-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/sankey-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/sankey-chart-s.svg new file mode 100644 index 000000000..53617edc5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/sankey-chart-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/scanner-l.svg b/client/packages/lowcoder-design/src/icons/v2/scanner-l.svg new file mode 100644 index 000000000..4b7537737 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/scanner-l.svg @@ -0,0 +1,1261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/scanner-m.svg b/client/packages/lowcoder-design/src/icons/v2/scanner-m.svg new file mode 100644 index 000000000..47d53ce0c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/scanner-m.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/scanner-s.svg b/client/packages/lowcoder-design/src/icons/v2/scanner-s.svg new file mode 100644 index 000000000..b356f89cf --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/scanner-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-l.svg b/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-l.svg new file mode 100644 index 000000000..160787056 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-m.svg b/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-m.svg new file mode 100644 index 000000000..a6aa87d5c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-s-1.svg b/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-s-1.svg new file mode 100644 index 000000000..ec7ad0e86 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-s-1.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-s.svg b/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-s.svg new file mode 100644 index 000000000..229c3adb5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/screen-share-stream-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/segmented-control-l.svg b/client/packages/lowcoder-design/src/icons/v2/segmented-control-l.svg new file mode 100644 index 000000000..4182789a7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/segmented-control-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/segmented-control-m.svg b/client/packages/lowcoder-design/src/icons/v2/segmented-control-m.svg new file mode 100644 index 000000000..7cbf4c81e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/segmented-control-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/segmented-control-s.svg b/client/packages/lowcoder-design/src/icons/v2/segmented-control-s.svg new file mode 100644 index 000000000..52116f7c8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/segmented-control-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/select-l.svg b/client/packages/lowcoder-design/src/icons/v2/select-l.svg new file mode 100644 index 000000000..dc3a32eb0 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/select-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/select-m.svg b/client/packages/lowcoder-design/src/icons/v2/select-m.svg new file mode 100644 index 000000000..317361957 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/select-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/select-s.svg b/client/packages/lowcoder-design/src/icons/v2/select-s.svg new file mode 100644 index 000000000..4713f8186 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/select-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/shapes-l.svg b/client/packages/lowcoder-design/src/icons/v2/shapes-l.svg new file mode 100644 index 000000000..43e6c3d90 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/shapes-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/shapes-m.svg b/client/packages/lowcoder-design/src/icons/v2/shapes-m.svg new file mode 100644 index 000000000..83bf4f402 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/shapes-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/shapes-s.svg b/client/packages/lowcoder-design/src/icons/v2/shapes-s.svg new file mode 100644 index 000000000..e063c9dec --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/shapes-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/signature-l.svg b/client/packages/lowcoder-design/src/icons/v2/signature-l.svg new file mode 100644 index 000000000..0d411e640 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/signature-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/signature-m.svg b/client/packages/lowcoder-design/src/icons/v2/signature-m.svg new file mode 100644 index 000000000..4140e9048 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/signature-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/signature-s.svg b/client/packages/lowcoder-design/src/icons/v2/signature-s.svg new file mode 100644 index 000000000..1498aa5a5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/signature-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/slider-l.svg b/client/packages/lowcoder-design/src/icons/v2/slider-l.svg new file mode 100644 index 000000000..382d54130 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/slider-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/slider-m.svg b/client/packages/lowcoder-design/src/icons/v2/slider-m.svg new file mode 100644 index 000000000..a2d32a0cc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/slider-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/slider-s.svg b/client/packages/lowcoder-design/src/icons/v2/slider-s.svg new file mode 100644 index 000000000..216f018d3 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/slider-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/steps-l.svg b/client/packages/lowcoder-design/src/icons/v2/steps-l.svg new file mode 100644 index 000000000..d5b208e36 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/steps-l.svg @@ -0,0 +1,1272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/steps-m.svg b/client/packages/lowcoder-design/src/icons/v2/steps-m.svg new file mode 100644 index 000000000..02c754b3d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/steps-m.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/steps-s.svg b/client/packages/lowcoder-design/src/icons/v2/steps-s.svg new file mode 100644 index 000000000..a24590a55 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/steps-s.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/sunburst-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/sunburst-chart-l.svg new file mode 100644 index 000000000..a6d60933e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/sunburst-chart-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/sunburst-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/sunburst-chart-m.svg new file mode 100644 index 000000000..f8b976de5 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/sunburst-chart-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/sunburst-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/sunburst-chart-s.svg new file mode 100644 index 000000000..2858c5199 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/sunburst-chart-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/switch-l.svg b/client/packages/lowcoder-design/src/icons/v2/switch-l.svg new file mode 100644 index 000000000..418c85f1f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/switch-l.svg @@ -0,0 +1,1262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/switch-m.svg b/client/packages/lowcoder-design/src/icons/v2/switch-m.svg new file mode 100644 index 000000000..b21b30db6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/switch-m.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/switch-s.svg b/client/packages/lowcoder-design/src/icons/v2/switch-s.svg new file mode 100644 index 000000000..7ffd58f7f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/switch-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tabbed-container-l.svg b/client/packages/lowcoder-design/src/icons/v2/tabbed-container-l.svg new file mode 100644 index 000000000..63d5474c8 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tabbed-container-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tabbed-container-m.svg b/client/packages/lowcoder-design/src/icons/v2/tabbed-container-m.svg new file mode 100644 index 000000000..9ea54727d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tabbed-container-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tabbed-container-s.svg b/client/packages/lowcoder-design/src/icons/v2/tabbed-container-s.svg new file mode 100644 index 000000000..eb7eae452 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tabbed-container-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/table-l.svg b/client/packages/lowcoder-design/src/icons/v2/table-l.svg new file mode 100644 index 000000000..b5fc148c1 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/table-l.svg @@ -0,0 +1,1270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/table-m.svg b/client/packages/lowcoder-design/src/icons/v2/table-m.svg new file mode 100644 index 000000000..84d6872ff --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/table-m.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/table-s.svg b/client/packages/lowcoder-design/src/icons/v2/table-s.svg new file mode 100644 index 000000000..1c3b47c3e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/table-s.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/text-area-input-l.svg b/client/packages/lowcoder-design/src/icons/v2/text-area-input-l.svg new file mode 100644 index 000000000..46d81a338 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/text-area-input-l.svg @@ -0,0 +1,1268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/text-area-input-m.svg b/client/packages/lowcoder-design/src/icons/v2/text-area-input-m.svg new file mode 100644 index 000000000..a2c52015f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/text-area-input-m.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/text-area-input-s.svg b/client/packages/lowcoder-design/src/icons/v2/text-area-input-s.svg new file mode 100644 index 000000000..34a838434 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/text-area-input-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/text-display-l.svg b/client/packages/lowcoder-design/src/icons/v2/text-display-l.svg new file mode 100644 index 000000000..38bfc139f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/text-display-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/text-display-m.svg b/client/packages/lowcoder-design/src/icons/v2/text-display-m.svg new file mode 100644 index 000000000..25c320db9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/text-display-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/text-display-s.svg b/client/packages/lowcoder-design/src/icons/v2/text-display-s.svg new file mode 100644 index 000000000..ec5fb4d8c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/text-display-s.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/themeriver-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/themeriver-chart-l.svg new file mode 100644 index 000000000..ba93c3736 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/themeriver-chart-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/themeriver-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/themeriver-chart-m.svg new file mode 100644 index 000000000..edb9a6ca6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/themeriver-chart-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/themeriver-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/themeriver-chart-s.svg new file mode 100644 index 000000000..85812c6a6 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/themeriver-chart-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/time-range-select-l.svg b/client/packages/lowcoder-design/src/icons/v2/time-range-select-l.svg new file mode 100644 index 000000000..6ef7bad54 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/time-range-select-l.svg @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/time-range-select-m.svg b/client/packages/lowcoder-design/src/icons/v2/time-range-select-m.svg new file mode 100644 index 000000000..16f2e774f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/time-range-select-m.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/time-range-select-s.svg b/client/packages/lowcoder-design/src/icons/v2/time-range-select-s.svg new file mode 100644 index 000000000..d40ec0348 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/time-range-select-s.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/time-select-l.svg b/client/packages/lowcoder-design/src/icons/v2/time-select-l.svg new file mode 100644 index 000000000..697d97b4e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/time-select-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/time-select-m.svg b/client/packages/lowcoder-design/src/icons/v2/time-select-m.svg new file mode 100644 index 000000000..9b00e8061 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/time-select-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/time-select-s.svg b/client/packages/lowcoder-design/src/icons/v2/time-select-s.svg new file mode 100644 index 000000000..348b68a50 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/time-select-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/timeline-l.svg b/client/packages/lowcoder-design/src/icons/v2/timeline-l.svg new file mode 100644 index 000000000..5308bf9e2 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/timeline-l.svg @@ -0,0 +1,1270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/timeline-m.svg b/client/packages/lowcoder-design/src/icons/v2/timeline-m.svg new file mode 100644 index 000000000..0e31e024f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/timeline-m.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/timeline-s.svg b/client/packages/lowcoder-design/src/icons/v2/timeline-s.svg new file mode 100644 index 000000000..88f0cbc3e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/timeline-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/timer-l.svg b/client/packages/lowcoder-design/src/icons/v2/timer-l.svg new file mode 100644 index 000000000..ea91cfa08 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/timer-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/timer-m.svg b/client/packages/lowcoder-design/src/icons/v2/timer-m.svg new file mode 100644 index 000000000..eb8a14816 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/timer-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/timer-s.svg b/client/packages/lowcoder-design/src/icons/v2/timer-s.svg new file mode 100644 index 000000000..5a64fe49d --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/timer-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/toggle-button-l.svg b/client/packages/lowcoder-design/src/icons/v2/toggle-button-l.svg new file mode 100644 index 000000000..9f00c6cf7 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/toggle-button-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/toggle-button-m.svg b/client/packages/lowcoder-design/src/icons/v2/toggle-button-m.svg new file mode 100644 index 000000000..1fc8341c9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/toggle-button-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/toggle-button-s.svg b/client/packages/lowcoder-design/src/icons/v2/toggle-button-s.svg new file mode 100644 index 000000000..71ebe9f0f --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/toggle-button-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/transfer-list-l.svg b/client/packages/lowcoder-design/src/icons/v2/transfer-list-l.svg new file mode 100644 index 000000000..3a0d7a4ed --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/transfer-list-l.svg @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/transfer-list-m.svg b/client/packages/lowcoder-design/src/icons/v2/transfer-list-m.svg new file mode 100644 index 000000000..78a43cdfe --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/transfer-list-m.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/transfer-list-s.svg b/client/packages/lowcoder-design/src/icons/v2/transfer-list-s.svg new file mode 100644 index 000000000..c8fe0ba20 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/transfer-list-s.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tree-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/tree-chart-l.svg new file mode 100644 index 000000000..a7307951c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tree-chart-l.svg @@ -0,0 +1,1279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tree-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/tree-chart-m.svg new file mode 100644 index 000000000..1d8633846 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tree-chart-m.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tree-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/tree-chart-s.svg new file mode 100644 index 000000000..434623e3c --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tree-chart-s.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tree-display-l.svg b/client/packages/lowcoder-design/src/icons/v2/tree-display-l.svg new file mode 100644 index 000000000..ef1dec095 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tree-display-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tree-display-m.svg b/client/packages/lowcoder-design/src/icons/v2/tree-display-m.svg new file mode 100644 index 000000000..fd6a6afe9 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tree-display-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tree-display-s.svg b/client/packages/lowcoder-design/src/icons/v2/tree-display-s.svg new file mode 100644 index 000000000..43bb9f61e --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tree-display-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tree-select-l.svg b/client/packages/lowcoder-design/src/icons/v2/tree-select-l.svg new file mode 100644 index 000000000..b7dfacf3a --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tree-select-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tree-select-m.svg b/client/packages/lowcoder-design/src/icons/v2/tree-select-m.svg new file mode 100644 index 000000000..5c0904c62 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tree-select-m.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/tree-select-s.svg b/client/packages/lowcoder-design/src/icons/v2/tree-select-s.svg new file mode 100644 index 000000000..1cf92a204 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/tree-select-s.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/treemap-chart-l.svg b/client/packages/lowcoder-design/src/icons/v2/treemap-chart-l.svg new file mode 100644 index 000000000..2e54192be --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/treemap-chart-l.svg @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/treemap-chart-m.svg b/client/packages/lowcoder-design/src/icons/v2/treemap-chart-m.svg new file mode 100644 index 000000000..25f7e6370 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/treemap-chart-m.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/treemap-chart-s.svg b/client/packages/lowcoder-design/src/icons/v2/treemap-chart-s.svg new file mode 100644 index 000000000..cb17b8b44 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/treemap-chart-s.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/turnstile-captcha-l.svg b/client/packages/lowcoder-design/src/icons/v2/turnstile-captcha-l.svg new file mode 100644 index 000000000..d7dd2ca03 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/turnstile-captcha-l.svg @@ -0,0 +1,1271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/turnstile-captcha-m.svg b/client/packages/lowcoder-design/src/icons/v2/turnstile-captcha-m.svg new file mode 100644 index 000000000..11f598931 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/turnstile-captcha-m.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/turnstile-captcha-s.svg b/client/packages/lowcoder-design/src/icons/v2/turnstile-captcha-s.svg new file mode 100644 index 000000000..8070b4ccc --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/turnstile-captcha-s.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/video-player-l.svg b/client/packages/lowcoder-design/src/icons/v2/video-player-l.svg new file mode 100644 index 000000000..15f4a4cb4 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/video-player-l.svg @@ -0,0 +1,1263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/video-player-m.svg b/client/packages/lowcoder-design/src/icons/v2/video-player-m.svg new file mode 100644 index 000000000..a76b1206b --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/video-player-m.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/packages/lowcoder-design/src/icons/v2/video-player-s.svg b/client/packages/lowcoder-design/src/icons/v2/video-player-s.svg new file mode 100644 index 000000000..02d9e6387 --- /dev/null +++ b/client/packages/lowcoder-design/src/icons/v2/video-player-s.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/packages/lowcoder-design/src/index.ts b/client/packages/lowcoder-design/src/index.ts index 92a05fb78..9298929c5 100644 --- a/client/packages/lowcoder-design/src/index.ts +++ b/client/packages/lowcoder-design/src/index.ts @@ -47,6 +47,7 @@ export * from "./components/tacoInput"; export * from "./components/tacoPagination"; export * from "./components/toolTip"; export * from "./components/video"; +export * from "./components/shapeSelect"; export * from "./icons"; diff --git a/client/packages/lowcoder-sdk-webpack-bundle/.babelrc b/client/packages/lowcoder-sdk-webpack-bundle/.babelrc new file mode 100644 index 000000000..364e20eb7 --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/.babelrc @@ -0,0 +1,33 @@ +{ + "presets": [ + "@babel/preset-typescript", + "@babel/preset-react", + ["@babel/preset-env", { + "modules": false, + "targets": { + "node": "6.10" + } + }] + ], + "plugins": [ + ["@babel/transform-runtime"], + ["babel-plugin-styled-components"], + ["import", { + "libraryName": "antd", + "libraryDirectory": "es", + "style": true + }, "antd"], + ["import", { + "libraryName": "@ant-design/icons", + // "style": false, + "libraryDirectory": "es/icons", + "camel2DashComponentName": false + }, "@ant-design/icons"], + ["import", { + "libraryName": "antd-mobile" + }, "antd-mobile"], + ["import", { + "libraryName": "lodash" + }, "lodash"] + ] +} \ No newline at end of file diff --git a/client/packages/lowcoder-sdk-webpack-bundle/.gitignore b/client/packages/lowcoder-sdk-webpack-bundle/.gitignore new file mode 100644 index 000000000..3c851814f --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/.gitignore @@ -0,0 +1,4 @@ +/node_modules +/dist +/bundle +/types \ No newline at end of file diff --git a/client/packages/lowcoder-sdk-webpack-bundle/LICENSE b/client/packages/lowcoder-sdk-webpack-bundle/LICENSE new file mode 100644 index 000000000..1ce875873 --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file diff --git a/client/packages/lowcoder-sdk-webpack-bundle/README.md b/client/packages/lowcoder-sdk-webpack-bundle/README.md new file mode 100644 index 000000000..0b465a65a --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/README.md @@ -0,0 +1,9 @@ +# lowcoder-sdk-webpack-bundle +The code to use Lowcoder Apps on any Web Project + +STEPS to use + +1) build the project with `npm run build` +2) host `dist` folder on server +3) add `bundle.js` as an external script on the HTML page where you want to include the app +4) Add the apps as given in demo under `/dist/index_test.html` diff --git a/client/packages/lowcoder-sdk-webpack-bundle/index.html b/client/packages/lowcoder-sdk-webpack-bundle/index.html new file mode 100644 index 000000000..43d660406 --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/index.html @@ -0,0 +1,37 @@ + + + + + + + YOUR APP TITLE + + + + +

App 1

+
+ + + +
+
+ + + + + diff --git a/client/packages/lowcoder-sdk-webpack-bundle/index.jsx b/client/packages/lowcoder-sdk-webpack-bundle/index.jsx new file mode 100644 index 000000000..ceaef9c99 --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/index.jsx @@ -0,0 +1,62 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import { LowcoderAppView } from "./src/index"; + +const opChangeDefault = (op) => {}; +const onModuleEventTriggeredDefault = (op) => {}; + +for ( + var i = 0; + i < document.querySelectorAll(".lowcoder-module-container").length; + i++ +) { + const App = () => { + return ( + + ); + } + + ReactDOM.render( + React.createElement(App, {}, null), + document + .querySelectorAll(".lowcoder-module-container") + [i]?.querySelector(".lowcoder-module-display") + ); +} diff --git a/client/packages/lowcoder-sdk-webpack-bundle/netlify.toml b/client/packages/lowcoder-sdk-webpack-bundle/netlify.toml new file mode 100644 index 000000000..ac22c53b6 --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/netlify.toml @@ -0,0 +1,12 @@ +# The following redirect is intended for use with most SPAs that handle +# routing internally. +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 + +[[headers]] + # Define which paths this specific [[headers]] block will cover. + for = "/*" + [headers.values] + Access-Control-Allow-Origin = "*" \ No newline at end of file diff --git a/client/packages/lowcoder-sdk-webpack-bundle/package.json b/client/packages/lowcoder-sdk-webpack-bundle/package.json new file mode 100644 index 000000000..103932650 --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/package.json @@ -0,0 +1,37 @@ +{ + "name": "lowcoder-sdk-webpack-bundle", + "description": "", + "version": "2.1.2", + "main": "index.jsx", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "webpack-dev-server --config ./webpack.config.cjs --mode development --progress --color --port 5000", + "build": "webpack --mode production" + }, + "author": "Lowcoder Software LTD", + "license": "AGPL3", + "devDependencies": { + "@svgr/webpack": "^8.1.0", + "babel-loader": "^9.1.3", + "babel-plugin-import": "^1.13.8", + "babel-plugin-styled-components": "^2.1.4", + "copy-webpack-plugin": "^12.0.2", + "css-loader": "^6.10.0", + "file-loader": "^6.2.0", + "less-loader": "^12.2.0", + "raw-loader": "^4.0.2", + "style-loader": "^3.3.4", + "ts-loader": "^9.5.1", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^4.8.4", + "url-loader": "^4.1.1", + "webpack": "^5.90.3", + "webpack-bundle-analyzer": "^4.10.1", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.0.4" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } +} diff --git a/client/packages/lowcoder-sdk-webpack-bundle/plugins/JSEntryWebpackPlugin.cjs b/client/packages/lowcoder-sdk-webpack-bundle/plugins/JSEntryWebpackPlugin.cjs new file mode 100644 index 000000000..9182f332f --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/plugins/JSEntryWebpackPlugin.cjs @@ -0,0 +1,200 @@ +const path = require('path') + +class JSEntryWebpackPlugin { + constructor(options = {}) { + this.options = { + filename: 'index.js', + template: 'auto', + publicPath: options.publicPath === undefined ? 'auto' : options.publicPath, + ...options, + } + } + + apply(compiler) { + compiler.hooks.emit.tap('InjectCssEntry', async compilation => { + // console.log(Object.keys(compilation.assets)) + + /** output filenames for the given entry names */ + const entryNames = Object.keys(compiler.options.entry) + const outputFileNames = new Set( + (entryNames.length ? entryNames : ['main']).map(entryName => + // Replace '[name]' with entry name + this.options.filename.replace(/\[name\]/g, entryName), + ), + ) + + /** Option for every entry point */ + const entryOption = Array.from(outputFileNames).map(filename => ({ + ...this.options, + filename, + }))[0] + + /** The public path used inside the html file */ + const publicPath = this.getPublicPath( + compilation, + entryOption.filename, + entryOption.publicPath, + ) + + /** build output path */ + const templatePath = this.getTemplatePath(entryOption.template, compilation.options) + + /** Generated file paths from the entry point names */ + const assets = this.htmlWebpackPluginAssets( + compilation, + // 只处理一个 + Array.from(compilation.entrypoints.keys()).slice(0, 1), + publicPath, + templatePath, + ) + + // js entry + if (!compilation.assets[assets.entry]) return + // const { libsImportCode } = await import("../src/dev-utils/external.js"); + // const libs = libsImportCode(["lowcoder-sdk"]); + // ${libsImportCode(["lowcoder-sdk"])} + let content = `(function() { + + // adding entry points to single bundle.js file + let scripts = ${JSON.stringify(assets.js)}; + for (let i = 0; i < scripts.length; i++) { + const scriptEle = document.createElement('script'); + scriptEle.src = scripts[i]; + document.body.appendChild(scriptEle); + } + })()`; + + compilation.assets[entryOption.filename] = { + source() { + return content + }, + size() { + return content.length + }, + } + }) + } + + htmlWebpackPluginAssets(compilation, entryNames, publicPath, templatePath) { + // https://github.com/jantimon/html-webpack-plugin/blob/main/index.js#L640 + const assets = { + publicPath, + templatePath, + entry: '', + js: [], + css: [], + } + + // Extract paths to .js, .mjs and .css files from the current compilation + const entryPointPublicPathMap = {} + const extensionRegexp = /\.(css|js)(\?|$)/ + for (let i = 0; i < entryNames.length; i++) { + const entryName = entryNames[i] + /** entryPointUnfilteredFiles - also includes hot module update files */ + const entryPointUnfilteredFiles = compilation.entrypoints.get(entryName).getFiles() + + const entryPointFiles = entryPointUnfilteredFiles.filter(chunkFile => { + // compilation.getAsset was introduced in webpack 4.4.0 + // once the support pre webpack 4.4.0 is dropped please + // remove the following guard: + const asset = compilation.getAsset && compilation.getAsset(chunkFile) + if (!asset) { + return true + } + // Prevent hot-module files from being included: + const assetMetaInformation = asset.info || {} + return !(assetMetaInformation.hotModuleReplacement || assetMetaInformation.development) + }) + + // Prepend the publicPath and append the hash depending on the + // webpack.output.publicPath and hashOptions + // E.g. bundle.js -> /bundle.js?hash + const entryPointPublicPaths = entryPointFiles.map(chunkFile => { + const urlPath = this.urlencodePath(chunkFile) + const entryPointPublicPath = publicPath + urlPath + + if (chunkFile.endsWith('.js')) { + assets.entry = urlPath + } + return entryPointPublicPath + }) + + entryPointPublicPaths.forEach(entryPointPublicPath => { + const extMatch = extensionRegexp.exec(entryPointPublicPath) + // Skip if the public path is not a .css, .mjs or .js file + if (!extMatch) { + return + } + // Skip if this file is already known + // (e.g. because of common chunk optimizations) + if (entryPointPublicPathMap[entryPointPublicPath]) { + return + } + entryPointPublicPathMap[entryPointPublicPath] = true + const ext = extMatch[1] + assets[ext].push(entryPointPublicPath) + }) + } + return assets + } + + getPublicPath(compilation, outputName, customPublicPath) { + const compilationHash = compilation.hash + + /** + * @type {string} the configured public path to the asset root + * if a path publicPath is set in the current webpack config use it otherwise + * fallback to a relative path + */ + const webpackPublicPath = compilation.getAssetPath(compilation.outputOptions.publicPath, { + hash: compilationHash, + }) + + // Webpack 5 introduced "auto" as default value + const isPublicPathDefined = webpackPublicPath !== 'auto' + + let publicPath = + // If the html-webpack-plugin options contain a custom public path uset it + customPublicPath !== 'auto' + ? customPublicPath + : isPublicPathDefined + ? // If a hard coded public path exists use it + webpackPublicPath + : // If no public path was set get a relative url path + path + .relative( + path.resolve(compilation.options.output.path, path.dirname(outputName)), + compilation.options.output.path, + ) + .split(path.sep) + .join('/') + + if (publicPath.length && publicPath.substr(-1, 1) !== '/') { + publicPath += '/' + } + + return publicPath + } + + getTemplatePath(template, options) { + const { context, output } = options + + return template === 'auto' + ? path.join(output.path, path.sep) + : path.join(context || '', template) + } + + urlencodePath(filePath) { + // some+path/demo.html?value=abc?def + const queryStringStart = filePath.indexOf('?') + const urlPath = queryStringStart === -1 ? filePath : filePath.substr(0, queryStringStart) + const queryString = filePath.substr(urlPath.length) + // Encode all parts except '/' which are not part of the querystring: + const encodedUrlPath = urlPath.split('/').map(encodeURIComponent).join('/') + return encodedUrlPath + queryString + } +} + +JSEntryWebpackPlugin.version = 1 + +module.exports = JSEntryWebpackPlugin diff --git a/client/packages/lowcoder-sdk-webpack-bundle/src/bundle.js b/client/packages/lowcoder-sdk-webpack-bundle/src/bundle.js new file mode 100644 index 000000000..14fe966ba --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/src/bundle.js @@ -0,0 +1,7 @@ +// Create a + Custom Component + + + + + diff --git a/client/packages/lowcoder-sdk-webpack-bundle/src/custom_component/index_custom_component_files/babel.min.js b/client/packages/lowcoder-sdk-webpack-bundle/src/custom_component/index_custom_component_files/babel.min.js new file mode 100644 index 000000000..21d5c9afb --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/src/custom_component/index_custom_component_files/babel.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Babel={})}(this,(function(e){"use strict";var t=Object.freeze({__proto__:null,get version(){return sz},get types(){return Gl},get loadOptionsSync(){return QG},get DEFAULT_EXTENSIONS(){return iz},get File(){return NB},get buildExternalHelpers(){return dO},get resolvePlugin(){return RO},get resolvePreset(){return xO},get getEnv(){return jO},get tokTypes(){return rD},get traverse(){return AC},get template(){return Tj},get createConfigItem(){return rV},get createConfigItemSync(){return eV},get createConfigItemAsync(){return tV},get loadPartialConfig(){return XG},get loadPartialConfigSync(){return JG},get loadPartialConfigAsync(){return YG},get loadOptions(){return $G},get loadOptionsAsync(){return ZG},get transform(){return WV},get transformSync(){return HV},get transformAsync(){return KV},get transformFile(){return XV},get transformFileSync(){return JV},get transformFileAsync(){return YV},get transformFromAst(){return QV},get transformFromAstSync(){return ZV},get transformFromAstAsync(){return ez},get parse(){return rz},get parseSync(){return az},get parseAsync(){return nz}});function r(){r=function(){return e};var e={},t=Object.prototype,a=t.hasOwnProperty,n=Object.defineProperty||function(e,t,r){e[t]=r.value},s="function"==typeof Symbol?Symbol:{},i=s.iterator||"@@iterator",o=s.asyncIterator||"@@asyncIterator",d=s.toStringTag||"@@toStringTag";function u(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,r){return e[t]=r}}function c(e,t,r,a){var s=t&&t.prototype instanceof f?t:f,i=Object.create(s.prototype),o=new A(a||[]);return n(i,"_invoke",{value:E(e,r,o)}),i}function l(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var p={};function f(){}function g(){}function h(){}var y={};u(y,i,(function(){return this}));var m=Object.getPrototypeOf,v=m&&m(m(C([])));v&&v!==t&&a.call(v,i)&&(y=v);var b=h.prototype=f.prototype=Object.create(y);function R(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function x(e,t){function r(n,s,i,o){var d=l(e[n],e,s);if("throw"!==d.type){var u=d.arg,c=u.value;return c&&"object"==typeof c&&a.call(c,"__await")?t.resolve(c.__await).then((function(e){r("next",e,i,o)}),(function(e){r("throw",e,i,o)})):t.resolve(c).then((function(e){u.value=e,i(u)}),(function(e){return r("throw",e,i,o)}))}o(d.arg)}var s;n(this,"_invoke",{value:function(e,a){function n(){return new t((function(t,n){r(e,a,t,n)}))}return s=s?s.then(n,n):n()}})}function E(e,t,r){var a="suspendedStart";return function(n,s){if("executing"===a)throw new Error("Generator is already running");if("completed"===a){if("throw"===n)throw s;return S()}for(r.method=n,r.arg=s;;){var i=r.delegate;if(i){var o=D(i,r);if(o){if(o===p)continue;return o}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if("suspendedStart"===a)throw a="completed",r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);a="executing";var d=l(e,t,r);if("normal"===d.type){if(a=r.done?"completed":"suspendedYield",d.arg===p)continue;return{value:d.arg,done:r.done}}"throw"===d.type&&(a="completed",r.method="throw",r.arg=d.arg)}}}function D(e,t){var r=t.method,a=e.iterator[r];if(void 0===a)return t.delegate=null,"throw"===r&&e.iterator.return&&(t.method="return",t.arg=void 0,D(e,t),"throw"===t.method)||"return"!==r&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+r+"' method")),p;var n=l(a,e.iterator,t.arg);if("throw"===n.type)return t.method="throw",t.arg=n.arg,t.delegate=null,p;var s=n.arg;return s?s.done?(t[e.resultName]=s.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,p):s:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function j(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function w(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function A(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(j,this),this.reset(!0)}function C(e){if(e){var t=e[i];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,n=function t(){for(;++r=0;--n){var s=this.tryEntries[n],i=s.completion;if("root"===s.tryLoc)return r("end");if(s.tryLoc<=this.prev){var o=a.call(s,"catchLoc"),d=a.call(s,"finallyLoc");if(o&&d){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&a.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),w(r),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var a=r.completion;if("throw"===a.type){var n=a.arg;w(r)}return n}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:C(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),p}},e}function a(e,t,r,a,n,s,i){try{var o=e[s](i),d=o.value}catch(e){return void r(e)}o.done?t(d):Promise.resolve(d).then(a,n)}function n(e){return function(){var t=this,r=arguments;return new Promise((function(n,s){var i=e.apply(t,r);function o(e){a(i,n,s,o,d,"next",e)}function d(e){a(i,n,s,o,d,"throw",e)}o(void 0)}))}}function s(e,t){for(var r=0;r=0||(n[r]=e[r]);return n}function g(e,t){if(null==e)return{};var r,a,n=f(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function y(e,t){return t||(t=e.slice(0)),e.raw=t,e}function m(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var a,n,s,i,o=[],d=!0,u=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;d=!1}else for(;!(d=(a=s.call(r)).done)&&(o.push(a.value),o.length!==t);d=!0);}catch(e){u=!0,n=e}finally{try{if(!d&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(u)throw n}}return o}}(e,t)||b(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e){return function(e){if(Array.isArray(e))return R(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||b(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function b(e,t){if(e){if("string"==typeof e)return R(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?R(e,t):void 0}}function R(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=new Array(t);r=e.length?{done:!0}:{done:!1,value:e[a++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function E(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var a=r.call(e,t||"default");if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}var D=Object.freeze({__proto__:null,ReferencedIdentifier:["Identifier","JSXIdentifier"],ReferencedMemberExpression:["MemberExpression"],BindingIdentifier:["Identifier"],Statement:["Statement"],Expression:["Expression"],Scope:["Scopable","Pattern"],Referenced:null,BlockScoped:null,Var:["VariableDeclaration"],User:null,Generated:null,Pure:null,Flow:["Flow","ImportDeclaration","ExportDeclaration","ImportSpecifier"],RestProperty:["RestElement"],SpreadProperty:["RestElement"],ExistentialTypeParam:["ExistsTypeAnnotation"],NumericLiteralTypeAnnotation:["NumberLiteralTypeAnnotation"],ForAwaitStatement:["ForOfStatement"]});function j(e,t){for(var r=0,a=Object.keys(t);rn.length)return!1;for(var i=0,o=s.length-1;i1)for(var r=1;re)return!1;if((r+=t[a+1])>=e)return!0}return!1}function ta(e){return e<65?36===e:e<=90||(e<97?95===e:e<=122||(e<=65535?e>=170&&Yr.test(String.fromCharCode(e)):ea(e,Qr)))}function ra(e){return e<48?36===e:e<58||!(e<65)&&(e<=90||(e<97?95===e:e<=122||(e<=65535?e>=170&&$r.test(String.fromCharCode(e)):ea(e,Qr)||ea(e,Zr))))}function aa(e){for(var t=!0,r=0;r=48&&e<=57},ya={decBinOct:new Set([46,66,69,79,95,98,101,111]),hex:new Set([46,88,95,120])},ma={bin:function(e){return 48===e||49===e},oct:function(e){return e>=48&&e<=55},dec:function(e){return e>=48&&e<=57},hex:function(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}};function va(e,t,r,a,n,s){for(var i=r,o=a,d=n,u="",c=null,l=r,p=t.length;;){if(r>=p){s.unterminated(i,o,d),u+=t.slice(l,r);break}var f=t.charCodeAt(r);if(ba(e,f,t,r)){u+=t.slice(l,r);break}if(92===f){u+=t.slice(l,r);var g=Ra(t,r,a,n,"template"===e,s);null!==g.ch||c?u+=g.ch:c={pos:r,lineStart:a,curLine:n},r=g.pos,a=g.lineStart,n=g.curLine,l=r}else 8232===f||8233===f?(++n,a=++r):10===f||13===f?"template"===e?(u+=t.slice(l,r)+"\n",++r,13===f&&10===t.charCodeAt(r)&&++r,++n,l=a=r):s.unterminated(i,o,d):++r}return{pos:r,str:u,firstInvalidLoc:c,lineStart:a,curLine:n,containsInvalid:!!c}}function ba(e,t,r,a){return"template"===e?96===t||36===t&&123===r.charCodeAt(a+1):t===("double"===e?34:39)}function Ra(e,t,r,a,n,s){var i=!n;t++;var o=function(e){return{pos:t,ch:e,lineStart:r,curLine:a}},d=e.charCodeAt(t++);switch(d){case 110:return o("\n");case 114:return o("\r");case 120:var u,c=xa(e,t,r,a,2,!1,i,s);return u=c.code,t=c.pos,o(null===u?null:String.fromCharCode(u));case 117:var l,p=Da(e,t,r,a,i,s);return l=p.code,t=p.pos,o(null===l?null:String.fromCodePoint(l));case 116:return o("\t");case 98:return o("\b");case 118:return o("\v");case 102:return o("\f");case 13:10===e.charCodeAt(t)&&++t;case 10:r=t,++a;case 8232:case 8233:return o("");case 56:case 57:if(n)return o(null);s.strictNumericEscape(t-1,r,a);default:if(d>=48&&d<=55){var f=t-1,g=e.slice(f,t+2).match(/^[0-7]+/)[0],h=parseInt(g,8);h>255&&(g=g.slice(0,-1),h=parseInt(g,8)),t+=g.length-1;var y=e.charCodeAt(t);if("0"!==g||56===y||57===y){if(n)return o(null);s.strictNumericEscape(f,r,a)}return o(String.fromCharCode(h))}return o(String.fromCharCode(d))}}function xa(e,t,r,a,n,s,i,o){var d,u=t,c=Ea(e,t,r,a,16,n,s,!1,o,!i);return d=c.n,t=c.pos,null===d&&(i?o.invalidEscapeSequence(u,r,a):t=u-1),{code:d,pos:t}}function Ea(e,t,r,a,n,s,i,o,d,u){for(var c=t,l=16===n?ya.hex:ya.decBinOct,p=16===n?ma.hex:10===n?ma.dec:8===n?ma.oct:ma.bin,f=!1,g=0,h=0,y=null==s?1/0:s;h=97?m-97+10:m>=65?m-65+10:ha(m)?m-48:1/0)>=n){if(v<=9&&u)return{n:null,pos:t};if(v<=9&&d.invalidDigit(t,r,a,n))v=0;else{if(!i)break;v=0,f=!0}}++t,g=g*n+v}else{var b=e.charCodeAt(t-1),R=e.charCodeAt(t+1);if(o){if(Number.isNaN(R)||!p(R)||l.has(b)||l.has(R)){if(u)return{n:null,pos:t};d.unexpectedNumericSeparator(t,r,a)}}else{if(u)return{n:null,pos:t};d.numericSeparatorInEscapeSequence(t,r,a)}++t}}return t===c||null!=s&&t-c!==s||f?{n:null,pos:t}:{n:g,pos:t}}function Da(e,t,r,a,n,s){var i;if(123===e.charCodeAt(t)){var o=xa(e,++t,r,a,e.indexOf("}",t)-t,!0,n,s);if(i=o.code,t=o.pos,++t,null!==i&&i>1114111){if(!n)return{code:null,pos:t};s.invalidCodePoint(t,r,a)}}else{var d=xa(e,t,r,a,4,!1,n,s);i=d.code,t=d.pos}return{code:i,pos:t}}var ja=["consequent","body","alternate"],wa=["leadingComments","trailingComments","innerComments"],Aa=["||","&&","??"],Ca=["++","--"],Sa=[">","<",">=","<="],Ta=["==","===","!=","!=="],ka=[].concat(Ta,["in","instanceof"]),Pa=[].concat(v(ka),Sa),Fa=["-","/","%","*","**","&","|",">>",">>>","<<","^"],Ia=["+"].concat(Fa,v(Pa),["|>"]),_a=["=","+="].concat(v(Fa.map((function(e){return e+"="}))),v(Aa.map((function(e){return e+"="})))),Ba=["delete","!"],Oa=["+","-","~"],Na=["typeof"],Ma=["void","throw"].concat(Ba,Oa,Na),La={optional:["typeAnnotation","typeParameters","returnType"],force:["start","loc","end"]},Ua=Symbol.for("var used to be block scoped"),Ga=Symbol.for("should not be considered a local binding"),Va={},za={},qa={},Wa={},Ha={},Ka={},Xa={};function Ja(e){return Array.isArray(e)?"array":null===e?"null":typeof e}function Ya(e){return{validate:e}}function $a(e){return"string"==typeof e?sn(e):sn.apply(void 0,v(e))}function Qa(e){return Ya($a(e))}function Za(e){return{validate:e,optional:!0}}function en(e){return{validate:$a(e),optional:!0}}function tn(e){return t=$a(e),cn(dn("array"),an(t));var t}function rn(e){return Ya(tn(e))}function an(e){function t(t,r,a){if(Array.isArray(a))for(var n=0;n=2&&"type"in t[0]&&"array"===t[0].type&&!("each"in t[1]))throw new Error('An assertValueType("array") validator can only be followed by an assertEach(...) validator.');return a}var ln=["aliases","builder","deprecatedAlias","fields","inherits","visitor","validate"],pn=["default","optional","deprecated","validate"],fn={};function gn(){for(var e=arguments.length,t=new Array(e),r=0;r0:d&&"object"==typeof d)throw new Error("field defaults can only be primitives or empty arrays currently");a[i]={default:Array.isArray(d)?[]:d,optional:o.optional,deprecated:o.deprecated,validate:o.validate}}for(var u=t.visitor||r.visitor||[],c=t.aliases||r.aliases||[],l=t.builder||r.builder||t.visitor||[],p=0,f=Object.keys(t);p+s+1)throw new TypeError("RestElement must be last element of "+n)}}}),yn("ReturnStatement",{visitor:["argument"],aliases:["Statement","Terminatorless","CompletionStatement"],fields:{argument:{validate:sn("Expression"),optional:!0}}}),yn("SequenceExpression",{visitor:["expressions"],fields:{expressions:{validate:cn(dn("array"),an(sn("Expression")))}},aliases:["Expression"]}),yn("ParenthesizedExpression",{visitor:["expression"],aliases:["Expression","ExpressionWrapper"],fields:{expression:{validate:sn("Expression")}}}),yn("SwitchCase",{visitor:["test","consequent"],fields:{test:{validate:sn("Expression"),optional:!0},consequent:{validate:cn(dn("array"),an(sn("Statement")))}}}),yn("SwitchStatement",{visitor:["discriminant","cases"],aliases:["Statement","BlockParent","Scopable"],fields:{discriminant:{validate:sn("Expression")},cases:{validate:cn(dn("array"),an(sn("SwitchCase")))}}}),yn("ThisExpression",{aliases:["Expression"]}),yn("ThrowStatement",{visitor:["argument"],aliases:["Statement","Terminatorless","CompletionStatement"],fields:{argument:{validate:sn("Expression")}}}),yn("TryStatement",{visitor:["block","handler","finalizer"],aliases:["Statement"],fields:{block:{validate:cn(sn("BlockStatement"),Object.assign((function(e){if(Gr.env.BABEL_TYPES_8_BREAKING&&!e.handler&&!e.finalizer)throw new TypeError("TryStatement expects either a handler or finalizer, or both")}),{oneOfNodeTypes:["BlockStatement"]}))},handler:{optional:!0,validate:sn("CatchClause")},finalizer:{optional:!0,validate:sn("BlockStatement")}}}),yn("UnaryExpression",{builder:["operator","argument","prefix"],fields:{prefix:{default:!0},argument:{validate:sn("Expression")},operator:{validate:nn.apply(void 0,v(Ma))}},visitor:["argument"],aliases:["UnaryLike","Expression"]}),yn("UpdateExpression",{builder:["operator","argument","prefix"],fields:{prefix:{default:!1},argument:{validate:Gr.env.BABEL_TYPES_8_BREAKING?sn("Identifier","MemberExpression"):sn("Expression")},operator:{validate:nn.apply(void 0,v(Ca))}},visitor:["argument"],aliases:["Expression"]}),yn("VariableDeclaration",{builder:["kind","declarations"],visitor:["declarations"],aliases:["Statement","Declaration"],fields:{declare:{validate:dn("boolean"),optional:!0},kind:{validate:nn("var","let","const","using","await using")},declarations:{validate:cn(dn("array"),an(sn("VariableDeclarator")))}},validate:function(e,t,r){if(Gr.env.BABEL_TYPES_8_BREAKING&&Kr("ForXStatement",e,{left:r})&&1!==r.declarations.length)throw new TypeError("Exactly one VariableDeclarator is required in the VariableDeclaration of a "+e.type)}}),yn("VariableDeclarator",{visitor:["id","init"],fields:{id:{validate:function(){if(!Gr.env.BABEL_TYPES_8_BREAKING)return sn("LVal");var e=sn("Identifier","ArrayPattern","ObjectPattern"),t=sn("Identifier");return function(r,a,n){(r.init?e:t)(r,a,n)}}()},definite:{optional:!0,validate:dn("boolean")},init:{optional:!0,validate:sn("Expression")}}}),yn("WhileStatement",{visitor:["test","body"],aliases:["Statement","BlockParent","Loop","While","Scopable"],fields:{test:{validate:sn("Expression")},body:{validate:sn("Statement")}}}),yn("WithStatement",{visitor:["object","body"],aliases:["Statement"],fields:{object:{validate:sn("Expression")},body:{validate:sn("Statement")}}}),yn("AssignmentPattern",{visitor:["left","right","decorators"],builder:["left","right"],aliases:["Pattern","PatternLike","LVal"],fields:Object.assign({},wn(),{left:{validate:sn("Identifier","ObjectPattern","ArrayPattern","MemberExpression","TSAsExpression","TSSatisfiesExpression","TSTypeAssertion","TSNonNullExpression")},right:{validate:sn("Expression")},decorators:{validate:cn(dn("array"),an(sn("Decorator"))),optional:!0}})}),yn("ArrayPattern",{visitor:["elements","typeAnnotation"],builder:["elements"],aliases:["Pattern","PatternLike","LVal"],fields:Object.assign({},wn(),{elements:{validate:cn(dn("array"),an(on("null","PatternLike","LVal")))}})}),yn("ArrowFunctionExpression",{builder:["params","body","async"],visitor:["params","body","returnType","typeParameters"],aliases:["Scopable","Function","BlockParent","FunctionParent","Expression","Pureish"],fields:Object.assign({},mn(),vn(),{expression:{validate:dn("boolean")},body:{validate:sn("BlockStatement","Expression")},predicate:{validate:sn("DeclaredPredicate","InferredPredicate"),optional:!0}})}),yn("ClassBody",{visitor:["body"],fields:{body:{validate:cn(dn("array"),an(sn("ClassMethod","ClassPrivateMethod","ClassProperty","ClassPrivateProperty","ClassAccessorProperty","TSDeclareMethod","TSIndexSignature","StaticBlock")))}}}),yn("ClassExpression",{builder:["id","superClass","body","decorators"],visitor:["id","body","superClass","mixins","typeParameters","superTypeParameters","implements","decorators"],aliases:["Scopable","Class","Expression"],fields:{id:{validate:sn("Identifier"),optional:!0},typeParameters:{validate:sn("TypeParameterDeclaration","TSTypeParameterDeclaration","Noop"),optional:!0},body:{validate:sn("ClassBody")},superClass:{optional:!0,validate:sn("Expression")},superTypeParameters:{validate:sn("TypeParameterInstantiation","TSTypeParameterInstantiation"),optional:!0},implements:{validate:cn(dn("array"),an(sn("TSExpressionWithTypeArguments","ClassImplements"))),optional:!0},decorators:{validate:cn(dn("array"),an(sn("Decorator"))),optional:!0},mixins:{validate:sn("InterfaceExtends"),optional:!0}}}),yn("ClassDeclaration",{inherits:"ClassExpression",aliases:["Scopable","Class","Statement","Declaration"],fields:{id:{validate:sn("Identifier")},typeParameters:{validate:sn("TypeParameterDeclaration","TSTypeParameterDeclaration","Noop"),optional:!0},body:{validate:sn("ClassBody")},superClass:{optional:!0,validate:sn("Expression")},superTypeParameters:{validate:sn("TypeParameterInstantiation","TSTypeParameterInstantiation"),optional:!0},implements:{validate:cn(dn("array"),an(sn("TSExpressionWithTypeArguments","ClassImplements"))),optional:!0},decorators:{validate:cn(dn("array"),an(sn("Decorator"))),optional:!0},mixins:{validate:sn("InterfaceExtends"),optional:!0},declare:{validate:dn("boolean"),optional:!0},abstract:{validate:dn("boolean"),optional:!0}},validate:function(){var e=sn("Identifier");return function(t,r,a){Gr.env.BABEL_TYPES_8_BREAKING&&(Kr("ExportDefaultDeclaration",t)||e(a,"id",a.id))}}()}),yn("ExportAllDeclaration",{builder:["source"],visitor:["source","attributes","assertions"],aliases:["Statement","Declaration","ImportOrExportDeclaration","ExportDeclaration"],fields:{source:{validate:sn("StringLiteral")},exportKind:Za(nn("type","value")),attributes:{optional:!0,validate:cn(dn("array"),an(sn("ImportAttribute")))},assertions:{optional:!0,validate:cn(dn("array"),an(sn("ImportAttribute")))}}}),yn("ExportDefaultDeclaration",{visitor:["declaration"],aliases:["Statement","Declaration","ImportOrExportDeclaration","ExportDeclaration"],fields:{declaration:{validate:sn("TSDeclareFunction","FunctionDeclaration","ClassDeclaration","Expression")},exportKind:Za(nn("value"))}}),yn("ExportNamedDeclaration",{builder:["declaration","specifiers","source"],visitor:["declaration","specifiers","source","attributes","assertions"],aliases:["Statement","Declaration","ImportOrExportDeclaration","ExportDeclaration"],fields:{declaration:{optional:!0,validate:cn(sn("Declaration"),Object.assign((function(e,t,r){if(Gr.env.BABEL_TYPES_8_BREAKING&&r&&e.specifiers.length)throw new TypeError("Only declaration or specifiers is allowed on ExportNamedDeclaration")}),{oneOfNodeTypes:["Declaration"]}),(function(e,t,r){if(Gr.env.BABEL_TYPES_8_BREAKING&&r&&e.source)throw new TypeError("Cannot export a declaration from a source")}))},attributes:{optional:!0,validate:cn(dn("array"),an(sn("ImportAttribute")))},assertions:{optional:!0,validate:cn(dn("array"),an(sn("ImportAttribute")))},specifiers:{default:[],validate:cn(dn("array"),an((Dn=sn("ExportSpecifier","ExportDefaultSpecifier","ExportNamespaceSpecifier"),jn=sn("ExportSpecifier"),Gr.env.BABEL_TYPES_8_BREAKING?function(e,t,r){(e.source?Dn:jn)(e,t,r)}:Dn)))},source:{validate:sn("StringLiteral"),optional:!0},exportKind:Za(nn("type","value"))}}),yn("ExportSpecifier",{visitor:["local","exported"],aliases:["ModuleSpecifier"],fields:{local:{validate:sn("Identifier")},exported:{validate:sn("Identifier","StringLiteral")},exportKind:{validate:nn("type","value"),optional:!0}}}),yn("ForOfStatement",{visitor:["left","right","body"],builder:["left","right","body","await"],aliases:["Scopable","Statement","For","BlockParent","Loop","ForXStatement"],fields:{left:{validate:function(){if(!Gr.env.BABEL_TYPES_8_BREAKING)return sn("VariableDeclaration","LVal");var e=sn("VariableDeclaration"),t=sn("Identifier","MemberExpression","ArrayPattern","ObjectPattern","TSAsExpression","TSSatisfiesExpression","TSTypeAssertion","TSNonNullExpression");return function(r,a,n){Kr("VariableDeclaration",n)?e(r,a,n):t(r,a,n)}}()},right:{validate:sn("Expression")},body:{validate:sn("Statement")},await:{default:!1}}}),yn("ImportDeclaration",{builder:["specifiers","source"],visitor:["specifiers","source","attributes","assertions"],aliases:["Statement","Declaration","ImportOrExportDeclaration"],fields:{attributes:{optional:!0,validate:cn(dn("array"),an(sn("ImportAttribute")))},assertions:{optional:!0,validate:cn(dn("array"),an(sn("ImportAttribute")))},module:{optional:!0,validate:dn("boolean")},specifiers:{validate:cn(dn("array"),an(sn("ImportSpecifier","ImportDefaultSpecifier","ImportNamespaceSpecifier")))},source:{validate:sn("StringLiteral")},importKind:{validate:nn("type","typeof","value"),optional:!0}}}),yn("ImportDefaultSpecifier",{visitor:["local"],aliases:["ModuleSpecifier"],fields:{local:{validate:sn("Identifier")}}}),yn("ImportNamespaceSpecifier",{visitor:["local"],aliases:["ModuleSpecifier"],fields:{local:{validate:sn("Identifier")}}}),yn("ImportSpecifier",{visitor:["local","imported"],aliases:["ModuleSpecifier"],fields:{local:{validate:sn("Identifier")},imported:{validate:sn("Identifier","StringLiteral")},importKind:{validate:nn("type","typeof","value"),optional:!0}}}),yn("MetaProperty",{visitor:["meta","property"],aliases:["Expression"],fields:{meta:{validate:cn(sn("Identifier"),Object.assign((function(e,t,r){if(Gr.env.BABEL_TYPES_8_BREAKING){var a;switch(r.name){case"function":a="sent";break;case"new":a="target";break;case"import":a="meta"}if(!Kr("Identifier",e.property,{name:a}))throw new TypeError("Unrecognised MetaProperty")}}),{oneOfNodeTypes:["Identifier"]}))},property:{validate:sn("Identifier")}}});var An=function(){return{abstract:{validate:dn("boolean"),optional:!0},accessibility:{validate:nn("public","private","protected"),optional:!0},static:{default:!1},override:{default:!1},computed:{default:!1},optional:{validate:dn("boolean"),optional:!0},key:{validate:cn(function(){var e=sn("Identifier","StringLiteral","NumericLiteral"),t=sn("Expression");return function(r,a,n){(r.computed?t:e)(r,a,n)}}(),sn("Identifier","StringLiteral","NumericLiteral","BigIntLiteral","Expression"))}}},Cn=function(){return Object.assign({},mn(),An(),{params:{validate:cn(dn("array"),an(sn("Identifier","Pattern","RestElement","TSParameterProperty")))},kind:{validate:nn("get","set","method","constructor"),default:"method"},access:{validate:cn(dn("string"),nn("public","private","protected")),optional:!0},decorators:{validate:cn(dn("array"),an(sn("Decorator"))),optional:!0}})};yn("ClassMethod",{aliases:["Function","Scopable","BlockParent","FunctionParent","Method"],builder:["kind","key","params","body","computed","static","generator","async"],visitor:["key","params","body","decorators","returnType","typeParameters"],fields:Object.assign({},Cn(),vn(),{body:{validate:sn("BlockStatement")}})}),yn("ObjectPattern",{visitor:["properties","typeAnnotation","decorators"],builder:["properties"],aliases:["Pattern","PatternLike","LVal"],fields:Object.assign({},wn(),{properties:{validate:cn(dn("array"),an(sn("RestElement","ObjectProperty")))}})}),yn("SpreadElement",{visitor:["argument"],aliases:["UnaryLike"],deprecatedAlias:"SpreadProperty",fields:{argument:{validate:sn("Expression")}}}),yn("Super",{aliases:["Expression"]}),yn("TaggedTemplateExpression",{visitor:["tag","quasi","typeParameters"],builder:["tag","quasi"],aliases:["Expression"],fields:{tag:{validate:sn("Expression")},quasi:{validate:sn("TemplateLiteral")},typeParameters:{validate:sn("TypeParameterInstantiation","TSTypeParameterInstantiation"),optional:!0}}}),yn("TemplateElement",{builder:["value","tail"],fields:{value:{validate:cn(function(e){function t(t,r,a){for(var n=[],s=0,i=Object.keys(e);s=0)){if(He(o))return[o];if(dr(o))a.set(o.type,o);else if(it(o))n.has(o.types)||(t.push.apply(t,v(o.types)),n.add(o.types));else if(Ye(o)){var d=Xu(o.id);if(r.has(d)){var u,c=r.get(d);if(c.typeParameters){if(o.typeParameters)(u=c.typeParameters.params).push.apply(u,v(o.typeParameters.params)),c.typeParameters.params=Ju(c.typeParameters.params)}else c=o.typeParameters}else r.set(d,o)}else s.push(o)}}for(var l,p=x(a);!(l=p()).done;){var f=m(l.value,2)[1];s.push(f)}for(var g,h=x(r);!(g=h()).done;){var y=m(g.value,2)[1];s.push(y)}return s}function Yu(e){var t=Ju(e);return 1===t.length?t[0]:Io(t)}function $u(e){return G(e)?e.name:e.right.name+"."+$u(e.left)}function Qu(e){for(var t=Array.from(e),r=new Map,a=new Map,n=new Set,s=[],i=0;i=0)){if(wt(o))return[o];if(ur(o))a.set(o.type,o);else if(kt(o))n.has(o.types)||(t.push.apply(t,v(o.types)),n.add(o.types));else if(At(o)&&o.typeParameters){var d=$u(o.typeName);if(r.has(d)){var u,c=r.get(d);if(c.typeParameters){if(o.typeParameters)(u=c.typeParameters.params).push.apply(u,v(o.typeParameters.params)),c.typeParameters.params=Qu(c.typeParameters.params)}else c=o.typeParameters}else r.set(d,o)}else s.push(o)}}for(var l,p=x(a);!(l=p()).done;){var f=m(l.value,2)[1];s.push(f)}for(var g,h=x(r);!(g=h()).done;){var y=m(g.value,2)[1];s.push(y)}return s}function Zu(e){var t=e.map((function(e){return Ut(e)?e.typeAnnotation:e})),r=Qu(t);return 1===r.length?r[0]:su(r)}var ec=Function.call.bind(Object.prototype.hasOwnProperty);function tc(e,t,r,a){return e&&"string"==typeof e.type?nc(e,t,r,a):e}function rc(e,t,r,a){return Array.isArray(e)?e.map((function(e){return tc(e,t,r,a)})):tc(e,t,r,a)}function ac(e,t,r){return void 0===t&&(t=!0),void 0===r&&(r=!1),nc(e,t,r,new Map)}function nc(e,t,r,a){if(void 0===t&&(t=!0),void 0===r&&(r=!1),!e)return e;var n=e.type,s={type:e.type};if(G(e))s.name=e.name,ec(e,"optional")&&"boolean"==typeof e.optional&&(s.optional=e.optional),ec(e,"typeAnnotation")&&(s.typeAnnotation=t?rc(e.typeAnnotation,!0,r,a):e.typeAnnotation);else{if(!ec(Wa,n))throw new Error('Unknown node type: "'+n+'"');for(var i=0,o=Object.keys(Wa[n]);i=Number.MAX_SAFE_INTEGER?xl.uid=0:xl.uid++},El.keys={DeclareClass:["id"],DeclareFunction:["id"],DeclareModule:["id"],DeclareVariable:["id"],DeclareInterface:["id"],DeclareTypeAlias:["id"],DeclareOpaqueType:["id"],InterfaceDeclaration:["id"],TypeAlias:["id"],OpaqueType:["id"],CatchClause:["param"],LabeledStatement:["label"],UnaryExpression:["argument"],AssignmentExpression:["left"],ImportSpecifier:["local"],ImportNamespaceSpecifier:["local"],ImportDefaultSpecifier:["local"],ImportDeclaration:["specifiers"],ExportSpecifier:["exported"],ExportNamespaceSpecifier:["exported"],ExportDefaultSpecifier:["exported"],FunctionDeclaration:["id","params"],FunctionExpression:["id","params"],ArrowFunctionExpression:["params"],ObjectMethod:["params"],ClassMethod:["params"],ClassPrivateMethod:["params"],ForInStatement:["left"],ForOfStatement:["left"],ClassDeclaration:["id"],ClassExpression:["id"],RestElement:["argument"],UpdateExpression:["argument"],ObjectProperty:["value"],AssignmentPattern:["left"],ArrayPattern:["elements"],ObjectPattern:["properties"],VariableDeclaration:["declarations"],VariableDeclarator:["id"]};var Al=Function.call.bind(Object.prototype.toString);function Cl(e){if(void 0===e)return Ds("undefined");if(!0===e||!1===e)return Ts(e);if(null===e)return{type:"NullLiteral"};if("string"==typeof e)return As(e);if("number"==typeof e){var t;if(Number.isFinite(e))t=Cs(Math.abs(e));else t=ns("/",Number.isNaN(e)?Cs(0):Cs(1),Cs(0));return(e<0||Object.is(e,-0))&&(t=Ks("-",t)),t}if(function(e){return"[object RegExp]"===Al(e)}(e))return ks(e.source,e.toString().match(/\/([a-z]+|)$/)[1]);if(Array.isArray(e))return rs(e.map(Cl));if(function(e){if("object"!=typeof e||null===e||"[object Object]"!==Object.prototype.toString.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||null===Object.getPrototypeOf(t)}(e)){for(var r=[],a=0,n=Object.keys(e);a=0)return!0}else if(s===e)return!0}return!1}function Il(e){return ce(e)&&("var"!==e.kind||e[Ua])}function _l(e){return L(e)||ve(e)||Il(e)}function Bl(e,t,r){switch(t.type){case"MemberExpression":case"OptionalMemberExpression":return t.property===e?!!t.computed:t.object===e;case"JSXMemberExpression":return t.object===e;case"VariableDeclarator":return t.init===e;case"ArrowFunctionExpression":return t.body===e;case"PrivateName":case"LabeledStatement":case"CatchClause":case"RestElement":case"BreakStatement":case"ContinueStatement":case"FunctionDeclaration":case"FunctionExpression":case"ExportNamespaceSpecifier":case"ExportDefaultSpecifier":case"ImportDefaultSpecifier":case"ImportNamespaceSpecifier":case"ImportSpecifier":case"ImportAttribute":case"JSXAttribute":case"ObjectPattern":case"ArrayPattern":case"MetaProperty":return!1;case"ClassMethod":case"ClassPrivateMethod":case"ObjectMethod":return t.key===e&&!!t.computed;case"ObjectProperty":return t.key===e?!!t.computed:!r||"ObjectPattern"!==r.type;case"ClassProperty":case"ClassAccessorProperty":case"TSPropertySignature":return t.key!==e||!!t.computed;case"ClassPrivateProperty":case"ObjectTypeProperty":return t.key!==e;case"ClassDeclaration":case"ClassExpression":return t.superClass===e;case"AssignmentExpression":case"AssignmentPattern":return t.right===e;case"ExportSpecifier":return(null==r||!r.source)&&t.local===e;case"TSEnumMember":return t.id!==e}return!0}function Ol(e,t){return(!k(e)||!Xt(t)&&!F(t))&&(!(!tr(e)||!Xt(t)&&!F(t))||zt(e))}var Nl=new Set(["abstract","boolean","byte","char","double","enum","final","float","goto","implements","int","interface","long","native","package","private","protected","public","short","static","synchronized","throws","transient","volatile"]);function Ml(e){return ga(e)&&!Nl.has(e)}function Ll(e){return ce(e,{kind:"var"})&&!e[Ua]}var Ul={isReactComponent:pr,isCompatTag:function(e){return!!e&&/^[a-z]/.test(e)},buildChildren:function(e){for(var t=[],r=0;r=1.5*r;return Math.round(e/r)+" "+a+(n?"s":"")}return dp=function(o,d){d=d||{};var u=typeof o;if("string"===u&&o.length>0)return function(i){if((i=String(i)).length>100)return;var o=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(i);if(!o)return;var d=parseFloat(o[1]);switch((o[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return d*s;case"weeks":case"week":case"w":return d*n;case"days":case"day":case"d":return d*a;case"hours":case"hour":case"hrs":case"hr":case"h":return d*r;case"minutes":case"minute":case"mins":case"min":case"m":return d*t;case"seconds":case"second":case"secs":case"sec":case"s":return d*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return d;default:return}}(o);if("number"===u&&isFinite(o))return d.long?function(n){var s=Math.abs(n);if(s>=a)return i(n,s,a,"day");if(s>=r)return i(n,s,r,"hour");if(s>=t)return i(n,s,t,"minute");if(s>=e)return i(n,s,e,"second");return n+" ms"}(o):function(n){var s=Math.abs(n);if(s>=a)return Math.round(n/a)+"d";if(s>=r)return Math.round(n/r)+"h";if(s>=t)return Math.round(n/t)+"m";if(s>=e)return Math.round(n/e)+"s";return n+"ms"}(o);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(o))},dp}var fp=function(e){function t(e){var a,n,s,i=null;function o(){for(var e=arguments.length,r=new Array(e),n=0;n=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(r=!1,function(){r||(r=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||function(){},e.exports=fp(t),e.exports.formatters.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(lp,lp.exports);var gp=lp.exports,hp=ac,yp=oi,mp=di,vp=Ds,bp=Js,Rp=Ys;function xp(e){if(!e.isExportDeclaration()||e.isExportAllDeclaration())throw new Error("Only default and named export declarations can be split.");if(e.isExportDefaultDeclaration()){var t=e.get("declaration"),r=t.isFunctionDeclaration()||t.isClassDeclaration(),a=t.isScope()?t.scope.parent:t.scope,n=t.node.id,s=!1;n||(s=!0,n=a.generateUidIdentifier("default"),(r||t.isFunctionExpression()||t.isClassExpression())&&(t.node.id=hp(n)));var i=r?t.node:bp("var",[Rp(hp(n),t.node)]),o=yp(null,[mp(hp(n),vp("default"))]);return e.insertAfter(o),e.replaceWith(i),s&&a.registerDeclaration(e),e}if(e.get("specifiers").length>0)throw new Error("It doesn't make sense to split exported specifiers.");var d=e.get("declaration"),u=d.getOuterBindingIdentifiers(),c=Object.keys(u).map((function(e){return mp(vp(e),vp(e))})),l=yp(null,c);return e.insertAfter(l),e.replaceWith(d.node),e}function Ep(e){var t=e.context,r=e.node;if(r.computed&&t.maybeQueue(e.get("key")),r.decorators)for(var a,n=x(e.get("decorators"));!(a=n()).done;){var s=a.value;t.maybeQueue(s)}}var Dp={FunctionParent:function(e){e.isArrowFunctionExpression()||(e.skip(),e.isMethod()&&Ep(e))},Property:function(e){e.isObjectProperty()||(e.skip(),Ep(e))}},jp={ReferencedIdentifier:function(e,t){var r=e.node;r.name===t.oldName&&(r.name=t.newName)},Scope:function(e,t){e.scope.bindingIdentifierEquals(t.oldName,t.binding.identifier)||(e.skip(),e.isMethod()&&Ep(e))},ObjectProperty:function(e,t){var r,a=e.node,n=e.scope,s=a.key.name;!a.shorthand||s!==t.oldName&&s!==t.newName||n.getBindingIdentifier(s)!==t.binding.identifier||(a.shorthand=!1,null!=(r=a.extra)&&r.shorthand&&(a.extra.shorthand=!1))},"AssignmentExpression|Declaration|VariableDeclarator":function(e,t){if(!e.isVariableDeclaration()){var r=e.getOuterBindingIdentifiers();for(var a in r)a===t.oldName&&(r[a].name=t.newName)}}},wp=function(){function e(e,t,r){this.newName=r,this.oldName=t,this.binding=e}var t=e.prototype;return t.maybeConvertFromExportDeclaration=function(e){var t=e.parentPath;if(t.isExportDeclaration()){if(t.isExportDefaultDeclaration()){var r=t.node.declaration;if(Yt(r)&&!r.id)return}t.isExportAllDeclaration()||xp(t)}},t.maybeConvertFromClassFunctionDeclaration=function(e){return e},t.maybeConvertFromClassFunctionExpression=function(e){return e},t.rename=function(){var e=this.binding,t=this.oldName,r=this.newName,a=e.scope,n=e.path,s=n.find((function(e){return e.isDeclaration()||e.isFunctionExpression()||e.isClassExpression()}));if(s){var i=s.getOuterBindingIdentifiers();i[t]===e.identifier&&this.maybeConvertFromExportDeclaration(s)}var o=arguments[0]||a.block;EC(o,Xl(jp),a,this,a.path,{discriminant:!0}),arguments[0]||(a.removeOwnBinding(t),a.bindings[r]=e,this.binding.identifier.name=r),s&&(this.maybeConvertFromClassFunctionDeclaration(n),this.maybeConvertFromClassFunctionExpression(n))},i(e)}(),Ap=function(){function e(e){var t=e.identifier,r=e.scope,a=e.path,n=e.kind;this.identifier=void 0,this.scope=void 0,this.path=void 0,this.kind=void 0,this.constantViolations=[],this.constant=!0,this.referencePaths=[],this.referenced=!1,this.references=0,this.identifier=t,this.scope=r,this.path=a,this.kind=n,"var"!==n&&"hoisted"!==n||!function(e){for(var t=e.parentPath,r=e.key;t;t=(a=t).parentPath,r=a.key,a){var a;if(t.isFunctionParent())return!1;if(t.isWhile()||t.isForXStatement()||t.isForStatement()&&"body"===r)return!0}return!1}(a||function(){throw new Error("Internal Babel error: unreachable ")}())||this.reassign(a),this.clearValue()}var t=e.prototype;return t.deoptValue=function(){this.clearValue(),this.hasDeoptedValue=!0},t.setValue=function(e){this.hasDeoptedValue||(this.hasValue=!0,this.value=e)},t.clearValue=function(){this.hasDeoptedValue=!1,this.hasValue=!1,this.value=null},t.reassign=function(e){this.constant=!1,-1===this.constantViolations.indexOf(e)&&this.constantViolations.push(e)},t.reference=function(e){-1===this.referencePaths.indexOf(e)&&(this.referenced=!0,this.references++,this.referencePaths.push(e))},t.dereference=function(){this.references--,this.referenced=!!this.references},i(e)}();var Cp,Sp,Tp={builtin:{Array:!1,ArrayBuffer:!1,Atomics:!1,BigInt:!1,BigInt64Array:!1,BigUint64Array:!1,Boolean:!1,constructor:!1,DataView:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,escape:!1,eval:!1,EvalError:!1,FinalizationRegistry:!1,Float32Array:!1,Float64Array:!1,Function:!1,globalThis:!1,hasOwnProperty:!1,Infinity:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,isFinite:!1,isNaN:!1,isPrototypeOf:!1,JSON:!1,Map:!1,Math:!1,NaN:!1,Number:!1,Object:!1,parseFloat:!1,parseInt:!1,Promise:!1,propertyIsEnumerable:!1,Proxy:!1,RangeError:!1,ReferenceError:!1,Reflect:!1,RegExp:!1,Set:!1,SharedArrayBuffer:!1,String:!1,Symbol:!1,SyntaxError:!1,toLocaleString:!1,toString:!1,TypeError:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1,undefined:!1,unescape:!1,URIError:!1,valueOf:!1,WeakMap:!1,WeakRef:!1,WeakSet:!1},es5:{Array:!1,Boolean:!1,constructor:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,escape:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,Infinity:!1,isFinite:!1,isNaN:!1,isPrototypeOf:!1,JSON:!1,Math:!1,NaN:!1,Number:!1,Object:!1,parseFloat:!1,parseInt:!1,propertyIsEnumerable:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,toLocaleString:!1,toString:!1,TypeError:!1,undefined:!1,unescape:!1,URIError:!1,valueOf:!1},es2015:{Array:!1,ArrayBuffer:!1,Boolean:!1,constructor:!1,DataView:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,escape:!1,eval:!1,EvalError:!1,Float32Array:!1,Float64Array:!1,Function:!1,hasOwnProperty:!1,Infinity:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,isFinite:!1,isNaN:!1,isPrototypeOf:!1,JSON:!1,Map:!1,Math:!1,NaN:!1,Number:!1,Object:!1,parseFloat:!1,parseInt:!1,Promise:!1,propertyIsEnumerable:!1,Proxy:!1,RangeError:!1,ReferenceError:!1,Reflect:!1,RegExp:!1,Set:!1,String:!1,Symbol:!1,SyntaxError:!1,toLocaleString:!1,toString:!1,TypeError:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1,undefined:!1,unescape:!1,URIError:!1,valueOf:!1,WeakMap:!1,WeakSet:!1},es2017:{Array:!1,ArrayBuffer:!1,Atomics:!1,Boolean:!1,constructor:!1,DataView:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,escape:!1,eval:!1,EvalError:!1,Float32Array:!1,Float64Array:!1,Function:!1,hasOwnProperty:!1,Infinity:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,isFinite:!1,isNaN:!1,isPrototypeOf:!1,JSON:!1,Map:!1,Math:!1,NaN:!1,Number:!1,Object:!1,parseFloat:!1,parseInt:!1,Promise:!1,propertyIsEnumerable:!1,Proxy:!1,RangeError:!1,ReferenceError:!1,Reflect:!1,RegExp:!1,Set:!1,SharedArrayBuffer:!1,String:!1,Symbol:!1,SyntaxError:!1,toLocaleString:!1,toString:!1,TypeError:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1,undefined:!1,unescape:!1,URIError:!1,valueOf:!1,WeakMap:!1,WeakSet:!1},es2020:{Array:!1,ArrayBuffer:!1,Atomics:!1,BigInt:!1,BigInt64Array:!1,BigUint64Array:!1,Boolean:!1,constructor:!1,DataView:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,escape:!1,eval:!1,EvalError:!1,Float32Array:!1,Float64Array:!1,Function:!1,globalThis:!1,hasOwnProperty:!1,Infinity:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,isFinite:!1,isNaN:!1,isPrototypeOf:!1,JSON:!1,Map:!1,Math:!1,NaN:!1,Number:!1,Object:!1,parseFloat:!1,parseInt:!1,Promise:!1,propertyIsEnumerable:!1,Proxy:!1,RangeError:!1,ReferenceError:!1,Reflect:!1,RegExp:!1,Set:!1,SharedArrayBuffer:!1,String:!1,Symbol:!1,SyntaxError:!1,toLocaleString:!1,toString:!1,TypeError:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1,undefined:!1,unescape:!1,URIError:!1,valueOf:!1,WeakMap:!1,WeakSet:!1},es2021:{Array:!1,ArrayBuffer:!1,Atomics:!1,BigInt:!1,BigInt64Array:!1,BigUint64Array:!1,Boolean:!1,constructor:!1,DataView:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,escape:!1,eval:!1,EvalError:!1,FinalizationRegistry:!1,Float32Array:!1,Float64Array:!1,Function:!1,globalThis:!1,hasOwnProperty:!1,Infinity:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,isFinite:!1,isNaN:!1,isPrototypeOf:!1,JSON:!1,Map:!1,Math:!1,NaN:!1,Number:!1,Object:!1,parseFloat:!1,parseInt:!1,Promise:!1,propertyIsEnumerable:!1,Proxy:!1,RangeError:!1,ReferenceError:!1,Reflect:!1,RegExp:!1,Set:!1,SharedArrayBuffer:!1,String:!1,Symbol:!1,SyntaxError:!1,toLocaleString:!1,toString:!1,TypeError:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1,undefined:!1,unescape:!1,URIError:!1,valueOf:!1,WeakMap:!1,WeakRef:!1,WeakSet:!1},browser:{AbortController:!1,AbortSignal:!1,addEventListener:!1,alert:!1,AnalyserNode:!1,Animation:!1,AnimationEffectReadOnly:!1,AnimationEffectTiming:!1,AnimationEffectTimingReadOnly:!1,AnimationEvent:!1,AnimationPlaybackEvent:!1,AnimationTimeline:!1,applicationCache:!1,ApplicationCache:!1,ApplicationCacheErrorEvent:!1,atob:!1,Attr:!1,Audio:!1,AudioBuffer:!1,AudioBufferSourceNode:!1,AudioContext:!1,AudioDestinationNode:!1,AudioListener:!1,AudioNode:!1,AudioParam:!1,AudioProcessingEvent:!1,AudioScheduledSourceNode:!1,"AudioWorkletGlobalScope ":!1,AudioWorkletNode:!1,AudioWorkletProcessor:!1,BarProp:!1,BaseAudioContext:!1,BatteryManager:!1,BeforeUnloadEvent:!1,BiquadFilterNode:!1,Blob:!1,BlobEvent:!1,blur:!1,BroadcastChannel:!1,btoa:!1,BudgetService:!1,ByteLengthQueuingStrategy:!1,Cache:!1,caches:!1,CacheStorage:!1,cancelAnimationFrame:!1,cancelIdleCallback:!1,CanvasCaptureMediaStreamTrack:!1,CanvasGradient:!1,CanvasPattern:!1,CanvasRenderingContext2D:!1,ChannelMergerNode:!1,ChannelSplitterNode:!1,CharacterData:!1,clearInterval:!1,clearTimeout:!1,clientInformation:!1,ClipboardEvent:!1,close:!1,closed:!1,CloseEvent:!1,Comment:!1,CompositionEvent:!1,confirm:!1,console:!1,ConstantSourceNode:!1,ConvolverNode:!1,CountQueuingStrategy:!1,createImageBitmap:!1,Credential:!1,CredentialsContainer:!1,crypto:!1,Crypto:!1,CryptoKey:!1,CSS:!1,CSSConditionRule:!1,CSSFontFaceRule:!1,CSSGroupingRule:!1,CSSImportRule:!1,CSSKeyframeRule:!1,CSSKeyframesRule:!1,CSSMediaRule:!1,CSSNamespaceRule:!1,CSSPageRule:!1,CSSRule:!1,CSSRuleList:!1,CSSStyleDeclaration:!1,CSSStyleRule:!1,CSSStyleSheet:!1,CSSSupportsRule:!1,CustomElementRegistry:!1,customElements:!1,CustomEvent:!1,DataTransfer:!1,DataTransferItem:!1,DataTransferItemList:!1,defaultstatus:!1,defaultStatus:!1,DelayNode:!1,DeviceMotionEvent:!1,DeviceOrientationEvent:!1,devicePixelRatio:!1,dispatchEvent:!1,document:!1,Document:!1,DocumentFragment:!1,DocumentType:!1,DOMError:!1,DOMException:!1,DOMImplementation:!1,DOMMatrix:!1,DOMMatrixReadOnly:!1,DOMParser:!1,DOMPoint:!1,DOMPointReadOnly:!1,DOMQuad:!1,DOMRect:!1,DOMRectReadOnly:!1,DOMStringList:!1,DOMStringMap:!1,DOMTokenList:!1,DragEvent:!1,DynamicsCompressorNode:!1,Element:!1,ErrorEvent:!1,event:!1,Event:!1,EventSource:!1,EventTarget:!1,external:!1,fetch:!1,File:!1,FileList:!1,FileReader:!1,find:!1,focus:!1,FocusEvent:!1,FontFace:!1,FontFaceSetLoadEvent:!1,FormData:!1,frameElement:!1,frames:!1,GainNode:!1,Gamepad:!1,GamepadButton:!1,GamepadEvent:!1,getComputedStyle:!1,getSelection:!1,HashChangeEvent:!1,Headers:!1,history:!1,History:!1,HTMLAllCollection:!1,HTMLAnchorElement:!1,HTMLAreaElement:!1,HTMLAudioElement:!1,HTMLBaseElement:!1,HTMLBodyElement:!1,HTMLBRElement:!1,HTMLButtonElement:!1,HTMLCanvasElement:!1,HTMLCollection:!1,HTMLContentElement:!1,HTMLDataElement:!1,HTMLDataListElement:!1,HTMLDetailsElement:!1,HTMLDialogElement:!1,HTMLDirectoryElement:!1,HTMLDivElement:!1,HTMLDListElement:!1,HTMLDocument:!1,HTMLElement:!1,HTMLEmbedElement:!1,HTMLFieldSetElement:!1,HTMLFontElement:!1,HTMLFormControlsCollection:!1,HTMLFormElement:!1,HTMLFrameElement:!1,HTMLFrameSetElement:!1,HTMLHeadElement:!1,HTMLHeadingElement:!1,HTMLHRElement:!1,HTMLHtmlElement:!1,HTMLIFrameElement:!1,HTMLImageElement:!1,HTMLInputElement:!1,HTMLLabelElement:!1,HTMLLegendElement:!1,HTMLLIElement:!1,HTMLLinkElement:!1,HTMLMapElement:!1,HTMLMarqueeElement:!1,HTMLMediaElement:!1,HTMLMenuElement:!1,HTMLMetaElement:!1,HTMLMeterElement:!1,HTMLModElement:!1,HTMLObjectElement:!1,HTMLOListElement:!1,HTMLOptGroupElement:!1,HTMLOptionElement:!1,HTMLOptionsCollection:!1,HTMLOutputElement:!1,HTMLParagraphElement:!1,HTMLParamElement:!1,HTMLPictureElement:!1,HTMLPreElement:!1,HTMLProgressElement:!1,HTMLQuoteElement:!1,HTMLScriptElement:!1,HTMLSelectElement:!1,HTMLShadowElement:!1,HTMLSlotElement:!1,HTMLSourceElement:!1,HTMLSpanElement:!1,HTMLStyleElement:!1,HTMLTableCaptionElement:!1,HTMLTableCellElement:!1,HTMLTableColElement:!1,HTMLTableElement:!1,HTMLTableRowElement:!1,HTMLTableSectionElement:!1,HTMLTemplateElement:!1,HTMLTextAreaElement:!1,HTMLTimeElement:!1,HTMLTitleElement:!1,HTMLTrackElement:!1,HTMLUListElement:!1,HTMLUnknownElement:!1,HTMLVideoElement:!1,IDBCursor:!1,IDBCursorWithValue:!1,IDBDatabase:!1,IDBFactory:!1,IDBIndex:!1,IDBKeyRange:!1,IDBObjectStore:!1,IDBOpenDBRequest:!1,IDBRequest:!1,IDBTransaction:!1,IDBVersionChangeEvent:!1,IdleDeadline:!1,IIRFilterNode:!1,Image:!1,ImageBitmap:!1,ImageBitmapRenderingContext:!1,ImageCapture:!1,ImageData:!1,indexedDB:!1,innerHeight:!1,innerWidth:!1,InputEvent:!1,IntersectionObserver:!1,IntersectionObserverEntry:!1,Intl:!1,isSecureContext:!1,KeyboardEvent:!1,KeyframeEffect:!1,KeyframeEffectReadOnly:!1,length:!1,localStorage:!1,location:!0,Location:!1,locationbar:!1,matchMedia:!1,MediaDeviceInfo:!1,MediaDevices:!1,MediaElementAudioSourceNode:!1,MediaEncryptedEvent:!1,MediaError:!1,MediaKeyMessageEvent:!1,MediaKeySession:!1,MediaKeyStatusMap:!1,MediaKeySystemAccess:!1,MediaList:!1,MediaQueryList:!1,MediaQueryListEvent:!1,MediaRecorder:!1,MediaSettingsRange:!1,MediaSource:!1,MediaStream:!1,MediaStreamAudioDestinationNode:!1,MediaStreamAudioSourceNode:!1,MediaStreamEvent:!1,MediaStreamTrack:!1,MediaStreamTrackEvent:!1,menubar:!1,MessageChannel:!1,MessageEvent:!1,MessagePort:!1,MIDIAccess:!1,MIDIConnectionEvent:!1,MIDIInput:!1,MIDIInputMap:!1,MIDIMessageEvent:!1,MIDIOutput:!1,MIDIOutputMap:!1,MIDIPort:!1,MimeType:!1,MimeTypeArray:!1,MouseEvent:!1,moveBy:!1,moveTo:!1,MutationEvent:!1,MutationObserver:!1,MutationRecord:!1,name:!1,NamedNodeMap:!1,NavigationPreloadManager:!1,navigator:!1,Navigator:!1,NetworkInformation:!1,Node:!1,NodeFilter:!1,NodeIterator:!1,NodeList:!1,Notification:!1,OfflineAudioCompletionEvent:!1,OfflineAudioContext:!1,offscreenBuffering:!1,OffscreenCanvas:!0,OffscreenCanvasRenderingContext2D:!1,onabort:!0,onafterprint:!0,onanimationend:!0,onanimationiteration:!0,onanimationstart:!0,onappinstalled:!0,onauxclick:!0,onbeforeinstallprompt:!0,onbeforeprint:!0,onbeforeunload:!0,onblur:!0,oncancel:!0,oncanplay:!0,oncanplaythrough:!0,onchange:!0,onclick:!0,onclose:!0,oncontextmenu:!0,oncuechange:!0,ondblclick:!0,ondevicemotion:!0,ondeviceorientation:!0,ondeviceorientationabsolute:!0,ondrag:!0,ondragend:!0,ondragenter:!0,ondragleave:!0,ondragover:!0,ondragstart:!0,ondrop:!0,ondurationchange:!0,onemptied:!0,onended:!0,onerror:!0,onfocus:!0,ongotpointercapture:!0,onhashchange:!0,oninput:!0,oninvalid:!0,onkeydown:!0,onkeypress:!0,onkeyup:!0,onlanguagechange:!0,onload:!0,onloadeddata:!0,onloadedmetadata:!0,onloadstart:!0,onlostpointercapture:!0,onmessage:!0,onmessageerror:!0,onmousedown:!0,onmouseenter:!0,onmouseleave:!0,onmousemove:!0,onmouseout:!0,onmouseover:!0,onmouseup:!0,onmousewheel:!0,onoffline:!0,ononline:!0,onpagehide:!0,onpageshow:!0,onpause:!0,onplay:!0,onplaying:!0,onpointercancel:!0,onpointerdown:!0,onpointerenter:!0,onpointerleave:!0,onpointermove:!0,onpointerout:!0,onpointerover:!0,onpointerup:!0,onpopstate:!0,onprogress:!0,onratechange:!0,onrejectionhandled:!0,onreset:!0,onresize:!0,onscroll:!0,onsearch:!0,onseeked:!0,onseeking:!0,onselect:!0,onstalled:!0,onstorage:!0,onsubmit:!0,onsuspend:!0,ontimeupdate:!0,ontoggle:!0,ontransitionend:!0,onunhandledrejection:!0,onunload:!0,onvolumechange:!0,onwaiting:!0,onwheel:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,origin:!1,OscillatorNode:!1,outerHeight:!1,outerWidth:!1,PageTransitionEvent:!1,pageXOffset:!1,pageYOffset:!1,PannerNode:!1,parent:!1,Path2D:!1,PaymentAddress:!1,PaymentRequest:!1,PaymentRequestUpdateEvent:!1,PaymentResponse:!1,performance:!1,Performance:!1,PerformanceEntry:!1,PerformanceLongTaskTiming:!1,PerformanceMark:!1,PerformanceMeasure:!1,PerformanceNavigation:!1,PerformanceNavigationTiming:!1,PerformanceObserver:!1,PerformanceObserverEntryList:!1,PerformancePaintTiming:!1,PerformanceResourceTiming:!1,PerformanceTiming:!1,PeriodicWave:!1,Permissions:!1,PermissionStatus:!1,personalbar:!1,PhotoCapabilities:!1,Plugin:!1,PluginArray:!1,PointerEvent:!1,PopStateEvent:!1,postMessage:!1,Presentation:!1,PresentationAvailability:!1,PresentationConnection:!1,PresentationConnectionAvailableEvent:!1,PresentationConnectionCloseEvent:!1,PresentationConnectionList:!1,PresentationReceiver:!1,PresentationRequest:!1,print:!1,ProcessingInstruction:!1,ProgressEvent:!1,PromiseRejectionEvent:!1,prompt:!1,PushManager:!1,PushSubscription:!1,PushSubscriptionOptions:!1,queueMicrotask:!1,RadioNodeList:!1,Range:!1,ReadableStream:!1,registerProcessor:!1,RemotePlayback:!1,removeEventListener:!1,Request:!1,requestAnimationFrame:!1,requestIdleCallback:!1,resizeBy:!1,ResizeObserver:!1,ResizeObserverEntry:!1,resizeTo:!1,Response:!1,RTCCertificate:!1,RTCDataChannel:!1,RTCDataChannelEvent:!1,RTCDtlsTransport:!1,RTCIceCandidate:!1,RTCIceGatherer:!1,RTCIceTransport:!1,RTCPeerConnection:!1,RTCPeerConnectionIceEvent:!1,RTCRtpContributingSource:!1,RTCRtpReceiver:!1,RTCRtpSender:!1,RTCSctpTransport:!1,RTCSessionDescription:!1,RTCStatsReport:!1,RTCTrackEvent:!1,screen:!1,Screen:!1,screenLeft:!1,ScreenOrientation:!1,screenTop:!1,screenX:!1,screenY:!1,ScriptProcessorNode:!1,scroll:!1,scrollbars:!1,scrollBy:!1,scrollTo:!1,scrollX:!1,scrollY:!1,SecurityPolicyViolationEvent:!1,Selection:!1,self:!1,ServiceWorker:!1,ServiceWorkerContainer:!1,ServiceWorkerRegistration:!1,sessionStorage:!1,setInterval:!1,setTimeout:!1,ShadowRoot:!1,SharedWorker:!1,SourceBuffer:!1,SourceBufferList:!1,speechSynthesis:!1,SpeechSynthesisEvent:!1,SpeechSynthesisUtterance:!1,StaticRange:!1,status:!1,statusbar:!1,StereoPannerNode:!1,stop:!1,Storage:!1,StorageEvent:!1,StorageManager:!1,styleMedia:!1,StyleSheet:!1,StyleSheetList:!1,SubtleCrypto:!1,SVGAElement:!1,SVGAngle:!1,SVGAnimatedAngle:!1,SVGAnimatedBoolean:!1,SVGAnimatedEnumeration:!1,SVGAnimatedInteger:!1,SVGAnimatedLength:!1,SVGAnimatedLengthList:!1,SVGAnimatedNumber:!1,SVGAnimatedNumberList:!1,SVGAnimatedPreserveAspectRatio:!1,SVGAnimatedRect:!1,SVGAnimatedString:!1,SVGAnimatedTransformList:!1,SVGAnimateElement:!1,SVGAnimateMotionElement:!1,SVGAnimateTransformElement:!1,SVGAnimationElement:!1,SVGCircleElement:!1,SVGClipPathElement:!1,SVGComponentTransferFunctionElement:!1,SVGDefsElement:!1,SVGDescElement:!1,SVGDiscardElement:!1,SVGElement:!1,SVGEllipseElement:!1,SVGFEBlendElement:!1,SVGFEColorMatrixElement:!1,SVGFEComponentTransferElement:!1,SVGFECompositeElement:!1,SVGFEConvolveMatrixElement:!1,SVGFEDiffuseLightingElement:!1,SVGFEDisplacementMapElement:!1,SVGFEDistantLightElement:!1,SVGFEDropShadowElement:!1,SVGFEFloodElement:!1,SVGFEFuncAElement:!1,SVGFEFuncBElement:!1,SVGFEFuncGElement:!1,SVGFEFuncRElement:!1,SVGFEGaussianBlurElement:!1,SVGFEImageElement:!1,SVGFEMergeElement:!1,SVGFEMergeNodeElement:!1,SVGFEMorphologyElement:!1,SVGFEOffsetElement:!1,SVGFEPointLightElement:!1,SVGFESpecularLightingElement:!1,SVGFESpotLightElement:!1,SVGFETileElement:!1,SVGFETurbulenceElement:!1,SVGFilterElement:!1,SVGForeignObjectElement:!1,SVGGElement:!1,SVGGeometryElement:!1,SVGGradientElement:!1,SVGGraphicsElement:!1,SVGImageElement:!1,SVGLength:!1,SVGLengthList:!1,SVGLinearGradientElement:!1,SVGLineElement:!1,SVGMarkerElement:!1,SVGMaskElement:!1,SVGMatrix:!1,SVGMetadataElement:!1,SVGMPathElement:!1,SVGNumber:!1,SVGNumberList:!1,SVGPathElement:!1,SVGPatternElement:!1,SVGPoint:!1,SVGPointList:!1,SVGPolygonElement:!1,SVGPolylineElement:!1,SVGPreserveAspectRatio:!1,SVGRadialGradientElement:!1,SVGRect:!1,SVGRectElement:!1,SVGScriptElement:!1,SVGSetElement:!1,SVGStopElement:!1,SVGStringList:!1,SVGStyleElement:!1,SVGSVGElement:!1,SVGSwitchElement:!1,SVGSymbolElement:!1,SVGTextContentElement:!1,SVGTextElement:!1,SVGTextPathElement:!1,SVGTextPositioningElement:!1,SVGTitleElement:!1,SVGTransform:!1,SVGTransformList:!1,SVGTSpanElement:!1,SVGUnitTypes:!1,SVGUseElement:!1,SVGViewElement:!1,TaskAttributionTiming:!1,Text:!1,TextDecoder:!1,TextEncoder:!1,TextEvent:!1,TextMetrics:!1,TextTrack:!1,TextTrackCue:!1,TextTrackCueList:!1,TextTrackList:!1,TimeRanges:!1,toolbar:!1,top:!1,Touch:!1,TouchEvent:!1,TouchList:!1,TrackEvent:!1,TransitionEvent:!1,TreeWalker:!1,UIEvent:!1,URL:!1,URLSearchParams:!1,ValidityState:!1,visualViewport:!1,VisualViewport:!1,VTTCue:!1,WaveShaperNode:!1,WebAssembly:!1,WebGL2RenderingContext:!1,WebGLActiveInfo:!1,WebGLBuffer:!1,WebGLContextEvent:!1,WebGLFramebuffer:!1,WebGLProgram:!1,WebGLQuery:!1,WebGLRenderbuffer:!1,WebGLRenderingContext:!1,WebGLSampler:!1,WebGLShader:!1,WebGLShaderPrecisionFormat:!1,WebGLSync:!1,WebGLTexture:!1,WebGLTransformFeedback:!1,WebGLUniformLocation:!1,WebGLVertexArrayObject:!1,WebSocket:!1,WheelEvent:!1,window:!1,Window:!1,Worker:!1,WritableStream:!1,XMLDocument:!1,XMLHttpRequest:!1,XMLHttpRequestEventTarget:!1,XMLHttpRequestUpload:!1,XMLSerializer:!1,XPathEvaluator:!1,XPathExpression:!1,XPathResult:!1,XSLTProcessor:!1},worker:{addEventListener:!1,applicationCache:!1,atob:!1,Blob:!1,BroadcastChannel:!1,btoa:!1,Cache:!1,caches:!1,clearInterval:!1,clearTimeout:!1,close:!0,console:!1,fetch:!1,FileReaderSync:!1,FormData:!1,Headers:!1,IDBCursor:!1,IDBCursorWithValue:!1,IDBDatabase:!1,IDBFactory:!1,IDBIndex:!1,IDBKeyRange:!1,IDBObjectStore:!1,IDBOpenDBRequest:!1,IDBRequest:!1,IDBTransaction:!1,IDBVersionChangeEvent:!1,ImageData:!1,importScripts:!0,indexedDB:!1,location:!1,MessageChannel:!1,MessagePort:!1,name:!1,navigator:!1,Notification:!1,onclose:!0,onconnect:!0,onerror:!0,onlanguagechange:!0,onmessage:!0,onoffline:!0,ononline:!0,onrejectionhandled:!0,onunhandledrejection:!0,performance:!1,Performance:!1,PerformanceEntry:!1,PerformanceMark:!1,PerformanceMeasure:!1,PerformanceNavigation:!1,PerformanceResourceTiming:!1,PerformanceTiming:!1,postMessage:!0,Promise:!1,queueMicrotask:!1,removeEventListener:!1,Request:!1,Response:!1,self:!0,ServiceWorkerRegistration:!1,setInterval:!1,setTimeout:!1,TextDecoder:!1,TextEncoder:!1,URL:!1,URLSearchParams:!1,WebSocket:!1,Worker:!1,WorkerGlobalScope:!1,XMLHttpRequest:!1},node:{__dirname:!1,__filename:!1,Buffer:!1,clearImmediate:!1,clearInterval:!1,clearTimeout:!1,console:!1,exports:!0,global:!1,Intl:!1,module:!1,process:!1,queueMicrotask:!1,require:!1,setImmediate:!1,setInterval:!1,setTimeout:!1,TextDecoder:!1,TextEncoder:!1,URL:!1,URLSearchParams:!1},nodeBuiltin:{Buffer:!1,clearImmediate:!1,clearInterval:!1,clearTimeout:!1,console:!1,global:!1,Intl:!1,process:!1,queueMicrotask:!1,setImmediate:!1,setInterval:!1,setTimeout:!1,TextDecoder:!1,TextEncoder:!1,URL:!1,URLSearchParams:!1},commonjs:{exports:!0,global:!1,module:!1,require:!1},amd:{define:!1,require:!1},mocha:{after:!1,afterEach:!1,before:!1,beforeEach:!1,context:!1,describe:!1,it:!1,mocha:!1,run:!1,setup:!1,specify:!1,suite:!1,suiteSetup:!1,suiteTeardown:!1,teardown:!1,test:!1,xcontext:!1,xdescribe:!1,xit:!1,xspecify:!1},jasmine:{afterAll:!1,afterEach:!1,beforeAll:!1,beforeEach:!1,describe:!1,expect:!1,expectAsync:!1,fail:!1,fdescribe:!1,fit:!1,it:!1,jasmine:!1,pending:!1,runs:!1,spyOn:!1,spyOnAllFunctions:!1,spyOnProperty:!1,waits:!1,waitsFor:!1,xdescribe:!1,xit:!1},jest:{afterAll:!1,afterEach:!1,beforeAll:!1,beforeEach:!1,describe:!1,expect:!1,fdescribe:!1,fit:!1,it:!1,jest:!1,pit:!1,require:!1,test:!1,xdescribe:!1,xit:!1,xtest:!1},qunit:{asyncTest:!1,deepEqual:!1,equal:!1,expect:!1,module:!1,notDeepEqual:!1,notEqual:!1,notOk:!1,notPropEqual:!1,notStrictEqual:!1,ok:!1,propEqual:!1,QUnit:!1,raises:!1,start:!1,stop:!1,strictEqual:!1,test:!1,throws:!1},phantomjs:{console:!0,exports:!0,phantom:!0,require:!0,WebPage:!0},couch:{emit:!1,exports:!1,getRow:!1,log:!1,module:!1,provides:!1,require:!1,respond:!1,send:!1,start:!1,sum:!1},rhino:{defineClass:!1,deserialize:!1,gc:!1,help:!1,importClass:!1,importPackage:!1,java:!1,load:!1,loadClass:!1,Packages:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},nashorn:{__DIR__:!1,__FILE__:!1,__LINE__:!1,com:!1,edu:!1,exit:!1,java:!1,Java:!1,javafx:!1,JavaImporter:!1,javax:!1,JSAdapter:!1,load:!1,loadWithNewGlobal:!1,org:!1,Packages:!1,print:!1,quit:!1},wsh:{ActiveXObject:!1,CollectGarbage:!1,Debug:!1,Enumerator:!1,GetObject:!1,RuntimeObject:!1,ScriptEngine:!1,ScriptEngineBuildVersion:!1,ScriptEngineMajorVersion:!1,ScriptEngineMinorVersion:!1,VBArray:!1,WScript:!1,WSH:!1},jquery:{$:!1,jQuery:!1},yui:{YAHOO:!1,YAHOO_config:!1,YUI:!1,YUI_config:!1},shelljs:{cat:!1,cd:!1,chmod:!1,config:!1,cp:!1,dirs:!1,echo:!1,env:!1,error:!1,exec:!1,exit:!1,find:!1,grep:!1,ln:!1,ls:!1,mkdir:!1,mv:!1,popd:!1,pushd:!1,pwd:!1,rm:!1,sed:!1,set:!1,target:!1,tempdir:!1,test:!1,touch:!1,which:!1},prototypejs:{$:!1,$$:!1,$A:!1,$break:!1,$continue:!1,$F:!1,$H:!1,$R:!1,$w:!1,Abstract:!1,Ajax:!1,Autocompleter:!1,Builder:!1,Class:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Element:!1,Enumerable:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Scriptaculous:!1,Selector:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Template:!1,Toggle:!1,Try:!1},meteor:{$:!1,Accounts:!1,AccountsClient:!1,AccountsCommon:!1,AccountsServer:!1,App:!1,Assets:!1,Blaze:!1,check:!1,Cordova:!1,DDP:!1,DDPRateLimiter:!1,DDPServer:!1,Deps:!1,EJSON:!1,Email:!1,HTTP:!1,Log:!1,Match:!1,Meteor:!1,Mongo:!1,MongoInternals:!1,Npm:!1,Package:!1,Plugin:!1,process:!1,Random:!1,ReactiveDict:!1,ReactiveVar:!1,Router:!1,ServiceConfiguration:!1,Session:!1,share:!1,Spacebars:!1,Template:!1,Tinytest:!1,Tracker:!1,UI:!1,Utils:!1,WebApp:!1,WebAppInternals:!1},mongo:{_isWindows:!1,_rand:!1,BulkWriteResult:!1,cat:!1,cd:!1,connect:!1,db:!1,getHostName:!1,getMemInfo:!1,hostname:!1,ISODate:!1,listFiles:!1,load:!1,ls:!1,md5sumFile:!1,mkdir:!1,Mongo:!1,NumberInt:!1,NumberLong:!1,ObjectId:!1,PlanCache:!1,print:!1,printjson:!1,pwd:!1,quit:!1,removeFile:!1,rs:!1,sh:!1,UUID:!1,version:!1,WriteResult:!1},applescript:{$:!1,Application:!1,Automation:!1,console:!1,delay:!1,Library:!1,ObjC:!1,ObjectSpecifier:!1,Path:!1,Progress:!1,Ref:!1},serviceworker:{addEventListener:!1,applicationCache:!1,atob:!1,Blob:!1,BroadcastChannel:!1,btoa:!1,Cache:!1,caches:!1,CacheStorage:!1,clearInterval:!1,clearTimeout:!1,Client:!1,clients:!1,Clients:!1,close:!0,console:!1,ExtendableEvent:!1,ExtendableMessageEvent:!1,fetch:!1,FetchEvent:!1,FileReaderSync:!1,FormData:!1,Headers:!1,IDBCursor:!1,IDBCursorWithValue:!1,IDBDatabase:!1,IDBFactory:!1,IDBIndex:!1,IDBKeyRange:!1,IDBObjectStore:!1,IDBOpenDBRequest:!1,IDBRequest:!1,IDBTransaction:!1,IDBVersionChangeEvent:!1,ImageData:!1,importScripts:!1,indexedDB:!1,location:!1,MessageChannel:!1,MessagePort:!1,name:!1,navigator:!1,Notification:!1,onclose:!0,onconnect:!0,onerror:!0,onfetch:!0,oninstall:!0,onlanguagechange:!0,onmessage:!0,onmessageerror:!0,onnotificationclick:!0,onnotificationclose:!0,onoffline:!0,ononline:!0,onpush:!0,onpushsubscriptionchange:!0,onrejectionhandled:!0,onsync:!0,onunhandledrejection:!0,performance:!1,Performance:!1,PerformanceEntry:!1,PerformanceMark:!1,PerformanceMeasure:!1,PerformanceNavigation:!1,PerformanceResourceTiming:!1,PerformanceTiming:!1,postMessage:!0,Promise:!1,queueMicrotask:!1,registration:!1,removeEventListener:!1,Request:!1,Response:!1,self:!1,ServiceWorker:!1,ServiceWorkerContainer:!1,ServiceWorkerGlobalScope:!1,ServiceWorkerMessageEvent:!1,ServiceWorkerRegistration:!1,setInterval:!1,setTimeout:!1,skipWaiting:!1,TextDecoder:!1,TextEncoder:!1,URL:!1,URLSearchParams:!1,WebSocket:!1,WindowClient:!1,Worker:!1,WorkerGlobalScope:!1,XMLHttpRequest:!1},atomtest:{advanceClock:!1,atom:!1,fakeClearInterval:!1,fakeClearTimeout:!1,fakeSetInterval:!1,fakeSetTimeout:!1,resetTimeouts:!1,waitsForPromise:!1},embertest:{andThen:!1,click:!1,currentPath:!1,currentRouteName:!1,currentURL:!1,fillIn:!1,find:!1,findAll:!1,findWithAssert:!1,keyEvent:!1,pauseTest:!1,resumeTest:!1,triggerEvent:!1,visit:!1,wait:!1},protractor:{$:!1,$$:!1,browser:!1,by:!1,By:!1,DartObject:!1,element:!1,protractor:!1},"shared-node-browser":{clearInterval:!1,clearTimeout:!1,console:!1,setInterval:!1,setTimeout:!1,URL:!1,URLSearchParams:!1},webextensions:{browser:!1,chrome:!1,opr:!1},greasemonkey:{cloneInto:!1,createObjectIn:!1,exportFunction:!1,GM:!1,GM_addStyle:!1,GM_addValueChangeListener:!1,GM_deleteValue:!1,GM_download:!1,GM_getResourceText:!1,GM_getResourceURL:!1,GM_getTab:!1,GM_getTabs:!1,GM_getValue:!1,GM_info:!1,GM_listValues:!1,GM_log:!1,GM_notification:!1,GM_openInTab:!1,GM_registerMenuCommand:!1,GM_removeValueChangeListener:!1,GM_saveTab:!1,GM_setClipboard:!1,GM_setValue:!1,GM_unregisterMenuCommand:!1,GM_xmlhttpRequest:!1,unsafeWindow:!1},devtools:{$:!1,$_:!1,$$:!1,$0:!1,$1:!1,$2:!1,$3:!1,$4:!1,$x:!1,chrome:!1,clear:!1,copy:!1,debug:!1,dir:!1,dirxml:!1,getEventListeners:!1,inspect:!1,keys:!1,monitor:!1,monitorEvents:!1,profile:!1,profileEnd:!1,queryObjects:!1,table:!1,undebug:!1,unmonitor:!1,unmonitorEvents:!1,values:!1}};var kp,Pp,Fp={builtin:{Array:!1,ArrayBuffer:!1,Atomics:!1,BigInt:!1,BigInt64Array:!1,BigUint64Array:!1,Boolean:!1,constructor:!1,DataView:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,escape:!1,eval:!1,EvalError:!1,Float32Array:!1,Float64Array:!1,Function:!1,globalThis:!1,hasOwnProperty:!1,Infinity:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,isFinite:!1,isNaN:!1,isPrototypeOf:!1,JSON:!1,Map:!1,Math:!1,NaN:!1,Number:!1,Object:!1,parseFloat:!1,parseInt:!1,Promise:!1,propertyIsEnumerable:!1,Proxy:!1,RangeError:!1,ReferenceError:!1,Reflect:!1,RegExp:!1,Set:!1,SharedArrayBuffer:!1,String:!1,Symbol:!1,SyntaxError:!1,toLocaleString:!1,toString:!1,TypeError:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1,undefined:!1,unescape:!1,URIError:!1,valueOf:!1,WeakMap:!1,WeakSet:!1},es5:{Array:!1,Boolean:!1,constructor:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,escape:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,Infinity:!1,isFinite:!1,isNaN:!1,isPrototypeOf:!1,JSON:!1,Math:!1,NaN:!1,Number:!1,Object:!1,parseFloat:!1,parseInt:!1,propertyIsEnumerable:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,toLocaleString:!1,toString:!1,TypeError:!1,undefined:!1,unescape:!1,URIError:!1,valueOf:!1},es2015:{Array:!1,ArrayBuffer:!1,Boolean:!1,constructor:!1,DataView:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,escape:!1,eval:!1,EvalError:!1,Float32Array:!1,Float64Array:!1,Function:!1,hasOwnProperty:!1,Infinity:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,isFinite:!1,isNaN:!1,isPrototypeOf:!1,JSON:!1,Map:!1,Math:!1,NaN:!1,Number:!1,Object:!1,parseFloat:!1,parseInt:!1,Promise:!1,propertyIsEnumerable:!1,Proxy:!1,RangeError:!1,ReferenceError:!1,Reflect:!1,RegExp:!1,Set:!1,String:!1,Symbol:!1,SyntaxError:!1,toLocaleString:!1,toString:!1,TypeError:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1,undefined:!1,unescape:!1,URIError:!1,valueOf:!1,WeakMap:!1,WeakSet:!1},es2017:{Array:!1,ArrayBuffer:!1,Atomics:!1,Boolean:!1,constructor:!1,DataView:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,escape:!1,eval:!1,EvalError:!1,Float32Array:!1,Float64Array:!1,Function:!1,hasOwnProperty:!1,Infinity:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,isFinite:!1,isNaN:!1,isPrototypeOf:!1,JSON:!1,Map:!1,Math:!1,NaN:!1,Number:!1,Object:!1,parseFloat:!1,parseInt:!1,Promise:!1,propertyIsEnumerable:!1,Proxy:!1,RangeError:!1,ReferenceError:!1,Reflect:!1,RegExp:!1,Set:!1,SharedArrayBuffer:!1,String:!1,Symbol:!1,SyntaxError:!1,toLocaleString:!1,toString:!1,TypeError:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1,undefined:!1,unescape:!1,URIError:!1,valueOf:!1,WeakMap:!1,WeakSet:!1},browser:{AbortController:!1,AbortSignal:!1,addEventListener:!1,alert:!1,AnalyserNode:!1,Animation:!1,AnimationEffectReadOnly:!1,AnimationEffectTiming:!1,AnimationEffectTimingReadOnly:!1,AnimationEvent:!1,AnimationPlaybackEvent:!1,AnimationTimeline:!1,applicationCache:!1,ApplicationCache:!1,ApplicationCacheErrorEvent:!1,atob:!1,Attr:!1,Audio:!1,AudioBuffer:!1,AudioBufferSourceNode:!1,AudioContext:!1,AudioDestinationNode:!1,AudioListener:!1,AudioNode:!1,AudioParam:!1,AudioProcessingEvent:!1,AudioScheduledSourceNode:!1,"AudioWorkletGlobalScope ":!1,AudioWorkletNode:!1,AudioWorkletProcessor:!1,BarProp:!1,BaseAudioContext:!1,BatteryManager:!1,BeforeUnloadEvent:!1,BiquadFilterNode:!1,Blob:!1,BlobEvent:!1,blur:!1,BroadcastChannel:!1,btoa:!1,BudgetService:!1,ByteLengthQueuingStrategy:!1,Cache:!1,caches:!1,CacheStorage:!1,cancelAnimationFrame:!1,cancelIdleCallback:!1,CanvasCaptureMediaStreamTrack:!1,CanvasGradient:!1,CanvasPattern:!1,CanvasRenderingContext2D:!1,ChannelMergerNode:!1,ChannelSplitterNode:!1,CharacterData:!1,clearInterval:!1,clearTimeout:!1,clientInformation:!1,ClipboardEvent:!1,close:!1,closed:!1,CloseEvent:!1,Comment:!1,CompositionEvent:!1,confirm:!1,console:!1,ConstantSourceNode:!1,ConvolverNode:!1,CountQueuingStrategy:!1,createImageBitmap:!1,Credential:!1,CredentialsContainer:!1,crypto:!1,Crypto:!1,CryptoKey:!1,CSS:!1,CSSConditionRule:!1,CSSFontFaceRule:!1,CSSGroupingRule:!1,CSSImportRule:!1,CSSKeyframeRule:!1,CSSKeyframesRule:!1,CSSMediaRule:!1,CSSNamespaceRule:!1,CSSPageRule:!1,CSSRule:!1,CSSRuleList:!1,CSSStyleDeclaration:!1,CSSStyleRule:!1,CSSStyleSheet:!1,CSSSupportsRule:!1,CustomElementRegistry:!1,customElements:!1,CustomEvent:!1,DataTransfer:!1,DataTransferItem:!1,DataTransferItemList:!1,defaultstatus:!1,defaultStatus:!1,DelayNode:!1,DeviceMotionEvent:!1,DeviceOrientationEvent:!1,devicePixelRatio:!1,dispatchEvent:!1,document:!1,Document:!1,DocumentFragment:!1,DocumentType:!1,DOMError:!1,DOMException:!1,DOMImplementation:!1,DOMMatrix:!1,DOMMatrixReadOnly:!1,DOMParser:!1,DOMPoint:!1,DOMPointReadOnly:!1,DOMQuad:!1,DOMRect:!1,DOMRectReadOnly:!1,DOMStringList:!1,DOMStringMap:!1,DOMTokenList:!1,DragEvent:!1,DynamicsCompressorNode:!1,Element:!1,ErrorEvent:!1,event:!1,Event:!1,EventSource:!1,EventTarget:!1,external:!1,fetch:!1,File:!1,FileList:!1,FileReader:!1,find:!1,focus:!1,FocusEvent:!1,FontFace:!1,FontFaceSetLoadEvent:!1,FormData:!1,frameElement:!1,frames:!1,GainNode:!1,Gamepad:!1,GamepadButton:!1,GamepadEvent:!1,getComputedStyle:!1,getSelection:!1,HashChangeEvent:!1,Headers:!1,history:!1,History:!1,HTMLAllCollection:!1,HTMLAnchorElement:!1,HTMLAreaElement:!1,HTMLAudioElement:!1,HTMLBaseElement:!1,HTMLBodyElement:!1,HTMLBRElement:!1,HTMLButtonElement:!1,HTMLCanvasElement:!1,HTMLCollection:!1,HTMLContentElement:!1,HTMLDataElement:!1,HTMLDataListElement:!1,HTMLDetailsElement:!1,HTMLDialogElement:!1,HTMLDirectoryElement:!1,HTMLDivElement:!1,HTMLDListElement:!1,HTMLDocument:!1,HTMLElement:!1,HTMLEmbedElement:!1,HTMLFieldSetElement:!1,HTMLFontElement:!1,HTMLFormControlsCollection:!1,HTMLFormElement:!1,HTMLFrameElement:!1,HTMLFrameSetElement:!1,HTMLHeadElement:!1,HTMLHeadingElement:!1,HTMLHRElement:!1,HTMLHtmlElement:!1,HTMLIFrameElement:!1,HTMLImageElement:!1,HTMLInputElement:!1,HTMLLabelElement:!1,HTMLLegendElement:!1,HTMLLIElement:!1,HTMLLinkElement:!1,HTMLMapElement:!1,HTMLMarqueeElement:!1,HTMLMediaElement:!1,HTMLMenuElement:!1,HTMLMetaElement:!1,HTMLMeterElement:!1,HTMLModElement:!1,HTMLObjectElement:!1,HTMLOListElement:!1,HTMLOptGroupElement:!1,HTMLOptionElement:!1,HTMLOptionsCollection:!1,HTMLOutputElement:!1,HTMLParagraphElement:!1,HTMLParamElement:!1,HTMLPictureElement:!1,HTMLPreElement:!1,HTMLProgressElement:!1,HTMLQuoteElement:!1,HTMLScriptElement:!1,HTMLSelectElement:!1,HTMLShadowElement:!1,HTMLSlotElement:!1,HTMLSourceElement:!1,HTMLSpanElement:!1,HTMLStyleElement:!1,HTMLTableCaptionElement:!1,HTMLTableCellElement:!1,HTMLTableColElement:!1,HTMLTableElement:!1,HTMLTableRowElement:!1,HTMLTableSectionElement:!1,HTMLTemplateElement:!1,HTMLTextAreaElement:!1,HTMLTimeElement:!1,HTMLTitleElement:!1,HTMLTrackElement:!1,HTMLUListElement:!1,HTMLUnknownElement:!1,HTMLVideoElement:!1,IDBCursor:!1,IDBCursorWithValue:!1,IDBDatabase:!1,IDBFactory:!1,IDBIndex:!1,IDBKeyRange:!1,IDBObjectStore:!1,IDBOpenDBRequest:!1,IDBRequest:!1,IDBTransaction:!1,IDBVersionChangeEvent:!1,IdleDeadline:!1,IIRFilterNode:!1,Image:!1,ImageBitmap:!1,ImageBitmapRenderingContext:!1,ImageCapture:!1,ImageData:!1,indexedDB:!1,innerHeight:!1,innerWidth:!1,InputEvent:!1,IntersectionObserver:!1,IntersectionObserverEntry:!1,Intl:!1,isSecureContext:!1,KeyboardEvent:!1,KeyframeEffect:!1,KeyframeEffectReadOnly:!1,length:!1,localStorage:!1,location:!0,Location:!1,locationbar:!1,matchMedia:!1,MediaDeviceInfo:!1,MediaDevices:!1,MediaElementAudioSourceNode:!1,MediaEncryptedEvent:!1,MediaError:!1,MediaKeyMessageEvent:!1,MediaKeySession:!1,MediaKeyStatusMap:!1,MediaKeySystemAccess:!1,MediaList:!1,MediaQueryList:!1,MediaQueryListEvent:!1,MediaRecorder:!1,MediaSettingsRange:!1,MediaSource:!1,MediaStream:!1,MediaStreamAudioDestinationNode:!1,MediaStreamAudioSourceNode:!1,MediaStreamEvent:!1,MediaStreamTrack:!1,MediaStreamTrackEvent:!1,menubar:!1,MessageChannel:!1,MessageEvent:!1,MessagePort:!1,MIDIAccess:!1,MIDIConnectionEvent:!1,MIDIInput:!1,MIDIInputMap:!1,MIDIMessageEvent:!1,MIDIOutput:!1,MIDIOutputMap:!1,MIDIPort:!1,MimeType:!1,MimeTypeArray:!1,MouseEvent:!1,moveBy:!1,moveTo:!1,MutationEvent:!1,MutationObserver:!1,MutationRecord:!1,name:!1,NamedNodeMap:!1,NavigationPreloadManager:!1,navigator:!1,Navigator:!1,NetworkInformation:!1,Node:!1,NodeFilter:!1,NodeIterator:!1,NodeList:!1,Notification:!1,OfflineAudioCompletionEvent:!1,OfflineAudioContext:!1,offscreenBuffering:!1,OffscreenCanvas:!0,onabort:!0,onafterprint:!0,onanimationend:!0,onanimationiteration:!0,onanimationstart:!0,onappinstalled:!0,onauxclick:!0,onbeforeinstallprompt:!0,onbeforeprint:!0,onbeforeunload:!0,onblur:!0,oncancel:!0,oncanplay:!0,oncanplaythrough:!0,onchange:!0,onclick:!0,onclose:!0,oncontextmenu:!0,oncuechange:!0,ondblclick:!0,ondevicemotion:!0,ondeviceorientation:!0,ondeviceorientationabsolute:!0,ondrag:!0,ondragend:!0,ondragenter:!0,ondragleave:!0,ondragover:!0,ondragstart:!0,ondrop:!0,ondurationchange:!0,onemptied:!0,onended:!0,onerror:!0,onfocus:!0,ongotpointercapture:!0,onhashchange:!0,oninput:!0,oninvalid:!0,onkeydown:!0,onkeypress:!0,onkeyup:!0,onlanguagechange:!0,onload:!0,onloadeddata:!0,onloadedmetadata:!0,onloadstart:!0,onlostpointercapture:!0,onmessage:!0,onmessageerror:!0,onmousedown:!0,onmouseenter:!0,onmouseleave:!0,onmousemove:!0,onmouseout:!0,onmouseover:!0,onmouseup:!0,onmousewheel:!0,onoffline:!0,ononline:!0,onpagehide:!0,onpageshow:!0,onpause:!0,onplay:!0,onplaying:!0,onpointercancel:!0,onpointerdown:!0,onpointerenter:!0,onpointerleave:!0,onpointermove:!0,onpointerout:!0,onpointerover:!0,onpointerup:!0,onpopstate:!0,onprogress:!0,onratechange:!0,onrejectionhandled:!0,onreset:!0,onresize:!0,onscroll:!0,onsearch:!0,onseeked:!0,onseeking:!0,onselect:!0,onstalled:!0,onstorage:!0,onsubmit:!0,onsuspend:!0,ontimeupdate:!0,ontoggle:!0,ontransitionend:!0,onunhandledrejection:!0,onunload:!0,onvolumechange:!0,onwaiting:!0,onwheel:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,origin:!1,OscillatorNode:!1,outerHeight:!1,outerWidth:!1,PageTransitionEvent:!1,pageXOffset:!1,pageYOffset:!1,PannerNode:!1,parent:!1,Path2D:!1,PaymentAddress:!1,PaymentRequest:!1,PaymentRequestUpdateEvent:!1,PaymentResponse:!1,performance:!1,Performance:!1,PerformanceEntry:!1,PerformanceLongTaskTiming:!1,PerformanceMark:!1,PerformanceMeasure:!1,PerformanceNavigation:!1,PerformanceNavigationTiming:!1,PerformanceObserver:!1,PerformanceObserverEntryList:!1,PerformancePaintTiming:!1,PerformanceResourceTiming:!1,PerformanceTiming:!1,PeriodicWave:!1,Permissions:!1,PermissionStatus:!1,personalbar:!1,PhotoCapabilities:!1,Plugin:!1,PluginArray:!1,PointerEvent:!1,PopStateEvent:!1,postMessage:!1,Presentation:!1,PresentationAvailability:!1,PresentationConnection:!1,PresentationConnectionAvailableEvent:!1,PresentationConnectionCloseEvent:!1,PresentationConnectionList:!1,PresentationReceiver:!1,PresentationRequest:!1,print:!1,ProcessingInstruction:!1,ProgressEvent:!1,PromiseRejectionEvent:!1,prompt:!1,PushManager:!1,PushSubscription:!1,PushSubscriptionOptions:!1,queueMicrotask:!1,RadioNodeList:!1,Range:!1,ReadableStream:!1,registerProcessor:!1,RemotePlayback:!1,removeEventListener:!1,Request:!1,requestAnimationFrame:!1,requestIdleCallback:!1,resizeBy:!1,ResizeObserver:!1,ResizeObserverEntry:!1,resizeTo:!1,Response:!1,RTCCertificate:!1,RTCDataChannel:!1,RTCDataChannelEvent:!1,RTCDtlsTransport:!1,RTCIceCandidate:!1,RTCIceGatherer:!1,RTCIceTransport:!1,RTCPeerConnection:!1,RTCPeerConnectionIceEvent:!1,RTCRtpContributingSource:!1,RTCRtpReceiver:!1,RTCRtpSender:!1,RTCSctpTransport:!1,RTCSessionDescription:!1,RTCStatsReport:!1,RTCTrackEvent:!1,screen:!1,Screen:!1,screenLeft:!1,ScreenOrientation:!1,screenTop:!1,screenX:!1,screenY:!1,ScriptProcessorNode:!1,scroll:!1,scrollbars:!1,scrollBy:!1,scrollTo:!1,scrollX:!1,scrollY:!1,SecurityPolicyViolationEvent:!1,Selection:!1,self:!1,ServiceWorker:!1,ServiceWorkerContainer:!1,ServiceWorkerRegistration:!1,sessionStorage:!1,setInterval:!1,setTimeout:!1,ShadowRoot:!1,SharedWorker:!1,SourceBuffer:!1,SourceBufferList:!1,speechSynthesis:!1,SpeechSynthesisEvent:!1,SpeechSynthesisUtterance:!1,StaticRange:!1,status:!1,statusbar:!1,StereoPannerNode:!1,stop:!1,Storage:!1,StorageEvent:!1,StorageManager:!1,styleMedia:!1,StyleSheet:!1,StyleSheetList:!1,SubtleCrypto:!1,SVGAElement:!1,SVGAngle:!1,SVGAnimatedAngle:!1,SVGAnimatedBoolean:!1,SVGAnimatedEnumeration:!1,SVGAnimatedInteger:!1,SVGAnimatedLength:!1,SVGAnimatedLengthList:!1,SVGAnimatedNumber:!1,SVGAnimatedNumberList:!1,SVGAnimatedPreserveAspectRatio:!1,SVGAnimatedRect:!1,SVGAnimatedString:!1,SVGAnimatedTransformList:!1,SVGAnimateElement:!1,SVGAnimateMotionElement:!1,SVGAnimateTransformElement:!1,SVGAnimationElement:!1,SVGCircleElement:!1,SVGClipPathElement:!1,SVGComponentTransferFunctionElement:!1,SVGDefsElement:!1,SVGDescElement:!1,SVGDiscardElement:!1,SVGElement:!1,SVGEllipseElement:!1,SVGFEBlendElement:!1,SVGFEColorMatrixElement:!1,SVGFEComponentTransferElement:!1,SVGFECompositeElement:!1,SVGFEConvolveMatrixElement:!1,SVGFEDiffuseLightingElement:!1,SVGFEDisplacementMapElement:!1,SVGFEDistantLightElement:!1,SVGFEDropShadowElement:!1,SVGFEFloodElement:!1,SVGFEFuncAElement:!1,SVGFEFuncBElement:!1,SVGFEFuncGElement:!1,SVGFEFuncRElement:!1,SVGFEGaussianBlurElement:!1,SVGFEImageElement:!1,SVGFEMergeElement:!1,SVGFEMergeNodeElement:!1,SVGFEMorphologyElement:!1,SVGFEOffsetElement:!1,SVGFEPointLightElement:!1,SVGFESpecularLightingElement:!1,SVGFESpotLightElement:!1,SVGFETileElement:!1,SVGFETurbulenceElement:!1,SVGFilterElement:!1,SVGForeignObjectElement:!1,SVGGElement:!1,SVGGeometryElement:!1,SVGGradientElement:!1,SVGGraphicsElement:!1,SVGImageElement:!1,SVGLength:!1,SVGLengthList:!1,SVGLinearGradientElement:!1,SVGLineElement:!1,SVGMarkerElement:!1,SVGMaskElement:!1,SVGMatrix:!1,SVGMetadataElement:!1,SVGMPathElement:!1,SVGNumber:!1,SVGNumberList:!1,SVGPathElement:!1,SVGPatternElement:!1,SVGPoint:!1,SVGPointList:!1,SVGPolygonElement:!1,SVGPolylineElement:!1,SVGPreserveAspectRatio:!1,SVGRadialGradientElement:!1,SVGRect:!1,SVGRectElement:!1,SVGScriptElement:!1,SVGSetElement:!1,SVGStopElement:!1,SVGStringList:!1,SVGStyleElement:!1,SVGSVGElement:!1,SVGSwitchElement:!1,SVGSymbolElement:!1,SVGTextContentElement:!1,SVGTextElement:!1,SVGTextPathElement:!1,SVGTextPositioningElement:!1,SVGTitleElement:!1,SVGTransform:!1,SVGTransformList:!1,SVGTSpanElement:!1,SVGUnitTypes:!1,SVGUseElement:!1,SVGViewElement:!1,TaskAttributionTiming:!1,Text:!1,TextDecoder:!1,TextEncoder:!1,TextEvent:!1,TextMetrics:!1,TextTrack:!1,TextTrackCue:!1,TextTrackCueList:!1,TextTrackList:!1,TimeRanges:!1,toolbar:!1,top:!1,Touch:!1,TouchEvent:!1,TouchList:!1,TrackEvent:!1,TransitionEvent:!1,TreeWalker:!1,UIEvent:!1,URL:!1,URLSearchParams:!1,ValidityState:!1,visualViewport:!1,VisualViewport:!1,VTTCue:!1,WaveShaperNode:!1,WebAssembly:!1,WebGL2RenderingContext:!1,WebGLActiveInfo:!1,WebGLBuffer:!1,WebGLContextEvent:!1,WebGLFramebuffer:!1,WebGLProgram:!1,WebGLQuery:!1,WebGLRenderbuffer:!1,WebGLRenderingContext:!1,WebGLSampler:!1,WebGLShader:!1,WebGLShaderPrecisionFormat:!1,WebGLSync:!1,WebGLTexture:!1,WebGLTransformFeedback:!1,WebGLUniformLocation:!1,WebGLVertexArrayObject:!1,WebSocket:!1,WheelEvent:!1,window:!1,Window:!1,Worker:!1,WritableStream:!1,XMLDocument:!1,XMLHttpRequest:!1,XMLHttpRequestEventTarget:!1,XMLHttpRequestUpload:!1,XMLSerializer:!1,XPathEvaluator:!1,XPathExpression:!1,XPathResult:!1,XSLTProcessor:!1},worker:{addEventListener:!1,applicationCache:!1,atob:!1,Blob:!1,BroadcastChannel:!1,btoa:!1,Cache:!1,caches:!1,clearInterval:!1,clearTimeout:!1,close:!0,console:!1,fetch:!1,FileReaderSync:!1,FormData:!1,Headers:!1,IDBCursor:!1,IDBCursorWithValue:!1,IDBDatabase:!1,IDBFactory:!1,IDBIndex:!1,IDBKeyRange:!1,IDBObjectStore:!1,IDBOpenDBRequest:!1,IDBRequest:!1,IDBTransaction:!1,IDBVersionChangeEvent:!1,ImageData:!1,importScripts:!0,indexedDB:!1,location:!1,MessageChannel:!1,MessagePort:!1,name:!1,navigator:!1,Notification:!1,onclose:!0,onconnect:!0,onerror:!0,onlanguagechange:!0,onmessage:!0,onoffline:!0,ononline:!0,onrejectionhandled:!0,onunhandledrejection:!0,performance:!1,Performance:!1,PerformanceEntry:!1,PerformanceMark:!1,PerformanceMeasure:!1,PerformanceNavigation:!1,PerformanceResourceTiming:!1,PerformanceTiming:!1,postMessage:!0,Promise:!1,queueMicrotask:!1,removeEventListener:!1,Request:!1,Response:!1,self:!0,ServiceWorkerRegistration:!1,setInterval:!1,setTimeout:!1,TextDecoder:!1,TextEncoder:!1,URL:!1,URLSearchParams:!1,WebSocket:!1,Worker:!1,WorkerGlobalScope:!1,XMLHttpRequest:!1},node:{__dirname:!1,__filename:!1,Buffer:!1,clearImmediate:!1,clearInterval:!1,clearTimeout:!1,console:!1,exports:!0,global:!1,Intl:!1,module:!1,process:!1,queueMicrotask:!1,require:!1,setImmediate:!1,setInterval:!1,setTimeout:!1,TextDecoder:!1,TextEncoder:!1,URL:!1,URLSearchParams:!1},commonjs:{exports:!0,global:!1,module:!1,require:!1},amd:{define:!1,require:!1},mocha:{after:!1,afterEach:!1,before:!1,beforeEach:!1,context:!1,describe:!1,it:!1,mocha:!1,run:!1,setup:!1,specify:!1,suite:!1,suiteSetup:!1,suiteTeardown:!1,teardown:!1,test:!1,xcontext:!1,xdescribe:!1,xit:!1,xspecify:!1},jasmine:{afterAll:!1,afterEach:!1,beforeAll:!1,beforeEach:!1,describe:!1,expect:!1,fail:!1,fdescribe:!1,fit:!1,it:!1,jasmine:!1,pending:!1,runs:!1,spyOn:!1,spyOnProperty:!1,waits:!1,waitsFor:!1,xdescribe:!1,xit:!1},jest:{afterAll:!1,afterEach:!1,beforeAll:!1,beforeEach:!1,describe:!1,expect:!1,fdescribe:!1,fit:!1,it:!1,jest:!1,pit:!1,require:!1,test:!1,xdescribe:!1,xit:!1,xtest:!1},qunit:{asyncTest:!1,deepEqual:!1,equal:!1,expect:!1,module:!1,notDeepEqual:!1,notEqual:!1,notOk:!1,notPropEqual:!1,notStrictEqual:!1,ok:!1,propEqual:!1,QUnit:!1,raises:!1,start:!1,stop:!1,strictEqual:!1,test:!1,throws:!1},phantomjs:{console:!0,exports:!0,phantom:!0,require:!0,WebPage:!0},couch:{emit:!1,exports:!1,getRow:!1,log:!1,module:!1,provides:!1,require:!1,respond:!1,send:!1,start:!1,sum:!1},rhino:{defineClass:!1,deserialize:!1,gc:!1,help:!1,importClass:!1,importPackage:!1,java:!1,load:!1,loadClass:!1,Packages:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},nashorn:{__DIR__:!1,__FILE__:!1,__LINE__:!1,com:!1,edu:!1,exit:!1,java:!1,Java:!1,javafx:!1,JavaImporter:!1,javax:!1,JSAdapter:!1,load:!1,loadWithNewGlobal:!1,org:!1,Packages:!1,print:!1,quit:!1},wsh:{ActiveXObject:!0,Enumerator:!0,GetObject:!0,ScriptEngine:!0,ScriptEngineBuildVersion:!0,ScriptEngineMajorVersion:!0,ScriptEngineMinorVersion:!0,VBArray:!0,WScript:!0,WSH:!0,XDomainRequest:!0},jquery:{$:!1,jQuery:!1},yui:{YAHOO:!1,YAHOO_config:!1,YUI:!1,YUI_config:!1},shelljs:{cat:!1,cd:!1,chmod:!1,config:!1,cp:!1,dirs:!1,echo:!1,env:!1,error:!1,exec:!1,exit:!1,find:!1,grep:!1,ln:!1,ls:!1,mkdir:!1,mv:!1,popd:!1,pushd:!1,pwd:!1,rm:!1,sed:!1,set:!1,target:!1,tempdir:!1,test:!1,touch:!1,which:!1},prototypejs:{$:!1,$$:!1,$A:!1,$break:!1,$continue:!1,$F:!1,$H:!1,$R:!1,$w:!1,Abstract:!1,Ajax:!1,Autocompleter:!1,Builder:!1,Class:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Element:!1,Enumerable:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Scriptaculous:!1,Selector:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Template:!1,Toggle:!1,Try:!1},meteor:{_:!1,$:!1,Accounts:!1,AccountsClient:!1,AccountsCommon:!1,AccountsServer:!1,App:!1,Assets:!1,Blaze:!1,check:!1,Cordova:!1,DDP:!1,DDPRateLimiter:!1,DDPServer:!1,Deps:!1,EJSON:!1,Email:!1,HTTP:!1,Log:!1,Match:!1,Meteor:!1,Mongo:!1,MongoInternals:!1,Npm:!1,Package:!1,Plugin:!1,process:!1,Random:!1,ReactiveDict:!1,ReactiveVar:!1,Router:!1,ServiceConfiguration:!1,Session:!1,share:!1,Spacebars:!1,Template:!1,Tinytest:!1,Tracker:!1,UI:!1,Utils:!1,WebApp:!1,WebAppInternals:!1},mongo:{_isWindows:!1,_rand:!1,BulkWriteResult:!1,cat:!1,cd:!1,connect:!1,db:!1,getHostName:!1,getMemInfo:!1,hostname:!1,ISODate:!1,listFiles:!1,load:!1,ls:!1,md5sumFile:!1,mkdir:!1,Mongo:!1,NumberInt:!1,NumberLong:!1,ObjectId:!1,PlanCache:!1,print:!1,printjson:!1,pwd:!1,quit:!1,removeFile:!1,rs:!1,sh:!1,UUID:!1,version:!1,WriteResult:!1},applescript:{$:!1,Application:!1,Automation:!1,console:!1,delay:!1,Library:!1,ObjC:!1,ObjectSpecifier:!1,Path:!1,Progress:!1,Ref:!1},serviceworker:{addEventListener:!1,applicationCache:!1,atob:!1,Blob:!1,BroadcastChannel:!1,btoa:!1,Cache:!1,caches:!1,CacheStorage:!1,clearInterval:!1,clearTimeout:!1,Client:!1,clients:!1,Clients:!1,close:!0,console:!1,ExtendableEvent:!1,ExtendableMessageEvent:!1,fetch:!1,FetchEvent:!1,FileReaderSync:!1,FormData:!1,Headers:!1,IDBCursor:!1,IDBCursorWithValue:!1,IDBDatabase:!1,IDBFactory:!1,IDBIndex:!1,IDBKeyRange:!1,IDBObjectStore:!1,IDBOpenDBRequest:!1,IDBRequest:!1,IDBTransaction:!1,IDBVersionChangeEvent:!1,ImageData:!1,importScripts:!1,indexedDB:!1,location:!1,MessageChannel:!1,MessagePort:!1,name:!1,navigator:!1,Notification:!1,onclose:!0,onconnect:!0,onerror:!0,onfetch:!0,oninstall:!0,onlanguagechange:!0,onmessage:!0,onmessageerror:!0,onnotificationclick:!0,onnotificationclose:!0,onoffline:!0,ononline:!0,onpush:!0,onpushsubscriptionchange:!0,onrejectionhandled:!0,onsync:!0,onunhandledrejection:!0,performance:!1,Performance:!1,PerformanceEntry:!1,PerformanceMark:!1,PerformanceMeasure:!1,PerformanceNavigation:!1,PerformanceResourceTiming:!1,PerformanceTiming:!1,postMessage:!0,Promise:!1,queueMicrotask:!1,registration:!1,removeEventListener:!1,Request:!1,Response:!1,self:!1,ServiceWorker:!1,ServiceWorkerContainer:!1,ServiceWorkerGlobalScope:!1,ServiceWorkerMessageEvent:!1,ServiceWorkerRegistration:!1,setInterval:!1,setTimeout:!1,skipWaiting:!1,TextDecoder:!1,TextEncoder:!1,URL:!1,URLSearchParams:!1,WebSocket:!1,WindowClient:!1,Worker:!1,WorkerGlobalScope:!1,XMLHttpRequest:!1},atomtest:{advanceClock:!1,fakeClearInterval:!1,fakeClearTimeout:!1,fakeSetInterval:!1,fakeSetTimeout:!1,resetTimeouts:!1,waitsForPromise:!1},embertest:{andThen:!1,click:!1,currentPath:!1,currentRouteName:!1,currentURL:!1,fillIn:!1,find:!1,findAll:!1,findWithAssert:!1,keyEvent:!1,pauseTest:!1,resumeTest:!1,triggerEvent:!1,visit:!1,wait:!1},protractor:{$:!1,$$:!1,browser:!1,by:!1,By:!1,DartObject:!1,element:!1,protractor:!1},"shared-node-browser":{clearInterval:!1,clearTimeout:!1,console:!1,setInterval:!1,setTimeout:!1,URL:!1,URLSearchParams:!1},webextensions:{browser:!1,chrome:!1,opr:!1},greasemonkey:{cloneInto:!1,createObjectIn:!1,exportFunction:!1,GM:!1,GM_addStyle:!1,GM_deleteValue:!1,GM_getResourceText:!1,GM_getResourceURL:!1,GM_getValue:!1,GM_info:!1,GM_listValues:!1,GM_log:!1,GM_openInTab:!1,GM_registerMenuCommand:!1,GM_setClipboard:!1,GM_setValue:!1,GM_xmlhttpRequest:!1,unsafeWindow:!1},devtools:{$:!1,$_:!1,$$:!1,$0:!1,$1:!1,$2:!1,$3:!1,$4:!1,$x:!1,chrome:!1,clear:!1,copy:!1,debug:!1,dir:!1,dirxml:!1,getEventListeners:!1,inspect:!1,keys:!1,monitor:!1,monitorEvents:!1,profile:!1,profileEnd:!1,queryObjects:!1,table:!1,undebug:!1,unmonitor:!1,unmonitorEvents:!1,values:!1}};var Ip=function(e){return null!=e&&(e&&"false"!==e&&"0"!==e)}(Gr.env.BABEL_8_BREAKING)?Sp?Cp:(Sp=1,Cp=Tp):Pp?kp:(Pp=1,kp=Fp),_p=Ga,Bp=cs,Op=ac,Np=El,Mp=Ds,Lp=C,Up=Vt,Gp=rr,Vp=ye,zp=ve,qp=be,Wp=Re,Hp=xe,Kp=L,Xp=G,Jp=je,Yp=$t,$p=Qt,Qp=sr,Zp=H,ef=Q,tf=Zt,rf=Jt,af=K,nf=Fe,sf=Ie,of=_e,df=ie,uf=de,cf=ce,lf=cr,pf=Fs,ff=Cs,gf=pl,hf=Ks,yf=Js,mf=Ys,vf=xt,bf=Et,Rf=ee,xf=Dt,Ef=Se,Df=qe,jf=nr;function wf(e,t){switch(null==e?void 0:e.type){default:if(Jp(e)||jf(e))if((qp(e)||Hp(e)||Jp(e))&&e.source)wf(e.source,t);else if((Hp(e)||Jp(e))&&e.specifiers&&e.specifiers.length)for(var r,a=x(e.specifiers);!(r=a()).done;){wf(r.value,t)}else(Wp(e)||Hp(e))&&e.declaration&&wf(e.declaration,t);else Qp(e)?wf(e.local,t):!Yp(e)||Zp(e)||af(e)||of(e)||t.push(e.value);break;case"MemberExpression":case"OptionalMemberExpression":case"JSXMemberExpression":wf(e.object,t),wf(e.property,t);break;case"Identifier":case"JSXIdentifier":t.push(e.name);break;case"CallExpression":case"OptionalCallExpression":case"NewExpression":wf(e.callee,t);break;case"ObjectExpression":case"ObjectPattern":for(var n,s=x(e.properties);!(n=s()).done;){wf(n.value,t)}break;case"SpreadElement":case"RestElement":case"UnaryExpression":case"UpdateExpression":wf(e.argument,t);break;case"ObjectProperty":case"ObjectMethod":case"ClassProperty":case"ClassMethod":case"ClassPrivateProperty":case"ClassPrivateMethod":wf(e.key,t);break;case"ThisExpression":t.push("this");break;case"Super":t.push("super");break;case"Import":t.push("import");break;case"DoExpression":t.push("do");break;case"YieldExpression":t.push("yield"),wf(e.argument,t);break;case"AwaitExpression":t.push("await"),wf(e.argument,t);break;case"AssignmentExpression":wf(e.left,t);break;case"VariableDeclarator":case"FunctionExpression":case"FunctionDeclaration":case"ClassExpression":case"ClassDeclaration":case"PrivateName":wf(e.id,t);break;case"ParenthesizedExpression":wf(e.expression,t);break;case"MetaProperty":wf(e.meta,t),wf(e.property,t);break;case"JSXElement":wf(e.openingElement,t);break;case"JSXOpeningElement":wf(e.name,t);break;case"JSXFragment":wf(e.openingFragment,t);break;case"JSXOpeningFragment":t.push("Fragment");break;case"JSXNamespacedName":wf(e.namespace,t),wf(e.name,t)}}var Af={ForStatement:function(e){var t=e.get("init");if(t.isVar()){var r=e.scope;(r.getFunctionParent()||r.getProgramParent()).registerBinding("var",t)}},Declaration:function(e){e.isBlockScoped()||(e.isImportDeclaration()||e.isExportDeclaration()||(e.scope.getFunctionParent()||e.scope.getProgramParent()).registerDeclaration(e))},ImportDeclaration:function(e){e.scope.getBlockParent().registerDeclaration(e)},ReferencedIdentifier:function(e,t){t.references.push(e)},ForXStatement:function(e,t){var r=e.get("left");if(r.isPattern()||r.isIdentifier())t.constantViolations.push(e);else if(r.isVar()){var a=e.scope;(a.getFunctionParent()||a.getProgramParent()).registerBinding("var",r)}},ExportDeclaration:{exit:function(e){var t=e.node,r=e.scope;if(!qp(t)){var a=t.declaration;if(zp(a)||Kp(a)){var n=a.id;if(!n)return;var s=r.getBinding(n.name);null==s||s.reference(e)}else if(cf(a))for(var i,o=x(a.declarations);!(i=o()).done;)for(var d=i.value,u=0,c=Object.keys(Np(d));u1&&(r+=t),"_"+r},t.generateUidBasedOnNode=function(e,t){var r=[];wf(e,r);var a=r.join("$");return a=a.replace(/^_/,"")||t||"ref",this.generateUid(a.slice(0,20))},t.generateUidIdentifierBasedOnNode=function(e,t){return Mp(this.generateUidBasedOnNode(e,t))},t.isStatic=function(e){if(df(e)||nf(e)||xf(e))return!0;if(Xp(e)){var t=this.getBinding(e.name);return t?t.constant:this.hasBinding(e.name)}return!1},t.maybeGenerateMemoised=function(e,t){if(this.isStatic(e))return null;var r=this.generateUidIdentifierBasedOnNode(e);return t?r:(this.push({id:r}),Op(r))},t.checkBlockScopedCollisions=function(e,t,r,a){if("param"!==t&&("local"!==e.kind&&("let"===t||"let"===e.kind||"const"===e.kind||"module"===e.kind||"param"===e.kind&&"const"===t)))throw this.hub.buildError(a,'Duplicate declaration "'+r+'"',TypeError)},t.rename=function(e,t){var r=this.getBinding(e);if(r){t||(t=this.generateUidIdentifier(e).name);var a=new wp(r,e,t);a.rename(arguments[2])}},t._renameFromMap=function(e,t,r,a){e[t]&&(e[r]=a,e[t]=null)},t.dump=function(){var e="-".repeat(60);console.log(e);var t=this;do{console.log("#",t.block.type);for(var r=0,a=Object.keys(t.bindings);r0)&&this.isPure(e.body,t));if(Vp(e)){for(var i,o=x(e.body);!(i=o()).done;){var d=i.value;if(!this.isPure(d,t))return!1}return!0}if(Up(e))return this.isPure(e.left,t)&&this.isPure(e.right,t);if(Lp(e)||bf(e)){for(var u,c=x(e.elements);!(u=c()).done;){var l=u.value;if(null!==l&&!this.isPure(l,t))return!1}return!0}if(ef(e)||vf(e)){for(var p,f=x(e.properties);!(p=f()).done;){var g=p.value;if(!this.isPure(g,t))return!1}return!0}if($p(e))return!(e.computed&&!this.isPure(e.key,t))&&!((null==(n=e.decorators)?void 0:n.length)>0);if(tf(e))return!(e.computed&&!this.isPure(e.key,t))&&(!((null==(s=e.decorators)?void 0:s.length)>0)&&!((Rf(e)||e.static)&&null!==e.value&&!this.isPure(e.value,t)));if(uf(e))return this.isPure(e.argument,t);if(sf(e))return lf(e.tag,"String.raw")&&!this.hasBinding("String",!0)&&this.isPure(e.quasi,t);if(of(e)){for(var h,y=x(e.expressions);!(h=y()).done;){var m=h.value;if(!this.isPure(m,t))return!1}return!0}return rf(e)},t.setData=function(e,t){return this.data[e]=t},t.getData=function(e){var t=this;do{var r=t.data[e];if(null!=r)return r}while(t=t.parent)},t.removeData=function(e){var t=this;do{null!=t.data[e]&&(t.data[e]=null)}while(t=t.parent)},t.init=function(){this.inited||(this.inited=!0,this.crawl())},t.crawl=function(){var e=this.path;this.references=Object.create(null),this.bindings=Object.create(null),this.globals=Object.create(null),this.uids=Object.create(null),this.data=Object.create(null);var t=this.getProgramParent();if(!t.crawling){var r={references:[],constantViolations:[],assignments:[]};if(this.crawling=!0,"Program"!==e.type&&Af._exploded){for(var a,n=x(Af.enter);!(a=n()).done;){(0,a.value)(e,r)}var s=Af[e.type];if(s)for(var i,o=x(s.enter);!(i=o()).done;){(0,i.value)(e,r)}}e.traverse(Af,r),this.crawling=!1;for(var d,u=x(r.assignments);!(d=u()).done;){for(var c=d.value,l=c.getBindingIdentifiers(),p=0,f=Object.keys(l);p>18&63]+If[n>>12&63]+If[n>>6&63]+If[63&n]);return s.join("")}function Lf(e){var t;Of||Nf();for(var r=e.length,a=r%3,n="",s=[],i=16383,o=0,d=r-a;od?d:o+i));return 1===a?(t=e[r-1],n+=If[t>>2],n+=If[t<<4&63],n+="=="):2===a&&(t=(e[r-2]<<8)+e[r-1],n+=If[t>>10],n+=If[t>>4&63],n+=If[t<<2&63],n+="="),s.push(n),s.join("")}function Uf(e,t,r,a,n){var s,i,o=8*n-a-1,d=(1<>1,c=-7,l=r?n-1:0,p=r?-1:1,f=e[t+l];for(l+=p,s=f&(1<<-c)-1,f>>=-c,c+=o;c>0;s=256*s+e[t+l],l+=p,c-=8);for(i=s&(1<<-c)-1,s>>=-c,c+=a;c>0;i=256*i+e[t+l],l+=p,c-=8);if(0===s)s=1-u;else{if(s===d)return i?NaN:1/0*(f?-1:1);i+=Math.pow(2,a),s-=u}return(f?-1:1)*i*Math.pow(2,s-a)}function Gf(e,t,r,a,n,s){var i,o,d,u=8*s-n-1,c=(1<>1,p=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,f=a?0:s-1,g=a?1:-1,h=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(o=isNaN(t)?1:0,i=c):(i=Math.floor(Math.log(t)/Math.LN2),t*(d=Math.pow(2,-i))<1&&(i--,d*=2),(t+=i+l>=1?p/d:p*Math.pow(2,1-l))*d>=2&&(i++,d/=2),i+l>=c?(o=0,i=c):i+l>=1?(o=(t*d-1)*Math.pow(2,n),i+=l):(o=t*Math.pow(2,l-1)*Math.pow(2,n),i=0));n>=8;e[r+f]=255&o,f+=g,o/=256,n-=8);for(i=i<0;e[r+f]=255&i,f+=g,i/=256,u-=8);e[r+f-g]|=128*h}var Vf={}.toString,zf=Array.isArray||function(e){return"[object Array]"==Vf.call(e)};function qf(){return Hf.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Wf(e,t){if(qf()=qf())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+qf().toString(16)+" bytes");return 0|e}function Qf(e){return!(null==e||!e._isBuffer)}function Zf(e,t){if(Qf(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var a=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return Ag(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return Cg(e).length;default:if(a)return Ag(e).length;t=(""+t).toLowerCase(),a=!0}}function eg(e,t,r){var a=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return hg(this,t,r);case"utf8":case"utf-8":return lg(this,t,r);case"ascii":return fg(this,t,r);case"latin1":case"binary":return gg(this,t,r);case"base64":return cg(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return yg(this,t,r);default:if(a)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),a=!0}}function tg(e,t,r){var a=e[t];e[t]=e[r],e[r]=a}function rg(e,t,r,a,n){if(0===e.length)return-1;if("string"==typeof r?(a=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=n?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(n)return-1;r=e.length-1}else if(r<0){if(!n)return-1;r=0}if("string"==typeof t&&(t=Hf.from(t,a)),Qf(t))return 0===t.length?-1:ag(e,t,r,a,n);if("number"==typeof t)return t&=255,Hf.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):ag(e,[t],r,a,n);throw new TypeError("val must be string, number or Buffer")}function ag(e,t,r,a,n){var s,i=1,o=e.length,d=t.length;if(void 0!==a&&("ucs2"===(a=String(a).toLowerCase())||"ucs-2"===a||"utf16le"===a||"utf-16le"===a)){if(e.length<2||t.length<2)return-1;i=2,o/=2,d/=2,r/=2}function u(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(n){var c=-1;for(s=r;so&&(r=o-d),s=r;s>=0;s--){for(var l=!0,p=0;pn&&(a=n):a=n;var s=t.length;if(s%2!=0)throw new TypeError("Invalid hex string");a>s/2&&(a=s/2);for(var i=0;i>8,n=r%256,s.push(n),s.push(a);return s}(t,e.length-r),e,r,a)}function cg(e,t,r){return 0===t&&r===e.length?Lf(e):Lf(e.slice(t,r))}function lg(e,t,r){r=Math.min(e.length,r);for(var a=[],n=t;n239?4:u>223?3:u>191?2:1;if(n+l<=r)switch(l){case 1:u<128&&(c=u);break;case 2:128==(192&(s=e[n+1]))&&(d=(31&u)<<6|63&s)>127&&(c=d);break;case 3:s=e[n+1],i=e[n+2],128==(192&s)&&128==(192&i)&&(d=(15&u)<<12|(63&s)<<6|63&i)>2047&&(d<55296||d>57343)&&(c=d);break;case 4:s=e[n+1],i=e[n+2],o=e[n+3],128==(192&s)&&128==(192&i)&&128==(192&o)&&(d=(15&u)<<18|(63&s)<<12|(63&i)<<6|63&o)>65535&&d<1114112&&(c=d)}null===c?(c=65533,l=1):c>65535&&(c-=65536,a.push(c>>>10&1023|55296),c=56320|1023&c),a.push(c),n+=l}return function(e){var t=e.length;if(t<=pg)return String.fromCharCode.apply(String,e);var r="",a=0;for(;a0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),""},Hf.prototype.compare=function(e,t,r,a,n){if(!Qf(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===a&&(a=0),void 0===n&&(n=this.length),t<0||r>e.length||a<0||n>this.length)throw new RangeError("out of range index");if(a>=n&&t>=r)return 0;if(a>=n)return-1;if(t>=r)return 1;if(this===e)return 0;for(var s=(n>>>=0)-(a>>>=0),i=(r>>>=0)-(t>>>=0),o=Math.min(s,i),d=this.slice(a,n),u=e.slice(t,r),c=0;cn)&&(r=n),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");a||(a="utf8");for(var s=!1;;)switch(a){case"hex":return ng(this,e,t,r);case"utf8":case"utf-8":return sg(this,e,t,r);case"ascii":return ig(this,e,t,r);case"latin1":case"binary":return og(this,e,t,r);case"base64":return dg(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ug(this,e,t,r);default:if(s)throw new TypeError("Unknown encoding: "+a);a=(""+a).toLowerCase(),s=!0}},Hf.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var pg=4096;function fg(e,t,r){var a="";r=Math.min(e.length,r);for(var n=t;na)&&(r=a);for(var n="",s=t;sr)throw new RangeError("Trying to access beyond buffer length")}function vg(e,t,r,a,n,s){if(!Qf(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||te.length)throw new RangeError("Index out of range")}function bg(e,t,r,a){t<0&&(t=65535+t+1);for(var n=0,s=Math.min(e.length-r,2);n>>8*(a?n:1-n)}function Rg(e,t,r,a){t<0&&(t=4294967295+t+1);for(var n=0,s=Math.min(e.length-r,4);n>>8*(a?n:3-n)&255}function xg(e,t,r,a,n,s){if(r+a>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function Eg(e,t,r,a,n){return n||xg(e,0,r,4),Gf(e,t,r,a,23,4),r+4}function Dg(e,t,r,a,n){return n||xg(e,0,r,8),Gf(e,t,r,a,52,8),r+8}Hf.prototype.slice=function(e,t){var r,a=this.length;if((e=~~e)<0?(e+=a)<0&&(e=0):e>a&&(e=a),(t=void 0===t?a:~~t)<0?(t+=a)<0&&(t=0):t>a&&(t=a),t0&&(n*=256);)a+=this[e+--t]*n;return a},Hf.prototype.readUInt8=function(e,t){return t||mg(e,1,this.length),this[e]},Hf.prototype.readUInt16LE=function(e,t){return t||mg(e,2,this.length),this[e]|this[e+1]<<8},Hf.prototype.readUInt16BE=function(e,t){return t||mg(e,2,this.length),this[e]<<8|this[e+1]},Hf.prototype.readUInt32LE=function(e,t){return t||mg(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},Hf.prototype.readUInt32BE=function(e,t){return t||mg(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},Hf.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||mg(e,t,this.length);for(var a=this[e],n=1,s=0;++s=(n*=128)&&(a-=Math.pow(2,8*t)),a},Hf.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||mg(e,t,this.length);for(var a=t,n=1,s=this[e+--a];a>0&&(n*=256);)s+=this[e+--a]*n;return s>=(n*=128)&&(s-=Math.pow(2,8*t)),s},Hf.prototype.readInt8=function(e,t){return t||mg(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},Hf.prototype.readInt16LE=function(e,t){t||mg(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},Hf.prototype.readInt16BE=function(e,t){t||mg(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},Hf.prototype.readInt32LE=function(e,t){return t||mg(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},Hf.prototype.readInt32BE=function(e,t){return t||mg(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},Hf.prototype.readFloatLE=function(e,t){return t||mg(e,4,this.length),Uf(this,e,!0,23,4)},Hf.prototype.readFloatBE=function(e,t){return t||mg(e,4,this.length),Uf(this,e,!1,23,4)},Hf.prototype.readDoubleLE=function(e,t){return t||mg(e,8,this.length),Uf(this,e,!0,52,8)},Hf.prototype.readDoubleBE=function(e,t){return t||mg(e,8,this.length),Uf(this,e,!1,52,8)},Hf.prototype.writeUIntLE=function(e,t,r,a){(e=+e,t|=0,r|=0,a)||vg(this,e,t,r,Math.pow(2,8*r)-1,0);var n=1,s=0;for(this[t]=255&e;++s=0&&(s*=256);)this[t+n]=e/s&255;return t+r},Hf.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||vg(this,e,t,1,255,0),Hf.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},Hf.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||vg(this,e,t,2,65535,0),Hf.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):bg(this,e,t,!0),t+2},Hf.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||vg(this,e,t,2,65535,0),Hf.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):bg(this,e,t,!1),t+2},Hf.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||vg(this,e,t,4,4294967295,0),Hf.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):Rg(this,e,t,!0),t+4},Hf.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||vg(this,e,t,4,4294967295,0),Hf.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Rg(this,e,t,!1),t+4},Hf.prototype.writeIntLE=function(e,t,r,a){if(e=+e,t|=0,!a){var n=Math.pow(2,8*r-1);vg(this,e,t,r,n-1,-n)}var s=0,i=1,o=0;for(this[t]=255&e;++s>0)-o&255;return t+r},Hf.prototype.writeIntBE=function(e,t,r,a){if(e=+e,t|=0,!a){var n=Math.pow(2,8*r-1);vg(this,e,t,r,n-1,-n)}var s=r-1,i=1,o=0;for(this[t+s]=255&e;--s>=0&&(i*=256);)e<0&&0===o&&0!==this[t+s+1]&&(o=1),this[t+s]=(e/i>>0)-o&255;return t+r},Hf.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||vg(this,e,t,1,127,-128),Hf.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},Hf.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||vg(this,e,t,2,32767,-32768),Hf.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):bg(this,e,t,!0),t+2},Hf.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||vg(this,e,t,2,32767,-32768),Hf.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):bg(this,e,t,!1),t+2},Hf.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||vg(this,e,t,4,2147483647,-2147483648),Hf.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):Rg(this,e,t,!0),t+4},Hf.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||vg(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),Hf.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Rg(this,e,t,!1),t+4},Hf.prototype.writeFloatLE=function(e,t,r){return Eg(this,e,t,!0,r)},Hf.prototype.writeFloatBE=function(e,t,r){return Eg(this,e,t,!1,r)},Hf.prototype.writeDoubleLE=function(e,t,r){return Dg(this,e,t,!0,r)},Hf.prototype.writeDoubleBE=function(e,t,r){return Dg(this,e,t,!1,r)},Hf.prototype.copy=function(e,t,r,a){if(r||(r=0),a||0===a||(a=this.length),t>=e.length&&(t=e.length),t||(t=0),a>0&&a=this.length)throw new RangeError("sourceStart out of bounds");if(a<0)throw new RangeError("sourceEnd out of bounds");a>this.length&&(a=this.length),e.length-t=0;--n)e[n+t]=this[n+r];else if(s<1e3||!Hf.TYPED_ARRAY_SUPPORT)for(n=0;n>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(s=t;s55295&&r<57344){if(!n){if(r>56319){(t-=3)>-1&&s.push(239,191,189);continue}if(i+1===a){(t-=3)>-1&&s.push(239,191,189);continue}n=r;continue}if(r<56320){(t-=3)>-1&&s.push(239,191,189),n=r;continue}r=65536+(n-55296<<10|r-56320)}else n&&(t-=3)>-1&&s.push(239,191,189);if(n=null,r<128){if((t-=1)<0)break;s.push(r)}else if(r<2048){if((t-=2)<0)break;s.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;s.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;s.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return s}function Cg(e){return function(e){var t,r,a,n,s,i;Of||Nf();var o=e.length;if(o%4>0)throw new Error("Invalid string. Length must be a multiple of 4");s="="===e[o-2]?2:"="===e[o-1]?1:0,i=new Bf(3*o/4-s),a=s>0?o-4:o;var d=0;for(t=0,r=0;t>16&255,i[d++]=n>>8&255,i[d++]=255&n;return 2===s?(n=_f[e.charCodeAt(t)]<<2|_f[e.charCodeAt(t+1)]>>4,i[d++]=255&n):1===s&&(n=_f[e.charCodeAt(t)]<<10|_f[e.charCodeAt(t+1)]<<4|_f[e.charCodeAt(t+2)]>>2,i[d++]=n>>8&255,i[d++]=255&n),i}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(jg,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function Sg(e,t,r,a){for(var n=0;n=t.length||n>=e.length);++n)t[n+r]=e[n];return n}function Tg(e){return null!=e&&(!!e._isBuffer||kg(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&kg(e.slice(0,0))}(e))}function kg(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var Pg,Fg={exports:{}};function Ig(){return Pg||(Pg=1,function(e,t){!function(e){for(var t=",".charCodeAt(0),r=";".charCodeAt(0),a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=new Uint8Array(64),s=new Uint8Array(128),i=0;i>>=1,u&&(n=-2147483648|-n),r[a]+=n,t}function p(e,r,a){return!(r>=a)&&e.charCodeAt(r)!==t}function f(e){e.sort(g)}function g(e,t){return e[0]-t[0]}function h(e){for(var a=new Int32Array(5),n=16384,s=n-36,i=new Uint8Array(n),o=i.subarray(0,s),u=0,c="",l=0;l0&&(u===n&&(c+=d.decode(i),u=0),i[u++]=r),0!==p.length){a[0]=0;for(var f=0;fs&&(c+=d.decode(o),i.copyWithin(0,s,u),u-=s),f>0&&(i[u++]=t),u=y(i,u,a,g,0),1!==g.length&&(u=y(i,u,a,g,1),u=y(i,u,a,g,2),u=y(i,u,a,g,3),4!==g.length&&(u=y(i,u,a,g,4)))}}}return c+d.decode(i.subarray(0,u))}function y(e,t,r,a,s){var i=a[s],o=i-r[s];r[s]=i,o=o<0?-o<<1|1:o<<1;do{var d=31&o;(o>>>=5)>0&&(d|=32),e[t++]=n[d]}while(o>0);return t}e.decode=u,e.encode=h,Object.defineProperty(e,"__esModule",{value:!0})}(t)}(0,Fg.exports)),Fg.exports}var _g,Bg={exports:{}},Og={exports:{}};function Ng(){return _g||(_g=1,function(e,t){!function(e){for(var t=",".charCodeAt(0),r=";".charCodeAt(0),a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=new Uint8Array(64),s=new Uint8Array(128),i=0;i>>=1,u&&(n=-2147483648|-n),r[a]+=n,t}function p(e,r,a){return!(r>=a)&&e.charCodeAt(r)!==t}function f(e){e.sort(g)}function g(e,t){return e[0]-t[0]}function h(e){for(var a=new Int32Array(5),n=16384,s=n-36,i=new Uint8Array(n),o=i.subarray(0,s),u=0,c="",l=0;l0&&(u===n&&(c+=d.decode(i),u=0),i[u++]=r),0!==p.length){a[0]=0;for(var f=0;fs&&(c+=d.decode(o),i.copyWithin(0,s,u),u-=s),f>0&&(i[u++]=t),u=y(i,u,a,g,0),1!==g.length&&(u=y(i,u,a,g,1),u=y(i,u,a,g,2),u=y(i,u,a,g,3),4!==g.length&&(u=y(i,u,a,g,4)))}}}return c+d.decode(i.subarray(0,u))}function y(e,t,r,a,s){var i=a[s],o=i-r[s];r[s]=i,o=o<0?-o<<1|1:o<<1;do{var d=31&o;(o>>>=5)>0&&(d|=32),e[t++]=n[d]}while(o>0);return t}e.decode=u,e.encode=h,Object.defineProperty(e,"__esModule",{value:!0})}(t)}(0,Og.exports)),Og.exports}var Mg,Lg={exports:{}};function Ug(){return Mg||(Mg=1,function(e,t){e.exports=function(){var e,t=/^[\w+.-]+:\/\//,r=/^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/,a=/^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;function n(e){return t.test(e)}function s(e){return e.startsWith("//")}function i(e){return e.startsWith("/")}function o(e){return e.startsWith("file:")}function d(e){return/^[.?#]/.test(e)}function u(e){var t=r.exec(e);return l(t[1],t[2]||"",t[3],t[4]||"",t[5]||"/",t[6]||"",t[7]||"")}function c(e){var t=a.exec(e),r=t[2];return l("file:","",t[1]||"","",i(r)?r:"/"+r,t[3]||"",t[4]||"")}function l(t,r,a,n,s,i,o){return{scheme:t,user:r,host:a,port:n,path:s,query:i,hash:o,type:e.Absolute}}function p(t){if(s(t)){var r=u("http:"+t);return r.scheme="",r.type=e.SchemeRelative,r}if(i(t)){var a=u("http://foo.com"+t);return a.scheme="",a.host="",a.type=e.AbsolutePath,a}if(o(t))return c(t);if(n(t))return u(t);var d=u("http://foo.com/"+t);return d.scheme="",d.host="",d.type=t?t.startsWith("?")?e.Query:t.startsWith("#")?e.Hash:e.RelativePath:e.Empty,d}function f(e){if(e.endsWith("/.."))return e;var t=e.lastIndexOf("/");return e.slice(0,t+1)}function g(e,t){h(t,t.type),"/"===e.path?e.path=t.path:e.path=f(t.path)+e.path}function h(t,r){for(var a=r<=e.RelativePath,n=t.path.split("/"),s=1,i=0,o=!1,d=1;dn&&(n=i)}h(a,n);var o=a.query+a.hash;switch(n){case e.Hash:case e.Query:return o;case e.RelativePath:var u=a.path.slice(1);return u?d(r||t)&&!d(u)?"./"+u+o:u+o:o||".";case e.AbsolutePath:return a.path+o;default:return a.scheme+"//"+a.user+a.host+a.port+a.path+o}}return function(e){e[e.Empty=1]="Empty",e[e.Hash=2]="Hash",e[e.Query=3]="Query",e[e.RelativePath=4]="RelativePath",e[e.AbsolutePath=5]="AbsolutePath",e[e.SchemeRelative=6]="SchemeRelative",e[e.Absolute=7]="Absolute"}(e||(e={})),y}()}(Lg)),Lg.exports}!function(e,t){!function(e,t,r){function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=a(r);function s(e,t){return t&&!t.endsWith("/")&&(t+="/"),n.default(e,t)}function o(e){if(!e)return"";var t=e.lastIndexOf("/");return e.slice(0,t+1)}var d=0,u=1,c=2,l=3,p=4,f=1,g=2;function h(e,t){var r=y(e,0);if(r===e.length)return e;t||(e=e.slice());for(var a=r;a>1),s=e[n][d]-t;if(0===s)return R=!0,n;s<0?r=n+1:a=n-1}return R=!1,r-1}function E(e,t,r){for(var a=r+1;a=0&&e[a][d]===t;r=a--);return r}function j(){return{lastKey:-1,lastNeedle:-1,lastIndex:-1}}function w(e,t,r,a){var n=r.lastKey,s=r.lastNeedle,i=r.lastIndex,o=0,u=e.length-1;if(a===n){if(t===s)return R=-1!==i&&e[i][d]===t,i;t>=s?o=-1===i?0:i:u=i}return r.lastKey=a,r.lastNeedle=t,r.lastIndex=x(e,t,o,u)}function A(e,t){for(var r=t.map(S),a=0;at;a--)e[a]=e[a-1];e[t]=r}function S(){return{__proto__:null}}var T=function(t,r){var a="string"==typeof t?JSON.parse(t):t;if(!("sections"in a))return new M(a,r);var n=[],s=[],i=[],o=[];k(a,r,n,s,i,o,0,0,1/0,1/0);var d={version:3,file:a.file,names:o,sources:s,sourcesContent:i,mappings:n};return e.presortedDecodedMap(d)};function k(e,t,r,a,n,s,i,o,d,u){for(var c=e.sections,l=0;lg)return;for(var w=I(a,j),A=0===D?f:0,C=b[D],S=0;S=h)return;if(1!==T.length){var _=m+T[u],B=T[c],O=T[l];w.push(4===T.length?[P,_,B,O]:[P,_,B,O,v+T[p]])}else w.push([P])}}}function F(e,t){for(var r=0;r=n.length)return null;var s=n[r],i=V(s,t._decodedMemo,r,a,N);return-1===i?null:s[i]},e.originalPositionFor=function(t,r){var a=r.line,n=r.column,s=r.bias;if(--a<0)throw new Error(_);if(n<0)throw new Error(B);var i=e.decodedMappings(t);if(a>=i.length)return U(null,null,null,null);var o=i[a],d=V(o,t._decodedMemo,a,n,s||N);if(-1===d)return U(null,null,null,null);var f=o[d];if(1===f.length)return U(null,null,null,null);var g=t.names;return U(t.resolvedSources[f[u]],f[c]+1,f[l],5===f.length?g[f[p]]:null)},e.allGeneratedPositionsFor=function(e,t){return r(e,t.source,t.line,t.column,t.bias||O,!0)},e.generatedPositionFor=function(e,t){return r(e,t.source,t.line,t.column,t.bias||N,!1)},e.eachMapping=function(t,r){for(var a=e.decodedMappings(t),n=t.names,s=t.resolvedSources,i=0;i=0&&!(t>=e[a][s]);r=a--);return r}function h(e,t,r){for(var a=e.length;a>t;a--)e[a]=e[a-1];e[t]=r}function y(e){for(var t=e.length,r=t,a=r-1;a>=0&&!(e[a].length>0);r=a,a--);r1?String.fromCharCode(e).repeat(t):String.fromCharCode(e),10!==e?(this._mark(r.line,r.column,r.identifierName,r.identifierNamePos,r.filename),this._position.column+=t):(this._position.line++,this._position.column=0),this._canMarkIdName&&(r.identifierName=void 0,r.identifierNamePos=void 0)},t._append=function(e,t,r){var a=e.length,n=this._position;if(this._last=e.charCodeAt(a-1),++this._appendCount>4096?(this._str,this._buf+=this._str,this._str=e,this._appendCount=0):this._str+=e,r||this._map){var s=t.column,i=t.identifierName,o=t.identifierNamePos,d=t.filename,u=t.line;null==i&&null==o||!this._canMarkIdName||(t.identifierName=void 0,t.identifierNamePos=void 0);var c=e.indexOf("\n"),l=0;for(0!==c&&this._mark(u,s,i,o,d);-1!==c;)n.line++,n.column=0,(l=c+1)=0&&10===this._queue[r].char;r--)t++;return t===e&&10===this._last?t+1:t},t.endsWithCharAndNewline=function(){var e=this._queue,t=this._queueCursor;if(0!==t){if(10!==e[t-1].char)return;return t>1?e[t-2].char:this._last}},t.hasContent=function(){return 0!==this._queueCursor||!!this._last},t.exactSource=function(e,t){if(this._map){this.source("start",e);var r=e.identifierName,a=this._sourcePosition;r&&(this._canMarkIdName=!1,a.identifierName=r),t(),r&&(this._canMarkIdName=!0,a.identifierName=void 0,a.identifierNamePos=void 0),this.source("end",e)}else t()},t.source=function(e,t){this._map&&this._normalizePosition(e,t,0,0)},t.sourceWithOffset=function(e,t,r,a){this._map&&this._normalizePosition(e,t,r,a)},t.withSource=function(e,t,r){this._map&&this.source(e,t),r()},t._normalizePosition=function(e,t,r,a){var n=t[e],s=this._sourcePosition;n&&(s.line=n.line+r,s.column=n.column+a,s.filename=t.filename)},t.getCurrentColumn=function(){for(var e=this._queue,t=this._queueCursor,r=-1,a=0,n=0;n":0,"&&":1,"|":2,"^":3,"&":4,"==":5,"===":5,"!=":5,"!==":5,"<":6,">":6,"<=":6,">=":6,in:6,instanceof:6,">>":7,"<<":7,">>>":7,"+":8,"-":8,"*":9,"/":9,"%":9,"**":10};function dy(e){return qh(e)||iy(e)||Yh(e)}var uy=function(e,t){return vh(t,{superClass:e})},cy=function(e,t){return(_h(t)||Lh(t))&&t.object===e||(mh(t)||Mh(t)||Bh(t))&&t.callee===e||Qh(t)&&t.tag===e||Kh(t)};function ly(e,t){return ch(t)||Oh(t)||Fh(t)||ry(t)}function py(){return!0}function fy(e,t){return zh(t)||Xh(t)||Hh(t)||$h(t)||Jh(t)}function gy(e,t){return gh(t)||ty(t)||cy(e,t)||fh(t)&&sy(e)||xh(t)&&e===t.test||uy(e,t)}function hy(e,t){return cy(e,t)||hh(t,{operator:"**",left:e})||uy(e,t)}function yy(e,t){return!!(ty(t)||gh(t)||xh(t,{test:e})||fh(t)||dy(t))||hy(e,t)}function my(e,t){return mh(t,{callee:e})||_h(t,{object:e})}function vy(e,t){var r=1&t,a=2&t,n=4&t,s=8&t,i=16&t,o=32&t,d=e.length-1;if(!(d<=0)){for(var u=e[d],c=e[--d];d>=0;){if(r&&jh(c,{expression:u})||n&&Dh(c,{declaration:u})||a&&lh(c,{body:u})||s&&Sh(c,{init:u})||i&&Ah(c,{left:u})||o&&Ch(c,{left:u}))return!0;if(!(d>0&&(cy(u,c)&&!Bh(c)||Gh(c)&&c.expressions[0]===u||yh(c)&&!c.prefix||Rh(c,{test:u})||gh(c,{left:u})||ph(c,{left:u}))))return!1;u=c,c=e[--d]}return!1}}var by=Object.freeze({__proto__:null,NullableTypeAnnotation:function(e,t){return ch(t)},FunctionTypeAnnotation:function(e,t,r){if(!(r.length<3))return ry(t)||Fh(t)||ch(t)||ey(t)&&lh(r[r.length-3])},UpdateExpression:function(e,t){return cy(e,t)||uy(e,t)},ObjectExpression:function(e,t,r){return vy(r,3)},DoExpression:function(e,t,r){return!e.async&&vy(r,1)},Binary:function(e,t){if("**"===e.operator&&hh(t,{operator:"**"}))return t.left===e;if(uy(e,t))return!0;if(cy(e,t)||ty(t)||fh(t))return!0;if(gh(t)){var r=t.operator,a=oy[r],n=e.operator,s=oy[n];if(a===s&&t.right===e&&!Ih(t)||a>s)return!0}},UnionTypeAnnotation:ly,IntersectionTypeAnnotation:ly,OptionalIndexedAccessType:function(e,t){return Ph(t,{objectType:e})},TSAsExpression:py,TSSatisfiesExpression:py,TSTypeAssertion:py,TSUnionType:fy,TSIntersectionType:fy,TSInferType:function(e,t){return zh(t)||Xh(t)},TSInstantiationExpression:function(e,t){return(mh(t)||Mh(t)||Bh(t)||Wh(t))&&!!t.typeParameters},BinaryExpression:function(e,t){return"in"===e.operator&&(ay(t)||wh(t))},SequenceExpression:function(e,t){return!(Sh(t)||Zh(t)||Uh(t)||kh(t)&&t.test===e||ny(t)&&t.test===e||Ah(t)&&t.right===e||Vh(t)&&t.discriminant===e||jh(t)&&t.expression===e)},YieldExpression:gy,AwaitExpression:gy,ClassExpression:function(e,t,r){return vy(r,5)},UnaryLike:hy,FunctionExpression:function(e,t,r){return vy(r,5)},ArrowFunctionExpression:function(e,t){return Eh(t)||yy(e,t)},ConditionalExpression:yy,OptionalMemberExpression:my,OptionalCallExpression:my,AssignmentExpression:function(e,t){return!!Nh(e.left)||yy(e,t)},LogicalExpression:function(e,t){if(dy(t))return!0;switch(e.operator){case"||":return!!Ih(t)&&("??"===t.operator||"&&"===t.operator);case"&&":return Ih(t,{operator:"??"});case"??":return Ih(t)&&"??"!==t.operator}},Identifier:function(e,t,r){var a;return!(null==(a=e.extra)||!a.parenthesized||!ph(t,{left:e})||!Th(t.right)&&!bh(t.right)||null!=t.right.id)||("let"===e.name?vy(r,_h(t,{object:e,computed:!0})||Lh(t,{object:e,computed:!0,optional:!1})?57:32):"async"===e.name&&Ch(t)&&e===t.left)}}),Ry=qa,xy=P,Ey=J,Dy=Y;function jy(e){var t={};function r(e,r){var a=t[e];t[e]=a?function(e,t,n){var s=a(e,t,n);return null==s?r(e,t,n):s}:r}for(var a=0,n=Object.keys(e);a2?a(h):"\\x"+("00"+h).slice(-2)})),"`"==R&&(b=b.replace(/\$\{/g,"\\${")),f.isScriptContext&&(b=b.replace(/<\/(script|style)/gi,"<\\/$1").replace(/*/ + + + + + diff --git a/client/packages/lowcoder-sdk-webpack-bundle/tsconfig.json b/client/packages/lowcoder-sdk-webpack-bundle/tsconfig.json new file mode 100644 index 000000000..d4d4da718 --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compilerOptions": { + "target": "ESNext", + "experimentalDecorators": true, + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "declaration": true, + "declarationDir": "types", + "noEmit": false, + "emitDeclarationOnly": true, + "jsx": "react-jsx", + "baseUrl": "./src", + "paths": { + "*": [ + "*", + "../../lowcoder/src/*", + "../../lowcoder-comps/src/*", + "../../lowcoder-design/src/*" + ], + "@lowcoder-ee/*": ["../../lowcoder/src/*"] + } + }, + "exclude": ["../lowcoder/src/ee/*"], + "include": [ + "src", + "index.tsx", + "../lowcoder/src", + "../lowcoder-comps/src", + "../lowcoder-design/src" + ] +} diff --git a/client/packages/lowcoder-sdk-webpack-bundle/webpack.config.cjs b/client/packages/lowcoder-sdk-webpack-bundle/webpack.config.cjs new file mode 100644 index 000000000..a644d027d --- /dev/null +++ b/client/packages/lowcoder-sdk-webpack-bundle/webpack.config.cjs @@ -0,0 +1,155 @@ +const path = require("path"); +const TerserPlugin = require('terser-webpack-plugin'); +const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin'); +const webpack = require("webpack"); +const CopyPlugin = require("copy-webpack-plugin"); +const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; +const JSEntryWebpackPlugin = require('./plugins/JSEntryWebpackPlugin.cjs'); + +const { buildVars } = require("./src/dev-utils/buildVars.cjs"); +const isVisualizerEnabled = !!process.env.ENABLE_VISUALIZER; + +const define = {}; +buildVars.forEach(({ name, defaultValue }) => { + define[name] = JSON.stringify(process.env[name] || defaultValue); +}); + +const apiBaseUrl = "http://localhost:8000"; + +module.exports = { + mode: 'production', + entry: "./index.jsx", + // externals: { + // 'react': 'React', + // 'react-dom': 'ReactDOM', + // }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + }, + }, + ], + exclude: /node_modules/, + }, + { + test: /\.(js|jsx)$/, + exclude: /node_modules/, + use: ["babel-loader"], + }, + { + test: /\.css$/, + use: ["style-loader", "css-loader"], + }, + { + test: /\.less$/, + use: ["style-loader", "css-loader", "less-loader"], + }, + { + test: /\.svg$/i, + issuer: /\.[jt]sx?$/, + use: [ + { + loader: '@svgr/webpack', + options: { + svgoConfig: { + svgo: false, + }, + }, + }, + 'url-loader' + ] + }, + { + test: /\.(pdf|jpg|png|gif|ico)$/, + use: [ + { + loader: "url-loader", + }, + ], + }, + { + test: /\.(woff|woff2|eot|ttf|otf)$/, + loader: "file-loader", + }, + { + test: /\.md$/, + use: 'raw-loader' + } + ], + }, + resolve: { + extensions: [".*", ".js", ".jsx", ".ts", ".tsx"], + alias: { + "lowcoder-sdk": path.resolve(__dirname, "../lowcoder/src/index.sdk"), + "@lowcoder-ee": path.resolve(__dirname, "../lowcoder/src"), + }, + plugins: [new TsconfigPathsPlugin({ + configFile: "../lowcoder/tsconfig.json" + })] + }, + output: { + path: path.resolve(__dirname, 'dist'), + publicPath: "https://sdk.lowcoder.cloud/", + filename: '[name].bundle.js', + clean: true, + }, + plugins: [ + new webpack.DefinePlugin({ + ...define, + REACT_APP_API_HOST: JSON.stringify(apiBaseUrl), + REACT_APP_BUNDLE_TYPE: JSON.stringify("sdk"), + }), + new webpack.IgnorePlugin({ + resourceRegExp: /.test.(ts|tsx)$/, + }), + new JSEntryWebpackPlugin({ + path: path.resolve(__dirname, 'bundle'), + filename: 'bundle.js' + }), + // new CopyPlugin({ + // patterns: [ + // "./index.html", + // ], + // }), + new CopyPlugin({ + patterns: [ + "./index.html", + { + from: 'src/custom_component/*.html', // Path to source files + to: '[name][ext]', // Pattern for the output, '[name][ext]' will keep the original file name and extension + }, + { + from: 'src/custom_component/index_custom_component_files', // Path to your folder + to: 'index_custom_component_files/', // Destination path in the dist folder + }, + { + from: 'netlify.toml', // Path to your netlify.toml file + to: 'netlify.toml', // Destination filename in the dist folder + }, + ], + }), + isVisualizerEnabled && new BundleAnalyzerPlugin() + ], + optimization: { + minimize: true, + minimizer: [new TerserPlugin({ + // Your customization if any + })], + sideEffects: true, + splitChunks: { + chunks: 'all', + }, + runtimeChunk: 'single', + }, + devServer: { + static: { + directory: path.join(__dirname, "dist"), + }, + }, +}; diff --git a/client/packages/lowcoder-sdk/.gitignore b/client/packages/lowcoder-sdk/.gitignore index cf72cd865..3c851814f 100644 --- a/client/packages/lowcoder-sdk/.gitignore +++ b/client/packages/lowcoder-sdk/.gitignore @@ -1,3 +1,4 @@ /node_modules /dist +/bundle /types \ No newline at end of file diff --git a/client/packages/lowcoder-sdk/package.json b/client/packages/lowcoder-sdk/package.json index 69c8c3248..d269e29e3 100644 --- a/client/packages/lowcoder-sdk/package.json +++ b/client/packages/lowcoder-sdk/package.json @@ -1,6 +1,6 @@ { "name": "lowcoder-sdk", - "version": "2.3.4", + "version": "2.4.3", "type": "module", "files": [ "src", @@ -16,6 +16,10 @@ "import": "./dist/lowcoder-sdk.js", "require": "./dist/lowcoder-sdk.js" }, + "./appView": { + "import": "./dist/appView.js", + "require": "./dist/appView.js" + }, "./dataSource": { "types": "./dataSource.d.ts" }, diff --git a/client/packages/lowcoder-sdk/tsconfig.json b/client/packages/lowcoder-sdk/tsconfig.json index 8bf21e74d..d4d4da718 100644 --- a/client/packages/lowcoder-sdk/tsconfig.json +++ b/client/packages/lowcoder-sdk/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "ESNext", "experimentalDecorators": true, "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, diff --git a/client/packages/lowcoder-sdk/vite.config.mts b/client/packages/lowcoder-sdk/vite.config.mts index 9f63257d4..1a2ca402c 100644 --- a/client/packages/lowcoder-sdk/vite.config.mts +++ b/client/packages/lowcoder-sdk/vite.config.mts @@ -1,4 +1,4 @@ -import { defineConfig, UserConfig } from "vite"; +import { defineConfig, UserConfig, PluginOption } from "vite"; import react from "@vitejs/plugin-react"; import viteTsconfigPaths from "vite-tsconfig-paths"; import svgrPlugin from "vite-plugin-svgr"; @@ -6,6 +6,10 @@ import path from "path"; import { ensureLastSlash } from "./src/dev-utils/util"; import { buildVars } from "./src/dev-utils/buildVars"; import { globalDepPlugin } from "./src/dev-utils/globalDepPlguin"; +import dynamicImport from 'vite-plugin-dynamic-import'; +import { visualizer } from "rollup-plugin-visualizer"; + +const isVisualizerEnabled = !!process.env.ENABLE_VISUALIZER; const define = {}; buildVars.forEach(({ name, defaultValue }) => { @@ -41,6 +45,12 @@ export const viteConfig: UserConfig = { output: { chunkFileNames: "[hash].js", }, + onwarn: (warning, warn) => { + if (warning.code === 'MODULE_LEVEL_DIRECTIVE') { + return + } + warn(warning) + }, }, commonjsOptions: { defaultIsModuleExports: (id) => { @@ -97,6 +107,14 @@ export const viteConfig: UserConfig = { ref: true, }, }), + dynamicImport(), + isVisualizerEnabled && visualizer({ + template: "treemap", // or sunburst + open: true, + gzipSize: true, + brotliSize: true, + filename: "analyse.html" + }) as PluginOption, ], }; diff --git a/client/packages/lowcoder/package.json b/client/packages/lowcoder/package.json index 13c8bd729..62560576b 100644 --- a/client/packages/lowcoder/package.json +++ b/client/packages/lowcoder/package.json @@ -36,14 +36,12 @@ "@types/react-signature-canvas": "^1.0.2", "@types/react-test-renderer": "^18.0.0", "@types/react-virtualized": "^9.21.21", - "agora-access-token": "^2.0.4", - "agora-rtc-sdk-ng": "^4.19.0", - "agora-rtm-sdk": "^1.5.1", - "antd": "^5.13.2", + "antd": "5.13.2", "axios": "^1.6.2", "buffer": "^6.0.3", "clsx": "^2.0.0", "cnchar": "^3.2.4", + "coolshapes-react": "lowcoder-org/coolshapes-react", "copy-to-clipboard": "^3.3.3", "core-js": "^3.25.2", "echarts": "^5.4.3", @@ -95,7 +93,7 @@ "resize-observer-polyfill": "^1.5.1", "simplebar-react": "^3.2.4", "sql-formatter": "^8.2.0", - "styled-components": "^6.1.6", + "styled-components": "^6.1.8", "stylis": "^4.1.1", "tern": "^0.24.3", "typescript-collections": "^1.3.3", @@ -127,6 +125,7 @@ "typescript": "^4.8.4", "vite": "^4.5.2", "vite-plugin-checker": "^0.5.1", + "vite-plugin-dynamic-import": "^1.5.0", "vite-plugin-html": "^3.2.0", "vite-plugin-svgr": "^2.2.2", "vite-tsconfig-paths": "^3.6.0" diff --git a/client/packages/lowcoder/src/api/apiUtils.ts b/client/packages/lowcoder/src/api/apiUtils.ts index 485264c81..826ae90ed 100644 --- a/client/packages/lowcoder/src/api/apiUtils.ts +++ b/client/packages/lowcoder/src/api/apiUtils.ts @@ -14,7 +14,7 @@ import axios, { AxiosError, AxiosRequestConfig, AxiosResponse, InternalAxiosRequ import { trans } from "i18n"; import StoreRegistry from "redux/store/storeRegistry"; import { logoutAction } from "redux/reduxActions/userActions"; -import { messageInstance } from "lowcoder-design"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; const executeActionRegex = /query\/execute/; const timeoutErrorRegex = /timeout of (\d+)ms exceeded/; diff --git a/client/packages/lowcoder/src/api/applicationApi.ts b/client/packages/lowcoder/src/api/applicationApi.ts index 06659a441..10398d036 100644 --- a/client/packages/lowcoder/src/api/applicationApi.ts +++ b/client/packages/lowcoder/src/api/applicationApi.ts @@ -28,6 +28,7 @@ export interface HomeOrgMeta { id: string; name: string; commonSettings: CommonSettingResponseData; + createdBy: string; } export interface HomeData { diff --git a/client/packages/lowcoder/src/api/userApi.ts b/client/packages/lowcoder/src/api/userApi.ts index b599ed061..c171ab4ab 100644 --- a/client/packages/lowcoder/src/api/userApi.ts +++ b/client/packages/lowcoder/src/api/userApi.ts @@ -38,6 +38,26 @@ export interface GetUserResponse extends ApiResponse { } & BaseUserInfo; } +export interface ApiKeyPayload { + name: string; + description?: string; +} + +export interface ResetLostPasswordPayload { + token: string; + userEmail: string; + newPassword: string; +} + +export interface FetchApiKeysResponse extends ApiResponse { + data: { + id: string; + name: string; + description: string; + token: string; + } +} + export type GetCurrentUserResponse = GenericApiResponse; class UserApi extends Api { @@ -55,6 +75,11 @@ class UserApi extends Api { static markUserStatusURL = "/users/mark-status"; static userDetailURL = (id: string) => `/users/userDetail/${id}`; static resetPasswordURL = `/users/reset-password`; + static forgotPasswordURL = `/users/lost-password`; + static resetLostPasswordURL = `/users/reset-lost-password`; + static fetchApiKeysURL = `/auth/api-keys`; + static createApiKeyURL = `/auth/api-key`; + static deleteApiKeyURL = (id: string) => `/auth/api-key/${id}`; static thirdPartyLogin( request: ThirdPartyAuthRequest & CommonLoginParam @@ -120,6 +145,33 @@ class UserApi extends Api { static resetPassword(userId: string): AxiosPromise { return Api.post(UserApi.resetPasswordURL, { userId: userId }); } + + static forgotPassword(userEmail: string): AxiosPromise { + return Api.post(UserApi.forgotPasswordURL, { userEmail }); + } + + static resetLostPassword(request: ResetLostPasswordPayload): AxiosPromise { + // console.log(request); + return Api.post(UserApi.resetLostPasswordURL, request); + } + + static createApiKey({ + name, + description = '' + }: ApiKeyPayload): AxiosPromise { + return Api.post(UserApi.createApiKeyURL, { + name, + description + }); + } + + static fetchApiKeys(): AxiosPromise { + return Api.get(UserApi.fetchApiKeysURL); + } + + static deleteApiKey(apiKeyId: string): AxiosPromise { + return Api.delete(UserApi.deleteApiKeyURL(apiKeyId)); + } } export default UserApi; diff --git a/client/packages/lowcoder/src/app.tsx b/client/packages/lowcoder/src/app.tsx index b9837726f..d252efcd2 100644 --- a/client/packages/lowcoder/src/app.tsx +++ b/client/packages/lowcoder/src/app.tsx @@ -1,6 +1,9 @@ import { default as App } from "antd/es/app"; import { default as ConfigProvider } from "antd/es/config-provider"; import { + USER_PROFILE_URL, + NEWS_URL, + ORG_HOME_URL, ALL_APPLICATIONS_URL, APP_EDITOR_URL, APPLICATION_VIEW_URL, @@ -14,7 +17,6 @@ import { IMPORT_APP_FROM_TEMPLATE_URL, INVITE_LANDING_URL, isAuthUnRequired, - MARKETPLACE_TYPE_URL, MARKETPLACE_URL, ORG_AUTH_LOGIN_URL, ORG_AUTH_REGISTER_URL, @@ -22,31 +24,31 @@ import { SETTING, TRASH_URL, USER_AUTH_URL, + ADMIN_APP_URL, + ORG_AUTH_FORGOT_PASSWORD_URL, + ORG_AUTH_RESET_PASSWORD_URL, } from "constants/routesURL"; + import React from "react"; import { createRoot } from "react-dom/client"; import { Helmet } from "react-helmet"; import { connect, Provider } from "react-redux"; -import { Redirect, Route, Router, Switch } from "react-router-dom"; -import { AppState } from "redux/reducers"; +import { Redirect, Router, Switch } from "react-router-dom"; +import type { AppState } from "redux/reducers"; import { fetchConfigAction } from "redux/reduxActions/configActions"; import { fetchUserAction } from "redux/reduxActions/userActions"; import { reduxStore } from "redux/store/store"; import { developEnv } from "util/envUtils"; import history from "util/history"; import LazyRoute from "components/LazyRoute"; -import AppFromTemplate from "pages/ApplicationV2/AppFromTemplate"; -import AppEditor from "pages/editor/AppEditor"; import { getAntdLocale } from "i18n/antdLocale"; -import { CodeEditorTooltipContainer } from "base/codeEditor/codeEditor"; import { ProductLoading } from "components/ProductLoading"; -import { language, trans } from "i18n"; +import { trans } from "i18n"; // language import { loadComps } from "comps"; import { initApp } from "util/commonUtils"; -import ApplicationHome from "./pages/ApplicationV2"; -import { favicon } from "@lowcoder-ee/assets/images"; +import { favicon } from "assets/images"; import { hasQueryParam } from "util/urlUtils"; -import { isFetchUserFinished } from "redux/selectors/usersSelectors"; +import { isFetchUserFinished } from "redux/selectors/usersSelectors"; // getCurrentUser, import { SystemWarning } from "./components/SystemWarning"; import { getBrandingConfig } from "./redux/selectors/configSelectors"; import { buildMaterialPreviewURL } from "./util/materialUtils"; @@ -56,13 +58,16 @@ const LazyUserAuthComp = React.lazy(() => import("pages/userAuth")); const LazyInviteLanding = React.lazy(() => import("pages/common/inviteLanding")); const LazyComponentDoc = React.lazy(() => import("pages/ComponentDoc")); const LazyComponentPlayground = React.lazy(() => import("pages/ComponentPlayground")); +const LazyAppEditor = React.lazy(() => import("pages/editor/AppEditor")); +const LazyAppFromTemplate = React.lazy(() => import("pages/ApplicationV2/AppFromTemplate")); +const LazyApplicationHome = React.lazy(() => import("pages/ApplicationV2")); const LazyDebugComp = React.lazy(() => import("./debug")); const LazyDebugNewComp = React.lazy(() => import("./debugNew")); -const Wrapper = (props: { children: React.ReactNode }) => ( +const Wrapper = (props: { children: React.ReactNode, language: string }) => ( @@ -80,6 +85,7 @@ type AppIndexProps = { getCurrentUser: () => void; favicon: string; brandName: string; + uiLanguage: string; }; class AppIndex extends React.Component { @@ -105,8 +111,14 @@ class AppIndex extends React.Component { const hideLoadingHeader = isTemplate || isAuthUnRequired(pathname); return ; } + + // persisting the language in local storage + localStorage.setItem('lowcoder_uiLanguage', this.props.uiLanguage); + + // console.log("this.props.defaultHomePage: ", this.props.defaultHomePage) + return ( - + {{this.props.brandName}} {} @@ -119,32 +131,40 @@ class AppIndex extends React.Component { , , // adding Clearbit Support for Analytics - + ]} - {!this.props.orgDev && !!this.props.defaultHomePage ? ( - ) : ( - + )} {!this.props.orgDev && !!this.props.defaultHomePage && ( - + )} */} + + {!this.props.orgDev ? ( + + ) : ( + )} - - - + + { TRASH_URL, SETTING, MARKETPLACE_URL, + ADMIN_APP_URL, ]} // component={ApplicationListPage} - component={ApplicationHome} + component={LazyApplicationHome} /> + + @@ -171,7 +194,7 @@ class AppIndex extends React.Component { <> - + )} @@ -191,6 +214,7 @@ const mapStateToProps = (state: AppState) => ({ ? buildMaterialPreviewURL(getBrandingConfig(state)?.favicon!) : favicon, brandName: getBrandingConfig(state)?.brandName ?? trans("productName"), + uiLanguage: state.ui.users.user.uiLanguage, }); const mapDispatchToProps = (dispatch: any) => ({ @@ -205,6 +229,7 @@ const AppIndexWithProps = connect(mapStateToProps, mapDispatchToProps)(AppIndex) export function bootstrap() { initApp(); loadComps(); + const container = document.getElementById("root"); const root = createRoot(container!); root.render( diff --git a/client/packages/lowcoder/src/appView/AppView.tsx b/client/packages/lowcoder/src/appView/AppView.tsx index 2410770e8..4c396c1cd 100644 --- a/client/packages/lowcoder/src/appView/AppView.tsx +++ b/client/packages/lowcoder/src/appView/AppView.tsx @@ -1,3 +1,5 @@ +import { default as App } from "antd/es/app"; +import GlobalInstances from "components/GlobalInstances"; import { RootComp } from "comps/comps/rootComp"; import { GetContainerParams, useCompInstance } from "comps/utils/useCompInstance"; import { createBrowserHistory } from "history"; @@ -88,19 +90,22 @@ export function AppView(props: AppViewProps) { }, [moduleInputs]); return ( - - - - comp?.getView()} /> - - - + + + + + + comp?.getView()} /> + + + + ); } diff --git a/client/packages/lowcoder/src/appView/AppViewInstance.tsx b/client/packages/lowcoder/src/appView/AppViewInstance.tsx index 4163ddfff..90942c946 100644 --- a/client/packages/lowcoder/src/appView/AppViewInstance.tsx +++ b/client/packages/lowcoder/src/appView/AppViewInstance.tsx @@ -1,17 +1,24 @@ -import { ApplicationResp } from "api/applicationApi"; +import type { ApplicationResp } from "api/applicationApi"; import axios from "axios"; -import { RootComp } from "comps/comps/rootComp"; +import type { RootComp } from "comps/comps/rootComp"; import { setGlobalSettings } from "comps/utils/globalSettings"; import { sdkConfig } from "constants/sdkConfig"; -import _ from "lodash"; -import { Root } from "react-dom/client"; +import { get, set, isEqual } from "lodash"; +import type { Root } from "react-dom/client"; import { StyleSheetManager } from "styled-components"; -import { ModuleDSL, ModuleDSLIoInput } from "types/dsl"; -import { AppView } from "./AppView"; +import type { ModuleDSL, ModuleDSLIoInput } from "types/dsl"; import { API_STATUS_CODES } from "constants/apiConstants"; import { AUTH_LOGIN_URL } from "constants/routesURL"; import { AuthSearchParams } from "constants/authConstants"; -import { saveAuthSearchParams } from "@lowcoder-ee/pages/userAuth/authUtils"; +import { saveAuthSearchParams } from "pages/userAuth/authUtils"; +import { Suspense, lazy } from "react"; +import Flex from "antd/es/flex"; +import { TacoButton } from "components/button"; + +const AppView = lazy( + () => import('./AppView') + .then(module => ({default: module.AppView})) +); export type OutputChangeHandler = (output: O) => void; export type EventTriggerHandler = (eventName: string) => void; @@ -28,8 +35,11 @@ export interface AppViewInstanceOptions { baseUrl?: string; webUrl?: string; moduleInputs?: I; + orgId?: string; } +let isAuthButtonClicked = false; + export class AppViewInstance { private comp: RootComp | null = null; private prevOutputs: any = null; @@ -39,12 +49,16 @@ export class AppViewInstance { baseUrl: "https://api-service.lowcoder.cloud", webUrl: "https://app.lowcoder.cloud", }; + private authorizedUser: boolean = true; constructor(private appId: string, private node: Element, private root: Root, options: AppViewInstanceOptions = {}) { Object.assign(this.options, options); if (this.options.baseUrl) { sdkConfig.baseURL = this.options.baseUrl; } + if (this.options.webUrl) { + sdkConfig.webUrl = this.options.webUrl; + } this.dataPromise = this.loadData(); this.render(); @@ -76,7 +90,15 @@ export class AppViewInstance { [AuthSearchParams.redirectUrl]: encodeURIComponent(window.location.href), [AuthSearchParams.loginType]: null, }) - window.location.href = `${webUrl}${AUTH_LOGIN_URL}`; + + this.authorizedUser = false; + return { + data: { + orgCommonSettings: undefined, + applicationDSL: {}, + moduleDSL: {}, + } + }; } }); @@ -90,7 +112,7 @@ export class AppViewInstance { if (this.options.moduleInputs && this.isModuleDSL(finalAppDsl)) { const inputsPath = "ui.comp.io.inputs"; - const nextInputs = _.get(finalAppDsl, inputsPath, []).map((i: ModuleDSLIoInput) => { + const nextInputs = get(finalAppDsl, inputsPath, []).map((i: ModuleDSLIoInput) => { const inputValue = this.options.moduleInputs[i.name]; if (inputValue) { return { @@ -103,7 +125,7 @@ export class AppViewInstance { } return i; }); - _.set(finalAppDsl, inputsPath, nextInputs); + set(finalAppDsl, inputsPath, nextInputs); } return { @@ -128,7 +150,7 @@ export class AppViewInstance { return [name, value]; }) ); - if (!_.isEqual(this.prevOutputs, outputValue)) { + if (!isEqual(this.prevOutputs, outputValue)) { this.prevOutputs = outputValue; this.emit("moduleOutputChange", [outputValue]); } @@ -137,17 +159,50 @@ export class AppViewInstance { private async render() { const data = await this.dataPromise; + const loginUrl = this.options.orgId + ? `${this.options.webUrl}/org/${this.options.orgId}/auth/login` + : `${this.options.webUrl}${AUTH_LOGIN_URL}`; + this.root.render( - - this.handleCompChange(comp)} - onModuleEventTriggered={(eventName) => this.emit("moduleEventTriggered", [eventName])} - /> - + this.authorizedUser ? ( + + + this.handleCompChange(comp)} + onModuleEventTriggered={(eventName) => this.emit("moduleEventTriggered", [eventName])} + /> + + + ) : ( + +

This resource needs authentication.

+ {!isAuthButtonClicked ? ( + { + isAuthButtonClicked = true; + window.open(loginUrl, '_blank'); + this.render(); + }} + > + Login + + ) : ( + { + window.location.reload(); + }} + > + Refresh + + )} +
+ ) ); } diff --git a/client/packages/lowcoder/src/appView/LowcoderAppView.tsx b/client/packages/lowcoder/src/appView/LowcoderAppView.tsx index 1fb1001b9..5800b7ea5 100644 --- a/client/packages/lowcoder/src/appView/LowcoderAppView.tsx +++ b/client/packages/lowcoder/src/appView/LowcoderAppView.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useImperativeHandle, useRef, useState } from "react"; -import { +import type { AppViewInstance, AppViewInstanceOptions, EventTriggerHandler, diff --git a/client/packages/lowcoder/src/appView/bootstrapAt.tsx b/client/packages/lowcoder/src/appView/bootstrapAt.tsx index b7dba8e9d..1ba424eb3 100644 --- a/client/packages/lowcoder/src/appView/bootstrapAt.tsx +++ b/client/packages/lowcoder/src/appView/bootstrapAt.tsx @@ -1,5 +1,5 @@ import { loadComps } from "comps"; -import { AppViewInstance, AppViewInstanceOptions } from "./AppViewInstance"; +import type { AppViewInstanceOptions } from "./AppViewInstance"; import { createRoot } from "react-dom/client"; loadComps(); @@ -13,5 +13,7 @@ export async function bootstrapAppAt( console.error("node must be not null."); return; } + + const { AppViewInstance } = await import("./AppViewInstance"); return new AppViewInstance(appId, node, createRoot(node), options); } diff --git a/client/packages/lowcoder/src/appView/index.ts b/client/packages/lowcoder/src/appView/index.ts new file mode 100644 index 000000000..f5bc9e273 --- /dev/null +++ b/client/packages/lowcoder/src/appView/index.ts @@ -0,0 +1,17 @@ +export { + bootstrapAppAt +} from "appView/bootstrapAt"; +export { + LowcoderAppView +} from "appView/LowcoderAppView"; +export type { + LowcoderAppViewProps +} from "appView/LowcoderAppView"; +export { + AppViewInstance +} from "appView/AppViewInstance"; +export type { + AppViewInstanceOptions, + OutputChangeHandler, + EventTriggerHandler, +} from "appView/AppViewInstance"; \ No newline at end of file diff --git a/client/packages/lowcoder/src/assets/images/Lowcoder-Logo.svg b/client/packages/lowcoder/src/assets/images/Lowcoder-Logo.svg new file mode 100644 index 000000000..4b199dddd --- /dev/null +++ b/client/packages/lowcoder/src/assets/images/Lowcoder-Logo.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/client/packages/lowcoder/src/base/codeEditor/autoFormat.tsx b/client/packages/lowcoder/src/base/codeEditor/autoFormat.tsx index 436b43f92..17b5820a3 100644 --- a/client/packages/lowcoder/src/base/codeEditor/autoFormat.tsx +++ b/client/packages/lowcoder/src/base/codeEditor/autoFormat.tsx @@ -1,8 +1,8 @@ -import { CodeType } from "lowcoder-core"; +import type { CodeType } from "lowcoder-core"; import { relaxedJSONToJSON } from "lowcoder-core"; import { getDynamicStringSegments, isDynamicSegment } from "lowcoder-core"; import { format as formatSQL } from "sql-formatter"; -import { Language } from "./codeEditorTypes"; +import type { Language } from "./codeEditorTypes"; export async function cssFormatter(text: string) { const prettier = await require("prettier/standalone"); @@ -14,7 +14,7 @@ export async function htmlFormatter(text: string) { const prettier = await require("prettier/standalone"); const parserPlugin = await require("prettier/parser-html"); return (await prettier.format(text, { parser: "html", plugins: [parserPlugin], semi: false })).trim(); -} +} async function getJavascriptFormatter() { const prettier = await require("prettier/standalone"); diff --git a/client/packages/lowcoder/src/base/codeEditor/codeEditor.tsx b/client/packages/lowcoder/src/base/codeEditor/codeEditor.tsx index b6ac336bd..594bc3403 100644 --- a/client/packages/lowcoder/src/base/codeEditor/codeEditor.tsx +++ b/client/packages/lowcoder/src/base/codeEditor/codeEditor.tsx @@ -9,9 +9,9 @@ import React, { import styled, { css } from "styled-components"; import { EditorState, EditorView } from "./codeMirror"; import { useExtensions } from "./extensions"; -import { PopupCard } from "lowcoder-design"; +import { PopupCard } from "lowcoder-design/src/components/popupCard"; import { CodeEditorPanel } from "../../pages/editor/codeEditorPanel"; -import { CodeEditorProps, StyleName } from "./codeEditorTypes"; +import type { CodeEditorProps, StyleName } from "./codeEditorTypes"; import { useClickCompNameEffect } from "./clickCompName"; import { Layers } from "../../constants/Layers"; @@ -51,8 +51,10 @@ const textStyle = css` export const CodeEditorTooltipContainer = styled.div` // tooltip common .cm-tooltip { - z-index: ${Layers.codeEditorTooltip}; - border: none; + border: 1px solid #d7d9e0; + padding: 5px !important; + margin-top: 5px !important; + height: 120px; } // make sure antd popover in the code editor available .ant-popover { @@ -84,6 +86,7 @@ export const CodeEditorTooltipContainer = styled.div` border-radius: 8px; box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); transform: translate(-16px, 10px); + z-index: ${Layers.codeEditorTooltip}; } // left minor tooltip @@ -109,6 +112,7 @@ export const CodeEditorTooltipContainer = styled.div` color: #4965f2; ${textStyle}; font-weight: 600; + z-index: ${Layers.codeEditorTooltip}; } .cm-tooltip > .cm-completionInfo .hintDiv:hover { diff --git a/client/packages/lowcoder/src/base/codeEditor/extensions.tsx b/client/packages/lowcoder/src/base/codeEditor/extensions.tsx index 8eea938be..3682cf4e0 100644 --- a/client/packages/lowcoder/src/base/codeEditor/extensions.tsx +++ b/client/packages/lowcoder/src/base/codeEditor/extensions.tsx @@ -30,7 +30,7 @@ import { import { defaultKeymap, history, historyKeymap, indentWithTab } from "@codemirror/commands"; import { highlightSelectionMatches, searchKeymap } from "@codemirror/search"; import { Diagnostic, linter, lintKeymap } from "@codemirror/lint"; -import { EditorState, Prec } from "@codemirror/state"; +import { type EditorState, Prec } from "@codemirror/state"; import { TernServer } from "base/codeEditor/completion/ternServer"; import { MutableRefObject, @@ -41,15 +41,15 @@ import { useRef, useState, } from "react"; -import { CodeEditorProps, Language, MetaDataContext } from "./codeEditorTypes"; +import { type CodeEditorProps, type Language, MetaDataContext } from "./codeEditorTypes"; import { Compartment, EditorView, - Extension, + type Extension, keymap, placeholder as extendPlaceholder, - StateEffect, - ViewUpdate, + type StateEffect, + type ViewUpdate, } from "./codeMirror"; import { ExposingCompletionSource } from "./completion/exposingCompletionSource"; import { SQLCompletionSource } from "./completion/sqlCompletionSource"; @@ -64,7 +64,7 @@ import { highlightJsTheme, useHighlightJsExtension } from "./extensions/highligh import { trans } from "i18n"; import log from "loglevel"; import { highlightSyntaxExtension } from "./extensions/highlightSyntax"; -import { messageInstance } from "lowcoder-design"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; // reference: https://github.com/codemirror/basic-setup/blob/main/src/codemirror.ts const basicSetup = [ diff --git a/client/packages/lowcoder/src/base/codeEditor/extensions/iconExtension.tsx b/client/packages/lowcoder/src/base/codeEditor/extensions/iconExtension.tsx index 4982c0ec9..13f2c5328 100644 --- a/client/packages/lowcoder/src/base/codeEditor/extensions/iconExtension.tsx +++ b/client/packages/lowcoder/src/base/codeEditor/extensions/iconExtension.tsx @@ -1,13 +1,13 @@ import { Decoration, - DecorationSet, + type DecorationSet, EditorView, MatchDecorator, ViewPlugin, - ViewUpdate, + type ViewUpdate, WidgetType, } from "@codemirror/view"; -import { useIcon } from "lowcoder-design"; +import { useIcon } from "lowcoder-design/src/components/iconSelect"; import { createRoot } from "react-dom/client"; import styled from "styled-components"; diff --git a/client/packages/lowcoder/src/components/ApplicationSelect.tsx b/client/packages/lowcoder/src/components/ApplicationSelect.tsx index fd6cba8a6..b9e4ff078 100644 --- a/client/packages/lowcoder/src/components/ApplicationSelect.tsx +++ b/client/packages/lowcoder/src/components/ApplicationSelect.tsx @@ -1,5 +1,5 @@ import { AppTypeEnum } from "constants/applicationConstants"; -import { Dropdown } from "lowcoder-design"; +import { Dropdown } from "lowcoder-design/src/components/Dropdown"; import { trans } from "i18n"; import { ReactNode, useEffect } from "react"; import { useApplicationId } from "util/hooks"; diff --git a/client/packages/lowcoder/src/components/ColorPicker.tsx b/client/packages/lowcoder/src/components/ColorPicker.tsx index 603776420..b461672e2 100644 --- a/client/packages/lowcoder/src/components/ColorPicker.tsx +++ b/client/packages/lowcoder/src/components/ColorPicker.tsx @@ -4,9 +4,9 @@ import { ConfigItem, Radius, Margin, Padding, GridColumns } from "../pages/setti import { isValidColor, toHex } from "components/colorSelect/colorUtils"; import { ColorSelect } from "components/colorSelect"; import { TacoInput } from "components/tacoInput"; -import { TableCellsIcon as GridIcon } from "lowcoder-design"; //Added By Aqib Mirza +import { TableCellsIcon as GridIcon } from "lowcoder-design/src/icons"; //Added By Aqib Mirza -import { ExpandIcon, CompressIcon } from "lowcoder-design"; +import { ExpandIcon, CompressIcon } from "lowcoder-design/src/icons"; export type configChangeParams = { colorKey: string; diff --git a/client/packages/lowcoder/src/components/CompName.tsx b/client/packages/lowcoder/src/components/CompName.tsx index 163f6c704..b350cf746 100644 --- a/client/packages/lowcoder/src/components/CompName.tsx +++ b/client/packages/lowcoder/src/components/CompName.tsx @@ -1,11 +1,13 @@ import { useContext, useEffect, useState } from "react"; import styled from "styled-components"; -import { EditPopoverItemType, PointIcon, Search, SearchOutlinedIcon } from "lowcoder-design"; +import { PointIcon, SearchOutlinedIcon } from "lowcoder-design/src/icons"; +import type { EditPopoverItemType } from 'lowcoder-design/src/components/popover'; +import { Search } from 'lowcoder-design/src/components/Search'; import { EditPopover } from "lowcoder-design"; import { EditorContext } from "comps/editorState"; import { GridCompOperator } from "comps/utils/gridCompOperator"; -import { PopupCard } from "lowcoder-design"; -import { EditText } from "lowcoder-design"; +import { PopupCard } from "lowcoder-design/src/components/popupCard"; +import { EditText } from "lowcoder-design/src/components/edit"; import { values } from "lodash"; import { GreyTextColor } from "constants/style"; import { UICompType } from "comps/uiCompRegistry"; @@ -119,6 +121,13 @@ export const CompName = (props: Iprops) => { onClick: () => { }, }); + items.push({ + text: trans("history.currentVersion") + ": " + compInfo.packageVersion, + onClick: () => { + + }, + }); + items.push({ text: trans("comp.menuUpgradeToLatest"), onClick: () => { diff --git a/client/packages/lowcoder/src/components/EmptyContent.tsx b/client/packages/lowcoder/src/components/EmptyContent.tsx index 5202dae4c..882c18407 100644 --- a/client/packages/lowcoder/src/components/EmptyContent.tsx +++ b/client/packages/lowcoder/src/components/EmptyContent.tsx @@ -1,4 +1,4 @@ -import { labelCss } from "lowcoder-design"; +import { labelCss } from "lowcoder-design/src/components/Label"; import { HTMLAttributes } from "react"; import styled from "styled-components"; diff --git a/client/packages/lowcoder/src/components/EmptyItem.tsx b/client/packages/lowcoder/src/components/EmptyItem.tsx index 5f36d84f4..c0317ad43 100644 --- a/client/packages/lowcoder/src/components/EmptyItem.tsx +++ b/client/packages/lowcoder/src/components/EmptyItem.tsx @@ -1,4 +1,4 @@ -import { labelCss } from "lowcoder-design"; +import { labelCss } from "lowcoder-design/src/components/Label"; import { PropsWithChildren } from "react"; import styled from "styled-components"; diff --git a/client/packages/lowcoder/src/components/InputList.tsx b/client/packages/lowcoder/src/components/InputList.tsx index 12477fc5d..6fd4e8c7b 100644 --- a/client/packages/lowcoder/src/components/InputList.tsx +++ b/client/packages/lowcoder/src/components/InputList.tsx @@ -1,13 +1,13 @@ import { default as Form } from "antd/es/form"; import { default as FormItem } from "antd/es/form/FormItem"; -import { FormListProps, Rule } from "antd/lib/form"; -import { TacoButton } from "lowcoder-design"; -import { Input } from "lowcoder-design"; +import type { FormListProps, Rule } from "antd/es/form"; +import { TacoButton } from "lowcoder-design/src/components/button" +import { Input } from "lowcoder-design/src/components/Input"; import styled from "styled-components"; import LinkPlusButton from "./LinkPlusButton"; -import { BluePlusIcon } from "lowcoder-design"; +import { BluePlusIcon } from "lowcoder-design/src/icons"; import { useEffect } from "react"; -import { useForm } from "antd/lib/form/Form"; +import { useForm } from "antd/es/form/Form"; import { trans } from "i18n"; const StyledItem = styled(FormItem)` diff --git a/client/packages/lowcoder/src/components/JSLibraryModal.tsx b/client/packages/lowcoder/src/components/JSLibraryModal.tsx index 3d99b0df0..64a4941f8 100644 --- a/client/packages/lowcoder/src/components/JSLibraryModal.tsx +++ b/client/packages/lowcoder/src/components/JSLibraryModal.tsx @@ -1,5 +1,5 @@ import styled from "styled-components"; -import React, { ReactNode, useEffect, useState } from "react"; +import React, { ReactNode, lazy, useEffect, useState } from "react"; import { CustomModal } from "components/CustomModal"; import { trans } from "i18n"; import { DocLink } from "components/ExternalLink"; @@ -18,11 +18,11 @@ import { ErrorIcon, } from "icons"; import { ActiveTextColor, GreyTextColor } from "constants/style"; -import { LoadingOutlined } from "@ant-design/icons"; +import { default as LoadingOutlined } from "@ant-design/icons/LoadingOutlined"; import { RecommendedJSLibraryMeta } from "api/jsLibraryApi"; import log from "loglevel"; import { TacoMarkDown } from "components/markdown"; -import { messageInstance } from "lowcoder-design"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; const ModalLabel = styled.div` display: flex; diff --git a/client/packages/lowcoder/src/components/LazyRoute.tsx b/client/packages/lowcoder/src/components/LazyRoute.tsx index 0b0e27c3d..0eaea363c 100644 --- a/client/packages/lowcoder/src/components/LazyRoute.tsx +++ b/client/packages/lowcoder/src/components/LazyRoute.tsx @@ -2,6 +2,8 @@ import { default as Skeleton } from "antd/es/skeleton"; import { ComponentType, lazy, Suspense, useRef } from "react"; import { Route, RouteProps } from "react-router"; import PageSkeleton from "./PageSkeleton"; +import EditorSkeletonView from "@lowcoder-ee/pages/editor/editorSkeletonView"; +import { ProductLoading } from "./ProductLoading"; interface IProps extends RouteProps { /** @@ -13,7 +15,7 @@ interface IProps extends RouteProps { const fallbacks = { normal: , - layout: , + layout: , outAppLayout: , }; diff --git a/client/packages/lowcoder/src/components/LinkPlusButton.tsx b/client/packages/lowcoder/src/components/LinkPlusButton.tsx index ec50f1ac3..1cb77942e 100644 --- a/client/packages/lowcoder/src/components/LinkPlusButton.tsx +++ b/client/packages/lowcoder/src/components/LinkPlusButton.tsx @@ -1,4 +1,4 @@ -import { TacoButton } from "lowcoder-design"; +import { TacoButton } from "lowcoder-design/src/components/button" import { PropsWithChildren, ReactNode } from "react"; import styled from "styled-components"; diff --git a/client/packages/lowcoder/src/components/PermissionDialog/AppPermissionDialog.tsx b/client/packages/lowcoder/src/components/PermissionDialog/AppPermissionDialog.tsx index 499ceae37..9c0b490a6 100644 --- a/client/packages/lowcoder/src/components/PermissionDialog/AppPermissionDialog.tsx +++ b/client/packages/lowcoder/src/components/PermissionDialog/AppPermissionDialog.tsx @@ -28,8 +28,8 @@ import copy from "copy-to-clipboard"; import { StyledLoading } from "./commonComponents"; import { PermissionRole } from "./Permission"; import { SHARE_TITLE } from "../../constants/apiConstants"; -import { messageInstance } from "lowcoder-design"; -import { Divider } from "antd"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; +import { default as Divider } from "antd/es/divider"; export const AppPermissionDialog = (props: { applicationId: string; diff --git a/client/packages/lowcoder/src/components/ResCreatePanel.tsx b/client/packages/lowcoder/src/components/ResCreatePanel.tsx index efcbb38f0..388927948 100644 --- a/client/packages/lowcoder/src/components/ResCreatePanel.tsx +++ b/client/packages/lowcoder/src/components/ResCreatePanel.tsx @@ -1,4 +1,6 @@ -import { AddIcon, CloseIcon, CustomModalProps, ImportIconV2, ScrollBar } from "lowcoder-design"; +import { AddIcon, CloseIcon, ImportIconV2 } from "lowcoder-design/src/icons"; +import type { CustomModalProps } from "lowcoder-design/src/components/CustomModal"; +import { ScrollBar } from "lowcoder-design/src/components/ScrollBar"; import { BottomShadow, GreyTextColor, TabActiveColor } from "constants/style"; import { trans } from "i18n"; import _, { noop } from "lodash"; @@ -9,16 +11,16 @@ import { useResizeDetector } from "react-resize-detector"; import styled, { css } from "styled-components"; import { BottomResTypeEnum } from "types/bottomRes"; import { LargeBottomResIconWrapper } from "util/bottomResUtils"; -import { PageType } from "../constants/pageConstants"; -import { SizeType } from "antd/lib/config-provider/SizeContext"; -import { Datasource } from "@lowcoder-ee/constants/datasourceConstants"; +import type { PageType } from "../constants/pageConstants"; +import type { SizeType } from "antd/es/config-provider/SizeContext"; +import { Datasource } from "constants/datasourceConstants"; import { LOWCODER_API_ID, LOWCODER_API_INFO, QUICK_GRAPHQL_ID, QUICK_REST_API_ID, } from "../constants/datasourceConstants"; -import { ResourceType } from "@lowcoder-ee/constants/queryConstants"; +import { ResourceType } from "constants/queryConstants"; import { default as Upload } from "antd/es/upload"; import { useSelector } from "react-redux"; import { getUser } from "../redux/selectors/usersSelectors"; diff --git a/client/packages/lowcoder/src/components/TextArea.tsx b/client/packages/lowcoder/src/components/TextArea.tsx index e9c5800fc..9b0c71003 100644 --- a/client/packages/lowcoder/src/components/TextArea.tsx +++ b/client/packages/lowcoder/src/components/TextArea.tsx @@ -1,5 +1,9 @@ import styled from "styled-components"; -import { default as AntdTextArea, TextAreaRef, TextAreaProps as AntdTextAreaProps } from "antd/es/input/TextArea"; +import { + default as AntdTextArea, + type TextAreaRef, + type TextAreaProps as AntdTextAreaProps +} from "antd/es/input/TextArea"; import { ChangeEvent, useEffect, useRef, useState } from "react"; import _ from "lodash"; import React from "react"; diff --git a/client/packages/lowcoder/src/components/layout/SideBar.tsx b/client/packages/lowcoder/src/components/layout/SideBar.tsx index 492df7d28..9e9886aed 100644 --- a/client/packages/lowcoder/src/components/layout/SideBar.tsx +++ b/client/packages/lowcoder/src/components/layout/SideBar.tsx @@ -1,4 +1,4 @@ -import { default as LayoutSider, SiderProps } from "antd/es/layout/Sider"; +import { default as LayoutSider, type SiderProps } from "antd/es/layout/Sider"; import { TopHeaderHeight } from "constants/style"; import styled from "styled-components"; diff --git a/client/packages/lowcoder/src/components/layout/SideBarItem.tsx b/client/packages/lowcoder/src/components/layout/SideBarItem.tsx index 655c01257..ec8909944 100644 --- a/client/packages/lowcoder/src/components/layout/SideBarItem.tsx +++ b/client/packages/lowcoder/src/components/layout/SideBarItem.tsx @@ -19,6 +19,10 @@ const Wrapper = styled.div<{ $size?: SideBarSize; $selected?: boolean }>` background: ${(props) => (props.$selected ? "#ebf0f7" : "#efeff1")}; } + svg { + width:24px + } + ${(props) => props.$selected && css` diff --git a/client/packages/lowcoder/src/components/table/EditableCell.tsx b/client/packages/lowcoder/src/components/table/EditableCell.tsx index a08a3607d..11a18d1ac 100644 --- a/client/packages/lowcoder/src/components/table/EditableCell.tsx +++ b/client/packages/lowcoder/src/components/table/EditableCell.tsx @@ -1,7 +1,7 @@ import { PresetStatusColorType } from "antd/es/_util/colors"; import _ from "lodash"; import { changeChildAction, DispatchType } from "lowcoder-core"; -import { constantColors } from "lowcoder-design"; +import { constantColors } from "lowcoder-design/src/components/colorSelect/colorUtils"; import React, { ReactNode, useCallback, useContext, useEffect, useMemo, useState } from "react"; import styled from "styled-components"; import { JSONValue } from "util/jsonTypes"; @@ -71,6 +71,7 @@ export function EditableCell(props: EditableCellProps) { changeValue, baseValue, candidateTags, + // tagColors candidateStatus, onTableEvent, } = props; @@ -78,8 +79,8 @@ export function EditableCell(props: EditableCellProps) { const editable = editViewFn ? props.editable : false; const { isEditing, setIsEditing } = useContext(TableCellContext); const value = changeValue ?? baseValue!; - const [tmpValue, setTmpValue] = useState(value); + useEffect(() => { setTmpValue(value); }, [value]); diff --git a/client/packages/lowcoder/src/comps/comps/allComp.test.tsx b/client/packages/lowcoder/src/comps/comps/allComp.test.tsx index aa11137f7..c77d37fe5 100644 --- a/client/packages/lowcoder/src/comps/comps/allComp.test.tsx +++ b/client/packages/lowcoder/src/comps/comps/allComp.test.tsx @@ -63,9 +63,15 @@ const COMPS_MAP = { tableColumnRender: RenderComp, } as Record; -Object.entries(uiCompRegistry).forEach(([key, value]) => { - COMPS_MAP["ui_" + key] = value.comp; -}); +Object.entries(uiCompRegistry).forEach(async ([key, value]) => { + if(value.lazyLoad) { + const module = await import(`../${value.compPath}`!); + COMPS_MAP["ui_" + key] = module[value.compName!]; + } else { + COMPS_MAP["ui_" + key] = value.comp!; + } +}) + Object.keys(QueryMap).forEach((key) => { COMPS_MAP["query_" + key] = (QueryMap as Record)[key]; }); diff --git a/client/packages/lowcoder/src/comps/comps/appSettingsComp.tsx b/client/packages/lowcoder/src/comps/comps/appSettingsComp.tsx index 1782120df..f30a951ea 100644 --- a/client/packages/lowcoder/src/comps/comps/appSettingsComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/appSettingsComp.tsx @@ -18,6 +18,7 @@ import { StringControl } from "comps/controls/codeControl"; import { IconControl } from "comps/controls/iconControl"; import { dropdownControl } from "comps/controls/dropdownControl"; import { ApplicationCategoriesEnum } from "constants/applicationConstants"; +import { BoolControl } from "../controls/boolControl"; const TITLE = trans("appSetting.title"); const USER_DEFINE = "__USER_DEFINE"; @@ -182,6 +183,7 @@ const childrenMap = { description: withDefault(StringControl, ''), icon: IconControl, category: dropdownControl(AppCategories, ApplicationCategoriesEnum.BUSINESS), + showHeaderInPublic: withDefault(BoolControl, true), maxWidth: dropdownInputSimpleControl(OPTIONS, USER_DEFINE, "1920"), themeId: valueComp(DEFAULT_THEMEID), customShortcuts: CustomShortcutsComp, @@ -202,6 +204,7 @@ function AppSettingsModal(props: ChildrenInstance) { description, icon, category, + showHeaderInPublic, } = props; const THEME_OPTIONS = themeList?.map((theme) => ({ label: theme.name, @@ -255,6 +258,11 @@ function AppSettingsModal(props: ChildrenInstance) { tooltip: trans("aggregation.iconTooltip"), })}
+
+ {showHeaderInPublic.propertyView({ + label: trans("appSetting.showPublicHeader"), + })} +
{maxWidth.propertyView({ dropdownLabel: trans("appSetting.canvasMaxWidth"), inputLabel: trans("appSetting.userDefinedMaxWidth"), diff --git a/client/packages/lowcoder/src/comps/comps/autoCompleteComp/autoCompleteComp.tsx b/client/packages/lowcoder/src/comps/comps/autoCompleteComp/autoCompleteComp.tsx index 059dd3852..ae6fb9457 100644 --- a/client/packages/lowcoder/src/comps/comps/autoCompleteComp/autoCompleteComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/autoCompleteComp/autoCompleteComp.tsx @@ -3,8 +3,10 @@ import { Input, Section, sectionNames } from "lowcoder-design"; import { BoolControl } from "comps/controls/boolControl"; import { styleControl } from "comps/controls/styleControl"; import { + InputFieldStyle, InputLikeStyle, InputLikeStyleType, + LabelStyle, } from "comps/controls/styleControlConstants"; import { NameConfig, @@ -72,7 +74,8 @@ const childrenMap = { ...textInputChildren, viewRef: RefControl, allowClear: BoolControl.DEFAULT_TRUE, - style: styleControl(InputLikeStyle), + style: styleControl(InputFieldStyle), + labelStyle:styleControl(LabelStyle), prefixIcon: IconControl, suffixIcon: IconControl, items: jsonControl(convertAutoCompleteData, autoCompleteDate), @@ -85,6 +88,7 @@ const childrenMap = { autocompleteIconColor: dropdownControl(autocompleteIconColor, "blue"), componentSize: dropdownControl(componentSize, "small"), valueInItems: booleanExposingStateControl("valueInItems"), + inputFieldStyle: styleControl(InputLikeStyle), }; const getValidate = (value: any): "" | "warning" | "error" | undefined => { @@ -153,11 +157,11 @@ let AutoCompleteCompBase = (function () { ), - // style: props.style, - // ...validateState, + style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, + ...validateState, }); }) .setPropertyViewFn((children) => { @@ -335,6 +341,12 @@ let AutoCompleteCompBase = (function () {
{children.style.getPropertyView()}
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.inputFieldStyle.getPropertyView()} +
); }) diff --git a/client/packages/lowcoder/src/comps/comps/avatar.tsx b/client/packages/lowcoder/src/comps/comps/avatar.tsx new file mode 100644 index 000000000..61779a1c7 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/avatar.tsx @@ -0,0 +1,282 @@ +import styled from "styled-components"; +import { RecordConstructorToView } from "lowcoder-core"; +import { styleControl } from "comps/controls/styleControl"; +import _ from "lodash"; +import { + avatarContainerStyle, + AvatarContainerStyleType, + avatarLabelStyle, + AvatarLabelStyleType, + AvatarStyle, + AvatarStyleType, +} from "comps/controls/styleControlConstants"; +import { UICompBuilder } from "comps/generators/uiCompBuilder"; +import { withDefault } from "../generators"; +import { + NameConfig, + NameConfigHidden, + withExposingConfigs, +} from "comps/generators/withExposing"; +import { Section, sectionNames } from "lowcoder-design"; +import { hiddenPropertyView } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { NumberControl } from "comps/controls/codeControl"; +import { IconControl } from "comps/controls/iconControl"; +import { + clickEvent, + eventHandlerControl, +} from "../controls/eventHandlerControl"; +import { Avatar, AvatarProps, Badge, Dropdown, Menu } from "antd"; +import { LeftRightControl, dropdownControl } from "../controls/dropdownControl"; +import { stringExposingStateControl } from "../controls/codeStateControl"; +import { BoolControl } from "../controls/boolControl"; +import { BadgeBasicSection, badgeChildren } from "./badgeComp/badgeConstants"; +import { DropdownOptionControl } from "../controls/optionsControl"; +import { ReactElement, useContext } from "react"; +import { CompNameContext, EditorContext } from "../editorState"; + +const AvatarWrapper = styled(Avatar) ` + background: ${(props) => props.$style.background}; + color: ${(props) => props.$style.fill}; + cursor: ${(props) => props.$cursorPointer ? 'pointer' : ''}; +`; + +const Wrapper = styled.div <{ iconSize: number, labelPosition: string,$style: AvatarContainerStyleType}>` +display: flex; +width: 100%; +height: 100%; +align-items: center; +flex-direction: ${(props) => props.labelPosition === 'left' ? 'row' : 'row-reverse'}; +${(props) => { + return ( + props.$style && { + ...props.$style, + borderRadius: props.$style.radius, + } + ); + }} +` + +const LabelWrapper = styled.div<{ iconSize: number, alignmentPosition: string }>` +width: calc(100% - ${(props) => props.iconSize}px); +display: flex; +padding-left: 5px; +padding-right: 5px; +flex-direction: column; +justify-content: flex-end; +align-items: ${(props) => props.alignmentPosition === 'left' ? 'flex-start' : 'flex-end'}; +` +const LabelSpan = styled.span<{ $style:AvatarLabelStyleType }>` +max-width: 100%; +overflow: hidden; +text-overflow: ellipsis; +white-space: nowrap; +font-weight: ${props=>props.$style.textWeight}; +border-radius: ${props=>props.$style.radius}; +font-size: ${props=>props.$style.textSize}; +rotate: ${props=>props.$style.rotation}; +text-transform: ${props=>props.$style.textTransform}; +color: ${props=>props.$style.text}; +border: ${props => props.$style.border}; +border-style: ${props=>props.$style.borderStyle}; +border-width: ${props=>props.$style.borderWidth}; +font-family: ${props=>props.$style.fontFamily}; +font-style: ${props=>props.$style.fontStyle}; +margin: ${props=>props.$style.margin}; +padding: ${props=>props.$style.padding}; +background: ${props=>props.$style.background}; +text-decoration: ${props=>props.$style.textDecoration}; +` +const CaptionSpan = styled.span<{ $style:AvatarLabelStyleType }>` +max-width: 100%; +overflow: hidden; +text-overflow: ellipsis; +white-space: nowrap; +font-weight: ${props=>props.$style.textWeight}; +border-radius: ${props=>props.$style.radius}; +font-size: ${props=>props.$style.textSize}; +rotate: ${props=>props.$style.rotation}; +text-transform: ${props=>props.$style.textTransform}; +color: ${props=>props.$style.text}; +border: ${props => props.$style.border}; +border-style: ${props=>props.$style.borderStyle}; +border-width: ${props=>props.$style.borderWidth}; +font-family: ${props=>props.$style.fontFamily}; +font-style: ${props=>props.$style.fontStyle}; +margin: ${props=>props.$style.margin}; +padding: ${props=>props.$style.padding}; +background: ${props=>props.$style.background}; +text-decoration: ${props => props.$style.textDecoration}; +` +const EventOptions = [clickEvent] as const; +const sharpOptions = [ + { label: trans("avatarComp.square"), value: "square" }, + { label: trans("avatarComp.circle"), value: "circle" }, +] as const; + +const sideOptions = [ + { label: trans('labelProp.left'), value: "left" }, + { label: trans('labelProp.right'), value: "right" }, +] as const; + +const childrenMap = { + style: styleControl(avatarContainerStyle), + avatarStyle: styleControl(AvatarStyle), + labelStyle: styleControl(avatarLabelStyle), + captionStyle: styleControl(avatarLabelStyle), + icon: withDefault(IconControl, "/icon:solid/user"), + iconSize: withDefault(NumberControl, 40), + onEvent: eventHandlerControl(EventOptions), + shape: dropdownControl(sharpOptions, "circle"), + title: stringExposingStateControl("title", ""), + src: stringExposingStateControl("src", ""), + avatarLabel: stringExposingStateControl("avatarLabel", "{{currentUser.name}}"), + avatarCatption: stringExposingStateControl("avatarCatption", "{{currentUser.email}}"), + labelPosition: dropdownControl(sideOptions, 'left'), + alignmentPosition: withDefault(LeftRightControl, 'left'), + enableDropdownMenu: BoolControl, + options: DropdownOptionControl, + ...badgeChildren, +}; + +const AvatarView = (props: RecordConstructorToView) => { + const { shape, title, src, iconSize } = props; + const comp = useContext(EditorContext).getUICompByName(useContext(CompNameContext)); + // const eventsCount = comp ? Object.keys(comp?.children.comp.children.onEvent.children).length : 0; + const hasIcon = props.options.findIndex((option) => (option.prefixIcon as ReactElement)?.props.value) > -1; + const items = props.options + .filter((option) => !option.hidden) + .map((option, index) => ({ + title: option.label, + label: option.label, + key: option.label + " - " + index, + disabled: option.disabled, + icon: hasIcon && {option.prefixIcon}, + onEvent: option.onEvent, + })); + const menu = ( + items.find((o) => o.key === key)?.onEvent("click")} + /> + ); + return ( + menu} + > + + + 0} + onClick={() => props.onEvent("click")} + > + {title.value} + + + + {props.avatarLabel.value} + {props.avatarCatption.value} + + + + ); +}; + +let AvatarBasicComp = (function () { + return new UICompBuilder(childrenMap, (props) => ) + .setPropertyViewFn((children) => ( + <> +
+ {children.src.propertyView({ + label: trans("avatarComp.src"), + placeholder: "http://xxxx/xx.jpg", + tooltip: trans("avatarComp.avatarCompTooltip"), + })} + {children.title.propertyView({ + label: trans("avatarComp.title"), + tooltip: trans("avatarComp.avatarCompTooltip"), + })} + {children.icon.propertyView({ + label: trans("avatarComp.icon"), + IconType: "All", + tooltip: trans("avatarComp.avatarCompTooltip"), + })} + {children.shape.propertyView({ + label: trans("avatarComp.shape"), + radioButton: true, + })} + { + children.iconSize.propertyView({ + label: trans("avatarComp.iconSize"), + })} + { + children.enableDropdownMenu.propertyView({ + label: trans("avatarComp.enableDropDown") + })} + {children.enableDropdownMenu.getView() && children.options.propertyView({})} +
+
+ { + children.avatarLabel.propertyView({ + label: trans("avatarComp.label"), + })} + { + children.avatarCatption.propertyView({ + label: trans("avatarComp.caption"), + })} + { + children.labelPosition.propertyView({ + label: trans("avatarComp.labelPosition"), + radioButton: true, + })} + { + children.alignmentPosition.propertyView({ + label: trans("avatarComp.alignmentPosition"), + radioButton: true, + })} +
+ {} +
+ {children.onEvent.getPropertyView()} +
+
+ {hiddenPropertyView(children)} +
+
+ {children.style.getPropertyView()} +
+
+ {children.avatarStyle.getPropertyView()} +
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.captionStyle.getPropertyView()} +
+ + )) + .build(); +})(); + + +export const AvatarComp = withExposingConfigs(AvatarBasicComp, [ + NameConfigHidden, + new NameConfig("badgeCount", trans("button.textDesc")), +]); diff --git a/client/packages/lowcoder/src/comps/comps/avatarGroup.tsx b/client/packages/lowcoder/src/comps/comps/avatarGroup.tsx new file mode 100644 index 000000000..3e2e5d258 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/avatarGroup.tsx @@ -0,0 +1,191 @@ +import { CompAction, RecordConstructorToView, changeChildAction } from "lowcoder-core"; +import { styleControl } from "comps/controls/styleControl"; +import { QRCodeStyle, QRCodeStyleType, avatarGroupStyle, AvatarGroupStyleType, avatarContainerStyle, AvatarContainerStyleType } from "comps/controls/styleControlConstants"; +import { UICompBuilder } from "comps/generators/uiCompBuilder"; +import { NameConfig, NameConfigHidden, withExposingConfigs } from "comps/generators/withExposing"; +import { AlignCenter, AlignLeft, AlignRight, Section, sectionNames } from "lowcoder-design"; +import { hiddenPropertyView } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { NumberControl, StringControl } from "comps/controls/codeControl"; +import { Avatar, Tooltip } from "antd"; +import { clickEvent, eventHandlerControl, refreshEvent } from "../controls/eventHandlerControl"; +import styled from "styled-components"; +import { useContext, ReactElement } from "react"; +import { MultiCompBuilder, stateComp, withDefault } from "../generators"; +import { EditorContext } from "comps/editorState"; +import { IconControl } from "../controls/iconControl"; +import { ColorControl } from "../controls/colorControl"; +import { optionsControl } from "../controls/optionsControl"; +import { BoolControl } from "../controls/boolControl"; +import { dropdownControl } from "../controls/dropdownControl"; +import { JSONObject } from "util/jsonTypes"; + +const MacaroneList = [ + '#fde68a', + '#eecff3', + '#a7f3d0', + '#bfdbfe', + '#bfdbfe', + '#c7d2fe', + '#fecaca', + '#fcd6bb', +] + +const Container = styled.div<{ $style: AvatarContainerStyleType | undefined, alignment: string }>` + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: ${props => props.alignment}; + cursor: pointer; + background: ${props => props?.$style?.background}; + margin: ${props => props?.$style?.margin}; + padding: ${props => props?.$style?.padding}; + border: ${props => props?.$style?.border}; + border-style: ${props => props?.$style?.borderStyle}; + border-radius: ${props => props?.$style?.radius}; + border-width: ${props => props?.$style?.borderWidth}; +`; + +const DropdownOption = new MultiCompBuilder( + { + src: StringControl, + AvatarIcon: IconControl, + label: StringControl, + color: ColorControl, + backgroundColor: ColorControl, + Tooltip: StringControl, + }, + (props) => props +) + .setPropertyViewFn((children) => ( + <> + {children.src.propertyView({ label: trans("avatarComp.src"), placeholder: "", tooltip: trans("avatarComp.avatarCompTooltip") })} + {children.label.propertyView({ + label: trans("avatarComp.title"), + tooltip: trans("avatarComp.avatarCompTooltip"), + })} + {children.AvatarIcon.propertyView({ + label: trans("avatarComp.icon"), + IconType: "All", + tooltip: trans("avatarComp.avatarCompTooltip"), + })} + {children.color.propertyView({ label: trans("style.fill") })} + {children.backgroundColor.propertyView({ label: trans("style.background") })} + {children.Tooltip.propertyView({ label: trans("badge.tooltip") })} + + )) + .build(); + +const EventOptions = [clickEvent, refreshEvent] as const; + +export const alignOptions = [ + { label: , value: "flex-start" }, + { label: , value: "center" }, + { label: , value: "flex-end" }, +] as const; + +const childrenMap = { + avatar: styleControl(avatarGroupStyle), + style: styleControl(avatarContainerStyle), + maxCount: withDefault(NumberControl, 3), + avatarSize: withDefault(NumberControl, 40), + alignment: dropdownControl(alignOptions, "center"), + autoColor: BoolControl.DEFAULT_TRUE, + onEvent: eventHandlerControl(EventOptions), + currentAvatar: stateComp({}), + avatars: optionsControl(DropdownOption, { + initOptions: [ + { src: "https://api.dicebear.com/7.x/miniavs/svg?seed=1", label: String.fromCharCode(65 + Math.ceil(Math.random() * 25)) }, + { AvatarIcon: "/icon:antd/startwotone" }, + { label: String.fromCharCode(65 + Math.ceil(Math.random() * 25)) }, + { label: String.fromCharCode(65 + Math.ceil(Math.random() * 25)) }, + ], + }) +}; + +const AvatarGroupView = (props: RecordConstructorToView & { dispatch: (action: CompAction) => void; }) => { + return ( + + { + + { + props.avatars.map((item, index) => { + return ( + + { + props.onEvent("click") + props.dispatch(changeChildAction("currentAvatar", item as JSONObject, false)); + }} + > + {item.label} + + + ) + }) + } + + } + + ); +}; + +let AvatarGroupBasicComp = (function () { + return new UICompBuilder(childrenMap, (props, dispatch) => ) + .setPropertyViewFn((children) => ( + <> + {["logic", "both"].includes(useContext(EditorContext).editorModeStatus) && ( + <> +
+ {children.avatars.propertyView({})} + {children.maxCount.propertyView({ + label: trans("avatarGroup.maxCount") + })} + {children.avatarSize.propertyView({ + label: trans("avatarGroup.avatarSize") + })} + {children.autoColor.propertyView({ + label: trans("avatarGroup.autoColor") + })} + {children.alignment.propertyView({ + label: trans("avatarGroup.alignment"), + radioButton: true, + })} +
+
+ {hiddenPropertyView(children)} + {children.onEvent.propertyView()} +
+ + )} + + {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( + <> +
+ {children.avatar.getPropertyView()} +
+
+ {children.style.getPropertyView()} +
+ + )} + + )) + .build(); +})(); + +export const AvatarGroupComp = withExposingConfigs(AvatarGroupBasicComp, [ + new NameConfig("currentAvatar", trans("avatarGroup.currentAvatar")), + NameConfigHidden, +]); diff --git a/client/packages/lowcoder/src/comps/comps/badgeComp/badgeConstants.tsx b/client/packages/lowcoder/src/comps/comps/badgeComp/badgeConstants.tsx new file mode 100644 index 000000000..e7033ed72 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/badgeComp/badgeConstants.tsx @@ -0,0 +1,59 @@ +import { + BoolCodeControl, + NumberControl, + StringControl, +} from "@lowcoder-ee/comps/controls/codeControl"; +import { Section, sectionNames } from "lowcoder-design"; +import { numberExposingStateControl } from "@lowcoder-ee/comps/controls/codeStateControl"; +import { withDefault } from "comps/generators"; +import { RecordConstructorToComp } from "lowcoder-core"; +import { trans } from "i18n"; +import { dropdownControl } from "comps/controls/dropdownControl"; + +const badgeSizeOptions = [ + { + label: trans("badge.SizeDefault"), + value: "default", + }, + { + label: trans("badge.SizeSmall"), + value: "small", + }, +] as const; + +const badgeTypeOptions = [ + { + label: trans("badge.number"), + value: "number", + }, + { + label: trans("badge.dot"), + value: "dot", + }, +] as const; + +export const badgeChildren = { + badgeType: dropdownControl(badgeTypeOptions, "number"), + badgeCount: withDefault(numberExposingStateControl("badgeCount"), "0"), + badgeSize: dropdownControl(badgeSizeOptions, "default"), + showZero: BoolCodeControl, + overflowCount: withDefault(NumberControl, 99), + badgeTitle: withDefault(StringControl, ""), +}; + +type badgeComp = RecordConstructorToComp; + +export const BadgeBasicSection = (children: badgeComp) => ( +
+ {children.badgeType.propertyView({ + label: trans("badge.Type"), + radioButton: true, + })} + {children.badgeCount.propertyView({ label: trans("badge.Count") })} + {children.badgeType.getView() === "number" && + children.overflowCount.propertyView({label: trans("badge.overflowCount")})} + {children.badgeType.getView() === "number" && + children.badgeSize.propertyView({ label: trans("badge.Size") })} + {children.badgeTitle.propertyView({ label: trans("badge.Title") })} +
+); diff --git a/client/packages/lowcoder/src/comps/comps/buttonComp/floatButtonComp.tsx b/client/packages/lowcoder/src/comps/comps/buttonComp/floatButtonComp.tsx new file mode 100644 index 000000000..01ec6226d --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/buttonComp/floatButtonComp.tsx @@ -0,0 +1,155 @@ +import { RecordConstructorToView } from "lowcoder-core"; +import { BoolControl } from "comps/controls/boolControl"; +import { stringExposingStateControl } from "comps/controls/codeStateControl"; +import { dropdownControl } from "comps/controls/dropdownControl"; +import { styleControl } from "comps/controls/styleControl"; +import { BadgeStyle, BadgeStyleType, FloatButtonStyle, FloatButtonStyleType } from "comps/controls/styleControlConstants"; +import { UICompBuilder } from "comps/generators/uiCompBuilder"; +import { NameConfig, NameConfigHidden, withExposingConfigs } from "comps/generators/withExposing"; +import { Section, sectionNames } from "lowcoder-design"; +import { hiddenPropertyView } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { StringControl, NumberControl } from "comps/controls/codeControl"; +import { FloatButton } from 'antd'; +import { withDefault, MultiCompBuilder, valueComp } from "../../generators"; +import { IconControl } from "comps/controls/iconControl"; +import styled from "styled-components"; +import { ButtonEventHandlerControl } from "comps/controls/eventHandlerControl"; +import { manualOptionsControl } from "comps/controls/optionsControl"; + +const Wrapper = styled.div<{ $badgeStyle: BadgeStyleType, $style: FloatButtonStyleType}>` + width: 0px; + height: 0px; + overflow: hidden; + .ant-float-btn-group { + inset-block-end: 0px; + right: -40px; + } + .ant-float-btn { + right: 0px; + inset-block-end: -8px; + } + .ant-float-btn-primary .ant-float-btn-body { + background-color: ${(props) => props.$style.background}; + border: ${(props) => props.$style.border}; + border-style: ${(props) => props.$style.borderStyle}; + border-width: ${(props) => props.$style.borderWidth}; + } +` + +const buttonShapeOption = [ + { label: trans('floatButton.square'), value: 'square' }, + { label: trans('floatButton.circle'), value: 'circle' }, +] as const; + +const buttonThemeOption = [ + { label: trans('floatButton.primary'), value: 'primary' }, + { label: trans('floatButton.default'), value: 'default' }, +] as const; + +const buttonGroupOption = new MultiCompBuilder( + { + id: valueComp(-1), + label: StringControl, + badge: withDefault(NumberControl, 0), + description: withDefault(StringControl, ''), + icon: withDefault(IconControl, '/icon:antd/questioncircleoutlined'), + onEvent: ButtonEventHandlerControl, + hidden: BoolControl, + }, + (props) => props +) + .setPropertyViewFn((children) => ( + <> + {children.label.propertyView({ label: trans("label") })} + {children.description.propertyView({ label: trans("floatButton.description") })} + {children.badge.propertyView({ label: trans("floatButton.badge") })} + {children.hidden.propertyView({ label: trans("floatButton.hidden") })} + {children.icon.propertyView({ label: trans("icon") })} + {children.onEvent.getPropertyView()} + + )) + .build(); + +const childrenMap = { + value: stringExposingStateControl("value"), + includeMargin: BoolControl.DEFAULT_TRUE, + image: StringControl, + icon: withDefault(IconControl, '/icon:antd/questioncircleoutlined'), + badgeStyle: styleControl(BadgeStyle), + style: styleControl(FloatButtonStyle), + buttons: manualOptionsControl(buttonGroupOption, { + initOptions: [ + { id: 0, label: trans("optionsControl.optionI", { i: '1' }), icon: "/icon:antd/filetextoutlined", badge: '1' }, + { id: 1, label: trans("optionsControl.optionI", { i: '2' }), icon: "/icon:antd/filetextoutlined" }, + ], + autoIncField: "id", + }), + shape: dropdownControl(buttonShapeOption, 'circle'), + buttonTheme: dropdownControl(buttonThemeOption, 'primary'), + dot: BoolControl, +}; + +const FloatButtonView = (props: RecordConstructorToView) => { + const renderButton = (button: any, onlyOne?: boolean) => { + return !button?.hidden ? ( + button.onEvent("click")} + tooltip={button?.label} + description={button?.description} + badge={{ count: button?.badge, color: props.badgeStyle.badgeColor, dot: props?.dot }} + type={onlyOne ? props.buttonTheme : 'default'} + shape={props.shape} + />) + : '' + } + return ( + + {props.buttons.length === 1 ? (renderButton(props.buttons[0], true)) : + ( sum + (i.buttonType === 'custom' && !i.hidden ? i.badge : 0), 0), color: props.badgeStyle.badgeColor, dot: props.dot }} + type={props.buttonTheme} + > + {props.buttons.map((button: any) => renderButton(button))} + ) + } + + ); +}; + +let FloatButtonBasicComp = (function () { + return new UICompBuilder(childrenMap, (props) => ) + .setPropertyViewFn((children) => ( + <> +
+ {children.buttons.propertyView({})} + {children.icon.propertyView({ label: trans("icon") })} + {children.shape.propertyView({ label: trans("floatButton.buttonShape"), radioButton: true })} + {children.buttonTheme.propertyView({ label: trans("floatButton.buttonTheme"), radioButton: true })} + {children.dot.propertyView({ label: trans("floatButton.dot") })} +
+
+ {hiddenPropertyView(children)} +
+
{children.badgeStyle.getPropertyView()}
+
{children.style.getPropertyView()}
+ + )) + .build(); +})(); + +FloatButtonBasicComp = class extends FloatButtonBasicComp { + override autoHeight(): boolean { + return true; + } +}; + +export const FloatButtonComp = withExposingConfigs(FloatButtonBasicComp, [ + new NameConfig("value", trans("QRCode.valueDesc")), + NameConfigHidden, +]); diff --git a/client/packages/lowcoder/src/comps/comps/buttonComp/scannerComp.tsx b/client/packages/lowcoder/src/comps/comps/buttonComp/scannerComp.tsx index a4b075f57..ddd6364c3 100644 --- a/client/packages/lowcoder/src/comps/comps/buttonComp/scannerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/buttonComp/scannerComp.tsx @@ -21,7 +21,7 @@ import { trans } from "i18n"; import React, { Suspense, useEffect, useRef, useState, useContext } from "react"; import { arrayStringExposingStateControl } from "comps/controls/codeStateControl"; import { BoolControl } from "comps/controls/boolControl"; -import { ItemType } from "antd/lib/menu/hooks/useItems"; +import type { ItemType } from "antd/es/menu/hooks/useItems"; import { RefControl } from "comps/controls/refControl"; import { EditorContext } from "comps/editorState"; diff --git a/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx b/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx index e6721cebb..74857007c 100644 --- a/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/commentComp/commentComp.tsx @@ -64,7 +64,7 @@ import relativeTime from "dayjs/plugin/relativeTime"; import dayjs from "dayjs"; // import "dayjs/locale/zh-cn"; import { getInitialsAndColorCode } from "util/stringUtils"; -import { CloseOutlined } from "@ant-design/icons"; +import { default as CloseOutlined } from "@ant-design/icons/CloseOutlined"; dayjs.extend(relativeTime); // dayjs.locale("zh-cn"); diff --git a/client/packages/lowcoder/src/comps/comps/containerComp/cardComp.tsx b/client/packages/lowcoder/src/comps/comps/containerComp/cardComp.tsx new file mode 100644 index 000000000..d8784192c --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/containerComp/cardComp.tsx @@ -0,0 +1,333 @@ +import ReactResizeDetector from "react-resize-detector"; +import { NameConfigHidden, withExposingConfigs } from "comps/generators/withExposing"; +import { Section, sectionNames } from "lowcoder-design"; +import { TriContainer } from "../triContainerComp/triContainer"; +import { + ContainerCompBuilder, +} from "../triContainerComp/triContainerCompBuilder"; +import { disabledPropertyView, hiddenPropertyView } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { BoolCodeControl, StringControl } from "comps/controls/codeControl"; +import { BoolControl } from "comps/controls/boolControl"; +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 { MultiCompBuilder, withDefault } from "comps/generators"; +import { IconControl } from "comps/controls/iconControl"; +import { ButtonEventHandlerControl, CardEventHandlerControl, clickEvent, refreshEvent } from "comps/controls/eventHandlerControl"; +import { optionsControl } from "comps/controls/optionsControl"; +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 }>` + height: 100%; + width: 100%; + .ant-card-small >.ant-card-head { + background-color: ${props => props.$headerStyle?.background} !important; + border: ${props => props.$headerStyle?.border}; + border-style: ${props => props.$headerStyle?.borderStyle}; + border-width: ${props => props.$headerStyle?.borderWidth}; + border-radius: ${props => props.$headerStyle?.radius}; + font-size: ${props => props.$headerStyle?.textSize}; + font-style: ${props => props.$headerStyle?.fontStyle}; + font-family: ${props => props.$headerStyle?.fontFamily}; + font-weight: ${props => props.$headerStyle?.textWeight}; + text-transform: ${props => props.$headerStyle?.textTransform}; + text-decoration: ${props => props.$headerStyle?.textDecoration}; + color: ${props => props.$headerStyle?.text}; + rotate: ${props => props.$headerStyle?.rotation}; + margin: ${props => props.$headerStyle?.margin}; + padding: ${props => props.$headerStyle?.padding}; + } + .ant-card .ant-card-actions { + border-top: 1px solid ${props => props.$style?.border}; + } + .ant-card .ant-card-actions>li:not(:last-child) { + border-inline-end: 1px solid ${props => props.$style?.border}; + } + .ant-card .ant-card-actions { + background-color: ${props => props.$style?.background}; + } + .ant-card .ant-card-body { + background-color: ${props => props.$bodyStyle?.background} !important; + border: ${props => props.$bodyStyle?.border}; + border-style: ${props => props.$bodyStyle?.borderStyle}; + border-width: ${props => props.$bodyStyle?.borderWidth}; + border-radius: ${props => props.$bodyStyle?.radius}; + rotate: ${props => props.$bodyStyle?.rotation}; + margin: ${props => props.$bodyStyle?.margin}; + padding: ${props => props.$bodyStyle?.padding}; + } + .ant-card { + display: flex; + flex-direction: column; + justify-content: space-between; + background-color: ${props => props.$style?.background}; + border: ${props => props.$style?.border}; + border-style: ${props => props.$style?.borderStyle}; + border-radius: ${props => props.$style?.radius}; + border-width: ${props => props.$style?.borderWidth}; + } + .ant-card-body { + display: ${props => props.$showMate ? '' : 'none'}; + height: ${props => props.$cardType == 'custom' ? '100%' : 'auto'}; + } + .ant-card-body .ant-card-meta .ant-card-meta-title{ + color: ${props => props.$bodyStyle?.text} !important; + font-size: ${props => props.$bodyStyle?.textSize}; + font-style: ${props => props.$bodyStyle?.fontStyle}; + font-family: ${props => props.$bodyStyle?.fontFamily}; + font-weight: ${props => props.$bodyStyle?.textWeight}; + text-transform: ${props => props.$bodyStyle?.textTransform}; + text-decoration: ${props => props.$bodyStyle?.textDecoration}; + } + .ant-card-body .ant-card-meta .ant-card-meta-description{ + color: ${props => props.$bodyStyle?.text} !important; + font-size: ${props => props.$bodyStyle?.textSize}; + font-style: ${props => props.$bodyStyle?.fontStyle}; + font-family: ${props => props.$bodyStyle?.fontFamily}; + font-weight: ${props => props.$bodyStyle?.textWeight}; + text-transform: ${props => props.$bodyStyle?.textTransform}; + text-decoration: ${props => props.$bodyStyle?.textDecoration}; + } +`; + +const ContainWarpper = styled.div` + height: 100%; + width: 100%; +` + +const IconWarpper = styled.div<{ $style: CardStyleType | undefined, disabled: boolean }>` + pointer-events: ${props => props.disabled ? 'none' : ''}; + svg { + color: ${props => props.disabled ? '#d9d9d9' : props.$style?.IconColor}; + } + &:hover { + svg { + color: ${props => props.$style?.activateColor}; + } +} +` + +const cardTypeOption = [ + { label: trans("card.common"), value: "common" }, + { label: trans("card.custom"), value: "custom" }, +] as const; + +const sizeOptions = [ + { label: trans("card.default"), value: "default" }, + { label: trans("card.small"), value: "small" }, +] as const; + +const EventOptions = [clickEvent, refreshEvent] as const; + +const ActionIconOption = new MultiCompBuilder( + { + label: StringControl, + icon: withDefault(IconControl, "/icon:antd/settingoutlined"), + disabled: BoolCodeControl, + hidden: BoolCodeControl, + onEvent: ButtonEventHandlerControl, + }, + (props) => props +) + .setPropertyViewFn((children) => ( + <> + {children.icon.propertyView({ label: trans("button.icon") })} + {disabledPropertyView(children)} + {hiddenPropertyView(children)} + {children.onEvent.getPropertyView()} + + )) + .build(); + +const ActionOptionControl = optionsControl(ActionIconOption, { + initOptions: [ + { label: trans("optionsControl.optionI", { i: 1 }), icon: "/icon:antd/settingoutlined" }, + { label: trans("optionsControl.optionI", { i: 2 }), icon: "/icon:antd/editoutlined" }, + { label: trans("optionsControl.optionI", { i: 3 }), icon: "/icon:antd/ellipsisoutlined" }, + ], +}); + +export const ContainerBaseComp = (function () { + const childrenMap = { + showTitle: BoolControl.DEFAULT_TRUE, + title: withDefault(StringControl, trans('card.title')), + size: dropdownControl(sizeOptions, 'small'), + extraTitle: withDefault(StringControl, trans('card.more')), + cardType: dropdownControl(cardTypeOption, 'common'), + CoverImg: BoolControl.DEFAULT_TRUE, + imgSrc: withDefault(StringControl, "https://lowcoder.cloud/images/e0a89736c6be4393893d2981ac1fd753.png"), + imgHeight: withDefault(StringControl, 'auto'), + showMeta: BoolControl.DEFAULT_TRUE, + metaTitle: withDefault(StringControl, trans('card.metaTitle')), + metaDesc: withDefault(StringControl, trans('card.metaDesc')), + hoverable: BoolControl.DEFAULT_TRUE, + showActionIcon: BoolControl.DEFAULT_TRUE, + actionOptions: ActionOptionControl, + + onEvent: CardEventHandlerControl, + style: styleControl(CardStyle), + headerStyle: styleControl(CardHeaderStyle), + bodyStyle: styleControl(CardHeaderStyle), + }; + + return new ContainerCompBuilder(childrenMap, (props, dispatch) => { + props.container.showHeader = false; + // 注入容器参数 + props.container.style = Object.assign(props.container.style, { + CONTAINER_BODY_PADDING: props.style.containerBodyPadding, + border: '#00000000', + background: props.style.background, + }) + const conRef = useRef(null); + const [width, setWidth] = useState(0); + const [height, setHeight] = useState(0); + useEffect(() => { + if (height && width) { + onResize(); + } + }, [height, width]); + + const onResize = () => { + const container = conRef.current; + setWidth(container?.clientWidth ?? 0); + setHeight(container?.clientHeight ?? 0); + }; + return ( + + props.onEvent('focus')} + onMouseLeave={() => props.onEvent('blur')} + onClick={() => props.onEvent('click')} + > + { props.onEvent('clickExtra')}>{props.extraTitle}} + + // 内容 + cover={props.cardType == 'common' && props.CoverImg && } + actions={props.cardType == 'common' && props.showActionIcon ? + props.actionOptions.filter(item => !item.hidden).map(item => { + return ( + item.onEvent('click')} + disabled={item.disabled} + $style={props.style} + > + {item.icon} + ) + } + ) : [] + } + > + {props.cardType == 'common' && props.showMeta && } + {props.cardType == 'custom' && + } + + } + + + ); + }) + .setPropertyViewFn((children) => { + return ( + <> + {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( + <> +
+ {children.size.propertyView({ + label: trans("card.titleSize"), + radioButton: true, + })} + {children.showTitle.propertyView({ label: trans('card.showTitle') })} + {children.showTitle.getView() && children.title.propertyView({ label: trans('card.title') })} + {children.showTitle.getView() && children.extraTitle.propertyView({ label: trans('card.extraTitle') })} + { + children.cardType.getView() == 'common' && + children.CoverImg.propertyView({ label: trans('card.CoverImg') }) + } + + { + children.cardType.getView() == 'common' && + children.CoverImg.getView() && + children.imgSrc.propertyView({ label: trans('card.imgSrc') }) + } + { + children.cardType.getView() == 'common' && + children.CoverImg.getView() && + children.imgHeight.propertyView({ label: trans('card.imgHeight') }) + } + { + children.cardType.getView() == 'common' && + children.showMeta.propertyView({ label: trans('card.showMeta') }) + } + { + children.cardType.getView() == 'common' && + children.showMeta.getView() && + children.metaTitle.propertyView({ label: trans('card.metaTitle') }) + } + { + children.cardType.getView() == 'common' && + children.showMeta.getView() && + children.metaDesc.propertyView({ label: trans('card.metaDesc') }) + } + + { + children.cardType.getView() == 'common' && + children.showActionIcon.propertyView({ label: trans('card.showActionIcon') }) + } + { + children.cardType.getView() == 'common' && + children.showActionIcon.getView() && + children.actionOptions.propertyView({ title: trans('card.actionOptions') }) + } + +
+
+ {hiddenPropertyView(children)} + {children.onEvent.getPropertyView()} +
+ + )} + + {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( + <> +
+ {children.cardType.propertyView({ + label: trans("card.cardType"), + radioButton: true, + })} +
+
+ {children.style.getPropertyView()} +
+
+ {children.headerStyle.getPropertyView()} +
+
+ {children.bodyStyle.getPropertyView()} +
+ + )} + + ); + }) + .build(); +})(); + +export const CardComp = withExposingConfigs(ContainerBaseComp, [NameConfigHidden]); + diff --git a/client/packages/lowcoder/src/comps/comps/containerComp/containerComp.tsx b/client/packages/lowcoder/src/comps/comps/containerComp/containerComp.tsx index e6ba29282..d088a51c0 100644 --- a/client/packages/lowcoder/src/comps/comps/containerComp/containerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/containerComp/containerComp.tsx @@ -125,7 +125,7 @@ export function defaultContainerData( layoutItem: { i: "", h: 5, - w: 12, + w: 24, x: 0, y: 0, }, diff --git a/client/packages/lowcoder/src/comps/comps/containerComp/containerView.tsx b/client/packages/lowcoder/src/comps/comps/containerComp/containerView.tsx index f54f34308..3d9d45f93 100644 --- a/client/packages/lowcoder/src/comps/comps/containerComp/containerView.tsx +++ b/client/packages/lowcoder/src/comps/comps/containerComp/containerView.tsx @@ -195,7 +195,7 @@ const onFlyDrop = (layout: Layout, items: Layout, dispatch: DispatchType) => { } }; -const onDrop = ( +const onDrop = async ( layout: Layout, items: Layout, event: DragEvent, @@ -222,7 +222,20 @@ const onDrop = ( const nameGenerator = editorState.getNameGenerator(); const compInfo = parseCompType(compType); const compName = nameGenerator.genItemName(compInfo.compName); - const defaultDataFn = uiCompRegistry[compType as UICompType]?.defaultDataFn; + let defaultDataFn = undefined; + + if (!compInfo.isRemote) { + const { + defaultDataFnName, + defaultDataFnPath, + } = uiCompRegistry[compType as UICompType]; + + if(defaultDataFnName && defaultDataFnPath) { + const module = await import(`../../${defaultDataFnPath}.tsx`); + defaultDataFn = module[defaultDataFnName]; + } + } + const widgetValue: GridItemDataType = { compType, name: compName, @@ -329,6 +342,7 @@ export function InnerGrid(props: ViewPropsWithSelect) { const editorState = useContext(EditorContext); const { readOnly } = useContext(ExternalEditorContext); + // Falk: TODO: Here we can define the inner grid columns dynamically //Added By Aqib Mirza const defaultGrid = useContext(ThemeContext)?.theme?.gridColumns || diff --git a/client/packages/lowcoder/src/comps/comps/containerComp/pageLayoutComp.tsx b/client/packages/lowcoder/src/comps/comps/containerComp/pageLayoutComp.tsx new file mode 100644 index 000000000..489398a94 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/containerComp/pageLayoutComp.tsx @@ -0,0 +1,205 @@ +import { CompParams } from "lowcoder-core"; +import { ToDataType } from "comps/generators/multi"; +import { NameConfigDisabled, NameConfigHidden, withExposingConfigs, NameConfig, CompDepsConfig } from "comps/generators/withExposing"; +import { withMethodExposing } from "comps/generators/withMethodExposing"; +import { NameGenerator } from "comps/utils/nameGenerator"; +import { Section, sectionNames } from "lowcoder-design"; +import { oldContainerParamsToNew } from "../containerBase"; +import { toSimpleContainerData } from "../containerBase/simpleContainerComp"; +import { disabledPropertyView, hiddenPropertyView } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { BoolCodeControl } from "comps/controls/codeControl"; +import { DisabledContext } from "comps/generators/uiCompBuilder"; +import React, { useContext, useEffect, useState } from "react"; +import { EditorContext } from "comps/editorState"; + +import { + ContainerChildren, + ContainerCompBuilder, +} from "../pageLayoutComp/pageLayoutCompBuilder"; +import { PageLayout } from "../pageLayoutComp/pageLayout"; + + +export const ContainerBaseComp = (function () { + const childrenMap = { + disabled: BoolCodeControl + }; + + return new ContainerCompBuilder(childrenMap, (props, dispatch) => { + + const [siderCollapsed, setSiderCollapsed] = useState(false); + + return ( + + + + ); + }) + .setPropertyViewFn((children) => { + return ( + <> + {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( +
+ {disabledPropertyView(children)} + {hiddenPropertyView(children)} + { children.container.appSelectorPropertyView()} +
+ )} + + {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( + <>
+ {children.container.getPropertyView()} +
+
+ { children.container.stylePropertyView() } +
+ {children.container.children.showHeader.getView() && ( +
+ { children.container.headerStylePropertyView() } +
+ )} + {children.container.children.showSider.getView() && ( +
+ { children.container.siderStylePropertyView() } +
+ )} +
+ { children.container.bodyStylePropertyView() } +
+ {children.container.children.showFooter.getView() && ( +
+ { children.container.footerStylePropertyView() } +
+ )} + + )} + + ); + }) + .build(); +})(); + +// Compatible with old data +function convertOldContainerParams(params: CompParams) { + // convert older params to old params + let tempParams = oldContainerParamsToNew(params); + + if (tempParams.value) { + const container = tempParams.value.container; + // old params + if (container && (container.hasOwnProperty("layout") || container.hasOwnProperty("items"))) { + const autoHeight = tempParams.value.autoHeight; + const scrollbars = tempParams.value.scrollbars; + return { + ...tempParams, + value: { + container: { + showHeader: true, + body: { 0: { view: container } }, + showFooter: false, + showSider: true, + autoHeight: autoHeight, + contentScrollbars: scrollbars, + }, + }, + }; + } + } + return tempParams; +} + + +class ContainerTmpComp extends ContainerBaseComp { + constructor(params: CompParams) { + super(convertOldContainerParams(params)); + } +} + +const PageLayoutCompTmP = withExposingConfigs(ContainerTmpComp, [ + NameConfigHidden, + NameConfigDisabled, + + new NameConfig("container", trans("export.ratingValueDesc")), + new CompDepsConfig( + "siderCollapsed", + (comp) => ({ data : comp.children.container.children.siderCollapsed.nodeWithoutCache()}), + (input) => input.data.value, trans("listView.itemsDesc") + ), +]); + +export const PageLayoutComp = withMethodExposing(PageLayoutCompTmP, [ + + { + method: { + name: "setSiderCollapsed", + description: "Set the Sider of the PageLayout to be collapsed or not", + params: [{ name: "collapsed", type: "boolean" }], + }, + execute: (comp, values) => { + const page = values[0] as number; + if (page && page > 0) { + // comp.children.pagination.children.pageNo.dispatchChangeValueAction(page); + } + }, + } +]); + +type ContainerDataType = ToDataType>; + +export function defaultPageLayoutData( + compName: string, + nameGenerator: NameGenerator +): ContainerDataType { + return { + container: { + header: toSimpleContainerData([ + { + item: { + compType: "navigation", + name: nameGenerator.genItemName("pageNavigation"), + comp: { + logoUrl: "", + hidden: false, + items: [ + { + label: "Home", + hidden: false, + active: false, + }, + { + label: "Services", + hidden: false, + active: false, + items: [ + { + label: "Lowcode Platform", + hidden: false, + active: false, + }, + { + label: "App Development", + hidden: false, + active: false, + }, + ], + }, + { + label: "About", + hidden: false, + active: false, + }, + ], + }, + }, + layoutItem: { + i: "", + h: 6, + w: 24, + x: 0, + y: 0, + }, + }, + ]), + }, + }; +} diff --git a/client/packages/lowcoder/src/comps/comps/containerComp/textContainerComp.tsx b/client/packages/lowcoder/src/comps/comps/containerComp/textContainerComp.tsx new file mode 100644 index 000000000..6681a9635 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/containerComp/textContainerComp.tsx @@ -0,0 +1,192 @@ +import { BoolCodeControl, StringControl } from "comps/controls/codeControl"; +import { stringExposingStateControl } from "comps/controls/codeStateControl"; +import { ToDataType } from "comps/generators/multi"; +import { + NameConfigHidden, + withExposingConfigs, +} from "comps/generators/withExposing"; +import { NameGenerator } from "comps/utils/nameGenerator"; +import { hiddenPropertyView } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { CompParams } from "lowcoder-core"; +import { Section, sectionNames } from "lowcoder-design"; +import { oldContainerParamsToNew } from "../containerBase"; +import { toSimpleContainerData } from "../containerBase/simpleContainerComp"; +import { + ContainerChildren, + ContainerCompBuilder, +} from "../triContainerComp/triContainerCompBuilder"; +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 { useContext } from "react"; +import { EditorContext } from "comps/editorState"; +import { alignWithJustifyControl } from "comps/controls/alignControl"; + +const typeOptions = [ + { + label: "Markdown", + value: "markdown", + }, + { + label: trans("text"), + value: "text", + }, +] as const; + +const floatOptions = [ + { + label: "None", + value: "none", + }, + { + label: "Right", + value: "right", + }, + { + label: "Left", + value: "left", + }, +] as const; + + +export const ContainerBaseComp = (function () { + const childrenMap = { + disabled: BoolCodeControl, + text: stringExposingStateControl( + "text", "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi feugiat faucibus eleifend. Pellentesque eleifend, risus vel sagittis mattis, mauris ipsum tempor sapien, eu lobortis lacus libero a dui. Cras erat felis, rhoncus vestibulum consectetur et, ultrices ut purus. Sed a tortor orci. Vestibulum nec eleifend ante." + ), + type: dropdownControl(typeOptions, "markdown"), + float: dropdownControl(floatOptions, "left"), + horizontalAlignment: alignWithJustifyControl(), + width: withDefault(StringControl, "40"), + style: styleControl(TextStyle), + }; + return new ContainerCompBuilder(childrenMap, (props, dispatch) => { + return ; + }) + .setPropertyViewFn((children) => { + return ( + <> +
+ {children.type.propertyView({label: trans("value"), tooltip: trans("textShow.valueTooltip"), radioButton: true,})} + {children.text.propertyView({})} +
+ + {["logic", "both"].includes(useContext(EditorContext).editorModeStatus) && ( +
+ {hiddenPropertyView(children)} +
+ )} + {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( + <> +
+ {children.container.getPropertyView()} + {children.width.propertyView({label: trans("container.flowWidth")})} + {children.float.propertyView({ label: trans("container.floatType"), radioButton: true, + })} + {children.horizontalAlignment.propertyView({ + label: trans("textShow.horizontalAlignment"), + radioButton: true, + })} +
+
+ {children.style.getPropertyView()} +
+
+ {children.container.stylePropertyView()} +
+ {children.container.children.showHeader.getView() && ( +
+ { children.container.headerStylePropertyView() } +
+ )} + {children.container.children.showBody.getView() && ( +
+ { children.container.bodyStylePropertyView() } +
+ )} + {children.container.children.showFooter.getView() && ( +
+ { children.container.footerStylePropertyView() } +
+ )} + + )} + + ); + }) + .build(); +})(); + +// Compatible with old data +function convertOldContainerParams(params: CompParams) { + // convert older params to old params + let tempParams = oldContainerParamsToNew(params); + + if (tempParams.value) { + const container = tempParams.value.container; + // old params + if ( + container && + (container.hasOwnProperty("layout") || container.hasOwnProperty("items")) + ) { + const autoHeight = tempParams.value.autoHeight; + return { + ...tempParams, + value: { + container: { + showHeader: false, + body: { 0: { view: container } }, + showBody: true, + showFooter: false, + autoHeight: autoHeight, + }, + }, + }; + } + } + return tempParams; +} + +class ContainerTmpComp extends ContainerBaseComp { + constructor(params: CompParams) { + super(convertOldContainerParams(params)); + } +} + +export const ContainerComp = withExposingConfigs(ContainerTmpComp, [ + NameConfigHidden, +]); + +type ContainerDataType = ToDataType>; + +export function defaultContainerData( + compName: string, + nameGenerator: NameGenerator +): ContainerDataType { + return { + container: { + header: toSimpleContainerData([ + { + item: { + compType: "text", + name: nameGenerator.genItemName("containerTitle"), + comp: { + text: "### " + trans("container.title"), + }, + }, + layoutItem: { + i: "", + h: 5, + w: 24, + x: 0, + y: 0, + }, + }, + ]) + }, + }; +} diff --git a/client/packages/lowcoder/src/comps/comps/customComp/customComp.tsx b/client/packages/lowcoder/src/comps/comps/customComp/customComp.tsx index fafb3f7f5..07d72b701 100644 --- a/client/packages/lowcoder/src/comps/comps/customComp/customComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/customComp/customComp.tsx @@ -15,7 +15,6 @@ import { EditorContext } from "comps/editorState"; // TODO: eventually to embedd in container so we have styling? // TODO: support different starter templates for different frameworks (react, ANT, Flutter, Angular, etc) -// TODO: use modern version of ANTd const defaultModel = { name: "{{currentUser.name}}", diff --git a/client/packages/lowcoder/src/comps/comps/dateComp/dateComp.tsx b/client/packages/lowcoder/src/comps/comps/dateComp/dateComp.tsx index ceeb9a257..f3182b38f 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 } from "comps/controls/styleControlConstants"; +import { DateTimeStyle, DateTimeStyleType, InputFieldStyle, LabelStyle } from "comps/controls/styleControlConstants"; import { withMethodExposing } from "../../generators/withMethodExposing"; import { disabledPropertyView, @@ -50,6 +50,11 @@ import { DateRangeUIView } from "comps/comps/dateComp/dateRangeUIView"; import { EditorContext } from "comps/editorState"; +const defaultStyle = { + borderStyle: 'solid', + borderWidth: '1px', +} + const EventOptions = [changeEvent, focusEvent, blurEvent] as const; const validationChildren = { @@ -71,10 +76,12 @@ const commonChildren = { hourStep: RangeControl.closed(1, 24, 1), minuteStep: RangeControl.closed(1, 60, 1), secondStep: RangeControl.closed(1, 60, 1), - style: styleControl(DateTimeStyle), + style: styleControl(InputFieldStyle), + labelStyle: styleControl(LabelStyle.filter((style) => ['accent', 'validate'].includes(style.name) === false)), suffixIcon: withDefault(IconControl, "/icon:regular/calendar"), ...validationChildren, viewRef: RefControl, + inputFieldStyle: withDefault(styleControl(DateTimeStyle), defaultStyle), }; type CommonChildrenType = RecordConstructorToComp; @@ -159,17 +166,19 @@ export type DateCompViewProps = Pick< export const datePickerControl = new UICompBuilder(childrenMap, (props) => { let time = dayjs(null); - if(props.value.value !== '') { + if (props.value.value !== '') { time = dayjs(props.value.value, DateParser); } return props.label({ required: props.required, style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, children: ( disabledTime(props.minTime, props.maxTime)} - $style={props.style} + $style={props.inputFieldStyle} disabled={props.disabled} {...datePickerProps(props)} minDate={props.minDate} @@ -212,11 +221,11 @@ export const datePickerControl = new UICompBuilder(childrenMap, (props) => { {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( <>
- {requiredPropertyView(children)} - {dateValidationFields(children)} - {timeValidationFields(children)} - {children.customRule.propertyView({})} -
+ {requiredPropertyView(children)} + {dateValidationFields(children)} + {timeValidationFields(children)} + {children.customRule.propertyView({})} +
{children.onEvent.getPropertyView()} {disabledPropertyView(children)} @@ -234,9 +243,9 @@ export const datePickerControl = new UICompBuilder(childrenMap, (props) => { {children.placeholder.propertyView({ label: trans("date.placeholderText") })}
)} - + {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( - <>
+ <>
{timeFields(children, isMobile)} {children.suffixIcon.propertyView({ label: trans("button.suffixIcon") })}
@@ -244,9 +253,17 @@ export const datePickerControl = new UICompBuilder(childrenMap, (props) => { {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && !isMobile && commonAdvanceSection(children)} {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( -
- {children.style.getPropertyView()} -
+ <> +
+ {children.style.getPropertyView()} +
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.inputFieldStyle.getPropertyView()} +
+ )} ); @@ -264,17 +281,17 @@ export const dateRangeControl = (function () { return new UICompBuilder(childrenMap, (props) => { let start = dayjs(null); let end = dayjs(null); - if(props.start.value !== '') { + if (props.start.value !== '') { start = dayjs(props.start.value, DateParser); } - if(props.end.value !== '') { + if (props.end.value !== '') { end = dayjs(props.end.value, DateParser); } const children = ( { @@ -337,11 +356,11 @@ export const dateRangeControl = (function () { {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( <>
- {requiredPropertyView(children)} - {dateValidationFields(children)} - {timeValidationFields(children)} - {children.customRule.propertyView({})} -
+ {requiredPropertyView(children)} + {dateValidationFields(children)} + {timeValidationFields(children)} + {children.customRule.propertyView({})} +
{children.onEvent.getPropertyView()} {disabledPropertyView(children)} @@ -358,7 +377,7 @@ export const dateRangeControl = (function () { {children.placeholder.propertyView({ label: trans("date.placeholderText") })}
)} - + {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( <>
{timeFields(children, isMobile)} @@ -368,9 +387,17 @@ export const dateRangeControl = (function () { {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && commonAdvanceSection(children)} {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( -
- {children.style.getPropertyView()} -
+ <> +
+ {children.style.getPropertyView()} +
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.inputFieldStyle.getPropertyView()} +
+ )} diff --git a/client/packages/lowcoder/src/comps/comps/dateComp/dateCompUtil.ts b/client/packages/lowcoder/src/comps/comps/dateComp/dateCompUtil.ts index 2c265ecd8..cdd2f7662 100644 --- a/client/packages/lowcoder/src/comps/comps/dateComp/dateCompUtil.ts +++ b/client/packages/lowcoder/src/comps/comps/dateComp/dateCompUtil.ts @@ -4,7 +4,7 @@ import { range } from "lodash"; import { DateTimeStyleType } from "../../controls/styleControlConstants"; import { css } from "styled-components"; import { isDarkColor, lightenColor } from "components/colorSelect/colorUtils"; -import { CommonPickerMethods } from "antd/lib/date-picker/generatePicker/interface"; +import { CommonPickerMethods } from "antd/es/date-picker/generatePicker/interface"; import { blurMethod, focusMethod } from "comps/utils/methodUtils"; import { refMethods } from "comps/generators/withMethodExposing"; @@ -73,6 +73,8 @@ export const getStyle = (style: DateTimeStyleType) => { &:not(.ant-picker-disabled) { border-color: ${style.border}; background-color: ${style.background}; + border-width: ${style.borderWidth}; + border-style: ${style.borderStyle}; input { color: ${style.text}; diff --git a/client/packages/lowcoder/src/comps/comps/dateComp/dateMobileUIView.tsx b/client/packages/lowcoder/src/comps/comps/dateComp/dateMobileUIView.tsx index fcb2cec58..248b3da46 100644 --- a/client/packages/lowcoder/src/comps/comps/dateComp/dateMobileUIView.tsx +++ b/client/packages/lowcoder/src/comps/comps/dateComp/dateMobileUIView.tsx @@ -7,7 +7,7 @@ import { CanvasContainerID } from "constants/domLocators"; import { trans } from "i18n"; import React from "react"; import { DataUIViewProps } from "comps/comps/dateComp/dateUIView"; -import { SwapRightOutlined } from "@ant-design/icons"; +import { default as SwapRightOutlined } from "@ant-design/icons/SwapRightOutlined" import { DateRangeUIViewProps } from "comps/comps/dateComp/dateRangeUIView"; import { DateCompViewProps } from "comps/comps/dateComp/dateComp"; @@ -30,6 +30,8 @@ const handleClick = async ( MobileDatePicker.prompt({ getContainer: () => document.querySelector(`#${CanvasContainerID}`) || document.body, mouseWheel: true, + cancelText: trans("cancel"), + confirmText: trans("ok"), destroyOnClose: true, closeOnMaskClick: true, min: min.isValid() ? min.toDate() : undefined, diff --git a/client/packages/lowcoder/src/comps/comps/dateComp/timeMobileUIView.tsx b/client/packages/lowcoder/src/comps/comps/dateComp/timeMobileUIView.tsx index 6e0274182..bb0433c78 100644 --- a/client/packages/lowcoder/src/comps/comps/dateComp/timeMobileUIView.tsx +++ b/client/packages/lowcoder/src/comps/comps/dateComp/timeMobileUIView.tsx @@ -1,4 +1,3 @@ -import { Picker } from "antd-mobile"; import { CanvasContainerID } from "constants/domLocators"; import type { TimeCompViewProps } from "./timeComp"; import dayjs from "dayjs"; @@ -10,7 +9,7 @@ import { getMobileStyle } from "comps/comps/dateComp/dateCompUtil"; import { trans } from "i18n"; import type { TimeUIViewProps } from "comps/comps/dateComp/timeUIView"; import { TimeRangeUIViewProps } from "comps/comps/dateComp/timeRangeUIView"; -import { SwapRightOutlined } from "@ant-design/icons"; +import { default as SwapRightOutlined } from "@ant-design/icons/SwapRightOutlined"; import React from "react"; const HoursColumns = (step: number = 1) => [ @@ -50,7 +49,7 @@ const AmPm = [ }, ]; -const handleClick = ( +const handleClick = async ( params: Pick< TimeCompViewProps, "hourStep" | "minuteStep" | "secondStep" | "use12Hours" | "disabledTime" | "onFocus" | "onBlur" @@ -59,6 +58,7 @@ const handleClick = ( onChange: (value: dayjs.Dayjs | null) => void; } ) => { + const Picker = (await import("antd-mobile/es/components/picker")).default const { disabledHours, disabledMinutes, disabledSeconds } = params.disabledTime(); Picker.prompt({ diff --git a/client/packages/lowcoder/src/comps/comps/dividerComp.tsx b/client/packages/lowcoder/src/comps/comps/dividerComp.tsx index 906db77c3..338ae6d7f 100644 --- a/client/packages/lowcoder/src/comps/comps/dividerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/dividerComp.tsx @@ -46,10 +46,10 @@ const StyledDivider = styled(Divider) ` }}; padding: ${(props) => props.$style.padding}; - border-top: ${(props) => (props.$style.borderWidth ? props.$style.borderWidth : "1px")} ${(props) => (props.dashed ? "dashed" : "solid")} ${(props) => props.$style.color}; - + border-top: ${(props) => (props.$style.borderWidth && props.$style.borderWidth != "0px" ? props.$style.borderWidth : "1px")} ${(props) => (props.dashed ? "dashed" : "solid")} ${(props) => props.$style.border}; +"" .ant-divider-inner-text::before, .ant-divider-inner-text::after { - border-block-start: ${(props) => (props.$style.borderWidth ? props.$style.borderWidth : "1px")} ${(props) => (props.dashed ? "dashed" : "solid")} ${(props) => props.$style.color} !important; + border-block-start: ${(props) => (props.$style.borderWidth && props.$style.borderWidth != "0px" ? props.$style.borderWidth : "1px")} ${(props) => (props.dashed ? "dashed" : "solid")} ${(props) => props.$style.border} !important; border-block-start-color: inherit; border-block-end: 0; } @@ -81,6 +81,8 @@ function fixOldStyleData(oldData: any) { return oldData; } + + // Compatible with historical style data 2022-8-26 export const DividerComp = migrateOldData( new UICompBuilder(childrenMap, (props) => { diff --git a/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.test.tsx b/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.test.tsx index 0dc0e8f66..087c04258 100644 --- a/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.test.tsx +++ b/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.test.tsx @@ -1,6 +1,7 @@ -import { readFile } from "fs/promises"; +// import { readFile } from "fs/promises"; import { resolveParsedValue } from "./fileComp"; import mime from "mime"; +const { readFile } = require("node:fs/promises"); global.TextDecoder = require("util").TextDecoder; @@ -90,7 +91,7 @@ function toArrayBuffer(buf: Buffer) { } function getFile(path: string) { - return readFile(path).then((b) => ({ + return readFile(path).then((b: Buffer) => ({ originFileObj: { arrayBuffer: () => new Promise((resolve) => resolve(toArrayBuffer(b))), type: mime.getType(path.substring(path.lastIndexOf("."))), diff --git a/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.tsx b/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.tsx index 018855b9c..48928e2f1 100644 --- a/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/fileComp/fileComp.tsx @@ -38,7 +38,7 @@ import { changeEvent, eventHandlerControl } from "../../controls/eventHandlerCon import { stateComp, UICompBuilder, withDefault } from "../../generators"; import { CommonNameConfig, NameConfig, withExposingConfigs } from "../../generators/withExposing"; import { formDataChildren, FormDataPropertyView } from "../formComp/formDataConstants"; -import { messageInstance } from "lowcoder-design"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; import React, { useContext } from "react"; import { EditorContext } from "comps/editorState"; diff --git a/client/packages/lowcoder/src/comps/comps/formComp/createForm.tsx b/client/packages/lowcoder/src/comps/comps/formComp/createForm.tsx index 37fab64d4..864e000d3 100644 --- a/client/packages/lowcoder/src/comps/comps/formComp/createForm.tsx +++ b/client/packages/lowcoder/src/comps/comps/formComp/createForm.tsx @@ -28,7 +28,7 @@ import { trans } from "i18n"; import log from "loglevel"; import { Datasource } from "@lowcoder-ee/constants/datasourceConstants"; import DataSourceIcon from "components/DataSourceIcon"; -import { messageInstance } from "lowcoder-design"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; const OpenDialogButton = styled.span` &:hover { diff --git a/client/packages/lowcoder/src/comps/comps/formComp/formComp.tsx b/client/packages/lowcoder/src/comps/comps/formComp/formComp.tsx index 16166e3f2..9201b4f23 100644 --- a/client/packages/lowcoder/src/comps/comps/formComp/formComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/formComp/formComp.tsx @@ -40,7 +40,7 @@ import { import { TriContainer } from "../triContainerComp/triContainer"; import { traverseCompTree } from "../containerBase/utils"; import { IForm } from "./formDataConstants"; -import { default as Spin } from "antd/es/spin"; +import { default as Spin } from "antd/lib/spin"; import { BoolControl } from "comps/controls/boolControl"; import { BottomResTypeEnum } from "types/bottomRes"; import { BoolCodeControl, JSONObjectControl } from "comps/controls/codeControl"; @@ -55,8 +55,8 @@ import { import { trans } from "i18n"; import log from "loglevel"; import { DisabledContext } from "comps/generators/uiCompBuilder"; -import { LoadingOutlined } from "@ant-design/icons"; -import { messageInstance } from "lowcoder-design"; +import { default as LoadingOutlined } from "@ant-design/icons/LoadingOutlined"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; import { styled } from "styled-components"; const FormWrapper = styled.div` diff --git a/client/packages/lowcoder/src/comps/comps/gridItemComp.tsx b/client/packages/lowcoder/src/comps/comps/gridItemComp.tsx index 5fb1e0b64..4fb4eb961 100644 --- a/client/packages/lowcoder/src/comps/comps/gridItemComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/gridItemComp.tsx @@ -23,6 +23,7 @@ import { profilerCallback } from "util/cacheUtils"; import { setFieldsNoTypeCheck, shallowEqual } from "util/objectUtils"; import { remoteComp } from "./remoteComp/remoteComp"; import { SimpleNameComp } from "./simpleNameComp"; +import { lazyLoadComp } from "./lazyLoadComp/lazyLoadComp"; export function defaultLayout(compType: UICompType): UICompLayoutInfo { return uiCompRegistry[compType]?.layoutInfo ?? { w: 5, h: 5 }; @@ -38,6 +39,7 @@ const TmpComp = withTypeAndChildren< >( (type) => { const compInfo = parseCompType(type); + if (compInfo.isRemote) { return remoteComp(compInfo); } @@ -46,8 +48,15 @@ const TmpComp = withTypeAndChildren< if (name !== type) { continue; } - const comp = manifest.withoutLoading ? manifest.comp : withIsLoading(manifest.comp); - return withErrorBoundary(comp) as ExposingMultiCompConstructor; + + if(manifest.lazyLoad) { + return lazyLoadComp( + manifest.compName, + manifest.compPath, + ); + } + const comp = manifest.withoutLoading ? manifest.comp : withIsLoading(manifest.comp!); + return withErrorBoundary(comp!) as ExposingMultiCompConstructor; } }, "button", diff --git a/client/packages/lowcoder/src/comps/comps/gridLayoutComp/canvasView.tsx b/client/packages/lowcoder/src/comps/comps/gridLayoutComp/canvasView.tsx index 545608daa..1a15ba9d3 100644 --- a/client/packages/lowcoder/src/comps/comps/gridLayoutComp/canvasView.tsx +++ b/client/packages/lowcoder/src/comps/comps/gridLayoutComp/canvasView.tsx @@ -21,6 +21,8 @@ import { CanvasContainerID } from "constants/domLocators"; import { CNRootContainer } from "constants/styleSelectors"; import { ScrollBar } from "lowcoder-design"; +// min-height: 100vh; + const UICompContainer = styled.div<{ $maxWidth?: number; readOnly?: boolean; $bgColor: string }>` height: 100%; margin: 0 auto; @@ -103,7 +105,6 @@ export function CanvasView(props: ContainerBaseProps) { cols: parseInt(defaultGrid), }; ////////////////////// - if (readOnly) { return ( -
- {/* */} - - - - {/* */} -
+ + +
); } diff --git a/client/packages/lowcoder/src/comps/comps/iconComp.tsx b/client/packages/lowcoder/src/comps/comps/iconComp.tsx index c04c5bbb3..f1700f489 100644 --- a/client/packages/lowcoder/src/comps/comps/iconComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/iconComp.tsx @@ -80,20 +80,24 @@ const IconView = (props: RecordConstructorToView) => { }; return ( - - props.onEvent("click")} - > - {props.icon} - + ( + props.onEvent("click")} + > + {props.icon} + + )} + > ); }; diff --git a/client/packages/lowcoder/src/comps/comps/imageComp.tsx b/client/packages/lowcoder/src/comps/comps/imageComp.tsx index 81d682342..b5a2a5728 100644 --- a/client/packages/lowcoder/src/comps/comps/imageComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/imageComp.tsx @@ -132,24 +132,28 @@ const ContainerImg = (props: RecordConstructorToView) => { } }; return ( - - -
- props.onEvent("click")} - /> -
-
+ ( + +
+ props.onEvent("click")} + /> +
+
+ )} + >
); }; diff --git a/client/packages/lowcoder/src/comps/comps/jsonComp/jsonEditorComp.tsx b/client/packages/lowcoder/src/comps/comps/jsonComp/jsonEditorComp.tsx index 6fde88e77..6663d527e 100644 --- a/client/packages/lowcoder/src/comps/comps/jsonComp/jsonEditorComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/jsonComp/jsonEditorComp.tsx @@ -19,7 +19,6 @@ import { type EditorView as EditorViewType, } from "base/codeEditor/codeMirror"; import { useExtensions } from "base/codeEditor/extensions"; -import { getJsonFormatter } from "base/codeEditor/autoFormat"; import { EditorContext } from "comps/editorState"; /** diff --git a/client/packages/lowcoder/src/comps/comps/jsonComp/jsonExplorerComp.tsx b/client/packages/lowcoder/src/comps/comps/jsonComp/jsonExplorerComp.tsx index 6d11c9f67..ee317c13c 100644 --- a/client/packages/lowcoder/src/comps/comps/jsonComp/jsonExplorerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/jsonComp/jsonExplorerComp.tsx @@ -1,7 +1,7 @@ import { Section, sectionNames } from "lowcoder-design"; import { UICompBuilder, withDefault } from "../../generators"; import { NameConfigHidden, NameConfig, withExposingConfigs } from "../../generators/withExposing"; -import ReactJson, { ThemeKeys } from "react-json-view"; +import ReactJson, { type ThemeKeys } from "react-json-view"; import { defaultData } from "./jsonConstants"; import styled from "styled-components"; import { BoolControl } from "comps/controls/boolControl"; diff --git a/client/packages/lowcoder/src/comps/comps/jsonComp/jsonLottieComp.tsx b/client/packages/lowcoder/src/comps/comps/jsonComp/jsonLottieComp.tsx index d3e6dcd72..45bafc9e5 100644 --- a/client/packages/lowcoder/src/comps/comps/jsonComp/jsonLottieComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/jsonComp/jsonLottieComp.tsx @@ -1,5 +1,4 @@ -import { Player } from "@lottiefiles/react-lottie-player"; -import { hiddenPropertyView } from "@lowcoder-ee/index.sdk"; +import { hiddenPropertyView } from "comps/utils/propertyUtils"; import { ArrayOrJSONObjectControl, NumberControl, @@ -10,7 +9,7 @@ import { styleControl } from "comps/controls/styleControl"; import { LottieStyle } from "comps/controls/styleControlConstants"; import { trans } from "i18n"; import { Section, sectionNames } from "lowcoder-design"; -import { useEffect, useState, useContext } from "react"; +import { useContext, lazy } from "react"; import { UICompBuilder, withDefault } from "../../generators"; import { NameConfig, @@ -20,6 +19,11 @@ import { import { defaultLottie } from "./jsonConstants"; import { EditorContext } from "comps/editorState"; +const Player = lazy( + () => import('@lottiefiles/react-lottie-player') + .then(module => ({default: module.Player})) +); + /** * JsonLottie Comp */ diff --git a/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/dateWidget.tsx b/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/dateWidget.tsx index 94887ffa6..1f1d42620 100644 --- a/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/dateWidget.tsx +++ b/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/dateWidget.tsx @@ -1,4 +1,4 @@ -import { WidgetProps } from "@rjsf/utils"; +import type { WidgetProps } from "@rjsf/utils"; import { default as DatePicker } from "antd/es/date-picker"; import dayjs from "dayjs"; diff --git a/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx b/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx index 37d5e4198..dfe00127f 100644 --- a/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/jsonSchemaFormComp/jsonSchemaFormComp.tsx @@ -1,18 +1,17 @@ import { withTheme } from '@rjsf/core'; -import { RJSFValidationError, ErrorListProps, UISchemaSubmitButtonOptions } from "@rjsf/utils"; +import type { RJSFValidationError, ErrorListProps, UISchemaSubmitButtonOptions } from "@rjsf/utils"; import validator from "@rjsf/validator-ajv8"; // import Ajv from "@rjsf/validator-ajv8"; 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, JsonSchemaFormStyleType } from "comps/controls/styleControlConstants"; +import { JsonSchemaFormStyle, type JsonSchemaFormStyleType } from "comps/controls/styleControlConstants"; import { depsConfig, NameConfigHidden, withExposingConfigs } from "comps/generators/withExposing"; import { withMethodExposing } from "comps/generators/withMethodExposing"; -import { ValueFromOption } from "lowcoder-design"; -import { i18n } from "lowcoder-core"; +import type { ValueFromOption } from "lowcoder-design"; import { i18nObjs, trans } from "i18n"; -import { JSONSchema7 } from "json-schema"; +import type { JSONSchema7 } from "json-schema"; import styled from "styled-components"; import { toBoolean, toNumber, toString } from "util/convertUtils"; import { Section, sectionNames } from "lowcoder-design"; diff --git a/client/packages/lowcoder/src/comps/comps/layout/mobileTabLayout.tsx b/client/packages/lowcoder/src/comps/comps/layout/mobileTabLayout.tsx index 9e6522281..e08567a82 100644 --- a/client/packages/lowcoder/src/comps/comps/layout/mobileTabLayout.tsx +++ b/client/packages/lowcoder/src/comps/comps/layout/mobileTabLayout.tsx @@ -5,7 +5,7 @@ import { manualOptionsControl } from "comps/controls/optionsControl"; import { BoolCodeControl, StringControl } from "comps/controls/codeControl"; import { IconControl } from "comps/controls/iconControl"; import styled from "styled-components"; -import React, { Suspense, useContext, useState } from "react"; +import React, { Suspense, useContext, useState } from "react"; import { registerLayoutMap } from "comps/comps/uiComp"; import { AppSelectComp } from "comps/comps/layout/appSelectComp"; import { NameAndExposingInfo } from "comps/utils/exposingTypes"; @@ -191,6 +191,8 @@ MobileTabLayoutTmp = withViewFn(MobileTabLayoutTmp, (comp) => { /> ); + //console.log("appView", appView); + if (readOnly) { return ( diff --git a/client/packages/lowcoder/src/comps/comps/lazyLoadComp/lazyLoadComp.test.tsx b/client/packages/lowcoder/src/comps/comps/lazyLoadComp/lazyLoadComp.test.tsx new file mode 100644 index 000000000..26af49da1 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/lazyLoadComp/lazyLoadComp.test.tsx @@ -0,0 +1,111 @@ +import { ExecuteAction } from "comps/controls/actionSelector/executeCompTypes"; +import { simpleMultiComp, valueComp } from "comps/generators"; +import { withSimpleExposing } from "comps/generators/withExposing"; +import { withMethodExposing } from "comps/generators/withMethodExposing"; +import { evalAndReduce } from "comps/utils"; +import { customAction } from "lowcoder-core"; +import { lazyLoadComp } from "./lazyLoadComp"; + +const TestComp = valueComp(123); +export { TestComp }; + +const compName = 'TestComp'; +const compPath = 'comps/lazyLoadComp/lazyLoadComp.test'; + +const RComp = lazyLoadComp(compName, compPath); + +test("lazyload comp", async () => { + let c: any = null; + c = new RComp({ + dispatch: (action) => { + if (c) { + c = c.reduce(action); + } + }, + }); + + expect(c.toJsonValue()).toBe(undefined); + await c.load(); + expect(c.toJsonValue()).toBe(123); + + c.dispatchChangeValueAction(345); + expect(c.toJsonValue()).toBe(345); +}); + +test("lazyload comp keep values", async () => { + let c: any = null; + c = new RComp({ + dispatch: (action) => { + if (c) { + c = c.reduce(action); + } + }, + value: 456, + }); + + expect(c.toJsonValue()).toBe(456); + await c.load(); + expect(c.toJsonValue()).toBe(456); +}); + +test("lazyload comp exposing data", async () => { + const EComp = lazyLoadComp(compName, compPath, async () => { + return withSimpleExposing(simpleMultiComp({ hello: valueComp(123) }), (comp) => { + return { + hello: comp.children.hello.getView(), + }; + }); + }); + + let c: any = null; + c = new EComp({ + dispatch: (action) => { + if (c) { + c = c.reduce(action); + } + }, + }); + + await c.load(); + const c1 = evalAndReduce(c); + expect(c1.exposingValues.hello).toBe(123); +}); + +test("lazyload comp execute method", async () => { + const MComp = lazyLoadComp(compName, compPath, async () => { + return withMethodExposing(simpleMultiComp({ hello: valueComp(123) }), [ + { + method: { + name: "add", + params: [{ name: "value", type: "number" }], + }, + execute: (comp, values) => { + const hello = comp.children.hello; + hello.dispatchChangeValueAction(hello.getView() + (values[0] as number)); + }, + }, + ]); + }); + let c: any = null; + c = new MComp({ + dispatch: (action) => { + if (c) { + c = c.reduce(action); + } + }, + }); + + await c.load(); + c.reduce( + customAction( + { + type: "execute", + methodName: "add", + params: [10], + }, + false + ) + ); + await new Promise((r) => setTimeout(r, 20)); + expect(c.children.hello.getView()).toEqual(133); +}); diff --git a/client/packages/lowcoder/src/comps/comps/lazyLoadComp/lazyLoadComp.tsx b/client/packages/lowcoder/src/comps/comps/lazyLoadComp/lazyLoadComp.tsx new file mode 100644 index 000000000..fbb8ccc06 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/lazyLoadComp/lazyLoadComp.tsx @@ -0,0 +1,167 @@ +import { default as Skeleton } from "antd/es/skeleton"; +import { simpleMultiComp } from "comps/generators"; +import { withExposingConfigs } from "comps/generators/withExposing"; +import { GreyTextColor } from "constants/style"; +import log from "loglevel"; +import { Comp, CompAction, CompConstructor, CompParams, customAction, isCustomAction } from "lowcoder-core"; +import { WhiteLoading } from "lowcoder-design"; +import { useState } from "react"; +import { useMount } from "react-use"; +import styled from "styled-components"; +import { RemoteCompInfo, RemoteCompLoader } from "types/remoteComp"; +import { withErrorBoundary } from "comps/generators/withErrorBoundary"; + +const ViewError = styled.div` + display: flex; + justify-content: center; + align-items: center; + background-color: white; + height: 100%; + color: ${GreyTextColor}; + border-radius: 4px; + padding: 24px; +`; + +const ViewLoadingWrapper = styled.div` + display: flex; + justify-content: center; + align-items: center; + background-color: white; + height: 100%; +`; + +function ViewLoading(props: { padding?: number }) { + return ( + + + + ); +} + +export interface LazyCompReadyAction { + type: "LazyCompReady"; + comp: Comp; +} + +interface LazyCompViewProps { + loadComp: () => Promise; + loadingElement?: () => React.ReactNode; + errorElement?: (error: any) => React.ReactNode; +} + +function LazyCompView(props: React.PropsWithChildren) { + const { loadComp, loadingElement, errorElement } = props; + const [error, setError] = useState(""); + + useMount(() => { + setError(""); + loadComp().catch((e) => { + setError(String(e)); + }); + }); + + if (error) { + if (errorElement) { + return <>{errorElement(error)}; + } + return ( + +
{error}
+
+ ); + } + + if (loadingElement) { + return {loadingElement()}; + } + + return ( + + + + ); +} + +export type LazyloadCompLoader = () => Promise; + +export function lazyLoadComp( + compName?: string, + compPath?: string, + loader?: LazyloadCompLoader, + loadingElement?: () => React.ReactNode +) { + class LazyLoadComp extends simpleMultiComp({}) { + compValue: any; + compName = compName; + compPath = compPath; + constructor(params: CompParams) { + super(params); + this.compValue = params.value; + } + + private async load() { + if (!compPath) { + return; + } + let LazyExportedComp; + if (!loader) { + const module = await import(`../../${compPath}.tsx`); + LazyExportedComp = module[compName!]; + } else { + LazyExportedComp = await loader(); + } + if (!LazyExportedComp) { + log.error("loader not found, lazy load info:", compPath); + return; + } + + const params: CompParams = { + dispatch: this.dispatch, + }; + + if (this.compValue) { + params.value = this.compValue; + } + const LazyCompWithErrorBound = withErrorBoundary(LazyExportedComp); + this.dispatch( + customAction( + { + type: "LazyCompReady", + comp: new LazyCompWithErrorBound(params), + }, + false + ) + ); + } + + getView() { + // const key = `${remoteInfo?.packageName}-${remoteInfo?.packageVersion}-${remoteInfo?.compName}`; + const key = `${compName}`; + return ( + this.load()} loadingElement={loadingElement} /> + ); + } + + getPropertyView() { + return ; + } + + reduce(action: CompAction): this { + if (isCustomAction(action, "LazyCompReady")) { + // use real remote comp instance to replace RemoteCompLoader + return action.value.comp as this; + } + return super.reduce(action); + } + + autoHeight(): boolean { + return false; + } + + toJsonValue() { + return this.compValue; + } + } + + return withExposingConfigs(LazyLoadComp, []); +} \ No newline at end of file diff --git a/client/packages/lowcoder/src/comps/comps/listViewComp/listView.tsx b/client/packages/lowcoder/src/comps/comps/listViewComp/listView.tsx index f5f720569..0d82ed705 100644 --- a/client/packages/lowcoder/src/comps/comps/listViewComp/listView.tsx +++ b/client/packages/lowcoder/src/comps/comps/listViewComp/listView.tsx @@ -4,7 +4,7 @@ import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; import _ from "lodash"; import { ConstructorToView, deferAction } from "lowcoder-core"; import { HintPlaceHolder, ScrollBar, pageItemRender } from "lowcoder-design"; -import { RefObject, useContext, useEffect, useMemo, useRef } from "react"; +import { RefObject, useContext, createContext, useMemo, useRef } from "react"; import ReactResizeDetector from "react-resize-detector"; import styled from "styled-components"; import { checkIsMobile } from "util/commonUtils"; @@ -35,26 +35,57 @@ const FooterWrapper = styled.div` `; const BodyWrapper = styled.div<{ $autoHeight: boolean }>` - overflow: auto; - overflow: overlay; height: ${(props) => (props.$autoHeight ? "100%" : "calc(100% - 32px)")}; `; -const FlexWrapper = styled.div` +const FlexWrapper = styled.div` height: 100%; display: flex; align-items: center; - justify-content: center; + // justify-content: center; +`; + +const ListOrientationWrapper = styled.div<{ + $isHorizontal: boolean, + $autoHeight : boolean, + $isGrid: boolean, +}>` + height: ${(props) => (props.$autoHeight ? "auto" : "100%")}; + display: flex; + flex-direction: ${(props) => (props.$isHorizontal && !props.$isGrid ? "row" : "column")}; + height: 100%; `; -const ContainerInListView = (props: ContainerBaseProps) => { +type MinHorizontalWidthContextType = { + horizontalWidth: string, + minHorizontalWidth?: string, +} + +const MinHorizontalWidthContext = createContext({ + horizontalWidth: '100%', + minHorizontalWidth: '100px', +}); + +const ContainerInListView = (props: ContainerBaseProps ) => { + const { + horizontalWidth, + minHorizontalWidth + } = useContext(MinHorizontalWidthContext); + return ( - +
+ +
); }; @@ -66,10 +97,23 @@ type ListItemProps = { scrollContainerRef?: RefObject; minHeight?: string; unMountFn?: () => void; + minHorizontalWidth?: string; + horizontalWidth: string; }; -function ListItem(props: ListItemProps) { - const { itemIdx, offset, containerProps, autoHeight, scrollContainerRef, minHeight } = props; +function ListItem({ + minHorizontalWidth, + horizontalWidth, + ...props +}: ListItemProps) { + const { + itemIdx, + offset, + containerProps, + autoHeight, + scrollContainerRef, + minHeight + } = props; // disable the unmount function to save user's state with pagination // useEffect(() => { @@ -80,23 +124,36 @@ function ListItem(props: ListItemProps) { // }, []); return ( - + + + ); } @@ -126,6 +183,8 @@ export function ListView(props: Props) { ); const autoHeight = useMemo(() => children.autoHeight.getView(), [children.autoHeight]); const scrollbars = useMemo(() => children.scrollbars.getView(), [children.scrollbars]); + const horizontal = useMemo(() => children.horizontal.getView(), [children.horizontal]); + const minHorizontalWidth = useMemo(() => children.minHorizontalWidth.getView(), [children.minHorizontalWidth]); const noOfColumns = useMemo( () => Math.max(1, children.noOfColumns.getView()), [children.noOfColumns] @@ -163,7 +222,7 @@ export function ListView(props: Props) { key={rowIdx} style={{ height: rowHeight, - // border: "0.5px solid #d9d9d9" + width: '100%', }} > @@ -198,6 +257,8 @@ export function ListView(props: Props) { scrollContainerRef={ref} minHeight={minHeight} unMountFn={unMountFn} + horizontalWidth={`${100 / noOfColumns}%`} + minHorizontalWidth={horizontal ? minHorizontalWidth : undefined} /> ); })} @@ -214,11 +275,25 @@ export function ListView(props: Props) { return ( + - <>{ { if (height) setListHeight(height); }} observerOptions={{ box: "border-box" }} > -
{renders}
-
} + { + if (height) setListHeight(height); + }} + observerOptions={{ box: "border-box" }} + render={() => ( + 1} + $autoHeight={autoHeight} + > + {renders} + + )} + > +
diff --git a/client/packages/lowcoder/src/comps/comps/listViewComp/listViewComp.tsx b/client/packages/lowcoder/src/comps/comps/listViewComp/listViewComp.tsx index 3687df0c4..1e6fe932e 100644 --- a/client/packages/lowcoder/src/comps/comps/listViewComp/listViewComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/listViewComp/listViewComp.tsx @@ -3,6 +3,7 @@ import { BoolControl } from "comps/controls/boolControl"; import { NumberControl, NumberOrJSONObjectArrayControl, + RadiusControl, StringControl, } from "comps/controls/codeControl"; import { styleControl } from "comps/controls/styleControl"; @@ -52,6 +53,8 @@ const childrenMap = { showBorder: BoolControl, pagination: withDefault(PaginationControl, { pageSize: "6" }), style: styleControl(ListViewStyle), + horizontal: withDefault(BoolControl, false), + minHorizontalWidth: withDefault(RadiusControl, '100px'), }; const ListViewTmpComp = new UICompBuilder(childrenMap, () => <>) diff --git a/client/packages/lowcoder/src/comps/comps/listViewComp/listViewPropertyView.tsx b/client/packages/lowcoder/src/comps/comps/listViewComp/listViewPropertyView.tsx index 5d2c5dc0a..bfd5f7d0a 100644 --- a/client/packages/lowcoder/src/comps/comps/listViewComp/listViewPropertyView.tsx +++ b/client/packages/lowcoder/src/comps/comps/listViewComp/listViewPropertyView.tsx @@ -62,11 +62,20 @@ export function listPropertyView(compType: ListCompType) { {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( <>
{children.autoHeight.getPropertyView()} - {!children.autoHeight.getView() && + {(!children.autoHeight.getView() || children.horizontal.getView()) && children.scrollbars.propertyView({ label: trans("prop.scrollbar"), } )} + {children.horizontal.propertyView({ + label: trans("prop.horizontal"), + })} + {children.horizontal.getView() && ( + children.minHorizontalWidth.propertyView({ + label: trans("prop.minHorizontalWidth"), + placeholder: '100px', + }) + )}
{children.style.getPropertyView()} diff --git a/client/packages/lowcoder/src/comps/comps/mediaComp/colorPickerComp.tsx b/client/packages/lowcoder/src/comps/comps/mediaComp/colorPickerComp.tsx new file mode 100644 index 000000000..f7ccaf662 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/mediaComp/colorPickerComp.tsx @@ -0,0 +1,127 @@ +import { Section, sectionNames } from "lowcoder-design"; +import { BoolControl } from "comps/controls/boolControl"; +import { styleControl } from "comps/controls/styleControl"; +import { ColorPickerStyle, ColorPickerStyleType } from "comps/controls/styleControlConstants"; +import { NameConfig } from "comps/generators/withExposing"; +import styled, { css } from "styled-components"; +import { UICompBuilder, withDefault } from "../../generators"; +import { FormDataPropertyView } from "../formComp/formDataConstants"; +import { textInputChildren } from "../textInputComp/textInputConstants"; +import { disabledPropertyView, hiddenPropertyView, } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { ColorPicker } from 'antd'; +import { presets } from "./colorPickerConstants"; +import _ from "lodash" +import { changeEvent, eventHandlerControl } from "comps/controls/eventHandlerControl"; +import { jsonObjectExposingStateControl, stringExposingStateControl } from "comps/controls/codeStateControl"; +import { dropdownControl } from "comps/controls/dropdownControl"; +import { ArrayOrJSONObjectControl } from "comps/controls/codeControl"; + +export function getStyle(style: ColorPickerStyleType) { + return css` + border-radius: ${style.radius}; + &:not(.ant-input-disabled, .ant-input-affix-wrapper-disabled), + input { + background-color: ${style.background}; + border-color: ${style.border}; + &:focus, + &.ant-input-affix-wrapper-focused { + border-color: ${style.accent}; + } + &:hover { + border-color: ${style.accent}; + } + .ant-input-clear-icon svg:hover { + opacity: 0.65; + } + } + `; +} + +const ColorPickerWrapper = styled(ColorPicker) <{ $style: ColorPickerStyleType }>` + width: 100%; + display: flex; + justify-content: flex-start; + ${(props) => props.$style && getStyle(props.$style)} +`; + +const colorPickerTriggerOption = [ + { label: trans('colorPicker.click'), value: 'click' }, + { label: trans('colorPicker.hover'), value: 'hover' }, +] as const; + +export const colorPickerEvent = eventHandlerControl([ + changeEvent +] as const); + +const childrenMap = { + ...textInputChildren, + value: stringExposingStateControl('value', '#3377ff'), + style: styleControl(ColorPickerStyle), + color: jsonObjectExposingStateControl('color', {}), + trigger: dropdownControl(colorPickerTriggerOption, 'click'), + disabledAlpha: BoolControl, + showPresets: BoolControl, + onEvent: colorPickerEvent, + presets: withDefault(ArrayOrJSONObjectControl, JSON.stringify(presets, null, 2)), +}; + +export const ColorPickerComp = new UICompBuilder(childrenMap, (props) => { + return props.label({ + children: ( + value.toHexString().toUpperCase()} + allowClear + trigger={props.trigger} + disabled={props.disabled} + onChange={(value) => { + props.value.onChange(value.toHexString().toUpperCase()) + props.color.onChange({ + hex: value.toHexString().toUpperCase(), + hsb: value.toHsb(), + rgb: value.toRgb(), + }) + props.onEvent('change') + }} + presets={props.showPresets && !_.isEmpty(props.presets) ? [(props.presets as any)] : []} + /> + ), + style: props.style, + }); +}) + .setPropertyViewFn((children) => { + return ( + <> +
+ {children.value.propertyView({ label: trans("prop.defaultValue") })} +
+ + + {children.label.getPropertyView()} +
+ {children.onEvent.getPropertyView()} + {disabledPropertyView(children)} +
+ +
+ {children.trigger.propertyView({ label: trans("colorPicker.trigger"), radioButton: true })} + {children.disabledAlpha.propertyView({ label: trans("colorPicker.disabledAlpha") })} + {children.showPresets.propertyView({ label: trans("colorPicker.showPresets") })} + {children.showPresets.getView() && children.presets.propertyView({ label: trans("colorPicker.recommended") })} +
+ +
{hiddenPropertyView(children)}
+ +
{children.style.getPropertyView()}
+ + ); + }) + .setExposeStateConfigs([ + new NameConfig("value", trans("export.inputValueDesc")), + new NameConfig("color", trans("export.inputValueDesc")), + new NameConfig("disabled", trans("prop.disabled")), + ]) + .build(); diff --git a/client/packages/lowcoder/src/comps/comps/mediaComp/colorPickerConstants.tsx b/client/packages/lowcoder/src/comps/comps/mediaComp/colorPickerConstants.tsx new file mode 100644 index 000000000..cb242546e --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/mediaComp/colorPickerConstants.tsx @@ -0,0 +1,38 @@ +import { trans } from "@lowcoder-ee/i18n"; + +export const presets = +{ + label: trans("colorPicker.recommended"), + colors: [ + '#000000', + '#000000E0', + '#000000A6', + '#00000073', + '#00000040', + '#00000026', + '#0000001A', + '#00000012', + '#0000000A', + '#00000005', + '#F5222D', + '#FA8C16', + '#FADB14', + '#8BBB11', + '#52C41A', + '#13A8A8', + '#1677FF', + '#2F54EB', + '#722ED1', + '#EB2F96', + '#F5222D4D', + '#FA8C164D', + '#FADB144D', + '#8BBB114D', + '#52C41A4D', + '#13A8A84D', + '#1677FF4D', + '#2F54EB4D', + '#722ED14D', + '#EB2F964D', + ], +} \ No newline at end of file diff --git a/client/packages/lowcoder/src/comps/comps/mediaComp/mediaUtils.tsx b/client/packages/lowcoder/src/comps/comps/mediaComp/mediaUtils.tsx index 8dc0f0d95..3dc162b03 100644 --- a/client/packages/lowcoder/src/comps/comps/mediaComp/mediaUtils.tsx +++ b/client/packages/lowcoder/src/comps/comps/mediaComp/mediaUtils.tsx @@ -7,7 +7,7 @@ import { } from "comps/generators/withMethodExposing"; import { trans } from "i18n"; import { MultiBaseComp } from "lowcoder-core"; -import ReactPlayer from "react-player"; +import type ReactPlayer from "react-player"; export const mediaCommonChildren = { viewRef: RefControl, diff --git a/client/packages/lowcoder/src/comps/comps/mediaComp/videoComp.tsx b/client/packages/lowcoder/src/comps/comps/mediaComp/videoComp.tsx index 1d1ad8089..c8288cf50 100644 --- a/client/packages/lowcoder/src/comps/comps/mediaComp/videoComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/mediaComp/videoComp.tsx @@ -14,7 +14,7 @@ import { RangeControl } from "../../controls/codeControl"; import { hiddenPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; import { Video } from "lowcoder-design"; -import ReactPlayer from "react-player"; +import type ReactPlayer from "react-player"; import { mediaCommonChildren, mediaMethods } from "./mediaUtils"; import { useContext } from "react"; diff --git a/client/packages/lowcoder/src/comps/comps/meetingComp/controlButton.tsx b/client/packages/lowcoder/src/comps/comps/meetingComp/controlButton.tsx index 1f7815a80..6911b9d0e 100644 --- a/client/packages/lowcoder/src/comps/comps/meetingComp/controlButton.tsx +++ b/client/packages/lowcoder/src/comps/comps/meetingComp/controlButton.tsx @@ -28,10 +28,7 @@ import { } from "../../generators/withExposing"; import { IForm } from "../formComp/formDataConstants"; import { SimpleNameComp } from "../simpleNameComp"; -import { - Button100, - ButtonStyleControl, -} from "./videobuttonCompConstants"; +import { Button100, ButtonStyleControl } from "./videobuttonCompConstants"; import { RefControl } from "comps/controls/refControl"; import { AutoHeightControl } from "comps/controls/autoHeightControl"; import { @@ -231,55 +228,59 @@ let ButtonTmpComp = (function () { return ( {(editorState) => ( - - -
- ( + +
- isDefault(props.type) - ? props.onEvent("click") - : submitForm(editorState, props.form) + ? { width: "100%", height: "100%" } + : undefined } > - {props.prefixIcon && ( - - {props.prefixIcon} - - )} - - -
-
+ + isDefault(props.type) + ? props.onEvent("click") + : submitForm(editorState, props.form) + } + > + {props.prefixIcon && ( + + {props.prefixIcon} + + )} + + +
+
+ )} + >
)}
@@ -293,8 +294,8 @@ let ButtonTmpComp = (function () { })}
- - {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( + {(useContext(EditorContext).editorModeStatus === "logic" || + useContext(EditorContext).editorModeStatus === "both") && (
{children.onEvent.getPropertyView()} {disabledPropertyView(children)} @@ -303,19 +304,22 @@ let ButtonTmpComp = (function () {
)} - {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( - <>
+ {(useContext(EditorContext).editorModeStatus === "layout" || + useContext(EditorContext).editorModeStatus === "both") && ( + <> +
{children.autoHeight.getPropertyView()} {children.iconSize.propertyView({ label: trans("button.iconSize"), })}
- {children.style.getPropertyView()} - {children.aspectRatio.propertyView({ - label: trans("style.aspectRatio"), - })} -
+ {children.style.getPropertyView()} + {children.aspectRatio.propertyView({ + label: trans("style.aspectRatio"), + })} +
+ )} )) diff --git a/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx b/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx deleted file mode 100644 index 685673735..000000000 --- a/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx +++ /dev/null @@ -1,871 +0,0 @@ -import { CloseOutlined } from "@ant-design/icons"; -import { default as Button } from "antd/es/button"; -import { ContainerCompBuilder } from "comps/comps/containerBase/containerCompBuilder"; -import { - gridItemCompToGridItems, - InnerGrid, -} from "comps/comps/containerComp/containerView"; -import { AutoHeightControl } from "comps/controls/autoHeightControl"; -import { BoolControl } from "comps/controls/boolControl"; -import { StringControl } from "comps/controls/codeControl"; -import { - booleanExposingStateControl, - BooleanStateControl, - jsonObjectExposingStateControl, - stringStateControl, -} from "comps/controls/codeStateControl"; -import { PositionControl } from "comps/controls/dropdownControl"; -import { - closeEvent, - eventHandlerControl, -} from "comps/controls/eventHandlerControl"; -import { styleControl } from "comps/controls/styleControl"; -import { DrawerStyle } from "comps/controls/styleControlConstants"; -import { stateComp, withDefault } from "comps/generators"; -import { withMethodExposing } from "comps/generators/withMethodExposing"; -import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; -import { CanvasContainerID } from "constants/domLocators"; -import { Layers } from "constants/Layers"; -import { trans } from "i18n"; -import { changeChildAction } from "lowcoder-core"; -import { - Drawer, - HintPlaceHolder, - Section, - sectionNames, -} from "lowcoder-design"; -import { useCallback, useEffect, useState } from "react"; -import { ResizeHandle } from "react-resizable"; -import styled from "styled-components"; -import { useUserViewMode } from "util/hooks"; -import { isNumeric } from "util/stringUtils"; -import { NameConfig, withExposingConfigs } from "../../generators/withExposing"; - -import { v4 as uuidv4 } from "uuid"; - -import { useContext } from "react"; -import { EditorContext } from "comps/editorState"; - -// import axios from "axios"; - -import AgoraRTC, { - ICameraVideoTrack, - IMicrophoneAudioTrack, - IAgoraRTCClient, - IAgoraRTCRemoteUser, - UID, - ILocalVideoTrack, -} from "agora-rtc-sdk-ng"; - -import { JSONValue, NumberControl } from "@lowcoder-ee/index.sdk"; -import { getData } from "../listViewComp/listViewUtils"; -import AgoraRTM, { RtmChannel, RtmClient } from "agora-rtm-sdk"; - -const EventOptions = [closeEvent] as const; - -const DEFAULT_SIZE = 378; -const DEFAULT_PADDING = 16; - -const DrawerWrapper = styled.div` - // Shield the mouse events of the lower layer, the mask can be closed in the edit mode to prevent the lower layer from sliding - pointer-events: auto; -`; - -const ButtonStyle = styled(Button)` - position: absolute; - left: 0; - top: 0; - z-index: 10; - font-weight: 700; - box-shadow: none; - color: rgba(0, 0, 0, 0.45); - height: 54px; - width: 54px; - - svg { - width: 16px; - height: 16px; - } - - &, - :hover, - :focus { - background-color: transparent; - border: none; - } - - :hover, - :focus { - color: rgba(0, 0, 0, 0.75); - } -`; - -// If it is a number, use the px unit by default -function transToPxSize(size: string | number) { - return isNumeric(size) ? size + "px" : (size as string); -} - -export const client: IAgoraRTCClient = AgoraRTC.createClient({ - mode: "rtc", - codec: "vp8", -}); - -AgoraRTC.setLogLevel(4); - -/* -0: DEBUG. Output all API logs. -1: INFO. Output logs of the INFO, WARNING and ERROR level. -2: WARNING. Output logs of the WARNING and ERROR level. -3: ERROR. Output logs of the ERROR level. -4: NONE. Do not output any log. -*/ - -let audioTrack: IMicrophoneAudioTrack; -let videoTrack: ICameraVideoTrack; -let screenShareStream: ILocalVideoTrack; -let userId: UID | null | undefined; -let rtmChannelResponse: RtmChannel; -let rtmClient: RtmClient; - -const turnOnCamera = async (flag?: boolean) => { - if (videoTrack) { - return videoTrack.setEnabled(flag!); - } - videoTrack = await AgoraRTC.createCameraVideoTrack(); - videoTrack.play(userId + ""); -}; - -const turnOnMicrophone = async (flag?: boolean) => { - if (audioTrack) { - return audioTrack.setEnabled(flag!); - } - audioTrack = await AgoraRTC.createMicrophoneAudioTrack(); - if (!flag) { - await client.unpublish(audioTrack); - } else { - await client.publish(audioTrack); - } -}; -const shareScreen = async (sharing: boolean) => { - try { - if (sharing === false) { - await client.unpublish(screenShareStream); - screenShareStream.close(); - await client.publish(videoTrack); - videoTrack.play(userId + ""); - } else { - screenShareStream = await AgoraRTC.createScreenVideoTrack( - { - screenSourceType: "screen", - }, - "disable" - ); - await client.unpublish(videoTrack); - screenShareStream.play("share-screen"); - await client.publish(screenShareStream); - } - } catch (error) { - console.error("Failed to create screen share stream:", error); - } -}; -const leaveChannel = async () => { - //stops local sharing video - if (screenShareStream) { - screenShareStream.close(); - } - - //stops local video streaming and puts off the camera - if (videoTrack) { - await client.unpublish(videoTrack); - await turnOnCamera(false); - } - - //mutes and stops locla audio stream - if (audioTrack) { - await turnOnMicrophone(false); - } - await client.leave(); - await rtmChannelResponse.leave(); -}; - -const publishVideo = async ( - appId: string, - channel: string, - rtmToken: string, - rtcToken: string -) => { - // initializing the Agora Meeting Client - await turnOnCamera(true); - await client.join(appId, channel, rtcToken, userId); - await client.publish(videoTrack); - // initializing the Agora RTM Client - await rtmInit(appId, userId, rtmToken, channel); -}; - -const sendMessageRtm = (message: any) => { - rtmChannelResponse.sendMessage({ text: JSON.stringify(message) }); -}; - -const sendPeerMessageRtm = (message: any, toId: string) => { - rtmClient.sendMessageToPeer({ text: JSON.stringify(message) }, toId); -}; - -const rtmInit = async (appId: any, uid: any, token: any, channel: any) => { - rtmClient = AgoraRTM.createInstance(appId); - let options = { - uid: String(uid), - token: token ? token : null, - }; - await rtmClient.login(options); - - rtmChannelResponse = rtmClient.createChannel(channel); - - await rtmChannelResponse.join(); -}; - -const meetingControllerChildren = { - visible: withDefault(BooleanStateControl, "false"), - onEvent: eventHandlerControl(EventOptions), - width: StringControl, - height: StringControl, - autoHeight: AutoHeightControl, - style: styleControl(DrawerStyle), - placement: PositionControl, - maskClosable: withDefault(BoolControl, true), - showMask: withDefault(BoolControl, true), - meetingActive: withDefault(BooleanStateControl, "false"), - audioControl: withDefault(BooleanStateControl, "false"), - videoControl: withDefault(BooleanStateControl, "true"), - endCall: withDefault(BooleanStateControl, "false"), - sharing: withDefault(BooleanStateControl, "false"), - appId: withDefault(StringControl, trans("meeting.appid")), - participants: stateComp([]), - usersScreenShared: stateComp([]), - localUser: jsonObjectExposingStateControl(""), - localUserID: withDefault( - stringStateControl(trans("meeting.localUserID")), - uuidv4() + "" - ), - meetingName: withDefault( - stringStateControl(trans("meeting.meetingName")), - uuidv4() + "" - ), - rtmToken: stringStateControl(trans("meeting.rtmToken")), - rtcToken: stringStateControl(trans("meeting.rtcToken")), - messages: stateComp([]), -}; -let MTComp = (function () { - return new ContainerCompBuilder( - meetingControllerChildren, - (props, dispatch) => { - const isTopBom = ["top", "bottom"].includes(props.placement); - const { items, ...otherContainerProps } = props.container; - const userViewMode = useUserViewMode(); - const resizable = !userViewMode && (!isTopBom || !props.autoHeight); - const onResizeStop = useCallback( - ( - e: React.SyntheticEvent, - node: HTMLElement, - size: { width: number; height: number }, - handle: ResizeHandle - ) => { - isTopBom - ? dispatch(changeChildAction("height", size.height, true)) - : dispatch(changeChildAction("width", size.width, true)); - }, - [dispatch, isTopBom] - ); - const [userIds, setUserIds] = useState([]); - const [updateVolume, setUpdateVolume] = useState({ - update: false, - userid: null, - }); - const [rtmMessages, setRtmMessages] = useState([]); - const [localUserSpeaking, setLocalUserSpeaking] = useState(false); - const [localUserVideo, setLocalUserVideo] = - useState(); - const [userJoined, setUserJoined] = useState(); - const [userLeft, setUserLeft] = useState(); - - useEffect(() => { - if (userJoined) { - let prevUsers: any[] = props.participants as []; - let userData = { - user: userJoined.uid, - audiostatus: userJoined.hasAudio, - streamingVideo: true, - }; - setUserIds((userIds: any) => [...userIds, userData]); - dispatch( - changeChildAction( - "participants", - removeDuplicates(getData([...prevUsers, userData]).data, "user"), - false - ) - ); - } - }, [userJoined]); - - function removeDuplicates(arr: any, prop: any) { - const uniqueObjects = []; - const seenValues = new Set(); - - for (const obj of arr) { - const objValue = obj[prop]; - - if (!seenValues.has(objValue)) { - seenValues.add(objValue); - uniqueObjects.push(obj); - } - } - - return uniqueObjects; - } - useEffect(() => { - if (userLeft) { - let newUsers = userIds.filter( - (item: any) => item.user !== userLeft.uid - ); - let hostExists = newUsers.filter((f: any) => f.host === true); - if (hostExists.length == 0 && newUsers.length > 0) { - newUsers[0].host = true; - } - setUserIds(newUsers); - dispatch( - changeChildAction( - "participants", - removeDuplicates(getData(newUsers).data, "user"), - false - ) - ); - } - }, [userLeft]); - - // console.log("sharing", props.sharing); - - useEffect(() => { - if (updateVolume.userid) { - let prevUsers: [] = props.participants as []; - - const updatedItems = prevUsers.map((userInfo: any) => { - if ( - userInfo.user === updateVolume.userid && - userInfo.speaking != updateVolume.update - ) { - return { ...userInfo, speaking: updateVolume.update }; - } - return userInfo; - }); - dispatch( - changeChildAction("participants", getData(updatedItems).data, false) - ); - } - }, [updateVolume]); - - useEffect(() => { - let prevUsers: [] = props.participants as []; - const updatedItems = prevUsers.map((userInfo: any) => { - if (userInfo.user === localUserVideo?.uid) { - return { ...userInfo, streamingSharing: props.sharing.value }; - } - return userInfo; - }); - dispatch( - changeChildAction("participants", getData(updatedItems).data, false) - ); - - let localObject = { - user: userId + "", - audiostatus: props.audioControl.value, - streamingVideo: props.videoControl.value, - streamingSharing: props.sharing.value, - speaking: localUserSpeaking, - }; - props.localUser.onChange(localObject); - }, [props.sharing.value]); - - useEffect(() => { - let prevUsers: [] = props.participants as []; - const updatedItems = prevUsers.map((userInfo: any) => { - if (userInfo.user === localUserVideo?.uid) { - return { ...userInfo, streamingVideo: localUserVideo?.hasVideo }; - } - return userInfo; - }); - dispatch( - changeChildAction("participants", getData(updatedItems).data, false) - ); - }, [localUserVideo?.hasVideo]); - - useEffect(() => { - if (rtmMessages) { - dispatch( - changeChildAction("messages", getData(rtmMessages).data, false) - ); - } - }, [rtmMessages]); - - useEffect(() => { - if (localUserSpeaking === true || localUserVideo) { - let localObject = { - user: userId + "", - audiostatus: props.audioControl.value, - streamingVideo: props.videoControl.value, - speaking: localUserSpeaking, - }; - props.localUser.onChange(localObject); - } - }, [localUserSpeaking]); - - useEffect(() => { - if (rtmChannelResponse) { - rtmClient.on("MessageFromPeer", function (message, peerId) { - setRtmMessages((prevMessages: any[]) => { - // Check if the messages array exceeds the maximum limit - if (prevMessages.length >= 500) { - prevMessages.pop(); // Remove the oldest message - } - return [ - ...prevMessages, - { peermessage: JSON.parse(message.text + ""), from: peerId }, - ]; - }); - }); - - rtmChannelResponse.on("ChannelMessage", function (message, memberId) { - setRtmMessages((prevMessages: any[]) => { - // Check if the messages array exceeds the maximum limit - if (prevMessages.length >= 500) { - prevMessages.pop(); // Remove the oldest message - } - return [ - ...prevMessages, - { - channelmessage: JSON.parse(message.text + ""), - from: memberId, - }, - ]; - }); - - dispatch( - changeChildAction("messages", getData(rtmMessages).data, false) - ); - }); - } - }, [rtmChannelResponse]); - - useEffect(() => { - if (client) { - //Enable Agora to send audio bytes - client.enableAudioVolumeIndicator(); - //user activity listeners - client.on("user-joined", (user: IAgoraRTCRemoteUser) => { - setUserJoined(user); - }); - client.on("user-left", (user: IAgoraRTCRemoteUser, reason: any) => { - setUserLeft(user); - }); - - //listen to user speaking, - client.on("volume-indicator", (volumeInfos: any) => { - if (volumeInfos.length === 0) return; - volumeInfos.map((volumeInfo: any) => { - //when the volume is above 30, user is probably speaking - const speaking = volumeInfo.level >= 30; - if ( - volumeInfo.uid === userId && - props.localUser.value.speaking != speaking - ) { - setLocalUserSpeaking(speaking); - } else { - setUpdateVolume({ update: speaking, userid: volumeInfo.uid }); - } - }); - }); - - client.on( - "user-published", - async (user: IAgoraRTCRemoteUser, mediaType: "video" | "audio") => { - setLocalUserVideo(user); - } - ); - client.on( - "user-unpublished", - (user: IAgoraRTCRemoteUser, mediaType: "video" | "audio") => { - setLocalUserVideo(user); - } - ); - } - }, [client]); - - return ( - - - - document.querySelector(`#${CanvasContainerID}`) || document.body - } - footer={null} - width={transToPxSize(props.width || DEFAULT_SIZE)} - height={ - !props.autoHeight - ? transToPxSize(props.height || DEFAULT_SIZE) - : "" - } - onClose={(e) => { - props.visible.onChange(false); - }} - afterOpenChange={(visible) => { - if (!visible) { - props.onEvent("close"); - } - }} - zIndex={Layers.drawer} - maskClosable={props.maskClosable} - mask={props.showMask} - > - { - props.visible.onChange(false); - }} - > - - - - - - - ); - } - ) - .setPropertyViewFn((children) => ( - <> - {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( - <>
- {children.appId.propertyView({ - label: trans("meeting.appid"), - })} - {children.meetingName.propertyView({ - label: trans("meeting.meetingName"), - })} - {children.localUserID.propertyView({ - label: trans("meeting.localUserID"), - })} - {children.rtmToken.propertyView({ - label: trans("meeting.rtmToken"), - })} - {children.rtcToken.propertyView({ - label: trans("meeting.rtcToken"), - })} -
-
- {children.onEvent.getPropertyView()} -
- - )} - - {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( - <>
- {children.placement.propertyView({ - label: trans("drawer.placement"), - radioButton: true, - })} - {["top", "bottom"].includes(children.placement.getView()) - ? children.autoHeight.getPropertyView() - : children.width.propertyView({ - label: trans("drawer.width"), - tooltip: trans("drawer.widthTooltip"), - placeholder: DEFAULT_SIZE + "", - })} - {!children.autoHeight.getView() && - ["top", "bottom"].includes(children.placement.getView()) && - children.height.propertyView({ - label: trans("drawer.height"), - tooltip: trans("drawer.heightTooltip"), - placeholder: DEFAULT_SIZE + "", - })} - {children.maskClosable.propertyView({ - label: trans("prop.maskClosable"), - })} - {children.showMask.propertyView({ - label: trans("prop.showMask"), - })} -
- -
- - {children.style.getPropertyView()} -
- )} - - )) - .build(); -})(); - -MTComp = class extends MTComp { - override autoHeight(): boolean { - return false; - } -}; - -MTComp = withMethodExposing(MTComp, [ - { - method: { - name: "openDrawer", - description: trans("drawer.openDrawerDesc"), - params: [], - }, - execute: (comp, values) => { - comp.children.visible.getView().onChange(true); - }, - }, - { - method: { - name: "startSharing", - description: trans("drawer.openDrawerDesc"), - params: [], - }, - execute: async (comp, values) => { - if (!comp.children.meetingActive.getView().value) return; - let sharing = !comp.children.sharing.getView().value; - await shareScreen(sharing); - comp.children.sharing.change(sharing); - }, - }, - { - method: { - name: "audioControl", - description: trans("meeting.actionBtnDesc"), - params: [], - }, - execute: async (comp, values) => { - if (!comp.children.meetingActive.getView().value) return; - let value = !comp.children.audioControl.getView().value; - comp.children.localUser.change({ - user: userId + "", - audiostatus: value, - streamingVideo: comp.children.videoControl.getView().value, - speaking: false, - }); - await turnOnMicrophone(value); - comp.children.audioControl.change(value); - }, - }, - { - method: { - name: "videoControl", - description: trans("meeting.actionBtnDesc"), - params: [], - }, - execute: async (comp, values) => { - //check if meeting is active - if (!comp.children.meetingActive.getView().value) return; - //toggle videoControl - let value = !comp.children.videoControl.getView().value; - if (videoTrack) { - videoTrack.setEnabled(value); - } else { - await turnOnCamera(value); - } - //change my local user data - let localData = { - user: userId + "", - streamingVideo: value, - audiostatus: comp.children.audioControl.getView().value, - speaking: comp.children.localUser.getView().value.speaking, - }; - - comp.children.localUser.change(localData); - comp.children.videoControl.change(value); - }, - }, - { - method: { - name: "startMeeting", - description: trans("meeting.actionBtnDesc"), - params: [], - }, - execute: async (comp, values) => { - if (comp.children.meetingActive.getView().value) return; - userId = - comp.children.localUserID.getView().value === "" - ? uuidv4() - : comp.children.localUserID.getView().value; - comp.children.localUser.change({ - user: userId + "", - audiostatus: false, - speaking: false, - streamingVideo: true, - }); - - comp.children.localUser.children.value.dispatch( - changeChildAction( - "localUser", - { - user: userId + "", - audiostatus: false, - speaking: false, - streamingVideo: true, - }, - false - ) - ); - comp.children.videoControl.change(true); - await publishVideo( - comp.children.appId.getView(), - comp.children.meetingName.getView().value === "" - ? uuidv4() - : comp.children.meetingName.getView().value, - comp.children.rtmToken.getView().value, - comp.children.rtcToken.getView().value - ); - comp.children.meetingActive.change(true); - }, - }, - { - method: { - name: "broadCast", - description: trans("meeting.broadCast"), - params: [], - }, - execute: async (comp, values) => { - if (!comp.children.meetingActive.getView().value) return; - let messagedata = - values !== undefined && values[0] !== undefined ? values[0] : ""; - let toUsers: any = - values !== undefined && values[1] !== undefined ? values[1] : ""; - - let message: any = { - time: Date.now(), - message: messagedata, - }; - - if (toUsers.length > 0 && toUsers[0] !== undefined) { - toUsers.forEach((peer: any) => { - message.to = peer; - sendPeerMessageRtm(message, String(peer)); - }); - } else { - sendMessageRtm(message); - } - }, - }, - { - method: { - name: "setMeetingName", - description: trans("meeting.meetingName"), - params: [], - }, - execute: async (comp, values) => { - let meetingName: any = values[0]; - comp.children.meetingName.change(meetingName); - }, - }, - { - method: { - name: "setUserName", - description: trans("meeting.userName"), - params: [], - }, - execute: async (comp, values) => { - let userName: any = values[0]; - let userLocal = comp.children.localUser.getView().value; - comp.children.localUser.change({ ...userLocal, userName: userName }); - }, - }, - { - method: { - name: "setRTCToken", - description: trans("meeting.rtcToken"), - params: [], - }, - execute: async (comp, values) => { - let rtcToken: any = values[0]; - comp.children.rtcToken.change(rtcToken); - }, - }, - { - method: { - name: "setRTMToken", - description: trans("meeting.rtmToken"), - params: [], - }, - execute: async (comp, values) => { - let rtmToken: any = values[0]; - comp.children.rtmToken.change(rtmToken); - }, - }, - { - method: { - name: "endMeeting", - description: trans("meeting.actionBtnDesc"), - params: [], - }, - execute: async (comp, values) => { - if (!comp.children.meetingActive.getView().value) return; - - let value = !comp.children.endCall.getView().value; - comp.children.endCall.change(value); - comp.children.meetingActive.change(false); - - await leaveChannel(); - - comp.children.localUser.change({ - user: userId + "", - streamingVideo: false, - }); - }, - }, - { - method: { - name: "closeDrawer", - description: trans("drawer.closeDrawerDesc"), - params: [], - }, - execute: (comp, values) => { - comp.children.visible.getView().onChange(false); - }, - }, -]); - -export const VideoMeetingControllerComp = withExposingConfigs(MTComp, [ - new NameConfig("visible", trans("export.visibleDesc")), - new NameConfig("appId", trans("meeting.appid")), - new NameConfig("localUser", trans("meeting.host")), - new NameConfig("participants", trans("meeting.participants")), - new NameConfig("meetingActive", trans("meeting.meetingActive")), - new NameConfig("meetingName", trans("meeting.meetingName")), - new NameConfig("localUserID", trans("meeting.localUserID")), - new NameConfig("messages", trans("meeting.messages")), - new NameConfig("rtmToken", trans("meeting.rtmToken")), - new NameConfig("rtcToken", trans("meeting.rtcToken")), -]); diff --git a/client/packages/lowcoder/src/comps/comps/meetingComp/videobuttonCompConstants.tsx b/client/packages/lowcoder/src/comps/comps/meetingComp/videobuttonCompConstants.tsx index b0068495c..2b74fd189 100644 --- a/client/packages/lowcoder/src/comps/comps/meetingComp/videobuttonCompConstants.tsx +++ b/client/packages/lowcoder/src/comps/comps/meetingComp/videobuttonCompConstants.tsx @@ -1,20 +1,20 @@ import { default as Button } from "antd/es/button"; -import { styleControl } from "comps/controls/styleControl"; import { + styleControl, ButtonStyleType, ButtonStyle, -} from "comps/controls/styleControlConstants"; -import { migrateOldData } from "comps/generators/simpleGenerators"; -import styled, { css } from "styled-components"; -import { genActiveColor, genHoverColor } from "lowcoder-design"; -import { refMethods } from "comps/generators/withMethodExposing"; -import { + migrateOldData, + refMethods, blurMethod, clickMethod, focusWithOptions, -} from "comps/utils/methodUtils"; + genActiveColor, + genHoverColor, +} from "lowcoder-sdk"; +import styled, { css } from "styled-components"; +// import { genActiveColor, genHoverColor } from "lowcoder-design"; -export function getButtonStyle(buttonStyle: ButtonStyleType) { +export function getButtonStyle(buttonStyle: any) { const hoverColor = genHoverColor(buttonStyle.background); const activeColor = genActiveColor(buttonStyle.background); return css` @@ -53,7 +53,7 @@ export function getButtonStyle(buttonStyle: ButtonStyleType) { `; } -export const Button100 = styled(Button)<{ $buttonStyle?: ButtonStyleType }>` +export const Button100 = styled(Button)<{ $buttonStyle?: any }>` ${(props) => props.$buttonStyle && getButtonStyle(props.$buttonStyle)} width: 100%; height: auto; @@ -104,7 +104,7 @@ export const ButtonStyleControl = migrateOldData( fixOldData ); -export const buttonRefMethods = refMethods([ +export const buttonRefMethods = refMethods([ focusWithOptions, blurMethod, clickMethod, diff --git a/client/packages/lowcoder/src/comps/comps/moduleComp/moduleComp.test.tsx b/client/packages/lowcoder/src/comps/comps/moduleComp/moduleComp.test.tsx index 3739d7521..516b53c07 100644 --- a/client/packages/lowcoder/src/comps/comps/moduleComp/moduleComp.test.tsx +++ b/client/packages/lowcoder/src/comps/comps/moduleComp/moduleComp.test.tsx @@ -1,5 +1,5 @@ import "comps"; -import { loadComps } from "comps"; +import { loadComps } from "comps/index-test"; import { ExecuteAction } from "comps/controls/actionSelector/executeCompTypes"; import { getCompContainer } from "comps/utils/useCompInstance"; import { ModuleLayoutCompName } from "constants/compConstants"; diff --git a/client/packages/lowcoder/src/comps/comps/moduleComp/moduleComp.tsx b/client/packages/lowcoder/src/comps/comps/moduleComp/moduleComp.tsx index b20f3c414..c880a81a1 100644 --- a/client/packages/lowcoder/src/comps/comps/moduleComp/moduleComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/moduleComp/moduleComp.tsx @@ -68,7 +68,7 @@ type UpdateDslAction = { moduleDsl: Record; }; -type ModuleReadyAction = { +export type ModuleReadyAction = { type: "moduleReady"; comp: RootComp; }; @@ -123,7 +123,7 @@ class ModuleTmpComp extends ModuleCompBase { )}
{!this.autoScaleCompHeight() && this.children.autoHeight.getPropertyView()} - {this.children.scrollbars.propertyView({ + {!this.autoScaleCompHeight() && this.children.scrollbars.propertyView({ label: trans("prop.scrollbar"), })} {hiddenPropertyView(this.children)} @@ -263,7 +263,6 @@ class ModuleTmpComp extends ModuleCompBase { override reduce(action: CompAction): this { const appId = this.children.appId.getView(); - // init if (isMyCustomAction(action, "init")) { if (getReduceContext().disableUpdateState) return this; @@ -531,7 +530,7 @@ const ModuleCompWithView = withViewFn(ModuleTmpComp, (comp) => { if (comp.moduleRootComp && comp.isReady) { content = ( - + {comp.moduleRootComp.getView()} diff --git a/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleContainerComp.tsx b/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleContainerComp.tsx index e2a1f0bac..f89cf5cf3 100644 --- a/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleContainerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleContainerComp.tsx @@ -17,6 +17,7 @@ import { const StyledInnerGrid = styled(InnerGrid)` border: ${(props) => (!props.$bordered ? "0px" : `1px solid ${BorderColor}`)}; height: 100%; + overflow: auto; `; function ModuleContainerView(props: ContainerBaseProps) { diff --git a/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleEventListComp.tsx b/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleEventListComp.tsx index 8b47ad5c4..61a9c8c90 100644 --- a/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleEventListComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleEventListComp.tsx @@ -10,7 +10,7 @@ import { controlItem, Section, Switch, SwitchWrapper } from "lowcoder-design"; import { trans } from "i18n"; import { ModuleEventListItemComp } from "./moduleEventListItemComp"; import { ConfigViewSection } from "./styled"; -import { messageInstance } from "lowcoder-design"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; import { DocLink } from "lowcoder-design"; import { markdownCompCss, TacoMarkDown } from "lowcoder-design"; diff --git a/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleLayoutComp.tsx b/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleLayoutComp.tsx index 40d309f92..6468422bf 100644 --- a/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleLayoutComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/moduleContainerComp/moduleLayoutComp.tsx @@ -67,9 +67,7 @@ function ModuleLayoutView(props: IProps) { if (readOnly) { return ( - - {props.containerView} - + {props.containerView} ); } @@ -115,30 +113,26 @@ export class ModuleLayoutComp extends ModuleLayoutCompBase implements IContainer const isRowCountLocked = this.children.autoScaleCompHeight.getView(); const rowCount = this.children.containerRowCount.getView(); return ( -
- - { - this.children.containerRowCount.dispatchChangeValueAction(rowCount); - }, - })} - onPositionParamsChange={(params) => { - setTimeout(() => this.children.positionParams.dispatchChangeValueAction(params)); - }} - onLayoutChange={(layout) => { - this.children.containerSize.dispatchChangeValueAction({ - height: layout[moduleContainerId].h, - width: layout[moduleContainerId].w, - }); - }} - /> - -
+ { + this.children.containerRowCount.dispatchChangeValueAction(rowCount); + }, + })} + onPositionParamsChange={(params) => { + setTimeout(() => this.children.positionParams.dispatchChangeValueAction(params)); + }} + onLayoutChange={(layout) => { + this.children.containerSize.dispatchChangeValueAction({ + height: layout[moduleContainerId].h, + width: layout[moduleContainerId].w, + }); + }} + /> ); } getPropertyView() { diff --git a/client/packages/lowcoder/src/comps/comps/navComp/navComp.tsx b/client/packages/lowcoder/src/comps/comps/navComp/navComp.tsx index 25882da30..1e64730f9 100644 --- a/client/packages/lowcoder/src/comps/comps/navComp/navComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/navComp/navComp.tsx @@ -7,7 +7,7 @@ import { StringControl } from "comps/controls/codeControl"; import { alignWithJustifyControl } from "comps/controls/alignControl"; import { navListComp } from "./navItemComp"; import { menuPropertyView } from "./components/MenuItemList"; -import { DownOutlined } from "@ant-design/icons"; +import { default as DownOutlined } from "@ant-design/icons/DownOutlined"; import { default as Dropdown } from "antd/es/dropdown"; import { default as Menu, MenuProps } from "antd/es/menu"; import { migrateOldData } from "comps/generators/simpleGenerators"; diff --git a/client/packages/lowcoder/src/comps/comps/numberInputComp/numberInputComp.tsx b/client/packages/lowcoder/src/comps/comps/numberInputComp/numberInputComp.tsx index 58dcfe8c4..cd633ec48 100644 --- a/client/packages/lowcoder/src/comps/comps/numberInputComp/numberInputComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/numberInputComp/numberInputComp.tsx @@ -21,7 +21,7 @@ import { withExposingConfigs, } from "comps/generators/withExposing"; import { Section, sectionNames, ValueFromOption } from "lowcoder-design"; -import { useEffect, useRef, useState } from "react"; +import { ReactNode, useEffect, useRef, useState } from "react"; import styled, { css } from "styled-components"; import { RecordConstructorToView } from "lowcoder-core"; import { InputEventHandlerControl } from "../../controls/eventHandlerControl"; @@ -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 { InputLikeStyle, InputLikeStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; +import { InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; import { disabledPropertyView, hiddenPropertyView, @@ -257,9 +257,11 @@ const childrenMap = { allowNull: BoolControl, onEvent: InputEventHandlerControl, viewRef: RefControl, - style: styleControl(InputLikeStyle), + style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), + labelStyle:styleControl(LabelStyle), + prefixText : stringExposingStateControl("defaultValue"), prefixIcon: IconControl, - + inputFieldStyle: withDefault(styleControl(InputLikeStyle), {borderWidth: '1px'}) , // validation required: BoolControl, min: UndefinedNumberControl, @@ -321,8 +323,8 @@ const CustomInputNumber = (props: RecordConstructorToView) = placeholder={props.placeholder} stringMode={true} precision={props.precision} - $style={props.style} - prefix={hasIcon(props.prefixIcon) && props.prefixIcon} + $style={props.inputFieldStyle} + prefix={hasIcon(props.prefixIcon) ? props.prefixIcon : props.prefixText.value} onPressEnter={() => { handleFinish(); props.onEvent("submit"); @@ -380,6 +382,8 @@ let NumberInputTmpComp = (function () { required: props.required, children: , style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, ...validate(props), }); }) @@ -417,6 +421,7 @@ let NumberInputTmpComp = (function () { {children.step.propertyView({ label: trans("numberInput.step") })} {children.precision.propertyView({ label: trans("numberInput.precision") })} {children.prefixIcon.propertyView({ label: trans("button.prefixIcon") })} + {children.prefixText.propertyView({ label: trans("button.prefixText") })} {children.allowNull.propertyView({ label: trans("numberInput.allowNull") })} {children.thousandsSeparator.propertyView({ label: trans("numberInput.thousandsSeparator"), @@ -427,9 +432,17 @@ let NumberInputTmpComp = (function () { )} {(useContext(EditorContext).editorModeStatus === "layout" || useContext(EditorContext).editorModeStatus === "both") && ( + <>
{children.style.getPropertyView()}
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.inputFieldStyle.getPropertyView()} +
+ )} )) diff --git a/client/packages/lowcoder/src/comps/comps/numberInputComp/rangeSliderComp.tsx b/client/packages/lowcoder/src/comps/comps/numberInputComp/rangeSliderComp.tsx index bea60397c..ee4f545c2 100644 --- a/client/packages/lowcoder/src/comps/comps/numberInputComp/rangeSliderComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/numberInputComp/rangeSliderComp.tsx @@ -5,18 +5,23 @@ import { UICompBuilder } from "../../generators"; import { CommonNameConfig, NameConfig, withExposingConfigs } from "../../generators/withExposing"; import { SliderChildren, SliderPropertyView, SliderStyled, SliderWrapper } from "./sliderCompConstants"; import { hasIcon } from "comps/utils"; +import { BoolControl } from "comps/controls/boolControl"; const RangeSliderBasicComp = (function () { const childrenMap = { ...SliderChildren, start: numberExposingStateControl("start", 10), end: numberExposingStateControl("end", 60), + vertical: BoolControl, }; return new UICompBuilder(childrenMap, (props) => { return props.label({ style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, children: ( { e.stopPropagation(); return false; @@ -27,8 +32,9 @@ const RangeSliderBasicComp = (function () { {...props} range={true} value={[props.start.value, props.end.value]} - $style={props.style} - style={{margin: 0}} + $style={props.inputFieldStyle} + style={{ margin: 0 }} + vertical={props.vertical || false} onChange={([start, end]) => { props.start.onChange(start); props.end.onChange(end); @@ -52,6 +58,7 @@ const RangeSliderBasicComp = (function () { label: trans("rangeSlider.step"), tooltip: trans("rangeSlider.stepTooltip"), })} + {children.vertical.propertyView({ label: trans("slider.vertical") })}
diff --git a/client/packages/lowcoder/src/comps/comps/numberInputComp/sliderComp.tsx b/client/packages/lowcoder/src/comps/comps/numberInputComp/sliderComp.tsx index b86b07ef6..3f7c2de69 100644 --- a/client/packages/lowcoder/src/comps/comps/numberInputComp/sliderComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/numberInputComp/sliderComp.tsx @@ -6,6 +6,7 @@ import { CommonNameConfig, NameConfig, withExposingConfigs } from "../../generat import { formDataChildren, FormDataPropertyView } from "../formComp/formDataConstants"; import { SliderChildren, SliderPropertyView, SliderStyled, SliderWrapper } from "./sliderCompConstants"; import { hasIcon } from "comps/utils"; +import { BoolControl } from "comps/controls/boolControl"; const SliderBasicComp = (function () { /** @@ -14,13 +15,17 @@ const SliderBasicComp = (function () { const childrenMap = { ...SliderChildren, value: numberExposingStateControl("value", 60), + vertical: BoolControl, ...formDataChildren, }; return new UICompBuilder(childrenMap, (props) => { return props.label({ style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, children: ( { e.stopPropagation(); return false; @@ -30,8 +35,9 @@ const SliderBasicComp = (function () { { props.value.onChange(e); props.onEvent("change"); @@ -53,6 +59,7 @@ const SliderBasicComp = (function () { label: trans("slider.step"), tooltip: trans("slider.stepTooltip"), })} + {children.vertical.propertyView({ label: trans("slider.vertical") })}
diff --git a/client/packages/lowcoder/src/comps/comps/numberInputComp/sliderCompConstants.tsx b/client/packages/lowcoder/src/comps/comps/numberInputComp/sliderCompConstants.tsx index fd1b84634..ad4c7e206 100644 --- a/client/packages/lowcoder/src/comps/comps/numberInputComp/sliderCompConstants.tsx +++ b/client/packages/lowcoder/src/comps/comps/numberInputComp/sliderCompConstants.tsx @@ -5,7 +5,7 @@ import { ChangeEventHandlerControl } from "../../controls/eventHandlerControl"; import { Section, sectionNames } from "lowcoder-design"; import { RecordConstructorToComp } from "lowcoder-core"; import { styleControl } from "comps/controls/styleControl"; -import { SliderStyle, SliderStyleType } from "comps/controls/styleControlConstants"; +import { InputFieldStyle, LabelStyle, SliderStyle, SliderStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; import styled, { css } from "styled-components"; import { default as Slider } from "antd/es/slider"; import { darkenColor, fadeColor } from "lowcoder-design"; @@ -16,7 +16,7 @@ import { trans } from "i18n"; import { useContext } from "react"; import { EditorContext } from "comps/editorState"; -const getStyle = (style: SliderStyleType) => { +const getStyle = (style: SliderStyleType, vertical: boolean) => { return css` &.ant-slider:not(.ant-slider-disabled) { &, @@ -41,15 +41,20 @@ const getStyle = (style: SliderStyleType) => { .ant-slider-handle:focus { box-shadow: 0 0 0 5px ${fadeColor(darkenColor(style.thumbBorder, 0.08), 0.12)}; } + ${vertical && css` + width: auto; + min-height: calc(300px - ${style.margin}); + margin: ${style.margin} auto !important; + `} } `; }; -export const SliderStyled = styled(Slider)<{ $style: SliderStyleType }>` - ${(props) => props.$style && getStyle(props.$style)} +export const SliderStyled = styled(Slider)<{ $style: SliderStyleType, vertical: boolean }>` + ${(props) => props.$style && getStyle(props.$style, props.vertical)} `; -export const SliderWrapper = styled.div` +export const SliderWrapper = styled.div<{ vertical: boolean }>` width: 100%; display: inline-flex; align-items: center; @@ -66,9 +71,11 @@ export const SliderChildren = { label: LabelControl, disabled: BoolCodeControl, onEvent: ChangeEventHandlerControl, - style: styleControl(SliderStyle), + style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), + labelStyle:styleControl(LabelStyle.filter((style)=> ['accent','validate'].includes(style.name) === false)), prefixIcon: IconControl, suffixIcon: IconControl, + inputFieldStyle:styleControl(SliderStyle) }; export const SliderPropertyView = ( @@ -96,6 +103,12 @@ export const SliderPropertyView = (
{children.style.getPropertyView()}
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.inputFieldStyle.getPropertyView()} +
)} diff --git a/client/packages/lowcoder/src/comps/comps/pageLayoutComp/containerBodyChildComp.tsx b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/containerBodyChildComp.tsx new file mode 100644 index 000000000..67b557e5d --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/containerBodyChildComp.tsx @@ -0,0 +1,17 @@ +import { MultiCompBuilder } from "comps/generators"; +import { SimpleContainerComp } from "../containerBase/simpleContainerComp"; + +const children = { + view: SimpleContainerComp, + // FIXME: keep extensible +}; + +export const ContainerBodyChildComp = new MultiCompBuilder(children, (props, dispatch) => { + return { + ...props, + dispatch: dispatch, + }; +}) + // TODO + .setPropertyViewFn(() => <>) + .build(); diff --git a/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx new file mode 100644 index 000000000..2e859ba9a --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayout.tsx @@ -0,0 +1,406 @@ +import { ContainerStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; +import { EditorContext } from "comps/editorState"; +import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; +import { HintPlaceHolder, ScrollBar } from "lowcoder-design"; +import { ReactNode, useContext, useEffect } from "react"; +import styled, { css } from "styled-components"; +import { checkIsMobile } from "util/commonUtils"; +import { gridItemCompToGridItems, InnerGrid } from "../containerComp/containerView"; +import { LayoutViewProps } from "./pageLayoutCompBuilder"; +import { ConfigProvider, Layout } from 'antd'; +import { contrastBackground, contrastText } from "comps/controls/styleControlConstants"; +import { useRef, useState } from "react"; +import { LowcoderAppView } from "appView/LowcoderAppView"; + +const { Header, Content, Footer, Sider } = Layout; + +const AppViewContainer = styled.div` + width: 100%; + top: 0; + max-width: inherit; + overflow: auto; + height: 100%; +`; + +const getStyle = (style: ContainerStyleType) => { + return css` + border-color: ${style.border}; + border-width: ${style.borderWidth}; + border-radius: ${style.radius}; + overflow: hidden; + padding: ${style.padding}; + ${style.background && `background-color: ${style.background};`} + ${style.backgroundImage && `background-image: url(${style.backgroundImage});`} + ${style.backgroundImageRepeat && `background-repeat: ${style.backgroundImageRepeat};`} + ${style.backgroundImageSize && `background-size: ${style.backgroundImageSize};`} + ${style.backgroundImagePosition && `background-position: ${style.backgroundImagePosition};`} + ${style.backgroundImageOrigin && `background-origin: ${style.backgroundImageOrigin};`} + `; +}; + +const Wrapper = styled.div<{ $style: ContainerStyleType }>` + display: flex; + flex-flow: column; + height: 100%; + border: 1px solid #d7d9e0; + border-radius: 4px; + ${(props) => props.$style && getStyle(props.$style)} +`; + +const HeaderInnerGrid = styled(InnerGrid)<{ + $backgroundColor: string + }>` + overflow: visible; + ${(props) => props.$backgroundColor && `background-color: ${props.$backgroundColor};`} + border-radius: 0; +`; + +const SiderInnerGrid = styled(InnerGrid)<{ + $backgroundColor: string + $siderBackgroundImage: string; + $siderBackgroundImageRepeat: string; + $siderBackgroundImageSize: string; + $siderBackgroundImagePosition: string; + $siderBackgroundImageOrigin: string; + }>` + overflow: auto; + ${(props) => props.$backgroundColor && `background-color: ${props.$backgroundColor};`} + border-radius: 0; + ${(props) => props.$siderBackgroundImage && `background-image: url(${props.$siderBackgroundImage});`} + ${(props) => props.$siderBackgroundImageRepeat && `background-repeat: ${props.$siderBackgroundImageRepeat};`} + ${(props) => props.$siderBackgroundImageSize && `background-size: ${props.$siderBackgroundImageSize};`} + ${(props) => props.$siderBackgroundImagePosition && `background-position: ${props.$siderBackgroundImagePosition};`} + ${(props) => props.$siderBackgroundImageOrigin && `background-origin: ${props.$siderBackgroundImageOrigin};`} +`; + +const BodyInnerGrid = styled(InnerGrid)<{ + $showBorder: boolean; + $backgroundColor: string; + $borderColor: string; + $borderWidth: string; +}>` + border-top: ${(props) => `${props.$showBorder ? props.$borderWidth : 0} solid ${props.$borderColor}`}; + flex: 1; + ${(props) => props.$backgroundColor && `background-color: ${props.$backgroundColor};`} + border-radius: 0; +`; + +const FooterInnerGrid = styled(InnerGrid)<{ + $showBorder: boolean; + $backgroundColor: string; + $borderColor: string; + $borderWidth: string; + $footerBackgroundImage: string; + $footerBackgroundImageRepeat: string; + $footerBackgroundImageSize: string; + $footerBackgroundImagePosition: string; + $footerBackgroundImageOrigin: string; +}>` + border-top: ${(props) => `${props.$showBorder ? props.$borderWidth : 0} solid ${props.$borderColor}`}; + overflow: visible; + ${(props) => props.$backgroundColor && `background-color: ${props.$backgroundColor};`} + border-radius: 0; + ${(props) => props.$footerBackgroundImage && `background-image: url(${props.$footerBackgroundImage});`} + ${(props) => props.$footerBackgroundImageRepeat && `background-repeat: ${props.$footerBackgroundImageRepeat};`} + ${(props) => props.$footerBackgroundImageSize && `background-size: ${props.$footerBackgroundImageSize};`} + ${(props) => props.$footerBackgroundImagePosition && `background-position: ${props.$footerBackgroundImagePosition};`} + ${(props) => props.$footerBackgroundImageOrigin && `background-origin: ${props.$footerBackgroundImageOrigin};`} +`; + +export type LayoutProps = LayoutViewProps & { + hintPlaceholder?: ReactNode; +}; + + +export function PageLayout(props: LayoutProps & { siderCollapsed: boolean; setSiderCollapsed: (collapsed: boolean) => void }) { + const { container, siderCollapsed, setSiderCollapsed } = props; + const { showHeader, showFooter, showSider } = container; + const { items: headerItems, ...otherHeaderProps } = container.header; + const { items: bodyItems, ...otherBodyProps } = container.body["0"].children.view.getView(); + const { items: footerItems, ...otherFooterProps } = container.footer; + const { items: siderItems, ...otherSiderProps } = container.sider; + const { + style, + headerStyle, + siderStyle, + bodyStyle, + footerStyle, + } = container; + + const editorState = useContext(EditorContext); + const maxWidth = editorState.getAppSettings().maxWidth; + const isMobile = checkIsMobile(maxWidth); + const appRef = useRef(); + + function onSiderCollapse (collapsed : boolean) { + props.setSiderCollapsed(collapsed); + // how to set the collapsed state in the container when the user manually collapses the sider? + } + + useEffect(() => {setSiderCollapsed(container.siderCollapsed)} , [container.siderCollapsed]); + + return ( +
+ + + + {showSider && !container.innerSider && !container.siderRight && ( + <> + onSiderCollapse(value)} + > + + + + + + + )} + + {showHeader && ( + <> + +
+ +
+
+ + )} + {showSider && container.innerSider ? ( + <> + {showSider && !container.siderRight && ( + + setSiderCollapsed(value)} + > + + + + + + )} + + + {container.showApp && container.contentApp != "" ? ( + + + + + + ) : ( + + )} + + + {showSider && container.siderRight && ( + + setSiderCollapsed(value)} + > + + + + + + )} + + ) : ( + + + {container.showApp && container.contentApp != "" ? ( + + + + + + ) : ( + + )} + + + )} + {showFooter && ( +
+ +
+ )} +
+ {showSider && !container.innerSider && container.siderRight && ( + <> + + setSiderCollapsed(value)} + + > + + + + + + + )} +
+ +
+
+
+ ); +} diff --git a/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayoutComp.tsx b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayoutComp.tsx new file mode 100644 index 000000000..dbe0e6111 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayoutComp.tsx @@ -0,0 +1,200 @@ +import { JSONValue } from "util/jsonTypes"; +import { AutoHeightControl } from "comps/controls/autoHeightControl"; +import { BoolControl } from "comps/controls/boolControl"; +import { styleControl } from "comps/controls/styleControl"; +import { + ContainerStyle, + ContainerHeaderStyle, + ContainerBodyStyle, + ContainerSiderStyle, + ContainerFooterStyle, +} from "comps/controls/styleControlConstants"; +import { MultiCompBuilder, sameTypeMap, withDefault } from "comps/generators"; +import { migrateOldData } from "comps/generators/simpleGenerators"; +import { NameGenerator } from "comps/utils"; +import { fromRecord, Node } from "lowcoder-core"; +import { nodeIsRecord } from "lowcoder-core"; +import _ from "lodash"; +import { lastValueIfEqual } from "util/objectUtils"; +import { + CompTree, + fixOldStyleData, + IContainer, + mergeCompTrees, + traverseCompTree, +} from "../containerBase"; +import { SimpleContainerComp } from "../containerBase/simpleContainerComp"; +import { ContainerBodyChildComp } from "./containerBodyChildComp"; +import { trans } from "i18n"; +import { ControlNode } from "lowcoder-design"; +import { StringControl } from "comps/controls/codeControl"; + +const childrenMap = { + header: SimpleContainerComp, + sider: SimpleContainerComp, + body: withDefault(sameTypeMap(ContainerBodyChildComp), { + 0: { view: { layout: {}, items: {} } }, + }), + showApp: BoolControl, + contentApp: StringControl, + baseUrl: StringControl, + footer: SimpleContainerComp, + showHeader: BoolControl.DEFAULT_TRUE, + showSider: BoolControl.DEFAULT_TRUE, + innerSider: BoolControl.DEFAULT_TRUE, + siderCollapsible: withDefault(BoolControl, false), + siderCollapsed : withDefault(BoolControl, false), + siderRight: withDefault(BoolControl, false), + siderWidth: withDefault(StringControl, "20%"), + siderCollapsedWidth: withDefault(StringControl, "0"), + showFooter: BoolControl, + autoHeight: AutoHeightControl, + siderScrollbars: withDefault(BoolControl, false), + contentScrollbars: withDefault(BoolControl, false), + style: withDefault(styleControl(ContainerStyle),{borderWidth:'1px'}), + headerStyle: styleControl(ContainerHeaderStyle), + siderStyle: styleControl(ContainerSiderStyle), + bodyStyle: styleControl(ContainerBodyStyle), + footerStyle: styleControl(ContainerFooterStyle), +}; + +// Compatible with old style data 2022-8-15 +const layoutBaseComp = migrateOldData( + new MultiCompBuilder(childrenMap, (props, dispatch) => { + return { ...props, dispatch }; + }).build(), + fixOldStyleData +); + +export class PageLayoutComp extends layoutBaseComp implements IContainer { + // scrollbars: any; + private allContainers() { + return [ + this.children.header, + this.children.sider, + ...Object.values(this.children.body.getView()).map((c) => c.children.view), + this.children.footer, + ]; + } + realSimpleContainer(key?: string): SimpleContainerComp | undefined { + if (_.isNil(key)) return this.children.body.getView()["0"].children.view; + return this.allContainers().find((container) => container.realSimpleContainer(key)); + } + getCompTree(): CompTree { + return mergeCompTrees(this.allContainers().map((c) => c.getCompTree())); + } + findContainer(key: string): IContainer | undefined { + for (const container of this.allContainers()) { + const foundContainer = container.findContainer(key); + if (foundContainer) { + return foundContainer === container ? this : foundContainer; + } + } + return undefined; + } + getPasteValue(nameGenerator: NameGenerator): JSONValue { + return { + ...this.toJsonValue(), + header: this.children.header.getPasteValue(nameGenerator), + sider: this.children.sider.getPasteValue(nameGenerator), + body: _.mapValues(this.children.body.getView(), (comp) => { + return { + ...comp.toJsonValue(), + view: comp.children.view.getPasteValue(nameGenerator), + }; + }), + footer: this.children.footer.getPasteValue(nameGenerator), + }; + } + override autoHeight(): boolean { + return this.children.autoHeight.getView(); + } + + exposingNode() { + // The exposingNodes of the container subcomponents are put together + const allNodes: Record> = {}; + traverseCompTree(this.getCompTree(), (item) => { + const comp = item.children.comp; + let node = comp.exposingNode(); + // plus formDataKey + if (nodeIsRecord(node) && !node.children.hasOwnProperty("formDataKey")) { + const formDataKey = comp.children["formDataKey"]; + if (formDataKey) { + node = fromRecord({ ...node.children, formDataKey: formDataKey.exposingNode() }); + } + } + allNodes[item.children.name.getView()] = node; + return true; + }); + return lastValueIfEqual(this, "exposing_node", fromRecord(allNodes), checkEquals); + } + + getPropertyView(): ControlNode { + return [this.areaPropertyView(), this.heightPropertyView()]; + } + + areaPropertyView() { + return [ + this.children.showHeader.propertyView({ label: trans("prop.showHeader") }), + this.children.showSider.propertyView({ label: trans("prop.showSider") }), + this.children.siderRight.propertyView({ label: trans("prop.siderRight") }), + this.children.innerSider.propertyView({ label: trans("prop.innerSider") }), + this.children.siderCollapsible.propertyView({ label: trans("prop.siderCollapsible") }), + this.children.siderCollapsed.propertyView({ label: trans("prop.siderCollapsed") }), + this.children.showFooter.propertyView({ label: trans("prop.showFooter") }), + this.children.siderWidth.propertyView({ label: trans("prop.siderWidth"), tooltip : trans("prop.siderWidthTooltip") }), + this.children.siderCollapsedWidth.propertyView({ label: trans("prop.siderCollapsedWidth"), tooltip : trans("prop.siderCollapsedWidthTooltip") }), + ]; + } + + heightPropertyView() { + return [ + this.children.autoHeight.getPropertyView(), + this.children.siderScrollbars.propertyView({ label: trans("prop.siderScrollbar")}), + (!this.children.autoHeight.getView()) && this.children.contentScrollbars.propertyView({ label: trans("prop.contentScrollbar") }), + ]; + } + + appSelectorPropertyView() { + return [ + this.children.showApp.propertyView({ label: trans("prop.showApp"), tooltip: trans("prop.showAppTooltip") }), + this.children.showApp.getView() && this.children.contentApp.propertyView({ label: trans("prop.appID") }), + this.children.showApp.getView() && this.children.baseUrl.propertyView({ label: trans("prop.baseURL") }), + ]; + } + + stylePropertyView() { + return this.children.style.getPropertyView(); + } + + headerStylePropertyView() { + return this.children.headerStyle.getPropertyView(); + } + + siderStylePropertyView() { + return this.children.siderStyle.getPropertyView(); + } + + bodyStylePropertyView() { + return this.children.bodyStyle.getPropertyView(); + } + + footerStylePropertyView() { + return this.children.footerStyle.getPropertyView(); + } +} + +function checkEquals(node1: Node, node2: Node): boolean { + if (node1 === node2) { + return true; + } + if (node1 && node2 && nodeIsRecord(node1) && nodeIsRecord(node2)) { + const a = node1.children; + const b = node2.children; + const keys = Object.keys(a); + return ( + keys.length === Object.keys(b).length && keys.every((key) => checkEquals(a[key], b[key])) + ); + } + return false; +} diff --git a/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayoutCompBuilder.tsx b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayoutCompBuilder.tsx new file mode 100644 index 000000000..35a4b83ff --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/pageLayoutComp/pageLayoutCompBuilder.tsx @@ -0,0 +1,88 @@ +import { JSONValue } from "util/jsonTypes"; +import { Comp } from "lowcoder-core"; +import { UICompBuilder } from "comps/generators"; +import { + PropertyViewFnTypeForComp, + ToConstructor, + ToViewReturn, + ViewFnTypeForComp, +} from "comps/generators/multi"; +import { NewChildren as UiChildren } from "comps/generators/uiCompBuilder"; +import { NameGenerator } from "comps/utils"; +import { CompTree, IContainer } from "../containerBase"; +import { SimpleContainerComp } from "../containerBase/simpleContainerComp"; +import { PageLayoutComp } from "./pageLayoutComp"; +import { ReactNode } from "react"; + +export type ContainerChildren>> = + UiChildren & { + container: InstanceType; + }; + +export function containerChildren>>( + childrenMap: ToConstructor +): ToConstructor> { + return { ...childrenMap, container: PageLayoutComp } as any; +} + +export type LayoutViewProps = ToViewReturn>; + +export class ContainerCompBuilder< + ViewReturn, + ChildrenCompMap extends Record> +> { + private childrenMap: ToConstructor; + private viewFn: ViewFnTypeForComp>; + private propertyViewFn?: PropertyViewFnTypeForComp>; + /** + * If viewFn is not placed in the constructor, the type of ViewReturn cannot be inferred + */ + constructor( + childrenMap: ToConstructor, + viewFn: ViewFnTypeForComp> + ) { + this.childrenMap = childrenMap; + this.viewFn = viewFn; + } + setPropertyViewFn(propertyViewFn: PropertyViewFnTypeForComp>) { + this.propertyViewFn = propertyViewFn; + return this; + } + build() { + if (!this.propertyViewFn) { + throw new Error("no propertyViewFn provided"); + } + if (this.childrenMap.hasOwnProperty("container")) { + throw new Error("already has container"); + } + const newChildrenMap = containerChildren(this.childrenMap); + const TmpComp = new UICompBuilder(newChildrenMap, (props, dispatch) => { + return this.viewFn(props as any, dispatch) as ReactNode; + }) + .setPropertyViewFn(this.propertyViewFn as any) + .build(); + class Container extends TmpComp implements IContainer { + realSimpleContainer(key?: string): SimpleContainerComp | undefined { + return this.children.container.realSimpleContainer(key); + } + getCompTree(): CompTree { + return this.children.container.getCompTree(); + } + findContainer(key: string): IContainer | undefined { + const foundContainer = this.children.container.findContainer(key); + if (foundContainer) { + return foundContainer === this.children.container ? this : foundContainer; + } + return undefined; + } + getPasteValue(nameGenerator: NameGenerator): JSONValue { + const containerPasteValue = this.children.container.getPasteValue(nameGenerator); + return { container: containerPasteValue }; + } + override autoHeight(): boolean { + return this.children.container.autoHeight(); + } + } + return Container; + } +} diff --git a/client/packages/lowcoder/src/comps/comps/ratingComp.tsx b/client/packages/lowcoder/src/comps/comps/ratingComp.tsx index 40db580ab..3bf8e8549 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 { RatingStyle, RatingStyleType } from "comps/controls/styleControlConstants"; +import { 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"; @@ -43,7 +43,9 @@ const RatingBasicComp = (function () { allowHalf: BoolControl, disabled: BoolCodeControl, onEvent: eventHandlerControl(EventOptions), - style: migrateOldData(styleControl(RatingStyle), fixOldData), + style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), + labelStyle: styleControl(LabelStyle.filter((style) => ['accent', 'validate'].includes(style.name) === false)), + inputFieldStyle:migrateOldData(styleControl(RatingStyle), fixOldData), ...formDataChildren, }; return new UICompBuilder(childrenMap, (props) => { @@ -64,6 +66,8 @@ const RatingBasicComp = (function () { return props.label({ style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, children: ( ), }); @@ -93,14 +97,14 @@ const RatingBasicComp = (function () { {["logic", "both"].includes(useContext(EditorContext).editorModeStatus) && ( <>
- {children.onEvent.getPropertyView()} - {disabledPropertyView(children)} - {hiddenPropertyView(children)} -
+ {children.onEvent.getPropertyView()} + {disabledPropertyView(children)} + {hiddenPropertyView(children)} +
- {children.allowHalf.propertyView({ - label: trans("rating.allowHalf"), - })} + {children.allowHalf.propertyView({ + label: trans("rating.allowHalf"), + })}
)} @@ -110,9 +114,17 @@ const RatingBasicComp = (function () { )} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( -
- {children.style.getPropertyView()} -
+ <> +
+ {children.style.getPropertyView()} +
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.inputFieldStyle.getPropertyView()} +
+ )} ); @@ -144,6 +156,6 @@ const getStyle = (style: RatingStyleType) => { `; }; -export const RateStyled = styled(Rate)<{ $style: RatingStyleType }>` +export const RateStyled = styled(Rate) <{ $style: RatingStyleType }>` ${(props) => props.$style && getStyle(props.$style)} `; diff --git a/client/packages/lowcoder/src/comps/comps/remoteComp/loaders.tsx b/client/packages/lowcoder/src/comps/comps/remoteComp/loaders.tsx index b1077281d..1f15cff05 100644 --- a/client/packages/lowcoder/src/comps/comps/remoteComp/loaders.tsx +++ b/client/packages/lowcoder/src/comps/comps/remoteComp/loaders.tsx @@ -11,22 +11,18 @@ async function npmLoader( remoteInfo: RemoteCompInfo ): Promise { - console.log("remoteInfo: ", remoteInfo); - - // Falk: removed "packageVersion = "latest" as default value for packageVersion - to ensure no automatic version jumping. - - var localPackageVersion = remoteInfo.packageVersion || "latest"; + // Falk: removed "packageVersion = "latest" as default value fir packageVersion - to ensure no automatic version jumping. + const localPackageVersion = remoteInfo.packageVersion || "latest"; const { packageName, packageVersion, compName } = remoteInfo; - - // Falk: Special handling for lowcoder-comps package for old versions before 2.4.0 - if (packageName === "lowcoder-comps") { - localPackageVersion = "0.0.32"; - } - const entry = `${NPM_PLUGIN_ASSETS_BASE_URL}/${packageName}@${localPackageVersion}/index.js`; - + try { - const module = await import(/* webpackIgnore: true */ entry); + const module = await import( + /* @vite-ignore */ + /* webpackIgnore: true */ + entry + ); + // console.log("Entry 1", module); const comp = module.default?.[compName]; if (!comp) { throw new Error(trans("npm.compNotFound", { compName })); @@ -43,8 +39,12 @@ async function bundleLoader( ): Promise { const { packageName, packageVersion = "latest", compName } = remoteInfo; const entry = `/${packageName}/${packageVersion}/index.js?v=${REACT_APP_COMMIT_ID}`; - const module = await import(/* webpackIgnore: true */ entry); - const comp = module.default?.[compName]; + const module = await import( + /* @vite-ignore */ + /* webpackIgnore: true */ + entry + ); + const comp = module?.default?.[compName]; if (!comp) { throw new Error(trans("npm.compNotFound", { compName })); } diff --git a/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx b/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx index 8a9ce6312..6e5b807b0 100644 --- a/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx +++ b/client/packages/lowcoder/src/comps/comps/responsiveLayout/responsiveLayout.tsx @@ -31,13 +31,16 @@ import { } from "../containerComp/containerView"; import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; import { trans } from "i18n"; -import { messageInstance } from "lowcoder-design"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; import { BoolControl } from "comps/controls/boolControl"; -import { NumberControl } from "comps/controls/codeControl"; +import { BoolCodeControl, NumberControl } from "comps/controls/codeControl"; import { useContext } from "react"; import { EditorContext } from "comps/editorState"; +import { disabledPropertyView, hiddenPropertyView } from "comps/utils/propertyUtils"; +import { DisabledContext } from "comps/generators/uiCompBuilder"; + const RowWrapper = styled(Row)<{$style: ResponsiveLayoutRowStyleType}>` height: 100%; border: 1px solid ${(props) => props.$style.border}; @@ -62,7 +65,8 @@ const ColWrapper = styled(Col)<{ } `; -const childrenMap = { +const childrenMap = { + disabled: BoolCodeControl, columns: ColumnOptionControl, containers: withDefault(sameTypeMap(SimpleContainerComp), { 0: { view: {}, layout: {} }, @@ -117,58 +121,60 @@ const ResponsiveLayout = (props: ResponsiveLayoutProps) => { return ( -
- - {columns.map(column => { - const id = String(column.id); - const childDispatch = wrapDispatch(wrapDispatch(dispatch, "containers"), id); - if(!containers[id]) return null - const containerProps = containers[id].children; + +
+ + {columns.map(column => { + const id = String(column.id); + const childDispatch = wrapDispatch(wrapDispatch(dispatch, "containers"), id); + if(!containers[id]) return null + const containerProps = containers[id].children; - const columnCustomStyle = { - margin: !_.isEmpty(column.margin) ? column.margin : columnStyle.margin, - padding: !_.isEmpty(column.padding) ? column.padding : columnStyle.padding, - radius: !_.isEmpty(column.radius) ? column.radius : columnStyle.radius, - border: `1px solid ${!_.isEmpty(column.border) ? column.border : columnStyle.border}`, - background: !_.isEmpty(column.background) ? column.background : columnStyle.background, - } - const noOfColumns = columns.length; - let backgroundStyle = columnCustomStyle.background; - if(!_.isEmpty(column.backgroundImage)) { - backgroundStyle = `center / cover url('${column.backgroundImage}') no-repeat, ${backgroundStyle}`; + const columnCustomStyle = { + margin: !_.isEmpty(column.margin) ? column.margin : columnStyle.margin, + padding: !_.isEmpty(column.padding) ? column.padding : columnStyle.padding, + radius: !_.isEmpty(column.radius) ? column.radius : columnStyle.radius, + border: `1px solid ${!_.isEmpty(column.border) ? column.border : columnStyle.border}`, + background: !_.isEmpty(column.background) ? column.background : columnStyle.background, + } + const noOfColumns = columns.length; + let backgroundStyle = columnCustomStyle.background; + if(!_.isEmpty(column.backgroundImage)) { + backgroundStyle = `center / cover url('${column.backgroundImage}') no-repeat, ${backgroundStyle}`; + } + return ( + + + + ) + }) } - return ( - - - - ) - }) - } - -
+
+
+
); }; @@ -189,6 +195,13 @@ export const ResponsiveLayoutBaseComp = (function () { })} + {(useContext(EditorContext).editorModeStatus === "logic" || useContext(EditorContext).editorModeStatus === "both") && ( +
+ {disabledPropertyView(children)} + {hiddenPropertyView(children)} +
+ )} + {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( <>
diff --git a/client/packages/lowcoder/src/comps/comps/rootComp.tsx b/client/packages/lowcoder/src/comps/comps/rootComp.tsx index 2944cd3a1..b0db715ee 100644 --- a/client/packages/lowcoder/src/comps/comps/rootComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/rootComp.tsx @@ -1,23 +1,25 @@ +import "comps/comps/layout/navLayout"; +import "comps/comps/layout/mobileTabLayout"; + import { CompAction, CompActionTypes } from "lowcoder-core"; import { EditorContext, EditorState } from "comps/editorState"; import { simpleMultiComp } from "comps/generators"; import { HookListComp } from "comps/hooks/hookListComp"; import { QueryListComp } from "comps/queries/queryComp"; import { NameAndExposingInfo } from "comps/utils/exposingTypes"; -import EditorView from "pages/editor/editorView"; import { handlePromiseAndDispatch } from "util/promiseUtils"; -import { HTMLAttributes, useContext, useEffect, useMemo, useState } from "react"; +import { HTMLAttributes, Suspense, lazy, useContext, useEffect, useMemo, useState } from "react"; import { setFieldsNoTypeCheck } from "util/objectUtils"; import { AppSettingsComp } from "./appSettingsComp"; import { PreloadComp } from "./preLoadComp"; import { TemporaryStateListComp } from "./temporaryStateComp"; import { TransformerListComp } from "./transformerListComp"; import UIComp from "./uiComp"; -import EditorSkeletonView from "pages/editor/editorSkeletonView"; import { ThemeContext } from "comps/utils/themeContext"; import { ModuleLayoutCompName } from "constants/compConstants"; import { defaultTheme as localDefaultTheme } from "comps/controls/styleControlConstants"; import { ModuleLoading } from "components/ModuleLoading"; +import EditorSkeletonView from "pages/editor/editorSkeletonView"; import { getGlobalSettings } from "comps/utils/globalSettings"; import { getCurrentTheme } from "comps/utils/themeUtil"; import { DataChangeResponderListComp } from "./dataChangeResponderComp"; @@ -28,6 +30,12 @@ import { PropertySectionState, } from "lowcoder-design"; import RefTreeComp from "./refTreeComp"; +import { ExternalEditorContext } from "util/context/ExternalEditorContext"; +import { useUserViewMode } from "util/hooks"; + +const EditorView = lazy( + () => import("pages/editor/editorView"), +); interface RootViewProps extends HTMLAttributes { comp: InstanceType; @@ -52,6 +60,8 @@ function RootView(props: RootViewProps) { const { comp, isModuleRoot, ...divProps } = props; const [editorState, setEditorState] = useState(); const [propertySectionState, setPropertySectionState] = useState({}); + const { readOnly } = useContext(ExternalEditorContext); + const isUserViewMode = useUserViewMode(); const appThemeId = comp.children.settings.getView().themeId; const { orgCommonSettings } = getGlobalSettings(); const themeList = orgCommonSettings?.themeList || []; @@ -101,22 +111,27 @@ function RootView(props: RootViewProps) { }; }, [editorState, propertySectionState]); + if (!editorState && !isUserViewMode && readOnly) { + return ; + } + + const SuspenseFallback = isModuleRoot ? : ; + if (!editorState) { - if (isModuleRoot) { - return ; - } - return ; + return SuspenseFallback; } return ( -
+
{Object.keys(comp.children.queries.children).map((key) => (
{comp.children.queries.children[key].getView()}
))} - + + +
diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderComp.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderComp.tsx index e89c0e49f..d6503d4fd 100644 --- a/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderComp.tsx @@ -1,26 +1,48 @@ import { default as Cascader } from "antd/es/cascader"; -import { CascaderStyleType } from "comps/controls/styleControlConstants"; +import { CascaderStyleType, ChildrenMultiSelectStyleType } from "comps/controls/styleControlConstants"; import { blurMethod, focusMethod } from "comps/utils/methodUtils"; import { trans } from "i18n"; import styled from "styled-components"; import { UICompBuilder, withDefault } from "../../generators"; import { CommonNameConfig, NameConfig, withExposingConfigs } from "../../generators/withExposing"; import { CascaderChildren, CascaderPropertyView, defaultDataSource } from "./cascaderContants"; -import { getStyle } from "./selectCompConstants"; import { refMethods } from "comps/generators/withMethodExposing"; -const CascaderStyle = styled(Cascader)<{ $style: CascaderStyleType }>` +const CascaderStyle = styled(Cascader)<{ $style: CascaderStyleType,$childrenInputFieldStyle:ChildrenMultiSelectStyleType }>` width: 100%; font-family:"Montserrat"; - ${(props) => props.$style && getStyle(props.$style)} + ${(props) => { return props.$style && { ...props.$style, 'border-radius': props.$style.radius } }} `; +const DropdownRenderStyle = styled.div<{ $childrenInputFieldStyle: ChildrenMultiSelectStyleType }>` + background-color: ${props => props.$childrenInputFieldStyle?.background}; + border: ${props => props.$childrenInputFieldStyle?.border}; + border-style: ${props => props.$childrenInputFieldStyle?.borderStyle}; + border-width: ${props => props.$childrenInputFieldStyle?.borderWidth}; + border-radius: ${props => props.$childrenInputFieldStyle?.radius}; + rotate: ${props => props.$childrenInputFieldStyle?.rotation}; + margin: ${props => props.$childrenInputFieldStyle?.margin}; + padding: ${props => props.$childrenInputFieldStyle?.padding}; + .ant-cascader-menu-item-content{ + font-size: ${props => props.$childrenInputFieldStyle?.textSize}; + font-style: ${props => props.$childrenInputFieldStyle?.fontStyle}; + font-family: ${props => props.$childrenInputFieldStyle?.fontFamily}; + font-weight: ${props => props.$childrenInputFieldStyle?.textWeight}; + text-transform: ${props => props.$childrenInputFieldStyle?.textTransform}; + text-decoration: ${props => props.$childrenInputFieldStyle?.textDecoration}; + color: ${props => props.$childrenInputFieldStyle?.text}; + } +` + let CascaderBasicComp = (function () { const childrenMap = CascaderChildren; return new UICompBuilder(childrenMap, (props) => { return props.label({ style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, + childrenInputFieldStyle:props.childrenInputFieldStyle, children: ( props.onEvent("focus")} onBlur={() => props.onEvent("blur")} + dropdownRender={(menus: React.ReactNode) => ( + + {menus} + + )} onChange={(value: (string | number)[]) => { props.value.onChange(value as string[]); props.onEvent("change"); diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderContants.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderContants.tsx index 1a631e2eb..4222ce0a8 100644 --- a/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderContants.tsx +++ b/client/packages/lowcoder/src/comps/comps/selectInputComp/cascaderContants.tsx @@ -6,7 +6,7 @@ import { arrayStringExposingStateControl } from "comps/controls/codeStateControl import { BoolControl } from "comps/controls/boolControl"; import { LabelControl } from "comps/controls/labelControl"; import { styleControl } from "comps/controls/styleControl"; -import { CascaderStyle } from "comps/controls/styleControlConstants"; +import { CascaderStyle, ChildrenMultiSelectStyle, InputFieldStyle, LabelStyle } from "comps/controls/styleControlConstants"; import { allowClearPropertyView, disabledPropertyView, @@ -16,9 +16,9 @@ import { } from "comps/utils/propertyUtils"; import { i18nObjs, trans } from "i18n"; import { RefControl } from "comps/controls/refControl"; -import { CascaderRef } from "antd/lib/cascader"; +import { CascaderRef } from "antd/es/cascader"; -import { MarginControl } from "../../controls/marginControl"; +import { MarginControl } from "../../controls/marginControl"; import { PaddingControl } from "../../controls/paddingControl"; import { useContext } from "react"; @@ -34,11 +34,14 @@ export const CascaderChildren = { onEvent: SelectEventHandlerControl, allowClear: BoolControl, options: JSONObjectArrayControl, - style: styleControl(CascaderStyle), + style: styleControl(InputFieldStyle), + labelStyle: styleControl(LabelStyle.filter((style) => ['accent', 'validate'].includes(style.name) === false)), showSearch: BoolControl.DEFAULT_TRUE, viewRef: RefControl, - margin: MarginControl, + margin: MarginControl, padding: PaddingControl, + inputFieldStyle:styleControl(CascaderStyle), + childrenInputFieldStyle:styleControl(ChildrenMultiSelectStyle) }; export const CascaderPropertyView = ( @@ -71,9 +74,20 @@ export const CascaderPropertyView = ( )} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( -
- {children.style.getPropertyView()} -
+ <> +
+ {children.style.getPropertyView()} +
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.inputFieldStyle.getPropertyView()} +
+
+ {children.childrenInputFieldStyle.getPropertyView()} +
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/checkboxComp.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/checkboxComp.tsx index 0cb4587a6..c0cc28a7d 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 } from "comps/controls/styleControlConstants"; +import { CheckboxStyle, CheckboxStyleType, InputFieldStyle, LabelStyle } from "comps/controls/styleControlConstants"; import { RadioLayoutOptions, RadioPropertyView } from "./radioCompConstants"; import { dropdownControl } from "../../controls/dropdownControl"; import { ValueFromOption } from "lowcoder-design"; @@ -64,13 +64,13 @@ export const getStyle = (style: CheckboxStyleType) => { &:hover .ant-checkbox-inner, .ant-checkbox:hover .ant-checkbox-inner, .ant-checkbox-input + ant-checkbox-inner { - background-color:${style.hoverBackground ? style.hoverBackground :'#fff'}; + background-color:${style.hoverBackground ? style.hoverBackground : '#fff'}; } &:hover .ant-checkbox-checked .ant-checkbox-inner, .ant-checkbox:hover .ant-checkbox-inner, .ant-checkbox-input + ant-checkbox-inner { - background-color:${style.hoverBackground ? style.hoverBackground:'#ffff'}; + background-color:${style.hoverBackground ? style.hoverBackground : '#ffff'}; } &:hover .ant-checkbox-inner, @@ -136,10 +136,11 @@ let CheckboxBasicComp = (function () { disabled: BoolCodeControl, onEvent: ChangeEventHandlerControl, options: SelectInputOptionControl, - style: styleControl(CheckboxStyle), + style: styleControl(InputFieldStyle), + labelStyle: styleControl(LabelStyle.filter((style) => ['accent', 'validate'].includes(style.name) === false)), layout: dropdownControl(RadioLayoutOptions, "horizontal"), viewRef: RefControl, - + inputFieldStyle:styleControl(CheckboxStyle), ...SelectInputValidationChildren, ...formDataChildren, }; @@ -151,12 +152,14 @@ let CheckboxBasicComp = (function () { return props.label({ required: props.required, style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, children: ( option.value !== undefined && !option.hidden) diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/multiSelectComp.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/multiSelectComp.tsx index c45c0cdc6..b08a8276a 100644 --- a/client/packages/lowcoder/src/comps/comps/selectInputComp/multiSelectComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/selectInputComp/multiSelectComp.tsx @@ -1,5 +1,5 @@ import { styleControl } from "comps/controls/styleControl"; -import { MultiSelectStyle } from "comps/controls/styleControlConstants"; +import { ChildrenMultiSelectStyle, InputFieldStyle, LabelStyle, MultiSelectStyle } from "comps/controls/styleControlConstants"; import { trans } from "i18n"; import { arrayStringExposingStateControl } from "../../controls/codeStateControl"; import { UICompBuilder } from "../../generators"; @@ -22,7 +22,10 @@ let MultiSelectBasicComp = (function () { ...SelectChildrenMap, defaultValue: arrayStringExposingStateControl("defaultValue", ["1", "2"]), value: arrayStringExposingStateControl("value"), - style: styleControl(MultiSelectStyle), + style: styleControl(InputFieldStyle), + labelStyle:styleControl(LabelStyle), + inputFieldStyle:styleControl(MultiSelectStyle), + childrenInputFieldStyle:styleControl(ChildrenMultiSelectStyle), margin: MarginControl, padding: PaddingControl, }; @@ -36,6 +39,9 @@ let MultiSelectBasicComp = (function () { return props.label({ required: props.required, style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, + childrenInputFieldStyle:props.childrenInputFieldStyle, children: ( , - + inputFieldStyle:styleControl(RadioStyle), ...SelectInputValidationChildren, ...formDataChildren, }; @@ -92,7 +93,11 @@ export const RadioPropertyView = ( )} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( + <>
{children.style.getPropertyView()}
+
{children.labelStyle.getPropertyView()}
+
{children.inputFieldStyle.getPropertyView()}
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/segmentedControl.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/segmentedControl.tsx index a73827c2a..8470bd8b1 100644 --- a/client/packages/lowcoder/src/comps/comps/selectInputComp/segmentedControl.tsx +++ b/client/packages/lowcoder/src/comps/comps/selectInputComp/segmentedControl.tsx @@ -25,15 +25,13 @@ import { RefControl } from "comps/controls/refControl"; import { useContext } from "react"; import { EditorContext } from "comps/editorState"; -import { migrateOldData } from "comps/generators/simpleGenerators"; +import { migrateOldData, withDefault } from "comps/generators/simpleGenerators"; import { fixOldInputCompData } from "../textInputComp/textInputConstants"; const getStyle = (style: SegmentStyleType) => { return css` &.ant-segmented:not(.ant-segmented-disabled) { - background-color: ${style.background}; - &, .ant-segmented-item-selected, .ant-segmented-thumb, @@ -79,7 +77,7 @@ const SegmentChildrenMap = { disabled: BoolCodeControl, onEvent: ChangeEventHandlerControl, options: SelectOptionControl, - style: styleControl(SegmentStyle), + style: withDefault(styleControl(SegmentStyle),{borderWidth:'1px'}), viewRef: RefControl, ...SelectInputValidationChildren, diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/selectComp.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/selectComp.tsx index 50455b335..5224c1c98 100644 --- a/client/packages/lowcoder/src/comps/comps/selectInputComp/selectComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/selectInputComp/selectComp.tsx @@ -1,5 +1,5 @@ import { styleControl } from "comps/controls/styleControl"; -import { SelectStyle } from "comps/controls/styleControlConstants"; +import { ChildrenMultiSelectStyle, InputFieldStyle, LabelStyle, SelectStyle } from "comps/controls/styleControlConstants"; import { trans } from "i18n"; import { stringExposingStateControl } from "../../controls/codeStateControl"; import { UICompBuilder } from "../../generators"; @@ -25,7 +25,10 @@ let SelectBasicComp = (function () { ...SelectChildrenMap, defaultValue: stringExposingStateControl("defaultValue"), value: stringExposingStateControl("value"), - style: styleControl(SelectStyle), + style: styleControl(InputFieldStyle), + labelStyle: styleControl(LabelStyle), + inputFieldStyle: styleControl(SelectStyle), + childrenInputFieldStyle: styleControl(ChildrenMultiSelectStyle) }; return new UICompBuilder(childrenMap, (props, dispatch) => { const [ @@ -37,10 +40,13 @@ let SelectBasicComp = (function () { propsRef.current = props; const valueSet = new Set(props.options.map((o) => o.value)); // Filter illegal default values entered by the user - + return props.label({ required: props.required, style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, + childrenInputFieldStyle:props.childrenInputFieldStyle, children: ( props.$style && getStyle(props.$style)} `; -const DropdownStyled = styled.div<{ $style: MultiSelectStyleType }>` - ${(props) => props.$style && getDropdownStyle(props.$style)} +const DropdownStyled = styled.div<{ $style: ChildrenMultiSelectStyleType }>` + background-color: ${props => props.$style?.background}; + border: ${props => props.$style?.border}; + border-style: ${props => props.$style?.borderStyle}; + border-width: ${props => props.$style?.borderWidth}; + border-radius: ${props => props.$style?.radius}; + rotate: ${props => props.$style?.rotation}; + margin: ${props => props.$style?.margin}; + padding: ${props => props.$style?.padding}; .ant-select-item-option-content { - ${(props) => `padding: ${props.$style.padding}`}; + font-size: ${props => props.$style?.textSize}; + font-style: ${props => props.$style?.fontStyle}; + font-family: ${props => props.$style?.fontFamily}; + font-weight: ${props => props.$style?.textWeight}; + text-transform: ${props => props.$style?.textTransform}; + color: ${props => props.$style?.text}; + } + .option-label{ + text-decoration: ${props => props.$style?.textDecoration} !important; } .option-label img { min-width: 14px; @@ -217,6 +235,7 @@ export const SelectChildrenMap = { viewRef: RefControl, margin: MarginControl, padding: PaddingControl, + inputFieldStyle:styleControl(SelectStyle), ...SelectInputValidationChildren, ...formDataChildren, }; @@ -226,11 +245,12 @@ export const SelectUIView = ( mode?: "multiple" | "tags"; value: any; style: SelectStyleType | MultiSelectStyleType; + childrenInputFieldStyle: ChildrenMultiSelectStyleType; onChange: (value: any) => void; dispatch: DispatchType; } -) => ( - ( - + {originNode} )} @@ -279,7 +299,7 @@ export const SelectUIView = ( ))} -); +} export const SelectPropertyView = ( children: RecordConstructorToComp< @@ -290,6 +310,9 @@ export const SelectPropertyView = ( defaultValue: { propertyView: (params: ControlParams) => ControlNode }; value: { propertyView: (params: ControlParams) => ControlNode }; style: { getPropertyView: () => ControlNode }; + labelStyle: { getPropertyView: () => ControlNode }; + inputFieldStyle: { getPropertyView: () => ControlNode }; + childrenInputFieldStyle: { getPropertyView: () => ControlNode }; } ) => ( <> @@ -328,10 +351,21 @@ export const SelectPropertyView = ( {["layout", "both"].includes( useContext(EditorContext).editorModeStatus ) && ( -
- {children.style.getPropertyView()} -
- )} + <> +
+ {children.style.getPropertyView()} +
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.inputFieldStyle.getPropertyView()} +
+
+ {children.childrenInputFieldStyle.getPropertyView()} +
+ + )} ); diff --git a/client/packages/lowcoder/src/comps/comps/selectInputComp/stepControl.tsx b/client/packages/lowcoder/src/comps/comps/selectInputComp/stepControl.tsx new file mode 100644 index 000000000..f45e300bc --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/selectInputComp/stepControl.tsx @@ -0,0 +1,263 @@ +import { ConfigProvider, Steps} from "antd"; +import { BoolCodeControl } from "comps/controls/codeControl"; +import { BoolControl } from "comps/controls/boolControl"; +import { stringExposingStateControl, numberExposingStateControl } from "comps/controls/codeStateControl"; +import { ChangeEventHandlerControl } from "comps/controls/eventHandlerControl"; +import { StepOptionControl } from "comps/controls/optionsControl"; +import { styleControl } from "comps/controls/styleControl"; +import { StepsStyle, StepsStyleType, heightCalculator, widthCalculator, marginCalculator } from "comps/controls/styleControlConstants"; +import styled, { css } from "styled-components"; +import { UICompBuilder, withDefault } from "../../generators"; +import { CommonNameConfig, NameConfig, withExposingConfigs } from "../../generators/withExposing"; +import { selectDivRefMethods, } from "./selectInputConstants"; +import { Section, sectionNames } from "lowcoder-design"; +import { hiddenPropertyView, disabledPropertyView } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { hasIcon } from "comps/utils"; +import { RefControl } from "comps/controls/refControl"; +import { dropdownControl } from "comps/controls/dropdownControl"; +import { useContext, useState, useEffect } from "react"; +import { EditorContext } from "comps/editorState"; + + +const sizeOptions = [ + { + label: trans("step.sizeSmall"), + value: "small", + }, + { + label: trans("step.sizeDefault"), + value: "default", + } +] as const; + +const typeOptions = [ + { + label: trans("step.typeDefault"), + value: "default", + }, + { + label: trans("step.typeNavigation"), + value: "navigation", + }, + { + label: trans("step.typeInline"), + value: "inline", + } +] as const; + +const directionOptions = [ + { + label: trans("step.directionHorizontal"), + value: "horizontal", + }, + { + label: trans("step.directionVertical"), + value: "vertical", + } +] as const; + +const statusOptions = [ + { + label: trans("step.statusProcess"), + value: "process" + }, + { + label: trans("step.statusWait"), + value: "wait" + }, + { + label: trans("step.statusFinish"), + value: "finish" + }, + { + label: trans("step.statusError"), + value: "error" + }, +] + +const StepsChildrenMap = { + initialValue: numberExposingStateControl("1"), + value: stringExposingStateControl("value"), + stepStatus : stringExposingStateControl("process"), + stepPercent: numberExposingStateControl("60"), + size: dropdownControl(sizeOptions, "default"), + displayType : dropdownControl(typeOptions, "default"), + direction: dropdownControl(directionOptions, "horizontal"), + showDots : BoolControl, + showIcons : BoolControl, + selectable : BoolControl, + labelPlacement: dropdownControl(directionOptions, "horizontal"), + disabled: BoolCodeControl, + onEvent: ChangeEventHandlerControl, + options: StepOptionControl, + style: withDefault( styleControl(StepsStyle), {text:'#D7D9E0'}), + viewRef: RefControl +}; + +let StepControlBasicComp = (function () { + return new UICompBuilder(StepsChildrenMap, (props) => { + + const StyledWrapper = styled.div<{ style: StepsStyleType }>` + min-height: 24px; + max-width: ${widthCalculator(props.style.margin)}; + max-height: ${heightCalculator(props.style.margin)}; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-decoration: ${props.style.textDecoration}; + font-style: ${props.style.fontStyle}; + font-weight: ${props.style.textWeight}; + font-size: ${props.style.textSize}; + text-transform: ${props.style.textTransform}; + margin: ${props.style.margin}; + rotate: ${props.style.rotation}; + padding: ${props.style.padding}; + background-color: ${props.style.background}; + border: ${props.style.borderWidth} solid ${props.style.border}; + border-radius: ${props.style.radius}; + background-image: url(${props.style.backgroundImage}); + background-repeat: ${props.style.backgroundImageRepeat}; + background-size: ${props.style.backgroundImageSize}; + background-position: ${props.style.backgroundImagePosition}; + background-origin: ${props.style.backgroundImageOrigin}; + .ant-steps-item { padding-top: 5px !important; } + .ant-steps.ant-steps-label-vertical.ant-steps-small .ant-steps-item-icon { margin-top: 17px !important; } + .ant-steps.ant-steps-label-vertical.ant-steps-default .ant-steps-item-icon { margin-top: 12px !important; } + .ant-steps.ant-steps-dot .ant-steps-item-process .ant-steps-icon .ant-steps-icon-dot { margin-top: 4px !important; } + .ant-steps.ant-steps-default .ant-steps-item-icon .ant-steps-icon-dot { margin-top: 9px !important; } + .ant-steps.ant-steps-small .ant-steps-item-icon .ant-steps-icon-dot { margin-top: 4px !important; } + .ant-steps.ant-steps-dot .ant-steps-item-title { margin-top: 10px !important; } + .ant-steps.ant-steps-default.ant-steps-with-progress.ant-steps-label-horizontal .ant-steps-item.ant-steps-item-custom div.ant-steps-item-icon { margin-top:4px !important; } + .ant-steps.ant-steps-default.ant-steps-with-progress.ant-steps-label-vertical .ant-steps-item.ant-steps-item-custom div.ant-steps-item-icon { margin-top:17px !important; } + .ant-steps.ant-steps-dot.ant-steps-small.ant-steps-with-progress .ant-steps-item-icon .ant-progress { inset-block-start: -8px !important; inset-inline-start: -11px !important; } + .ant-steps.ant-steps-dot.ant-steps-default.ant-steps-with-progress .ant-steps-item-icon .ant-progress { inset-block-start: -7px !important; inset-inline-start: -13px !important; } + .ant-steps.ant-steps-small.ant-steps-with-progress .ant-steps-item:not(.ant-steps-item-custom) .ant-progress { inset-block-start: -5px !important; inset-inline-start: -5px !important; } + .ant-steps.ant-steps-default.ant-steps-with-progress .ant-steps-item:not(.ant-steps-item-custom) .ant-progress { inset-block-start: -5px !important; inset-inline-start: -5px !important; } + .ant-steps.ant-steps-small.ant-steps-with-progress .ant-steps-item.ant-steps-item-custom .ant-progress { inset-block-start: -5px !important; inset-inline-start: -10px !important; } + .ant-steps.ant-steps-default.ant-steps-with-progress .ant-steps-item.ant-steps-item-custom .ant-progress { inset-block-start: -4px !important; inset-inline-start: -13px !important; } + `; + + const [current, setCurrent] = useState(props.initialValue.value - 1); // Convert 1-based index to 0-based. + + useEffect(() => { + const newValue = Number(props.value.value); + setCurrent(newValue - 1); // Adjust for 0-based index. + }, [props.value.value]); + + const onChange = (index: number) => { + if (props.selectable == false) return; + const newIndex = Math.max(0, index); + setCurrent(newIndex); + if (props.options[newIndex]?.value !== undefined) { + props.value.onChange(newIndex + 1 + ""); // Convert back to 1-based index for display. + props.onEvent("change"); + } + }; + + return ( + + + + {props.options.map((option, index) => ( + + ))} + + + + ); + + }) + .setPropertyViewFn((children) => ( + <> +
+ {children.options.propertyView({})} + {children.initialValue.propertyView({ label: trans("step.initialValue"), tooltip : trans("step.initialValueTooltip")})} +
+ + {["logic", "both"].includes(useContext(EditorContext).editorModeStatus) && ( + <> +
+ {children.onEvent.getPropertyView()} + {disabledPropertyView(children)} + {hiddenPropertyView(children)} + {children.stepStatus.propertyView({label: trans("step.status")})} + {children.stepPercent.propertyView({label: trans("step.percent")})} + {children.selectable.propertyView({label: trans("step.selectable")})} +
+ )} + + {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( +
+ {children.size.propertyView({ + label: trans("step.size"), + radioButton: true, + })} + {children.displayType.propertyView({ + label: trans("step.type"), + radioButton: false, + })} + {children.direction.propertyView({ + label: trans("step.direction"), + radioButton: true, + })} + { children.direction.getView() == "horizontal" && + children.labelPlacement.propertyView({ + label: trans("step.labelPlacement"), + radioButton: true, + }) + } + { children.displayType.getView() != "inline" && !children.showIcons.getView() && ( + children.showDots.propertyView({label: trans("step.showDots")} + ))} + { children.displayType.getView() != "inline" && !children.showDots.getView() && ( + children.showIcons.propertyView({label: trans("step.showIcons")} + ))} +
+ )} + + {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( +
+ {children.style.getPropertyView()} +
+ )} + + )) + .setExposeMethodConfigs(selectDivRefMethods) + .build(); +})(); + +export const StepComp = withExposingConfigs(StepControlBasicComp, [ + new NameConfig("value", trans("step.valueDesc")), + new NameConfig("stepStatus", trans("step.status") ), + new NameConfig("stepPercent", trans("step.percent")), + ...CommonNameConfig, +]); diff --git a/client/packages/lowcoder/src/comps/comps/shapeComp/shapeComp.tsx b/client/packages/lowcoder/src/comps/comps/shapeComp/shapeComp.tsx new file mode 100644 index 000000000..51a404dbd --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/shapeComp/shapeComp.tsx @@ -0,0 +1,149 @@ +import { CompParams } from "lowcoder-core"; +import { ToDataType } from "comps/generators/multi"; +import { + NameConfigHidden, + withExposingConfigs, +} from "comps/generators/withExposing"; +import { NameGenerator } from "comps/utils/nameGenerator"; +import { Section, sectionNames } from "lowcoder-design"; +import { oldContainerParamsToNew } from "../containerBase"; +import { toSimpleContainerData } from "../containerBase/simpleContainerComp"; +import { ShapeTriContainer } from "./shapeTriContainer"; +import { ShapeControl } from "comps/controls/shapeControl"; +import { withDefault } from "../../generators"; +import { + ContainerChildren, + ContainerCompBuilder, +} from "../triContainerComp/triContainerCompBuilder"; +import { + disabledPropertyView, + hiddenPropertyView, +} from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { BoolCodeControl } from "comps/controls/codeControl"; +import { DisabledContext } from "comps/generators/uiCompBuilder"; +import React, { useContext, useEffect, useState } from "react"; +import { EditorContext } from "comps/editorState"; + +export const ContainerBaseComp = (function () { + const childrenMap = { + disabled: BoolCodeControl, + icon: withDefault(ShapeControl, ""), + }; + return new ContainerCompBuilder(childrenMap, (props, dispatch) => { + + + return ( + + + + ); + }) + .setPropertyViewFn((children) => { + return ( + <> +
+ {children.icon.propertyView({ + label: trans("iconComp.icon"), + IconType: "All", + })} +
+ {(useContext(EditorContext).editorModeStatus === "logic" || + useContext(EditorContext).editorModeStatus === "both") && ( +
+ {disabledPropertyView(children)} + {hiddenPropertyView(children)} +
+ )} + + {(useContext(EditorContext).editorModeStatus === "layout" || + useContext(EditorContext).editorModeStatus === "both") && ( + <> +
+ {children.container.getPropertyView()} +
+
+ {children.container.stylePropertyView()} +
+ {children.container.children.showBody.getView() && ( +
+ {children.container.bodyStylePropertyView()} +
+ )} + + )} + + ); + }) + .build(); +})(); + +// Compatible with old data +function convertOldContainerParams(params: CompParams) { + // convert older params to old params + let tempParams = oldContainerParamsToNew(params); + + if (tempParams.value) { + const container = tempParams.value.container; + // old params + if ( + container && + (container.hasOwnProperty("layout") || container.hasOwnProperty("items")) + ) { + const autoHeight = tempParams.value.autoHeight; + const scrollbars = tempParams.value.scrollbars; + return { + ...tempParams, + value: { + container: { + showHeader: true, + body: { 0: { view: container } }, + showBody: true, + showFooter: false, + autoHeight: autoHeight, + scrollbars: scrollbars, + }, + }, + }; + } + } + return tempParams; +} + +class ContainerTmpComp extends ContainerBaseComp { + constructor(params: CompParams) { + super(convertOldContainerParams(params)); + } +} + +export const ShapeComp = withExposingConfigs(ContainerTmpComp, [NameConfigHidden]); + +type ContainerDataType = ToDataType>; + +export function defaultContainerData( + compName: string, + nameGenerator: NameGenerator +): ContainerDataType { + return { + container: { + header: toSimpleContainerData([ + { + item: { + compType: "text", + name: nameGenerator.genItemName("containerTitle"), + comp: { + text: "### " + trans("container.title"), + }, + }, + layoutItem: { + i: "", + h: 5, + w: 24, + x: 0, + y: 0, + }, + }, + ]), + }, + }; +} diff --git a/client/packages/lowcoder/src/comps/comps/shapeComp/shapeTriContainer.tsx b/client/packages/lowcoder/src/comps/comps/shapeComp/shapeTriContainer.tsx new file mode 100644 index 000000000..45dd88a77 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/shapeComp/shapeTriContainer.tsx @@ -0,0 +1,166 @@ +import { ContainerStyleType, widthCalculator } from "comps/controls/styleControlConstants"; +import { EditorContext } from "comps/editorState"; +import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; +import { HintPlaceHolder, ScrollBar } from "lowcoder-design"; +import { ReactNode, useContext, useEffect, useState } from "react"; +import styled, { css } from "styled-components"; +import { checkIsMobile } from "util/commonUtils"; +import { + gridItemCompToGridItems, + InnerGrid, +} from "../containerComp/containerView"; +import { TriContainerViewProps } from "../triContainerComp/triContainerCompBuilder"; +import { Coolshape } from "coolshapes-react"; + +const getStyle = (style: ContainerStyleType) => { + return css` + border-color: ${style.border}; + border-width: ${style.borderWidth}; + border-radius: ${style.radius}; + overflow: hidden; + padding: ${style.padding}; + ${style.background && `background-color: ${style.background};`} + ${style.backgroundImage && `background-image: ${style.backgroundImage};`} + ${style.backgroundImageRepeat && + `background-repeat: ${style.backgroundImageRepeat};`} + ${style.backgroundImageSize && + `background-size: ${style.backgroundImageSize};`} + ${style.backgroundImagePosition && + `background-position: ${style.backgroundImagePosition};`} + ${style.backgroundImageOrigin && + `background-origin: ${style.backgroundImageOrigin};`} + `; +}; + +const Wrapper = styled.div<{ $style: ContainerStyleType }>` + display: flex; + flex-flow: column; + height: 100%; + border: 1px solid #d7d9e0; + border-radius: 4px; + ${(props) => props.$style && getStyle(props.$style)} +`; + +const StylesShape = styled(Coolshape)<{ $style: ContainerStyleType }>`; + ${(props) => props.$style && getStyle(props.$style)} +`; + +const BodyInnerGrid = styled(InnerGrid)<{ + $showBorder: boolean; + $backgroundColor: string; + $borderColor: string; + $borderWidth: string; + $backgroundImage: string; + $backgroundImageRepeat: string; + $backgroundImageSize: string; + $backgroundImagePosition: string; + $backgroundImageOrigin: string; +}>` + border-top: ${(props) => + `${props.$showBorder ? props.$borderWidth : 0} solid ${props.$borderColor}`}; + flex: 1; + ${(props) => + props.$backgroundColor && `background-color: ${props.$backgroundColor};`} + border-radius: 0; + ${(props) => + props.$backgroundImage && `background-image: ${props.$backgroundImage};`} + ${(props) => + props.$backgroundImageRepeat && + `background-repeat: ${props.$backgroundImageRepeat};`} + ${(props) => + props.$backgroundImageSize && + `background-size: ${props.$backgroundImageSize};`} + ${(props) => + props.$backgroundImagePosition && + `background-position: ${props.$backgroundImagePosition};`} + ${(props) => + props.$backgroundImageOrigin && + `background-origin: ${props.$backgroundImageOrigin};`} +`; + +export type TriContainerProps = TriContainerViewProps & { + hintPlaceholder?: ReactNode; + icon: any; +}; + +export function ShapeTriContainer(props: TriContainerProps) { + const { container, icon } = props; + // const { showHeader, showFooter } = container; + // When the header and footer are not displayed, the body must be displayed + const showBody = true; + const scrollbars = container.scrollbars; + + const { items: bodyItems, ...otherBodyProps } = + container.body["0"].children.view.getView(); + const { style, headerStyle, bodyStyle, footerStyle } = container; + + const editorState = useContext(EditorContext); + const maxWidth = editorState.getAppSettings().maxWidth; + const isMobile = checkIsMobile(maxWidth); + const paddingWidth = isMobile ? 8 : 0; + + let [shape, setShape] = useState({ value: "star", index: 0 }); + useEffect(() => { + if (icon.props?.value) { + let shapeDetails = icon.props?.value; + setShape({ + index: parseInt(shapeDetails?.split("_")[0]), + value: shapeDetails?.split("_")[1], + }); + } + }, [icon.props]); + + return ( +
+ + + +
+ + +
+
+
+
+
+ ); +} diff --git a/client/packages/lowcoder/src/comps/comps/signatureComp.tsx b/client/packages/lowcoder/src/comps/comps/signatureComp.tsx index 8db397915..d30e35999 100644 --- a/client/packages/lowcoder/src/comps/comps/signatureComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/signatureComp.tsx @@ -1,4 +1,4 @@ -import { DeleteOutlined } from "@ant-design/icons"; +import { default as DeleteOutlined } from "@ant-design/icons/DeleteOutlined"; import { default as Skeleton } from "antd/es/skeleton"; import { BoolControl } from "comps/controls/boolControl"; import { StringControl } from "comps/controls/codeControl"; @@ -8,9 +8,12 @@ import { styleControl } from "comps/controls/styleControl"; import { contrastColor, SignatureStyle, + LabelStyle, SignatureStyleType, widthCalculator, - heightCalculator + heightCalculator, + + InputFieldStyle } from "comps/controls/styleControlConstants"; import { stateComp, withDefault } from "comps/generators/simpleGenerators"; import { hiddenPropertyView } from "comps/utils/propertyUtils"; @@ -38,11 +41,11 @@ const Wrapper = styled.div<{ $style: SignatureStyleType; $isEmpty: boolean }>` overflow: hidden; width: 100%; height: 100%; - width: ${(props) => { - return widthCalculator(props.$style.margin); + width: ${(props) => { + return widthCalculator(props.$style.margin); }}; - height: ${(props) => { - return heightCalculator(props.$style.margin); + height: ${(props) => { + return heightCalculator(props.$style.margin); }}; margin: ${(props) => props.$style.margin}; padding: ${(props) => props.$style.padding}; @@ -97,11 +100,12 @@ const childrenMap = { tips: withDefault(StringControl, trans("signature.signHere")), onEvent: ChangeEventHandlerControl, label: withDefault(LabelControl, { position: "column", text: "" }), - style: styleControl(SignatureStyle), + style: styleControl(InputFieldStyle), + labelStyle: styleControl(LabelStyle), showUndo: withDefault(BoolControl, true), showClear: withDefault(BoolControl, true), value: stateComp(""), - + inputFieldStyle:styleControl(SignatureStyle), ...formDataChildren, }; @@ -126,6 +130,8 @@ let SignatureTmpComp = (function () { }; return props.label({ style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, children: ( { @@ -137,7 +143,7 @@ let SignatureTmpComp = (function () { onMouseDown={(e) => { e.preventDefault(); }} - $style={props.style} + $style={props.inputFieldStyle} $isEmpty={!props.value && !isBegin} >
@@ -146,7 +152,7 @@ let SignatureTmpComp = (function () { ref={(ref) => { canvas = ref; }} - penColor={props.style.pen} + penColor={props.inputFieldStyle.pen} clearOnResize={false} canvasProps={{ className: "sigCanvas", @@ -218,9 +224,17 @@ let SignatureTmpComp = (function () { )} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( -
- {children.style.getPropertyView()} -
+ <> +
+ {children.style.getPropertyView()} +
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.inputFieldStyle.getPropertyView()} +
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/switchComp.tsx b/client/packages/lowcoder/src/comps/comps/switchComp.tsx index 3a3ecf955..8b113857f 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 } from "comps/controls/styleControlConstants"; +import { SwitchStyle, SwitchStyleType, LabelStyle, InputFieldStyle } from "comps/controls/styleControlConstants"; import { migrateOldData } from "comps/generators/simpleGenerators"; import { Section, sectionNames } from "lowcoder-design"; import styled, { css } from "styled-components"; @@ -89,16 +89,19 @@ let SwitchTmpComp = (function () { label: LabelControl, onEvent: eventHandlerControl(EventOptions), disabled: BoolCodeControl, - style: migrateOldData(styleControl(SwitchStyle), fixOldData), + style: styleControl(InputFieldStyle), + labelStyle: styleControl(LabelStyle.filter((style) => ['accent', 'validate'].includes(style.name) === false)), viewRef: RefControl, - + inputFieldStyle:migrateOldData(styleControl(SwitchStyle), fixOldData), ...formDataChildren, }; return new UICompBuilder(childrenMap, (props) => { return props.label({ style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, children: ( - + - {children.style.getPropertyView()} -
+ <> +
+ {children.style.getPropertyView()} +
+
+ {children.labelStyle.getPropertyView()} +
+
+ {children.inputFieldStyle.getPropertyView()} +
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComp.tsx index 678bcabb0..4701156d2 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComp.tsx @@ -3,8 +3,9 @@ import { DateTimeComp } from "comps/comps/tableComp/column/columnTypeComps/colum import { ButtonComp } from "comps/comps/tableComp/column/simpleColumnTypeComps"; import { withType } from "comps/generators"; import { trans } from "i18n"; -import { Dropdown } from "lowcoder-design"; +import { Dropdown } from "lowcoder-design/src/components/Dropdown"; import { BooleanComp } from "./columnTypeComps/columnBooleanComp"; +import { SwitchComp } from "./columnTypeComps/columnSwitchComp"; import { DateComp } from "./columnTypeComps/columnDateComp"; import { ImageComp } from "./columnTypeComps/columnImgComp"; import { LinkComp } from "./columnTypeComps/columnLinkComp"; @@ -18,7 +19,13 @@ import { ColumnSelectComp } from "./columnTypeComps/columnSelectComp"; import { SimpleTextComp } from "./columnTypeComps/simpleTextComp"; import { ColumnNumberComp } from "./columnTypeComps/ColumnNumberComp"; +import { ColumnAvatarsComp } from "./columnTypeComps/columnAvatarsComp"; + const actionOptions = [ + { + label: trans("table.avatars"), + value: "avatars", + }, { label: trans("table.text"), value: "text", @@ -71,6 +78,10 @@ const actionOptions = [ label: trans("table.boolean"), value: "boolean", }, + { + label: trans("table.switch"), + value: "switch", + }, { label: trans("table.rating"), value: "rating", @@ -82,6 +93,7 @@ const actionOptions = [ ] as const; export const ColumnTypeCompMap = { + avatars: ColumnAvatarsComp, text: SimpleTextComp, number: ColumnNumberComp, button: ButtonComp, @@ -94,6 +106,7 @@ export const ColumnTypeCompMap = { markdown: ColumnMarkdownComp, dateTime: DateTimeComp, boolean: BooleanComp, + switch: SwitchComp, rating: RatingComp, progress: ProgressComp, date: DateComp, diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx index e8e729579..871d7fbf9 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/ColumnNumberComp.tsx @@ -6,6 +6,8 @@ import { ColumnTypeCompBuilder, ColumnTypeViewFn } from "../columnTypeCompBuilde import { ColumnValueTooltip } from "../simpleColumnTypeComps"; import { withDefault } from "comps/generators"; import styled from "styled-components"; +import { IconControl } from "comps/controls/iconControl"; +import { hasIcon } from "comps/utils"; const InputNumberWrapper = styled.div` .ant-input-number { @@ -28,6 +30,8 @@ const childrenMap = { precision: RangeControl.closed(0, 20, 0), float: BoolControl, prefix: StringControl, + prefixIcon: IconControl, + suffixIcon: IconControl, suffix: StringControl, }; @@ -46,14 +50,22 @@ export const ColumnNumberComp = (function () { childrenMap, (props, dispatch) => { float = props.float; - step = props.step; + step = props.step; precision = props.precision; const value = props.changeValue ?? getBaseValue(props, dispatch); let formattedValue: string | number = !float ? Math.floor(value) : value; if(float) { - formattedValue = formattedValue.toPrecision(precision + 1); + formattedValue = formattedValue.toFixed(precision + 1); } - return props.prefix + formattedValue + props.suffix; + return ( + <>{hasIcon(props.prefixIcon) && ( + {props.prefixIcon} + )} + {props.prefix + formattedValue + props.suffix} + {hasIcon(props.suffixIcon) && ( + {props.suffixIcon} + )} + ); }, (nodeValue) => nodeValue.text.value, getBaseValue, @@ -103,9 +115,15 @@ export const ColumnNumberComp = (function () { {children.prefix.propertyView({ label: trans("table.prefix"), })} + {children.prefixIcon.propertyView({ + label: trans("button.prefixIcon"), + })} {children.suffix.propertyView({ label: trans("table.suffix"), })} + {children.suffixIcon.propertyView({ + label: trans("button.suffixIcon"), + })} {children.float.propertyView({ label: trans("table.float"), onChange: (isFloat) => { diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnAvatarsComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnAvatarsComp.tsx new file mode 100644 index 000000000..82f261a14 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnAvatarsComp.tsx @@ -0,0 +1,169 @@ +import { ColumnTypeCompBuilder } from "comps/comps/tableComp/column/columnTypeCompBuilder"; +import { StringControl } from "comps/controls/codeControl"; +import { MultiCompBuilder, stateComp, withDefault } from "comps/generators"; +import { trans } from "i18n"; +import styled from "styled-components"; +import { LightActiveTextColor, PrimaryColor } from "constants/style"; +import { styleControl } from "comps/controls/styleControl"; +import { avatarGroupStyle, AvatarGroupStyleType } from "comps/controls/styleControlConstants"; +import { AlignCenter, AlignLeft, AlignRight } from "lowcoder-design"; +import { NumberControl } from "comps/controls/codeControl"; +import { Avatar, Tooltip } from "antd"; +import { clickEvent, eventHandlerControl, refreshEvent } from "comps/controls/eventHandlerControl"; +import { ReactElement } from "react"; +import { IconControl } from "comps/controls/iconControl"; +import { ColorControl } from "comps/controls/colorControl"; +import { optionsControl } from "comps/controls/optionsControl"; +import { BoolControl } from "comps/controls/boolControl"; +import { dropdownControl } from "comps/controls/dropdownControl"; +import { JSONObject } from "util/jsonTypes"; + +const MenuLinkWrapper = styled.div` + > a { + color: ${PrimaryColor} !important; + + &:hover { + color: ${LightActiveTextColor} !important; + } + } +`; + +const MacaroneList = [ + '#fde68a', + '#eecff3', + '#a7f3d0', + '#bfdbfe', + '#bfdbfe', + '#c7d2fe', + '#fecaca', + '#fcd6bb', +] + +const Container = styled.div<{ $style: AvatarGroupStyleType | undefined, alignment: string }>` + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: ${props => props.alignment}; + cursor: pointer; +`; + +const DropdownOption = new MultiCompBuilder( + { + src: StringControl, + AvatarIcon: IconControl, + label: StringControl, + color: ColorControl, + backgroundColor: ColorControl, + Tooltip: StringControl, + }, + (props) => props +) +.setPropertyViewFn((children) => { + return ( + <> + {children.src.propertyView({ label: trans("avatarComp.src"), placeholder: "", tooltip: trans("avatarComp.avatarCompTooltip") })} + {children.label.propertyView({label: trans("avatarComp.title"), tooltip: trans("avatarComp.avatarCompTooltip"), + })} + {children.AvatarIcon.propertyView({ + label: trans("avatarComp.icon"), + IconType: "All", + tooltip: trans("avatarComp.avatarCompTooltip"), + })} + {children.color.propertyView({ label: trans("style.fill") })} + {children.backgroundColor.propertyView({ label: trans("style.background") })} + {children.Tooltip.propertyView({ label: trans("badge.tooltip") })} + + ); +}) +.build(); + +const EventOptions = [clickEvent, refreshEvent] as const; + +export const alignOptions = [ + { label: , value: "flex-start" }, + { label: , value: "center" }, + { label: , value: "flex-end" }, +] as const; + +export const ColumnAvatarsComp = (function () { + const childrenMap = { + style: styleControl(avatarGroupStyle), + maxCount: withDefault(NumberControl, 3), + avatarSize: withDefault(NumberControl, 40), + alignment: dropdownControl(alignOptions, "center"), + autoColor: BoolControl.DEFAULT_TRUE, + onEvent: eventHandlerControl(EventOptions), + currentAvatar: stateComp({}), + avatars: optionsControl(DropdownOption, { + initOptions: [ + { src: "https://api.dicebear.com/7.x/miniavs/svg?seed=1", label: String.fromCharCode(65 + Math.ceil(Math.random() * 25)) }, + { AvatarIcon: "/icon:antd/startwotone" }, + { label: String.fromCharCode(65 + Math.ceil(Math.random() * 25)) }, + { label: String.fromCharCode(65 + Math.ceil(Math.random() * 25)) }, + ], + }) + }; + + return new ColumnTypeCompBuilder( + childrenMap, + (props) => { + return ( + + { + + { + props.avatars.map((item, index) => { + return ( + + { + props.onEvent("click") + // Falk: TODO: Implement dispatch function to set the currentAvatar + // dispatch(changeChildAction("currentAvatar", item as JSONObject, false)); + }} + > + {item.label} + + + ) + }) + } + + } + + ) + }, + () => "" + ) + .setPropertyViewFn((children) => ( + <> + {children.avatars.propertyView({})} + {children.maxCount.propertyView({ + label: trans("avatarGroup.maxCount") + })} + {children.avatarSize.propertyView({ + label: trans("avatarGroup.avatarSize") + })} + {children.autoColor.propertyView({ + label: trans("avatarGroup.autoColor") + })} + {children.alignment.propertyView({ + label: trans("table.avatarGroupAlignment"), + radioButton: true, + })} + {children.onEvent.propertyView()} + + )) + .build(); +})(); diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnBooleanComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnBooleanComp.tsx index b65c74eb4..b98924193 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnBooleanComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnBooleanComp.tsx @@ -9,6 +9,8 @@ import { CheckboxStyle, CheckboxStyleType } from "comps/controls/styleControlCon import { useStyle } from "comps/controls/styleControl"; import { dropdownControl } from "comps/controls/dropdownControl"; import { TableCheckedIcon, TableUnCheckedIcon } from "lowcoder-design"; +import { IconControl } from "comps/controls/iconControl"; +import { hasIcon } from "comps/utils"; const CheckboxStyled = styled(Checkbox)<{ $style: CheckboxStyleType }>` ${(props) => props.$style && getStyle(props.$style)} @@ -20,6 +22,7 @@ const Wrapper = styled.div` `; const IconWrapper = styled.div<{ $style: CheckboxStyleType; $ifChecked: boolean }>` + pointer-events: none; height: 22px; svg { width: 14px; @@ -48,6 +51,9 @@ const falseValuesOptions = [ const childrenMap = { text: BoolCodeControl, falseValues: dropdownControl(falseValuesOptions, ""), + iconTrue: IconControl, + iconFalse: IconControl, + iconNull: IconControl, }; const getBaseValue: ColumnTypeViewFn = (props) => props.text; @@ -88,12 +94,9 @@ export const BooleanComp = (function () { const style = useStyle(CheckboxStyle); return ( - {value ? ( - - ) : props.falseValues === "x" ? ( - - ) : ( - props.falseValues + {value === true ? ( hasIcon(props.iconTrue) ? props.iconTrue : ) + : value === false ? ( hasIcon(props.iconFalse) ? props.iconFalse : ( props.falseValues === "x" ? : props.falseValues ) + ) : ( hasIcon(props.iconNull) ? props.iconNull : "No Value" )} ); @@ -123,6 +126,15 @@ export const BooleanComp = (function () { label: trans("table.falseValues"), radioButton: true, })} + {children.iconTrue.propertyView({ + label: trans("table.iconTrue"), + })} + {children.iconFalse.propertyView({ + label: trans("table.iconFalse"), + })} + {children.iconNull.propertyView({ + label: trans("table.iconNull"), + })} ); }) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnDateComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnDateComp.tsx index 9149af73c..11a3107c4 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnDateComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnDateComp.tsx @@ -11,7 +11,7 @@ import { trans } from "i18n"; import { isNumber } from "lodash"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; -import { CalendarIcon, PrevIcon, SuperPrevIcon } from "lowcoder-design"; +import { CalendarCompIconSmall, PrevIcon, SuperPrevIcon } from "lowcoder-design"; import { useState } from "react"; import styled from "styled-components"; import { DateParser, DATE_FORMAT } from "util/dateTimeUtils"; @@ -164,7 +164,7 @@ export const DateEdit = (props: DateEditProps) => { > } + suffixIcon={} prevIcon={} nextIcon={} superNextIcon={} diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnSwitchComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnSwitchComp.tsx new file mode 100644 index 000000000..e9c550c93 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnSwitchComp.tsx @@ -0,0 +1,130 @@ +import { BoolCodeControl } from "comps/controls/codeControl"; +import { trans } from "i18n"; +import { default as Checkbox } from "antd/es/checkbox"; +import { ColumnTypeCompBuilder, ColumnTypeViewFn } from "../columnTypeCompBuilder"; +import { ColumnValueTooltip } from "../simpleColumnTypeComps"; +import { SwitchStyle, SwitchStyleType, LabelStyle, InputFieldStyle } from "comps/controls/styleControlConstants"; +import styled, { css } from "styled-components"; +import { CheckboxStyle } from "comps/controls/styleControlConstants"; +import { useStyle } from "comps/controls/styleControl"; +import { default as Switch } from "antd/es/switch"; +import { styleControl } from "comps/controls/styleControl"; +import { RefControl } from "comps/controls/refControl"; +import { booleanExposingStateControl } from "comps/controls/codeStateControl"; +import { changeEvent, eventHandlerControl } from "comps/controls/eventHandlerControl"; +import { disabledPropertyView } from "comps/utils/propertyUtils"; + +interface SwitchWrapperProps { + disabled: boolean; + $style?: SwitchStyleType; +} + +const EventOptions = [ + changeEvent, + { + label: trans("switchComp.open"), + value: "true", + description: trans("switchComp.openDesc"), + }, + { + label: trans("switchComp.close"), + value: "false", + description: trans("switchComp.closeDesc"), + }, +] as const; + +const getStyle = (style: SwitchStyleType) => { + return css` + .ant-switch-handle::before { + background-color: ${style.handle}; + } + button { + background-image: none; + background-color: ${style.unchecked}; + &.ant-switch-checked { + background-color: ${style.checked}; + } + } + `; +}; + +const SwitchWrapper = styled.div<{ disabled: boolean }>` + display: flex; + align-items: center; +`; + +const Wrapper = styled.div` + background: transparent !important; + padding: 0 8px; +` + +const childrenMap = { + value: booleanExposingStateControl("value"), + switchState: BoolCodeControl, + onEvent: eventHandlerControl(EventOptions), + disabled: BoolCodeControl, + style: styleControl(InputFieldStyle), + viewRef: RefControl, +}; + +const getBaseValue: ColumnTypeViewFn = (props) => props.switchState; + +export const SwitchComp = (function () { + return new ColumnTypeCompBuilder( + childrenMap, + (props, dispatch) => { + const value = props.changeValue ?? getBaseValue(props, dispatch); + const CheckBoxComp = () => { + return ( + { + props.value.onChange(checked); + props.onEvent("change"); + props.onEvent(checked ? "true" : "false"); + }} + /> + ); + }; + return ; + }, + (nodeValue) => nodeValue.switchState.value, + getBaseValue + ) + .setEditViewFn((props) => { + return ( + { + if (!e.currentTarget?.contains(e.relatedTarget)) { + props.onChangeEnd(); + } + }} + > + { + props.onChange(checked); + }} + /> + + + ); + }) + .setPropertyViewFn((children) => { + return ( + <> + {children.switchState.propertyView({ + label: trans("table.columnValue"), + tooltip: ColumnValueTooltip, + })} + {children.onEvent.propertyView()} + {disabledPropertyView(children)} + + + ); + }) + .build(); +})(); diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnTagsComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnTagsComp.tsx index fd8eaf901..e8c0fa641 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnTagsComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/columnTagsComp.tsx @@ -1,5 +1,5 @@ import { default as Tag } from "antd/es/tag"; -import { PresetStatusColorTypes } from "antd/lib/_util/colors"; +import { PresetStatusColorTypes } from "antd/es/_util/colors"; import { TagsContext } from "components/table/EditableCell"; import { ColumnTypeCompBuilder, @@ -15,6 +15,7 @@ import { toJson } from "really-relaxed-json"; import { hashToNum } from "util/stringUtils"; import { CustomSelect, PackUpIcon } from "lowcoder-design"; import { ScrollBar } from "lowcoder-design"; +import { ColoredTagOptionControl } from "comps/controls/optionsControl"; const colors = PresetStatusColorTypes; @@ -55,13 +56,22 @@ const TagsControl = codeControl | string>( { expectedType: "string | Array", codeType: "JSON" } ); -function getTagColor(text: string) { - const index = Math.abs(hashToNum(text)) % colors.length; - return colors[index]; +function getTagColor(tagText : any, tagOptions: any[]) { + const foundOption = tagOptions.find((option: { label: any; }) => option.label === tagText); + return foundOption ? foundOption.color : (function() { + const index = Math.abs(hashToNum(tagText)) % colors.length; + return colors[index]; + })(); +} + +function getTagIcon(tagText: any, tagOptions: any[]) { + const foundOption = tagOptions.find(option => option.label === tagText); + return foundOption ? foundOption.icon : undefined; } const childrenMap = { text: TagsControl, + tagColors: ColoredTagOptionControl, }; const getBaseValue: ColumnTypeViewFn = ( @@ -135,6 +145,9 @@ export const Wrapper = styled.div` } } } + .ant-tag svg { + margin-right: 4px; + } `; export const DropdownStyled = styled.div` @@ -150,8 +163,19 @@ export const DropdownStyled = styled.div` .ant-tag { margin-right: 0; } + .ant-tag svg { + margin-right: 4px; + } `; +export const TagStyled = styled(Tag)` + svg { + margin-right: 4px; + } +`; + +let tagOptionsList: any[] = []; + const TagEdit = (props: TagEditPropsType) => { const defaultTags = useContext(TagsContext); const [tags, setTags] = useState(() => { @@ -206,12 +230,12 @@ const TagEdit = (props: TagEditPropsType) => { {value.split(",")[1] ? ( value.split(",").map((item, i) => ( - + {item} )) ) : ( - + {value} )} @@ -226,6 +250,8 @@ export const ColumnTagsComp = (function () { return new ColumnTypeCompBuilder( childrenMap, (props, dispatch) => { + const tagOptions = props.tagColors; + tagOptionsList = props.tagColors; let value = props.changeValue ?? getBaseValue(props, dispatch); value = typeof value === "string" && value.split(",")[1] ? value.split(",") : value; const tags = _.isArray(value) ? value : [value]; @@ -233,9 +259,9 @@ export const ColumnTagsComp = (function () { // The actual eval value is of type number or boolean const tagText = String(tag); return ( - + {tagText} - + ); }); return view; @@ -257,6 +283,9 @@ export const ColumnTagsComp = (function () { label: trans("table.columnValue"), tooltip: ColumnValueTooltip, })} + {children.tagColors.propertyView({ + title: "test", + })} )) .build(); diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/simpleTextComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/simpleTextComp.tsx index 574972e4e..e312c0011 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/simpleTextComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/column/columnTypeComps/simpleTextComp.tsx @@ -3,9 +3,13 @@ import { StringOrNumberControl } from "comps/controls/codeControl"; import { trans } from "i18n"; import { ColumnTypeCompBuilder, ColumnTypeViewFn } from "../columnTypeCompBuilder"; import { ColumnValueTooltip } from "../simpleColumnTypeComps"; +import { IconControl } from "comps/controls/iconControl"; +import { hasIcon } from "comps/utils"; const childrenMap = { text: StringOrNumberControl, + prefixIcon: IconControl, + suffixIcon: IconControl, }; const getBaseValue: ColumnTypeViewFn = ( @@ -17,7 +21,13 @@ export const SimpleTextComp = (function () { childrenMap, (props, dispatch) => { const value = props.changeValue ?? getBaseValue(props, dispatch); - return value; + return <>{hasIcon(props.prefixIcon) && ( + {props.prefixIcon} + )} + {value} + {hasIcon(props.suffixIcon) && ( + {props.suffixIcon} + )} ; }, (nodeValue) => nodeValue.text.value, getBaseValue @@ -42,6 +52,12 @@ export const SimpleTextComp = (function () { label: trans("table.columnValue"), tooltip: ColumnValueTooltip, })} + {children.prefixIcon.propertyView({ + label: trans("button.prefixIcon"), + })} + {children.suffixIcon.propertyView({ + label: trans("button.suffixIcon"), + })} ); }) diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/expansionControl.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/expansionControl.tsx index 6b5b41380..51905a186 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/expansionControl.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/expansionControl.tsx @@ -50,7 +50,7 @@ let ExpansionControlTmp = (function () { slot: ContextSlotControl, }, () => ({ expandableConfig: {}, expandModalView: null }) - ) + ) .setControlItemData({ filterText: label }) .setPropertyViewFn((children, dispatch) => { return ( diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/selectionControl.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/selectionControl.tsx index a7cb00b24..60e292d0d 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/selectionControl.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/selectionControl.tsx @@ -1,4 +1,4 @@ -import { TableRowSelection } from "antd/lib/table/interface"; +import { TableRowSelection } from "antd/es/table/interface"; import { dropdownControl } from "comps/controls/dropdownControl"; import { stateComp } from "comps/generators"; import { trans } from "i18n"; diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx index ed03209ac..fdfa5d7e4 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableCompView.tsx @@ -38,7 +38,7 @@ import { TableImplComp } from "./tableComp"; import { useResizeDetector } from "react-resize-detector"; import { SlotConfigContext } from "comps/controls/slotControl"; import { EmptyContent } from "pages/common/styledComponent"; -import { messageInstance } from "lowcoder-design"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; import { ReactRef, ResizeHandleAxis } from "layout/gridLayoutPropTypes"; import { CellColorViewType } from "./column/tableColumnComp"; @@ -67,6 +67,8 @@ const getStyle = ( &, > td { background: ${genLinerGradient(rowStyle.background)}; + border-bottom:${rowStyle.borderWidth} ${rowStyle.borderStyle} ${rowStyle.border} !important; + border-right:${rowStyle.borderWidth} ${rowStyle.borderStyle} ${rowStyle.border} !important; } } @@ -74,6 +76,8 @@ const getStyle = ( &, > td { background: ${alternateBackground}; + border-bottom:${rowStyle.borderWidth} ${rowStyle.borderStyle} ${rowStyle.border} !important; + border-right:${rowStyle.borderWidth} ${rowStyle.borderStyle} ${rowStyle.border} !important; } } @@ -136,14 +140,15 @@ const BackgroundWrapper = styled.div<{ $style: TableStyleType; $tableAutoHeight: boolean; }>` - ${(props) => !props.$tableAutoHeight && `height: calc(100% - ${props.$style.margin} - ${props.$style.margin});`} background: ${(props) => props.$style.background} !important; - border: ${(props) => `${props.$style.borderWidth} solid ${props.$style.border} !important`}; + // border: ${(props) => `${props.$style.border} !important`}; border-radius: ${(props) => props.$style.radius} !important; // padding: unset !important; - padding: ${(props) => props.$style.padding} !important + padding: ${(props) => props.$style.padding} !important; margin: ${(props) => props.$style.margin} !important; overflow: scroll !important; + border-style:${(props) => props.$style.borderStyle} !important; + border-width: ${(props) => `${props.$style.borderWidth} !important`}; ${(props) => props.$style} `; @@ -339,7 +344,6 @@ const TableTd = styled.td<{ } background: ${(props) => props.$background} !important; border-color: ${(props) => props.$style.border} !important; - border-width: ${(props) => props.$style.borderWidth} !important; border-radius: ${(props) => props.$style.radius}; padding: 0 !important; @@ -533,7 +537,7 @@ function TableCellView(props: { text: columnStyle.text || columnsStyle.text, border: columnStyle.border || columnsStyle.border, radius: columnStyle.radius || columnsStyle.radius, - borderWidth: columnStyle.borderWidth || columnsStyle.borderWidth, + // borderWidth: columnStyle.borderWidth || columnsStyle.borderWidth, textSize: columnStyle.textSize || columnsStyle.textSize, textWeight: columnsStyle.textWeight || columnStyle.textWeight, fontFamily: columnsStyle.fontFamily || columnStyle.fontFamily, diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx index d64ffc8b1..ee68b9b1b 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableToolbarComp.tsx @@ -60,8 +60,8 @@ const getStyle = ( postion: -webkit-sticky; left: 0px !important; margin: ${style.margin} !important; + z-index: 999; - ${fixedToolbar && `z-index: 99;`}; ${fixedToolbar && position === 'below' && `bottom: 0;`}; ${fixedToolbar && position === 'above' && `top: 0;` }; diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx index 41a846c19..d752163ba 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableTypes.tsx @@ -205,12 +205,12 @@ const tableChildrenMap = { pagination: PaginationControl, sort: valueComp>([]), toolbar: TableToolbarComp, - style: styleControl(TableStyle), - rowStyle: styleControl(TableRowStyle), + style: withDefault(styleControl(TableStyle), {borderWidth: '1px'}), + rowStyle: withDefault(styleControl(TableRowStyle),{ borderWidth: '1px'}), toolbarStyle: styleControl(TableToolbarStyle), - headerStyle: styleControl(TableHeaderStyle), + headerStyle:withDefault(styleControl(TableHeaderStyle), {borderWidth: '1px'}), searchText: StringControl, - columnsStyle: withDefault(styleControl(TableColumnStyle), {borderWidth: '1px', radius: '0px',fontStyle:'italic'}), + columnsStyle: withDefault(styleControl(TableColumnStyle), {radius:'0px'}), viewModeResizable: BoolControl, visibleResizables: BoolControl, // sample data for regenerating columns diff --git a/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx b/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx index e0306b8f9..beb596991 100644 --- a/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx +++ b/client/packages/lowcoder/src/comps/comps/tableComp/tableUtils.tsx @@ -5,7 +5,7 @@ import { TableCurrentDataSource, TablePaginationConfig, } from "antd/es/table/interface"; -import { SortOrder } from "antd/lib/table/interface"; +import type { SortOrder } from "antd/es/table/interface"; import { __COLUMN_DISPLAY_VALUE_FN } from "comps/comps/tableComp/column/columnTypeCompBuilder"; import { CellColorViewType, RawColumnType, Render } from "comps/comps/tableComp/column/tableColumnComp"; import { TableFilter, tableFilterOperatorMap } from "comps/comps/tableComp/tableToolbarComp"; diff --git a/client/packages/lowcoder/src/comps/comps/tabs/index.tsx b/client/packages/lowcoder/src/comps/comps/tabs/index.tsx index 3f687dfad..7877697cc 100644 --- a/client/packages/lowcoder/src/comps/comps/tabs/index.tsx +++ b/client/packages/lowcoder/src/comps/comps/tabs/index.tsx @@ -1 +1 @@ -export { TabbedContainerComp } from "./tabbedContainerComp"; + export { TabbedContainerComp } from "./tabbedContainerComp"; \ No newline at end of file diff --git a/client/packages/lowcoder/src/comps/comps/tabs/tabbedContainerComp.tsx b/client/packages/lowcoder/src/comps/comps/tabs/tabbedContainerComp.tsx index 4d7c189c4..4effb590d 100644 --- a/client/packages/lowcoder/src/comps/comps/tabs/tabbedContainerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/tabs/tabbedContainerComp.tsx @@ -28,12 +28,13 @@ import { import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; import { disabledPropertyView, hiddenPropertyView } from "comps/utils/propertyUtils"; import { trans } from "i18n"; -import { BoolCodeControl } from "comps/controls/codeControl"; +import { BoolCodeControl, NumberControl } from "comps/controls/codeControl"; import { DisabledContext } from "comps/generators/uiCompBuilder"; import { EditorContext } from "comps/editorState"; import { checkIsMobile } from "util/commonUtils"; -import { messageInstance } from "lowcoder-design"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; import { BoolControl } from "comps/controls/boolControl"; +import { PositionControl } from "comps/controls/dropdownControl"; const EVENT_OPTIONS = [ { @@ -52,12 +53,15 @@ const childrenMap = { }), autoHeight: AutoHeightControl, scrollbars: withDefault(BoolControl, false), + placement: withDefault(PositionControl, "top"), onEvent: eventHandlerControl(EVENT_OPTIONS), disabled: BoolCodeControl, showHeader: withDefault(BoolControl, true), - style: styleControl(TabContainerStyle), + style: withDefault(styleControl(TabContainerStyle),{borderWidth:'1px'}), headerStyle: styleControl(ContainerHeaderStyle), bodyStyle: styleControl(ContainerBodyStyle), + tabsGutter: withDefault(NumberControl, 32), + tabsCentered: withDefault(BoolControl, false), }; type ViewProps = RecordConstructorToView; @@ -68,6 +72,7 @@ const getStyle = ( headerStyle: ContainerHeaderStyleType, bodyStyle: ContainerBodyStyleType, ) => { + console.log("🚀 ~ style:", style) return css` &.ant-tabs { overflow: hidden; @@ -75,7 +80,7 @@ const getStyle = ( border-radius: ${style.radius}; padding: ${style.padding}; background-color: ${style.background}; - background-image: ${style.backgroundImage}; + background-image: url(${style.backgroundImage}); background-repeat: ${style.backgroundImageRepeat}; background-size: ${style.backgroundImageSize}; background-position: ${style.backgroundImagePosition}; @@ -86,26 +91,15 @@ const getStyle = ( .react-grid-layout { border-radius: 0; background-color: ${bodyStyle.background || 'transparent'}; - background-image: ${bodyStyle.backgroundImage}; - background-repeat: ${bodyStyle.backgroundImageRepeat}; - background-size: ${bodyStyle.backgroundImageSize}; - background-position: ${bodyStyle.backgroundImagePosition}; - background-origin: ${bodyStyle.backgroundImageOrigin}; - } } > .ant-tabs-nav { background-color: ${headerStyle.headerBackground || 'transparent'}; - background-image: ${headerStyle.headerBackgroundImage}; - background-repeat: ${headerStyle.headerBackgroundImageRepeat}; - background-size: ${headerStyle.headerBackgroundImageSize}; - background-position: ${headerStyle.headerBackgroundImagePosition}; - background-origin: ${headerStyle.headerBackgroundImageOrigin}; .ant-tabs-tab { div { - color: ${style.tabText}; + color: #8b8fa3; } &.ant-tabs-tab-active div { @@ -114,6 +108,7 @@ const getStyle = ( } .ant-tabs-tab-btn { + font-size: ${style.textSize}; font-family:${style.fontFamily}; font-weight:${style.textWeight}; text-transform:${style.textTransform}; @@ -177,7 +172,7 @@ const StyledTabs = styled(Tabs)<{ const ContainerInTab = (props: ContainerBaseProps) => { return ( - + ); }; @@ -254,27 +249,33 @@ const TabbedContainer = (props: TabbedContainerProps) => { }) return ( -
- { - if (key !== props.selectedTabKey.value) { - props.selectedTabKey.onChange(key); - props.onEvent("change"); - } - }} - onTabClick={onTabClick} - animated - $isMobile={isMobile} - // tabBarGutter={32} - items={tabItems} - > - -
+ +
+ + { + if (key !== props.selectedTabKey.value) { + props.selectedTabKey.onChange(key); + props.onEvent("change"); + } + }} + onTabClick={onTabClick} + animated + $isMobile={isMobile} + items={tabItems} + tabBarGutter={props.tabsGutter} + centered={props.tabsCentered} + > + + +
+
); }; @@ -302,7 +303,7 @@ export const TabbedContainerBaseComp = (function () {
{children.onEvent.getPropertyView()} {disabledPropertyView(children)} - {children.showHeader.propertyView({ label: trans("prop.showHeader") })} + {children.showHeader.propertyView({ label: trans("tabbedContainer.showTabs") })} {hiddenPropertyView(children)}
)} @@ -310,6 +311,9 @@ export const TabbedContainerBaseComp = (function () { {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( <>
+ {children.placement.propertyView({ label: trans("tabbedContainer.placement"), radioButton: true })} + {children.tabsCentered.propertyView({ label: trans("tabbedContainer.tabsCentered")})} + { children.tabsGutter.propertyView({ label: trans("tabbedContainer.gutter"), tooltip : trans("tabbedContainer.gutterTooltip") })} {children.autoHeight.getPropertyView()} {!children.autoHeight.getView() && ( children.scrollbars.propertyView({ diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/inputComp.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/inputComp.tsx index 5eacf07cf..3e71e3b3d 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 { InputLikeStyle, InputLikeStyleType } from "comps/controls/styleControlConstants"; +import { InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle, LabelStyleType } from "comps/controls/styleControlConstants"; import { NameConfig, NameConfigPlaceHolder, @@ -31,7 +31,7 @@ import { IconControl } from "comps/controls/iconControl"; import { hasIcon } from "comps/utils"; import { InputRef } from "antd/es/input"; import { RefControl } from "comps/controls/refControl"; -import { migrateOldData } from "comps/generators/simpleGenerators"; +import { migrateOldData, withDefault } from "comps/generators/simpleGenerators"; import React, { useContext } from "react"; import { EditorContext } from "comps/editorState"; @@ -40,7 +40,7 @@ import { EditorContext } from "comps/editorState"; * Input Comp */ -const InputStyle = styled(Input)<{ $style: InputLikeStyleType }>` +const InputStyle = styled(Input) <{ $style: InputLikeStyleType }>` ${(props) => props.$style && getStyle(props.$style)} `; @@ -49,9 +49,11 @@ const childrenMap = { viewRef: RefControl, showCount: BoolControl, allowClear: BoolControl, - style: styleControl(InputLikeStyle), + style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), + labelStyle: styleControl(LabelStyle), prefixIcon: IconControl, suffixIcon: IconControl, + inputFieldStyle: styleControl(InputLikeStyle), }; let InputBasicComp = new UICompBuilder(childrenMap, (props) => { @@ -64,12 +66,14 @@ let InputBasicComp = new UICompBuilder(childrenMap, (props) => { ref={props.viewRef} showCount={props.showCount} allowClear={props.allowClear} - $style={props.style} + $style={props.inputFieldStyle} prefix={hasIcon(props.prefixIcon) && props.prefixIcon} suffix={hasIcon(props.suffixIcon) && props.suffixIcon} /> ), style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, ...validateState, }); }) @@ -82,22 +86,26 @@ let InputBasicComp = new UICompBuilder(childrenMap, (props) => { {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( children.label.getPropertyView() )} - + {["logic", "both"].includes(useContext(EditorContext).editorModeStatus) && ( <> -
{hiddenPropertyView(children)}
-
- {children.prefixIcon.propertyView({ label: trans("button.prefixIcon") })} - {children.suffixIcon.propertyView({ label: trans("button.suffixIcon") })} - {children.showCount.propertyView({ label: trans("prop.showCount") })} - {allowClearPropertyView(children)} - {readOnlyPropertyView(children)} -
- +
{hiddenPropertyView(children)}
+
+ {children.prefixIcon.propertyView({ label: trans("button.prefixIcon") })} + {children.suffixIcon.propertyView({ label: trans("button.suffixIcon") })} + {children.showCount.propertyView({ label: trans("prop.showCount") })} + {allowClearPropertyView(children)} + {readOnlyPropertyView(children)} +
+ )} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( - <>
{children.style.getPropertyView()}
+ <> +
{children.style.getPropertyView()}
+
{children.labelStyle.getPropertyView()}
+
{children.inputFieldStyle.getPropertyView()}
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx index 9bad13d1e..0c1e5235e 100644 --- a/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/textInputComp/mentionComp.tsx @@ -36,9 +36,9 @@ import { import { booleanExposingStateControl } from "comps/controls/codeStateControl"; import { trans } from "i18n"; import { RefControl } from "comps/controls/refControl"; -import { TextAreaRef } from "antd/lib/input/TextArea"; +import { TextAreaRef } from "antd/es/input/TextArea"; import { default as ConfigProvider } from "antd/es/config-provider"; -import { default as Mentions, MentionsOptionProps } from "antd/es/mentions"; +import { default as Mentions, type MentionsOptionProps } from "antd/es/mentions"; import { blurMethod, focusWithOptions } from "comps/utils/methodUtils"; import { textInputValidate, diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/passwordComp.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/passwordComp.tsx index 7659cdf72..ca005ea32 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 { InputLikeStyle, InputLikeStyleType } from "comps/controls/styleControlConstants"; +import { InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle } from "comps/controls/styleControlConstants"; import { hiddenPropertyView, minLengthPropertyView, @@ -43,7 +43,7 @@ import React, { useContext } from "react"; import { EditorContext } from "comps/editorState"; import { migrateOldData } from "comps/generators/simpleGenerators"; -const PasswordStyle = styled(InputPassword)<{ +const PasswordStyle = styled(InputPassword) <{ $style: InputLikeStyleType; }>` ${(props) => props.$style && getStyle(props.$style)} @@ -57,7 +57,9 @@ let PasswordTmpComp = (function () { validationType: dropdownControl(TextInputValidationOptions, "Regex"), visibilityToggle: BoolControl.DEFAULT_TRUE, prefixIcon: IconControl, - style: styleControl(InputLikeStyle), + style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), + labelStyle: styleControl(LabelStyle), + inputFieldStyle: styleControl(InputLikeStyle) }; return new UICompBuilder(childrenMap, (props) => { const [inputProps, validateState] = useTextInputProps(props); @@ -69,10 +71,12 @@ let PasswordTmpComp = (function () { {...inputProps} ref={props.viewRef} visibilityToggle={props.visibilityToggle} - $style={props.style} + $style={props.inputFieldStyle} /> ), style: props.style, + labelStyle: props.labelStyle, + inputFieldStyle:props.inputFieldStyle, ...validateState, }); }) @@ -88,24 +92,28 @@ let PasswordTmpComp = (function () { {["logic", "both"].includes(useContext(EditorContext).editorModeStatus) && ( <> -
{hiddenPropertyView(children)}
-
- {children.visibilityToggle.propertyView({ - label: trans("password.visibilityToggle"), - })} - {readOnlyPropertyView(children)} - {children.prefixIcon.propertyView({ label: trans("button.prefixIcon") })} -
+
{hiddenPropertyView(children)}
+
+ {children.visibilityToggle.propertyView({ + label: trans("password.visibilityToggle"), + })} + {readOnlyPropertyView(children)} + {children.prefixIcon.propertyView({ label: trans("button.prefixIcon") })} +
{requiredPropertyView(children)} {regexPropertyView(children)} {minLengthPropertyView(children)} {maxLengthPropertyView(children)} {children.customRule.propertyView({})} -
+
)} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( - <>
{children.style.getPropertyView()}
+ <> +
{children.style.getPropertyView()}
+
{children.labelStyle.getPropertyView()}
+
{children.inputFieldStyle.getPropertyView()}
+ )} ); diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/textAreaComp.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/textAreaComp.tsx index fe6a4ad24..530ce4afe 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 { InputLikeStyle, InputLikeStyleType } from "comps/controls/styleControlConstants"; +import { InputFieldStyle, InputLikeStyle, InputLikeStyleType, LabelStyle } from "comps/controls/styleControlConstants"; import { TextArea } from "components/TextArea"; import { allowClearPropertyView, @@ -31,14 +31,14 @@ import { } from "comps/utils/propertyUtils"; import { trans } from "i18n"; import { RefControl } from "comps/controls/refControl"; -import { TextAreaRef } from "antd/lib/input/TextArea"; +import { TextAreaRef } from "antd/es/input/TextArea"; import { blurMethod, focusWithOptions } from "comps/utils/methodUtils"; import React, { useContext } from "react"; import { EditorContext } from "comps/editorState"; import { migrateOldData } from "comps/generators/simpleGenerators"; -const TextAreaStyled = styled(TextArea)<{ +const TextAreaStyled = styled(TextArea) <{ $style: InputLikeStyleType; }>` ${(props) => props.$style && getStyle(props.$style)} @@ -48,7 +48,7 @@ const Wrapper = styled.div<{ $style: InputLikeStyleType; }>` height: 100% !important; - + .ant-input { height:100% !important; } @@ -71,24 +71,28 @@ let TextAreaTmpComp = (function () { viewRef: RefControl, allowClear: BoolControl, autoHeight: withDefault(AutoHeightControl, "fixed"), - style: styleControl(InputLikeStyle), + style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), + labelStyle: styleControl(LabelStyle), + inputFieldStyle: styleControl(InputLikeStyle) }; return new UICompBuilder(childrenMap, (props) => { const [inputProps, validateState] = useTextInputProps(props); return props.label({ required: props.required, + inputFieldStyle:props.inputFieldStyle, children: ( - - + ), style: props.style, + labelStyle: props.labelStyle, ...validateState, }); }) @@ -103,19 +107,23 @@ let TextAreaTmpComp = (function () { {["logic", "both"].includes(useContext(EditorContext).editorModeStatus) && ( <> -
- {children.autoHeight.getPropertyView()} - {hiddenPropertyView(children)} -
-
- {allowClearPropertyView(children)} - {readOnlyPropertyView(children)} -
- +
+ {children.autoHeight.getPropertyView()} + {hiddenPropertyView(children)} +
+
+ {allowClearPropertyView(children)} + {readOnlyPropertyView(children)} +
+ )} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( - <>
{children.style.getPropertyView()}
+ <> +
{children.style.getPropertyView()}
+
{children.labelStyle.getPropertyView()}
+
{children.inputFieldStyle.getPropertyView()}
+ )} )) diff --git a/client/packages/lowcoder/src/comps/comps/textInputComp/textInputConstants.tsx b/client/packages/lowcoder/src/comps/comps/textInputComp/textInputConstants.tsx index 9c9d17cbb..f2212358e 100644 --- a/client/packages/lowcoder/src/comps/comps/textInputComp/textInputConstants.tsx +++ b/client/packages/lowcoder/src/comps/comps/textInputComp/textInputConstants.tsx @@ -9,7 +9,7 @@ import { } from "comps/controls/codeControl"; import { stringExposingStateControl } from "comps/controls/codeStateControl"; import { LabelControl } from "comps/controls/labelControl"; -import { InputLikeStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; +import { InputLikeStyleType, LabelStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; import { Section, sectionNames, ValueFromOption } from "lowcoder-design"; import _ from "lodash"; import { css } from "styled-components"; @@ -235,7 +235,7 @@ export const TextInputValidationSection = (children: TextInputComp) => (
); -export function getStyle(style: InputLikeStyleType) { +export function getStyle(style: InputLikeStyleType, labelStyle?: LabelStyleType) { return css` border-radius: ${style.radius}; border-width: ${style.borderWidth}; diff --git a/client/packages/lowcoder/src/comps/comps/timerComp.tsx b/client/packages/lowcoder/src/comps/comps/timerComp.tsx new file mode 100644 index 000000000..ef8575e53 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/timerComp.tsx @@ -0,0 +1,295 @@ +import { CompAction, RecordConstructorToView, changeChildAction } from "lowcoder-core"; +import { styleControl } from "comps/controls/styleControl"; +import { 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"; +import { hiddenPropertyView } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { Button, Space } from "antd"; +import { countdownEvent, eventHandlerControl, pauseEvent, resetEvent, resumeEvent, startEvent } from "../controls/eventHandlerControl"; +import styled from "styled-components"; +import { useContext, useState, useEffect, useMemo } from "react"; +import { stateComp } from "../generators"; +import { EditorContext } from "comps/editorState"; +import { dropdownControl } from "../controls/dropdownControl"; +import { stringExposingStateControl } from "comps/controls/codeStateControl"; +import { BoolControl } from "comps/controls/boolControl"; + +const Container = styled.div<{ $style: timerStyleType | undefined }>` + align-items: center; + cursor: pointer; + font-size: 2.9em; + text-align: center; + word-wrap: break-word; + line-height: initial; + background-color: ${props => props.$style?.background}; + font-weight: ${props=>props?.$style?.textWeight}; +border-radius: ${props=>props?.$style?.radius}; +font-size: ${props=>props?.$style?.textSize}; +rotate: ${props=>props?.$style?.rotation}; +text-transform: ${props=>props?.$style?.textTransform}; +color: ${props=>props?.$style?.text}; +border: ${props => props?.$style?.border}; +border-style: ${props=>props?.$style?.borderStyle}; +border-width: ${props=>props?.$style?.borderWidth}; +font-family: ${props=>props?.$style?.fontFamily}; +font-style: ${props=>props?.$style?.fontStyle}; +margin: ${props=>props?.$style?.margin}; +padding: ${props=>props?.$style?.padding}; +background: ${props=>props?.$style?.background}; +text-decoration: ${props=>props?.$style?.textDecoration}; +`; + +const ButtonWarrper = styled.div` + width: 100%; + min-height: 35px; + display: flex; + justify-content: center; + padding-right: 15px; + padding-bottom: 10px; + margin-top: 10px; +`; + +const StyledButton = styled(Button)<{ $style: StartButtonStyleType }>` +background-color: ${props=>props.$style.background}; +font-weight: ${props=>props.$style.textWeight}; +border-radius: ${props=>props.$style.radius}; +font-size: ${props=>props.$style.textSize}; +rotate: ${props=>props.$style.rotation}; +text-transform: ${props=>props.$style.textTransform}; +color: ${props=>props.$style.text}; +border: ${props => props.$style.border}; +border-style: ${props=>props.$style.borderStyle}; +border-width: ${props=>props.$style.borderWidth}; +font-family: ${props=>props.$style.fontFamily}; +font-style: ${props=>props.$style.fontStyle}; +margin: ${props=>props.$style.margin}; +padding: ${props=>props.$style.padding}; +background: ${props=>props.$style.background}; +text-decoration: ${props=>props.$style.textDecoration}; +`; + + + +function formatTimeDifference(timeDifference: number) { + // 计算时、分、秒、毫秒 + const hours = Math.floor(timeDifference / (1000 * 60 * 60)); + const minutes = Math.floor((timeDifference % (1000 * 60 * 60)) / (1000 * 60)); + const seconds = Math.floor((timeDifference % (1000 * 60)) / 1000); + const milliseconds = timeDifference % 1000; + // 格式化时间差为文本 + const formattedTime = `${padZero(hours)}:${padZero(minutes)}:${padZero(seconds)}:${padZero(milliseconds, 3)}`; + return formattedTime; +} + +// 辅助函数:补零 +function padZero(number: number, length = 2) { + return String(number).padStart(length, '0'); +} + +const EventOptions = [countdownEvent, startEvent, pauseEvent, resumeEvent, resetEvent] as const; + +const timerTypeOptions = [ + { label: trans("timer.timer"), value: "timer" }, + { label: trans("timer.countdown"), value: "countdown" }, +] as const; + +const childrenMap = { + style: styleControl(timerStyle), + startButtonStyle: styleControl(startButtonStyle), + resetButtonStyle: styleControl(startButtonStyle), + onEvent: eventHandlerControl(EventOptions), + defaultValue: stringExposingStateControl("defaultValue", '00:00:00:000'), + timerType: dropdownControl(timerTypeOptions, 'timer'), + elapsedTime: stateComp(0), + timerState: stateComp('stoped'), + actionHandler: stateComp(''), + hideButton: BoolControl, +}; + +const AvatarGroupView = (props: RecordConstructorToView & { dispatch: (action: CompAction) => void; }) => { + const [startTime, setStartTime] = useState(0) + const [timerState, setTimerState] = useState('stoped') + const [elapsedTime, setElapsedTime] = useState(0) + const [intervalId, setIntervalId] = useState(0); + const [buttonState, setButtonState] = useState(true); + + useEffect(() => { + if (props.actionHandler != '') { + if (props.actionHandler === 'start') startAction() + else if (props.actionHandler === 'pause') pauseAction() + else if (props.actionHandler === 'resume') resumeAction() + else if (props.actionHandler === 'reset') resetAction() + props.dispatch(changeChildAction("actionHandler", '', true)); + } + }, [props.actionHandler]) + + useEffect(() => { + if (timerState === 'stoped') { + setElapsedTime(getDefaultValueMS) + } + }, [props.defaultValue.value]) + + useEffect(() => { + if (timerState === 'started') { + startTimer() + } + }, [startTime]) + + useEffect(() => { + if (timerState === 'stoped' && intervalId) { + intervalId && clearInterval(intervalId) + } + props.dispatch(changeChildAction("timerState", timerState, false)); + }, [timerState]) + + const getDefaultValueMS = useMemo(() => { + const [HH, MM, SS, MS] = (props.defaultValue.value && props.defaultValue.value.split(':')) || []; + let totleMS = parseInt(HH, 10) * 3600000 + parseInt(MM, 10) * 60000 + parseInt(SS, 10) * 1000 + parseInt(MS, 10) + return isNaN(totleMS) ? 0 : totleMS; + }, [props.defaultValue.value]) + + const startTimer = () => { + setIntervalId( + Number(setInterval(() => { + let temp = props.timerType === 'timer' ? Date.now() - startTime : getDefaultValueMS - (Date.now() - startTime) + if (temp <= 0) { + setTimerState('stoped') + props.onEvent('countdown') + setButtonState(false) + temp = 0 + } + setElapsedTime(temp) + props.dispatch(changeChildAction("elapsedTime", temp, false)); + }, 18)) + ) + } + const startAction = () => { + setTimerState('started') + props.onEvent('start') + setStartTime(props.timerType === 'timer' ? Date.now() - getDefaultValueMS : Date.now()) + } + + const pauseAction = () => { + intervalId && clearInterval(intervalId) + setTimerState('paused') + props.onEvent('pause') + } + + const resumeAction = () => { + setStartTime(props.timerType === 'timer' ? Date.now() - elapsedTime : Date.now() - (getDefaultValueMS - elapsedTime)) + setTimerState('started') + props.onEvent('resume') + } + const resetAction = () => { + intervalId && clearInterval(intervalId) + setTimerState('stoped') + setElapsedTime(getDefaultValueMS) + setButtonState(true) + props.onEvent('reset') + } + + return ( + + {formatTimeDifference(elapsedTime)} + + + ); +}; + +let AvatarGroupBasicComp = (function () { + return new UICompBuilder(childrenMap, (props, dispatch) => ) + .setPropertyViewFn((children) => ( + <> + {["logic", "both"].includes(useContext(EditorContext).editorModeStatus) && ( + <> +
+ {children.timerType.propertyView({ + label: trans('timer.timerType') + })} + {children.defaultValue.propertyView({ + label: trans('timer.defaultValue') + })} + {children.hideButton.propertyView({ + label: trans('timer.hideButton') + })} +
+
+ {hiddenPropertyView(children)} + {children.onEvent.propertyView()} +
+ + )} + + {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( + <> +
+ {children.style.getPropertyView()} +
+
+ {children.startButtonStyle.getPropertyView()} +
+
+ {children.resetButtonStyle.getPropertyView()} +
+ + )} + + )) + .setExposeMethodConfigs([ + { + method: { + name: "start/pause", + description: trans("timer.startPause"), + params: [], + }, + execute: async (comp, params) => { + if (comp.children.timerState.value === 'stoped') + comp.children.actionHandler.dispatch(comp.children.actionHandler.changeValueAction('start')) + else if (comp.children.timerState.value === 'paused') + comp.children.actionHandler.dispatch(comp.children.actionHandler.changeValueAction('resume')) + else if (comp.children.timerState.value === 'started') + comp.children.actionHandler.dispatch(comp.children.actionHandler.changeValueAction('pause')) + }, + }, + { + method: { + name: "reset", + description: trans("timer.reset"), + params: [], + }, + execute: async (comp, params) => { + comp.children.actionHandler.dispatch(comp.children.actionHandler.changeValueAction('reset')) + }, + }, + ]) + .build(); +})(); + +export const TimerComp = withExposingConfigs(AvatarGroupBasicComp, [ + new NameConfig("defaultValue", trans("timer.defaultValue")), + new NameConfig("elapsedTime", trans("timer.elapsedTime")), + new NameConfig("timerState", trans("timer.timerState")), + NameConfigHidden, +]); diff --git a/client/packages/lowcoder/src/comps/comps/tourComp/tourComp.tsx b/client/packages/lowcoder/src/comps/comps/tourComp/tourComp.tsx new file mode 100644 index 000000000..292eb02b9 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/tourComp/tourComp.tsx @@ -0,0 +1,99 @@ + +import { trans } from "i18n"; +import { withMethodExposing } from "../../generators/withMethodExposing"; +import { UICompBuilder } from "../../generators"; +import { stringExposingStateControl } from "comps/controls/codeStateControl"; +import { CommonNameConfig, NameConfig, withExposingConfigs } from "../../generators/withExposing"; +import { MultiBaseComp } from "lowcoder-core"; + +// FALK TODO: Check imports +// import { MultiBaseComp } from "lowcoder-core"; +// import { UICompBuilder } from "comps/generators/uiCompBuilder"; +// import { stringExposingStateControl } from "comps/controls/codeStateControl"; +// import { withMethodExposing } from "comps/generators/withMethodExposing"; + +import { TourChildrenMap, TourPropertyView } from "./tourPropertyView"; +import { Tour, TourProps } from "antd"; +import React, { useContext } from "react"; +import { EditorContext } from "comps/editorState"; +import { GridItemComp } from "comps/comps/gridItemComp"; +import { HookComp } from "comps/hooks/hookComp"; +import { TemporaryStateItemComp } from "comps/comps/temporaryStateComp"; + +/** + * This component builds the Property Panel and the fake 'UI' for the Tour component + */ +let TourBasicComp = (function() { + const childrenMap = { + ...TourChildrenMap, + defaultValue: stringExposingStateControl("defaultValue"), + value: stringExposingStateControl("value") + // style: styleControl(SelectStyle), + }; + return new UICompBuilder(childrenMap, (props, dispatch) => { + const editorState = useContext(EditorContext); + const compMap: (GridItemComp | HookComp | InstanceType)[] = Object.values(editorState.getAllUICompMap()); + + const steps: TourProps["steps"] = props.options.map((step) => { + const targetName = step.target; + let target = undefined; + const compListItem = compMap.find((compItem) => compItem.children.name.getView() === targetName); + if (compListItem) { + // console.log(`setting selected comp to ${compListItem}`); + try { + target = ((compListItem as MultiBaseComp).children.comp as GridItemComp).getRef?.(); + } catch (e) { + target = ((compListItem as MultiBaseComp).children.comp as HookComp).getRef?.(); + } + } + + return { + /** + * I'm pretty sure it's safe to use dangerouslySetInnerHTML here as any creator of an app + * will have unrestricted access to the data of any user anyway. E.g. have a button that + * just sends the current cookies wherever, thus the developer of the app must be trusted + * in all cases + * This even applies to things like , because the + * app creator might desire functionality like this. + */ + title: (
), + description: (
), + target: target?.current, + arrow: step.arrow, + placement: step.placement === "" ? undefined : step.placement, + mask: step.mask, + cover: step.cover ? () : undefined, + type: step.type === "" ? undefined : step.type, + }; + }); + + return ( + props.open.onChange(false)} + // indicatorsRender={(current, total) => props.indicatorsRender(current, total)} // todo enable later + disabledInteraction={props.disabledInteraction} + arrow={props.arrow} + placement={props.placement === "" ? undefined : props.placement} + type={props.type === "" ? undefined : props.type} + mask={props.mask} + /> + ); + }) + .setPropertyViewFn((children) => ) + .build(); +})(); + +export const TourComp = withMethodExposing(TourBasicComp, [ + { + method: { + name: "startTour", + description: "Triggers the tour to start", + params: [] + }, + execute: (comp, values) => { + comp.children.open.getView().onChange(true); + } + } +]); diff --git a/client/packages/lowcoder/src/comps/comps/tourComp/tourControlConstants.tsx b/client/packages/lowcoder/src/comps/comps/tourComp/tourControlConstants.tsx new file mode 100644 index 000000000..418e44c5e --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/tourComp/tourControlConstants.tsx @@ -0,0 +1,27 @@ +export type PlacementType = 'left' | 'leftTop' | 'leftBottom' | 'right' | 'rightTop' | 'rightBottom' | 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'center' | ''; +export type TourStepType = 'default' | 'primary' | ''; + +export const PlacementOptions: {label: string, value: PlacementType}[] = [ + { label: "​", value: ""}, + { label: "Center", value: "center"}, + { label: "Left", value: "left"}, + { label: "Left Top", value: "leftTop"}, + { label: "Left Bottom", value: "leftBottom"}, + { label: "Right", value: "right"}, + { label: "Right Top", value: "rightTop"}, + { label: "Right Bottom", value: "rightBottom"}, + { label: "Top", value: "top"}, + { label: "Top Left", value: "topLeft"}, + { label: "Top Right", value: "topRight"}, + { label: "Bottom", value: "bottom"}, + { label: "Bottom Left", value: "bottomLeft"}, + { label: "Bottom Right", value: "bottomRight"}, +]; + +export const TypeOptions: {label: string, value: TourStepType}[] = [ + { label: "​", value: ""}, + { label: "Default", value: "default"}, + { label: "Primary", value: "primary"}, +]; + +export {}; \ No newline at end of file diff --git a/client/packages/lowcoder/src/comps/comps/tourComp/tourPropertyView.tsx b/client/packages/lowcoder/src/comps/comps/tourComp/tourPropertyView.tsx new file mode 100644 index 000000000..c99a24984 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/tourComp/tourPropertyView.tsx @@ -0,0 +1,85 @@ +import { RecordConstructorToComp } from "lowcoder-core"; +import { BoolControl } from "../../controls/boolControl"; +import { ArrowControl, BoolCodeControl, MaskControl } from "../../controls/codeControl"; +import { Section } from "lowcoder-design"; + +import { TourStepControl } from "@lowcoder-ee/comps/controls/tourStepControl"; +import { booleanExposingStateControl } from "comps/controls/codeStateControl"; +import { dropdownControl } from "comps/controls/dropdownControl"; + +// Falk TODO: Check Imports +// import { TourStepControl } from "comps/controls/tourStepControl"; +// import { booleanExposingStateControl } from "comps/controls/codeStateControl"; +// import { dropdownControl } from "comps/controls/dropdownControl"; + +import { trans } from "i18n"; +import { PlacementOptions, TypeOptions } from "./tourControlConstants"; +import { + TourArrowTooltip, + TourMaskTooltip, + TourPlacementTooltip +} from "@lowcoder-ee/comps/comps/tourComp/tourTooltips"; + +export const TourChildrenMap = { + open: booleanExposingStateControl("open"), + options: TourStepControl, + // indicatorsRender: AlkjdfControl, // todo get this working later + disabledInteraction: BoolControl, + mask: MaskControl, + placement: dropdownControl(PlacementOptions, "bottom"), + arrow: ArrowControl, + type: dropdownControl(TypeOptions, "default"), +}; + +export const TourPropertyView = ( + children: RecordConstructorToComp< + typeof TourChildrenMap & { + hidden: typeof BoolCodeControl; + } + > //& { + // style: { getPropertyView: () => ControlNode }; + // } +) => ( + <> +
+ {children.options.propertyView({})} +
+ +
+ {/*{children.indicatorsRender.propertyView({*/} + {/* label: trans("tour.indicatorsRender.label"),*/} + {/* tooltip: IndicatorsRenderTooltip,*/} + {/*})}*/} + {children.disabledInteraction.propertyView({ + label: trans("tour.disabledInteraction.label"), + tooltip: trans("tour.disabledInteraction.tooltip") + })} + {children.mask.propertyView({ + label: trans("tour.mask.label"), + tooltip: TourMaskTooltip, + })} + {children.placement.propertyView({ + label: trans("tour.placement.label"), + tooltip: TourPlacementTooltip, + radioButton: false + })} + {children.arrow.propertyView({ + label: trans("tour.arrow.label"), + tooltip: TourArrowTooltip, + })} + {children.type.propertyView({ + label: trans("tour.type.label"), + tooltip: trans("tour.type.tooltip") + })} +
+ + {/*{["layout", "both"].includes(*/} + {/* useContext(EditorContext).editorModeStatus*/} + {/*) && (*/} + {/*
*/} + {/* {children.style.getPropertyView()}*/} + {/*
*/} + {/*)}*/} + +); + diff --git a/client/packages/lowcoder/src/comps/comps/tourComp/tourTooltips.tsx b/client/packages/lowcoder/src/comps/comps/tourComp/tourTooltips.tsx new file mode 100644 index 000000000..70f386cf8 --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/tourComp/tourTooltips.tsx @@ -0,0 +1,121 @@ +import { trans } from "i18n"; + +const indicatorsRenderExample = `(current, total) => ( + + {current + 1} / {total} + +)`; +export const IndicatorsRenderTooltip = ( +
+ {trans("tour.indicatorsRender.tooltip")} +
+
+ {trans("tour.indicatorsRender.tooltipValidTypes")} +
+
+

{trans("tour.tooltipSignatureHeader")}

+ + {trans("tour.indicatorsRender.tooltipFunctionSignature")} + +
+
+

{trans("tour.tooltipExampleHeader")}

+ + {indicatorsRenderExample} + +
+); + +let styleExample = { + "style": { "boxShadow": "inset 0 0 15px #fff" }, + "color": "rgba(40, 0, 255, .4)" +}; + +export const TourStepMaskTooltip = ( +
+ {trans("tour.options.mask.tooltip")} +
+
+ {trans("tour.options.mask.tooltipValidTypes")} +
+
+

Example:

+ + {JSON.stringify(styleExample, null, 1)} + +
+); + +export const TourMaskTooltip = ( +
+ {trans("tour.mask.tooltip")} +
+
+ {trans("tour.mask.tooltipValidTypes")} +
+
+

Example:

+ + {JSON.stringify(styleExample, null, 1)} + +
+); + +export const TourPlacementTooltip = ( +
+ {trans("tour.placement.tooltip")} +
+
+

{trans("tour.placement.tooltipValidOptions")}

+
{trans("tour.placement.tooltipValidOptionsAbove")}
+
    +
  • topLeft
  • +
  • top
  • +
  • topRight
  • +
+
{trans("tour.placement.tooltipValidOptionsLeft")}
+
    +
  • leftTop
  • +
  • left
  • +
  • leftBottom
  • +
+
{trans("tour.placement.tooltipValidOptionsRight")}
+
    +
  • rightTop
  • +
  • right
  • +
  • rightBottom
  • +
+
{trans("tour.placement.tooltipValidOptionsBelow")}
+
    +
  • bottomLeft
  • +
  • bottom
  • +
  • bottomRight
  • +
+
{trans("tour.placement.tooltipValidOptionsOnTop")}
+
    +
  • center
  • +
+
+); + +const arrowTooltipSignature = `boolean | { pointAtCenter: boolean }`; +export const TourStepArrowTooltip = ( +
+ {trans("tour.options.arrow.tooltip")} +
+
+

{trans("tour.tooltipSignatureHeader")}

+ {arrowTooltipSignature} +
+); +export const TourArrowTooltip = ( +
+ {trans("tour.arrow.tooltip")} +
+
+

{trans("tour.tooltipSignatureHeader")}

+ {arrowTooltipSignature} +
+); + +export {}; \ No newline at end of file diff --git a/client/packages/lowcoder/src/comps/comps/transferComp.tsx b/client/packages/lowcoder/src/comps/comps/transferComp.tsx new file mode 100644 index 000000000..1edaff06e --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/transferComp.tsx @@ -0,0 +1,195 @@ +import { CompAction, RecordConstructorToView, changeChildAction } from "lowcoder-core"; +import { BoolControl } from "comps/controls/boolControl"; +import { arrayObjectExposingStateControl, arrayStringExposingStateControl } from "comps/controls/codeStateControl"; +import { styleControl } from "comps/controls/styleControl"; +import { TransferStyle, TransferStyleType, heightCalculator, widthCalculator } from "comps/controls/styleControlConstants"; +import { UICompBuilder } from "comps/generators/uiCompBuilder"; +import { NameConfig, NameConfigHidden, withExposingConfigs } from "comps/generators/withExposing"; +import { Section, sectionNames } from "lowcoder-design"; +import { hiddenPropertyView } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { NumberControl, StringControl } from "comps/controls/codeControl"; +import { Transfer } from "antd"; +import ReactResizeDetector from "react-resize-detector"; +import { changeEvent, eventHandlerControl, searchEvent, selectedChangeEvent } from "../controls/eventHandlerControl"; +import styled, { css } from "styled-components"; +import { useEffect, useRef, useState } from "react"; +import { valueComp, withDefault } from "../generators"; +import type { TransferDirection } from 'antd/es/transfer'; +import { _ } from "core-js"; + + +const Container = styled.div<{ $style: TransferStyleType }>` + height: 100%; + width: 100%; + ${(props) => props.$style && getStyle(props.$style)} +`; + +const getStyle = (style: TransferStyleType) => { + return css` + margin: ${style.margin}; + padding: ${style.padding}; + border-style: ${style.borderStyle}; + border-width: ${style.borderWidth}; + border-color: ${style.border}; + background: ${style.background}; + border-radius: ${style.radius}; + max-width: ${widthCalculator(style.margin)}; + max-height: ${heightCalculator(style.margin)}; + `; +}; + +interface RecordType { + key: string; + title: string; + description?: string; +} +const defaultItems = [ + { key: '1', title: trans('transfer.content', { i: 1 }) }, + { key: '2', title: trans('transfer.content', { i: 2 }) }, + { key: '3', title: trans('transfer.content', { i: 3 }) }, + { key: '4', title: trans('transfer.content', { i: 4 }) }, + { key: '5', title: trans('transfer.content', { i: 5 }) }, + { key: '6', title: trans('transfer.content', { i: 6 }) }, + { key: '7', title: trans('transfer.content', { i: 7 }) }, +] as const + +const EventOptions = [changeEvent, searchEvent, selectedChangeEvent] as const; + +const childrenMap = { + style: styleControl(TransferStyle), + onEvent: eventHandlerControl(EventOptions), + sourceTitle: withDefault(StringControl, trans('transfer.sourceTitle')), + targetTitle: withDefault(StringControl, trans('transfer.targetTitle')), + oneWay: BoolControl, + pagination: BoolControl, + showSearch: BoolControl.DEFAULT_TRUE, + pageSize: withDefault(NumberControl, 10), + items: arrayObjectExposingStateControl('items', defaultItems as any), + targetKeys: arrayStringExposingStateControl('targetKeys', []), + selectedKeys: valueComp([[], []]), + targerObject: valueComp([]), + searchInfo: valueComp(['', '']), +}; + +const TransferView = (props: RecordConstructorToView & { + dispatch: (action: CompAction) => void; +}) => { + const conRef = useRef(null); + const [width, setWidth] = useState(0); + const [height, setHeight] = useState(0); + const [selectedKeys, setSelectedKeys] = useState([]); + + useEffect(() => { + if (height && width) { + onResize(); + } + }, [height, width]); + + const handleChange = (newTargetKeys: string[]) => { + props.targetKeys.onChange(newTargetKeys); + props.dispatch(changeChildAction("targerObject", Array.isArray(props.items.value) ? props.items.value.filter(item => newTargetKeys.includes(item.key as string)) : [], false)); + props.onEvent('change') + }; + + const onSelectChange = (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => { + setSelectedKeys([...sourceSelectedKeys, ...targetSelectedKeys]); + props.dispatch(changeChildAction("selectedKeys", [sourceSelectedKeys, targetSelectedKeys], false)); + props.onEvent('selectedChange') + }; + + const handleSearch = (dir: TransferDirection, value: string) => { + props.dispatch(changeChildAction("searchInfo", [dir, value], false)); + props.onEvent('search') + }; + + const onResize = () => { + const container = conRef.current; + setWidth(container?.clientWidth ?? 0); + setHeight(container?.clientHeight ?? 0); + }; + + return ( + + + item.title} + oneWay={props.oneWay} + onSearch={handleSearch} + pagination={props.pagination ? { + pageSize: props.pageSize || 10, + } : false} + /> + + + ); +}; + +let TransferBasicComp = (function () { + return new UICompBuilder(childrenMap, (props, dispatch) => ) + .setPropertyViewFn((children) => ( + <> +
+ {children.items.propertyView({ + label: trans("transfer.items"), + })} + {children.targetKeys.propertyView({ + label: trans("transfer.targetKeys"), + })} + {children.sourceTitle.propertyView({ + label: trans("transfer.sourceTitle"), + })} + {children.targetTitle.propertyView({ + label: trans("transfer.targetTitle"), + })} + {children.showSearch.propertyView({ + label: trans("transfer.allowSearch"), + })} + {children.oneWay.propertyView({ + label: trans("transfer.oneWay"), + })} + {children.pagination.propertyView({ + label: trans("transfer.pagination"), + })} + {children.pagination.getView() && children.pageSize.propertyView({ + label: trans("transfer.pageSize"), + })} +
+
+ {children.onEvent.propertyView()} + {hiddenPropertyView(children)} +
+
{children.style.getPropertyView()}
+ + )) + .build(); +})(); + +TransferBasicComp = class extends TransferBasicComp { + override autoHeight(): boolean { + return false; + } +}; + +export const transferComp = withExposingConfigs(TransferBasicComp, [ + new NameConfig("items", trans("transfer.items")), + new NameConfig("targetKeys", trans("transfer.targetKeys")), + new NameConfig("targerObject", trans("transfer.targerObject")), + new NameConfig("selectedKeys", trans("transfer.selectedKeys")), + new NameConfig("searchInfo", trans("transfer.searchInfo")), + NameConfigHidden, +]); diff --git a/client/packages/lowcoder/src/comps/comps/treeComp/treeComp.tsx b/client/packages/lowcoder/src/comps/comps/treeComp/treeComp.tsx index 6474efa9b..d6063652f 100644 --- a/client/packages/lowcoder/src/comps/comps/treeComp/treeComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/treeComp/treeComp.tsx @@ -7,7 +7,7 @@ import { useEffect, useState } from "react"; import styled from "styled-components"; import ReactResizeDetector from "react-resize-detector"; import { StyleConfigType, styleControl } from "comps/controls/styleControl"; -import { TreeStyle } from "comps/controls/styleControlConstants"; +import { InputFieldStyle, LabelStyle, TreeStyle } from "comps/controls/styleControlConstants"; import { LabelControl } from "comps/controls/labelControl"; import { withDefault } from "comps/generators"; import { dropdownControl } from "comps/controls/dropdownControl"; @@ -76,11 +76,13 @@ const childrenMap = { label: withDefault(LabelControl, { position: "column" }), // TODO: more event onEvent: SelectEventHandlerControl, - style: styleControl(TreeStyle), + style: styleControl(InputFieldStyle), + labelStyle: styleControl(LabelStyle.filter((style) => ['accent', 'validate'].includes(style.name) === false)), + inputFieldStyle:styleControl(TreeStyle) }; const TreeCompView = (props: RecordConstructorToView) => { - const { treeData, selectType, value, expanded, checkStrictly, style } = props; + const { treeData, selectType, value, expanded, checkStrictly, style, labelStyle } = props; const [height, setHeight] = useState(); const selectable = selectType === "single" || selectType === "multi"; const checkable = selectType === "check"; @@ -95,47 +97,53 @@ const TreeCompView = (props: RecordConstructorToView) => { return props.label({ required: props.required, ...selectInputValidate(props), - style: style, + style, + labelStyle, + inputFieldStyle:props.inputFieldStyle, children: ( - setHeight(h)}> - - { - value.onChange(keys as (string | number)[]); - props.onEvent("change"); - }} - onCheck={(keys) => { - value.onChange(Array.isArray(keys) ? keys as (string | number)[] : keys.checked as (string | number)[]); - props.onEvent("change"); - }} - onExpand={(keys) => { - expanded.onChange(keys as (string | number)[]); - }} - onFocus={() => props.onEvent("focus")} - onBlur={() => props.onEvent("blur")} - /> + setHeight(h)} + render={() => ( + + { + value.onChange(keys as (string | number)[]); + props.onEvent("change"); + }} + onCheck={(keys) => { + value.onChange(Array.isArray(keys) ? keys as (string | number)[] : keys.checked as (string | number)[]); + props.onEvent("change"); + }} + onExpand={(keys) => { + expanded.onChange(keys as (string | number)[]); + }} + onFocus={() => props.onEvent("focus")} + onBlur={() => props.onEvent("blur")} + /> + )} + > ), }); @@ -166,7 +174,7 @@ let TreeBasicComp = (function () { )} - + {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && (
{children.expanded.propertyView({ label: trans("tree.expanded") })} @@ -176,10 +184,14 @@ let TreeBasicComp = (function () {
)} - {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( children.label.getPropertyView() )} + {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && (children.label.getPropertyView())} {["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && ( -
{children.style.getPropertyView()}
+ <> +
{children.style.getPropertyView()}
+
{children.labelStyle.getPropertyView()}
+
{children.inputFieldStyle.getPropertyView()}
+ )} )) diff --git a/client/packages/lowcoder/src/comps/comps/treeComp/treeSelectComp.tsx b/client/packages/lowcoder/src/comps/comps/treeComp/treeSelectComp.tsx index ea31712a3..0b9f6d3da 100644 --- a/client/packages/lowcoder/src/comps/comps/treeComp/treeSelectComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/treeComp/treeSelectComp.tsx @@ -6,7 +6,7 @@ import { default as TreeSelect } from "antd/es/tree-select"; import { useEffect } from "react"; import styled from "styled-components"; import { styleControl } from "comps/controls/styleControl"; -import { TreeSelectStyle, TreeSelectStyleType } from "comps/controls/styleControlConstants"; +import { InputFieldStyle, LabelStyle, TreeSelectStyle, TreeSelectStyleType } from "comps/controls/styleControlConstants"; import { LabelControl } from "comps/controls/labelControl"; import { dropdownControl } from "comps/controls/dropdownControl"; import { @@ -65,7 +65,9 @@ const childrenMap = { allowClear: BoolControl, showSearch: BoolControl.DEFAULT_TRUE, inputValue: stateComp(""), // search value - style: styleControl(TreeSelectStyle), + style: withDefault(styleControl(InputFieldStyle), {borderWidth: '1px'}), + labelStyle:styleControl(LabelStyle), + inputFieldStyle: withDefault(styleControl(TreeSelectStyle), {borderWidth: '1px'}), viewRef: RefControl, }; @@ -83,7 +85,7 @@ function getCheckedStrategy(v: ValueFromOption) { const TreeCompView = ( props: RecordConstructorToView & { dispatch: DispatchType } ) => { - const { treeData, selectType, value, expanded, style, inputValue } = props; + const { treeData, selectType, value, expanded, style,labelStyle, inputValue } = props; const isSingle = selectType === "single"; const [ validateState, @@ -99,12 +101,14 @@ const TreeCompView = ( return props.label({ required: props.required, ...validateState, - style: style, + style, + labelStyle, + inputFieldStyle:props.inputFieldStyle, children: (
{children.style.getPropertyView()}
+
{children.labelStyle.getPropertyView()}
+
{children.inputFieldStyle.getPropertyView()}
+ )} - - - )) .setExposeMethodConfigs(baseSelectRefMethods) diff --git a/client/packages/lowcoder/src/comps/comps/triContainerComp/triContainer.tsx b/client/packages/lowcoder/src/comps/comps/triContainerComp/triContainer.tsx index 1becd89e0..b4adf54c7 100644 --- a/client/packages/lowcoder/src/comps/comps/triContainerComp/triContainer.tsx +++ b/client/packages/lowcoder/src/comps/comps/triContainerComp/triContainer.tsx @@ -16,7 +16,7 @@ const getStyle = (style: ContainerStyleType) => { overflow: hidden; padding: ${style.padding}; ${style.background && `background-color: ${style.background};`} - ${style.backgroundImage && `background-image: ${style.backgroundImage};`} + ${style.backgroundImage && `background-image: url(${style.backgroundImage});`} ${style.backgroundImageRepeat && `background-repeat: ${style.backgroundImageRepeat};`} ${style.backgroundImageSize && `background-size: ${style.backgroundImageSize};`} ${style.backgroundImagePosition && `background-position: ${style.backgroundImagePosition};`} @@ -35,20 +35,10 @@ const Wrapper = styled.div<{ $style: ContainerStyleType }>` const HeaderInnerGrid = styled(InnerGrid)<{ $backgroundColor: string - $headerBackgroundImage: string; - $headerBackgroundImageRepeat: string; - $headerBackgroundImageSize: string; - $headerBackgroundImagePosition: string; - $headerBackgroundImageOrigin: string; }>` overflow: visible; ${(props) => props.$backgroundColor && `background-color: ${props.$backgroundColor};`} border-radius: 0; - ${(props) => props.$headerBackgroundImage && `background-image: ${props.$headerBackgroundImage};`} - ${(props) => props.$headerBackgroundImageRepeat && `background-repeat: ${props.$headerBackgroundImageRepeat};`} - ${(props) => props.$headerBackgroundImageSize && `background-size: ${props.$headerBackgroundImageSize};`} - ${(props) => props.$headerBackgroundImagePosition && `background-position: ${props.$headerBackgroundImagePosition};`} - ${(props) => props.$headerBackgroundImageOrigin && `background-origin: ${props.$headerBackgroundImageOrigin};`} `; const BodyInnerGrid = styled(InnerGrid)<{ @@ -56,21 +46,11 @@ const BodyInnerGrid = styled(InnerGrid)<{ $backgroundColor: string; $borderColor: string; $borderWidth: string; - $backgroundImage: string; - $backgroundImageRepeat: string; - $backgroundImageSize: string; - $backgroundImagePosition: string; - $backgroundImageOrigin: string; }>` border-top: ${(props) => `${props.$showBorder ? props.$borderWidth : 0} solid ${props.$borderColor}`}; flex: 1; ${(props) => props.$backgroundColor && `background-color: ${props.$backgroundColor};`} border-radius: 0; - ${(props) => props.$backgroundImage && `background-image: ${props.$backgroundImage};`} - ${(props) => props.$backgroundImageRepeat && `background-repeat: ${props.$backgroundImageRepeat};`} - ${(props) => props.$backgroundImageSize && `background-size: ${props.$backgroundImageSize};`} - ${(props) => props.$backgroundImagePosition && `background-position: ${props.$backgroundImagePosition};`} - ${(props) => props.$backgroundImageOrigin && `background-origin: ${props.$backgroundImageOrigin};`} `; const FooterInnerGrid = styled(InnerGrid)<{ @@ -88,7 +68,7 @@ const FooterInnerGrid = styled(InnerGrid)<{ overflow: visible; ${(props) => props.$backgroundColor && `background-color: ${props.$backgroundColor};`} border-radius: 0; - ${(props) => props.$footerBackgroundImage && `background-image: ${props.$footerBackgroundImage};`} + ${(props) => props.$footerBackgroundImage && `background-image: url(${props.$footerBackgroundImage});`} ${(props) => props.$footerBackgroundImageRepeat && `background-repeat: ${props.$footerBackgroundImageRepeat};`} ${(props) => props.$footerBackgroundImageSize && `background-size: ${props.$footerBackgroundImageSize};`} ${(props) => props.$footerBackgroundImagePosition && `background-position: ${props.$footerBackgroundImagePosition};`} @@ -135,11 +115,6 @@ export function TriContainer(props: TriContainerProps) { containerPadding={[paddingWidth, 3]} showName={{ bottom: showBody || showFooter ? 20 : 0 }} $backgroundColor={headerStyle?.headerBackground || 'transparent'} - $headerBackgroundImage={headerStyle?.headerBackgroundImage} - $headerBackgroundImageRepeat={headerStyle?.headerBackgroundImageRepeat} - $headerBackgroundImageSize={headerStyle?.headerBackgroundImageSize} - $headerBackgroundImagePosition={headerStyle?.headerBackgroundImagePosition} - $headerBackgroundImageOrigin={headerStyle?.headerBackgroundImageOrigin} style={{padding: headerStyle.containerHeaderPadding}} /> @@ -162,11 +137,6 @@ export function TriContainer(props: TriContainerProps) { $backgroundColor={bodyStyle?.background || 'transparent'} $borderColor={style?.border} $borderWidth={style?.borderWidth} - $backgroundImage={bodyStyle?.backgroundImage} - $backgroundImageRepeat={bodyStyle?.backgroundImageRepeat} - $backgroundImageSize={bodyStyle?.backgroundImageSize} - $backgroundImagePosition={bodyStyle?.backgroundImagePosition} - $backgroundImageOrigin={bodyStyle?.backgroundImageOrigin} style={{padding: bodyStyle.containerBodyPadding}} /> diff --git a/client/packages/lowcoder/src/comps/comps/triContainerComp/triContainerComp.tsx b/client/packages/lowcoder/src/comps/comps/triContainerComp/triContainerComp.tsx index 61a64da16..b93e018b4 100644 --- a/client/packages/lowcoder/src/comps/comps/triContainerComp/triContainerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/triContainerComp/triContainerComp.tsx @@ -40,7 +40,7 @@ const childrenMap = { showFooter: BoolControl, autoHeight: AutoHeightControl, scrollbars: withDefault(BoolControl, false), - style: styleControl(ContainerStyle), + style: withDefault(styleControl(ContainerStyle),{borderWidth:'1px'}), headerStyle: styleControl(ContainerHeaderStyle), bodyStyle: styleControl(ContainerBodyStyle), footerStyle: styleControl(ContainerFooterStyle), diff --git a/client/packages/lowcoder/src/comps/comps/triContainerComp/triFloatTextContainer.tsx b/client/packages/lowcoder/src/comps/comps/triContainerComp/triFloatTextContainer.tsx new file mode 100644 index 000000000..e57a11dbf --- /dev/null +++ b/client/packages/lowcoder/src/comps/comps/triContainerComp/triFloatTextContainer.tsx @@ -0,0 +1,256 @@ +import { + TextStyleType, + ContainerStyleType, + heightCalculator, + widthCalculator, +} from "comps/controls/styleControlConstants"; +import { EditorContext } from "comps/editorState"; +import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; +import { HintPlaceHolder, TacoMarkDown } from "lowcoder-design"; +import { ReactNode, useContext } from "react"; +import styled, { css } from "styled-components"; +import { checkIsMobile } from "util/commonUtils"; +import { + gridItemCompToGridItems, + InnerGrid, +} from "../containerComp/containerView"; +import { TriContainerViewProps } from "../triContainerComp/triContainerCompBuilder"; + +const getStyle = (style: TextStyleType) => { + return css` + border-radius: ${(style.radius ? style.radius : "4px")}; + border: ${(style.borderWidth ? style.borderWidth : "0px")} solid ${style.border}; + color: ${style.text}; + font-size: ${style.textSize} !important; + font-weight: ${style.textWeight} !important; + font-family: ${style.fontFamily} !important; + font-style:${style.fontStyle} !important; + text-transform:${style.textTransform} !important; + text-decoration:${style.textDecoration} !important; + background-color: ${style.background}; + .markdown-body a { + color: ${style.links}; + } + .markdown-body { + margin: ${style.margin} !important; + padding: ${style.padding}; + width: ${widthCalculator(style.margin)}; + // height: ${heightCalculator(style.margin)}; + h1 { + line-height: 1.5; + } + h5 { + line-height: 2.2; + } + } + + .markdown-body { + &, + p, + div, + h1, + h2, + h3, + h4, + h5, + h6 { + color: ${style.text}; + } + img, + pre { + background-color: ${style.background}; + code { + color: #000000; + } + } + } + `; + } + +const Wrapper = styled.div<{ $style: ContainerStyleType }>` + display: flex; + flex-flow: column; + height: 100%; + border: ${(props) => props.$style.borderWidth} solid ${(props) => props.$style.border}; + border-radius: ${(props) => props.$style.radius}; + background-color: ${(props) => props.$style.background}; + padding: ${(props) => props.$style.padding}; + margin: ${(props) => props.$style.margin}; + ${(props) => props.$style.backgroundImage && `background-image: url(${props.$style.backgroundImage});`} + ${(props) => props.$style.backgroundImageRepeat && `background-repeat: ${props.$style.backgroundImageRepeat};`} + ${(props) => props.$style.backgroundImageSize && `background-size: ${props.$style.backgroundImageSize};`} + ${(props) => props.$style.backgroundImagePosition && `background-position: ${props.$style.backgroundImagePosition};`} + ${(props) => props.$style.backgroundImageOrigin && `background-origin: ${props.$style.backgroundImageOrigin};`} +`; + +const FloatTextWrapper = styled.div<{ $style: TextStyleType, $horizontalAlignment : any }>` + ${(props) => props.$style && getStyle(props.$style)} + text-align: ${(props) => props.$horizontalAlignment}; + padding: ${(props) => props.$style.padding}; + margin: ${(props) => props.$style.margin}; +`; + +const HeaderInnerGrid = styled(InnerGrid)<{ + $backgroundColor: string + }>` + overflow: visible; + ${(props) => props.$backgroundColor && `background-color: ${props.$backgroundColor};`} + border-radius: 0; +`; + +const BodyInnerGrid = styled(InnerGrid)<{ + $showBorder: boolean; + $backgroundColor: string; + $borderColor: string; + $borderWidth: string; +}>` + border-top: ${(props) => `${props.$showBorder ? props.$borderWidth : 0} solid ${props.$borderColor}`}; + flex: 1; + ${(props) => props.$backgroundColor && `background-color: ${props.$backgroundColor};`} + border-radius: 0; +`; + +const FooterInnerGrid = styled(InnerGrid)<{ + $showBorder: boolean; + $backgroundColor: string; + $borderColor: string; + $borderWidth: string; + $footerBackgroundImage: string; + $footerBackgroundImageRepeat: string; + $footerBackgroundImageSize: string; + $footerBackgroundImagePosition: string; + $footerBackgroundImageOrigin: string; +}>` + border-top: ${(props) => `${props.$showBorder ? props.$borderWidth : 0} solid ${props.$borderColor}`}; + overflow: visible; + ${(props) => props.$backgroundColor && `background-color: ${props.$backgroundColor};`} + border-radius: 0; + ${(props) => props.$footerBackgroundImage && `background-image: url(${props.$footerBackgroundImage});`} + ${(props) => props.$footerBackgroundImageRepeat && `background-repeat: ${props.$footerBackgroundImageRepeat};`} + ${(props) => props.$footerBackgroundImageSize && `background-size: ${props.$footerBackgroundImageSize};`} + ${(props) => props.$footerBackgroundImagePosition && `background-position: ${props.$footerBackgroundImagePosition};`} + ${(props) => props.$footerBackgroundImageOrigin && `background-origin: ${props.$footerBackgroundImageOrigin};`} +`; + +export type TriContainerProps = TriContainerViewProps & { + hintPlaceholder?: ReactNode; + text: { + value: string; + }; + type: string; + float: string; + width: string; + style: TextStyleType; + horizontalAlignment: string; +}; + +export function TriContainer(props: TriContainerProps) { + const { container, text } = props; + const { showHeader, showFooter } = container; + // When the header and footer are not displayed, the body must be displayed + const showBody = container.showBody || (!showHeader && !showFooter); + + const { items: headerItems, ...otherHeaderProps } = container.header; + const { items: bodyItems, ...otherBodyProps } = + container.body["0"].children.view.getView(); + const { items: footerItems, ...otherFooterProps } = container.footer; + + const editorState = useContext(EditorContext); + const maxWidth = editorState.getAppSettings().maxWidth; + const isMobile = checkIsMobile(maxWidth); + const paddingWidth = isMobile ? 7 : 19; + + const { + style, + headerStyle, + bodyStyle, + footerStyle, + } = container; + + return ( + + {showHeader && ( + + + + )} + {showBody && ( + +
+ + +

+ {props.type === "markdown" ? ( + {text.value} + ) : ( + text.value + )} +

+
+
+
+ )} + {showFooter && ( + + + + )} +
+ ); +} diff --git a/client/packages/lowcoder/src/comps/controls/actionSelector/executeCompAction.tsx b/client/packages/lowcoder/src/comps/controls/actionSelector/executeCompAction.tsx index a14adb207..1023a9a69 100644 --- a/client/packages/lowcoder/src/comps/controls/actionSelector/executeCompAction.tsx +++ b/client/packages/lowcoder/src/comps/controls/actionSelector/executeCompAction.tsx @@ -1,5 +1,4 @@ -import { customAction, routeByNameAction } from "lowcoder-core"; -import { CompParams, ConstructorToDataType } from "lowcoder-core"; +import { CompParams, ConstructorToDataType, customAction, routeByNameAction } from "lowcoder-core"; import { GridItemComp } from "comps/comps/gridItemComp"; import { SimpleNameComp } from "comps/comps/simpleNameComp"; import { TemporaryStateItemComp } from "comps/comps/temporaryStateComp"; @@ -13,10 +12,12 @@ import { mapValues } from "lodash"; import { Fragment, ReactNode } from "react"; import { getPromiseAfterDispatch } from "util/promiseUtils"; import { + ArrayNumberControl, ArrayStringControl, ArrayStringOrNumberControl, BoolCodeControl, CodeControlType, + JSONObjectArrayControl, JSONObjectControl, JSONValueControl, NumberControl, @@ -30,7 +31,9 @@ const ParamsCompMap: Record = { string: StringControl, boolean: BoolCodeControl, arrayString: ArrayStringControl, + arrayObject: JSONObjectArrayControl, arrayNumberString: ArrayStringOrNumberControl, + arrayNumber: ArrayNumberControl, JSON: JSONObjectControl, JSONValue: JSONValueControl, }; diff --git a/client/packages/lowcoder/src/comps/controls/actionSelector/executeCompTypes.tsx b/client/packages/lowcoder/src/comps/controls/actionSelector/executeCompTypes.tsx index 9906a864a..7d59c7c42 100644 --- a/client/packages/lowcoder/src/comps/controls/actionSelector/executeCompTypes.tsx +++ b/client/packages/lowcoder/src/comps/controls/actionSelector/executeCompTypes.tsx @@ -9,7 +9,9 @@ export type ParamType = | "boolean" | "arrayString" | "arrayNumberString" + | "arrayNumber" | "JSON" + | "arrayObject" | "JSONValue"; export type ParamConfig = { diff --git a/client/packages/lowcoder/src/comps/controls/actionSelector/messageAction.tsx b/client/packages/lowcoder/src/comps/controls/actionSelector/messageAction.tsx index 46ecbfc35..fc1c02912 100644 --- a/client/packages/lowcoder/src/comps/controls/actionSelector/messageAction.tsx +++ b/client/packages/lowcoder/src/comps/controls/actionSelector/messageAction.tsx @@ -4,7 +4,7 @@ import { MultiCompBuilder } from "comps/generators/multi"; import { BranchDiv } from "lowcoder-design"; import { trans } from "i18n"; import { millisecondsControl } from "../millisecondControl"; -import { messageInstance } from "lowcoder-design"; +import { messageInstance } from "lowcoder-design/src/components/GlobalInstances"; const childrenMap = { text: StringControl, diff --git a/client/packages/lowcoder/src/comps/controls/codeControl.tsx b/client/packages/lowcoder/src/comps/controls/codeControl.tsx index c423e836f..506da2543 100644 --- a/client/packages/lowcoder/src/comps/controls/codeControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/codeControl.tsx @@ -1,13 +1,13 @@ -import { EditorState } from "@codemirror/state"; +import type { EditorState } from "@codemirror/state"; import { isThemeColorKey } from "api/commonSettingApi"; -import { CodeEditor } from "base/codeEditor"; -import { Language } from "base/codeEditor/codeEditorTypes"; +import type { Language } from "base/codeEditor/codeEditorTypes"; import { EditorContext } from "comps/editorState"; import { withDefault } from "comps/generators/simpleGenerators"; import { CompExposingContext } from "comps/generators/withContext"; import { exposingDataForAutoComplete } from "comps/utils/exposingTypes"; import { trans } from "i18n"; import _ from "lodash"; +import { debounce, trimStart } from "lodash"; import { AbstractComp, changeDependName, @@ -31,11 +31,11 @@ import { toHex, wrapperToControlItem, } from "lowcoder-design"; -import { ReactNode } from "react"; +import { CSSProperties, lazy, ReactNode, Suspense } from "react"; import { showTransform, toArrayJSONObject, - toBoolean, + toBoolean, toBooleanOrCss, toBooleanOrJsonObject, toJSONArray, toJSONObject, toJSONObjectArray, @@ -55,6 +55,11 @@ import { setFieldsNoTypeCheck, shallowEqual, toType } from "util/objectUtils"; import { toReadableString } from "util/stringUtils"; import { ControlLayout, ControlParams } from "./controlParams"; +const CodeEditor = lazy( + () => import("base/codeEditor/codeEditor") + .then(module => ({default: module.CodeEditor})) +) + interface CodeControlParams extends CodeNodeOptions { language?: Language; defaultCode?: string; @@ -95,7 +100,7 @@ export function codeControl< this._exposingNode = withFunction(this._node, (x) => x.value); // make sure handleChange's reference only changes when the instance changes, avoid CodeEditor frequent reconfigure - this.handleChange = _.debounce((state: EditorState) => { + this.handleChange = debounce((state: EditorState) => { this.dispatchChangeValueAction(state.doc.toString()); }, 50); } @@ -104,7 +109,7 @@ export function codeControl< // need to re-bind handleChange when dispatch changes, otherwise old instance's dispatch is still in use const comp = setFieldsNoTypeCheck(this, { dispatch, - handleChange: _.debounce((state: EditorState) => { + handleChange: debounce((state: EditorState) => { comp.dispatchChangeValueAction(state.doc.toString()); }, 50), }); @@ -189,26 +194,28 @@ export function codeControl< {(exposingData) => ( <> - + + + )} @@ -270,7 +277,7 @@ function toRegExp(value: unknown): RegExp { if (valueType === "RegExp") { return value as RegExp; } else if (valueType === "string") { - const regexStr = _.trimStart(value as string, "^"); + const regexStr = trimStart(value as string, "^"); return new RegExp("^" + (regexStr ?? ".*") + "$"); } throw new TypeError( @@ -314,6 +321,8 @@ export type CodeControlJSONType = ReturnType; export const StringControl = codeControl(toString); export const NumberControl = codeControl(toNumber); export const StringOrNumberControl = codeControl(toStringOrNumber); +export const MaskControl = codeControl(toBooleanOrCss); +export const ArrowControl = codeControl(toBooleanOrJsonObject); // rangeCheck, don't support Infinity temporarily export class RangeControl { @@ -390,6 +399,12 @@ export const jsonObjectControl = (defaultValue?: JSONObject) => ? JSONObjectControl : withDefault(JSONObjectControl, JSON.stringify(defaultValue, null, 2)); +export const jsonArrayControl = (defaultValue?: JSONObject[]) => + defaultValue === undefined + ? JSONObjectControl + : withDefault(JSONObjectArrayControl, JSON.stringify(defaultValue, null, 2)); + + export const jsonValueControl = (defaultValue?: JSONValue) => defaultValue === undefined ? JSONValueControl diff --git a/client/packages/lowcoder/src/comps/controls/codeStateControl.tsx b/client/packages/lowcoder/src/comps/controls/codeStateControl.tsx index b9100dc59..23308b29c 100644 --- a/client/packages/lowcoder/src/comps/controls/codeStateControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/codeStateControl.tsx @@ -1,7 +1,9 @@ import { + ArrayNumberControl, ArrayStringControl, BoolCodeControl, CodeControlJSONType, + jsonArrayControl, jsonControl, jsonObjectControl, jsonValueControl, @@ -30,8 +32,10 @@ import { memo } from "util/cacheUtils"; import { toBoolean, toJSONObject, + toJSONObjectArray, toJSONValue, toNumber, + toNumberArray, toString, toStringArray, toStringNumberArray, @@ -163,10 +167,14 @@ function convertValue(value: EvalParamType, type: ParamType) { return toNumber(value); case "boolean": return toBoolean(value); + case "arrayObject": + return toJSONObjectArray(value); case "arrayString": return toStringArray(value); case "arrayNumberString": return toStringNumberArray(value); + case "arrayNumber": + return toNumberArray(value); case "JSON": return toJSONObject(value); case "JSONValue": @@ -183,8 +191,10 @@ function getTypeDefaultValue(type: ParamType) { return 0; case "boolean": return false; + case "arrayObject": case "arrayString": case "arrayNumberString": + case "arrayNumber": return []; case "JSON": return {}; @@ -200,7 +210,7 @@ function stateControlMethodExposing [] ); +export const arrayNumberStateControl = (defaultValue?: number[]) => + withTmpState( + defaultValue === undefined + ? ArrayNumberControl + : withDefault(ArrayNumberControl, JSON.stringify(defaultValue)), + [] + ); + export const jsonObjectStateControl = (defaultValue?: JSONObject) => withTmpState(jsonObjectControl(defaultValue), {}); +export const arrayObjectStateControl = (defaultValue?: JSONObject[]) => + withTmpState(jsonArrayControl(defaultValue), {}); + export const jsonValueStateControl = (defaultValue?: JSONValue) => withTmpState(jsonValueControl(defaultValue), ""); @@ -292,6 +313,18 @@ export const arrayStringExposingStateControl = (paramName: string, defaultValue? type: "arrayString", }); +export const arrayNumberExposingStateControl = (paramName: string, defaultValue?: number[]) => + stateControlMethodExposing(arrayNumberStateControl(defaultValue), { + name: paramName, + type: "arrayNumber", + }); + +export const arrayObjectExposingStateControl = (paramName: string, defaultValue?: JSONObject[]) => + stateControlMethodExposing(arrayObjectStateControl(defaultValue), { + name: paramName, + type: "arrayObject", + }); + export const jsonObjectExposingStateControl = (paramName: string, defaultValue?: JSONObject) => stateControlMethodExposing(jsonObjectStateControl(defaultValue), { name: paramName, diff --git a/client/packages/lowcoder/src/comps/controls/codeTextControl.tsx b/client/packages/lowcoder/src/comps/controls/codeTextControl.tsx index 15ad0d57d..5f6021d93 100644 --- a/client/packages/lowcoder/src/comps/controls/codeTextControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/codeTextControl.tsx @@ -1,13 +1,18 @@ -import { CodeEditor } from "base/codeEditor/codeEditor"; +// import { CodeEditor } from "base/codeEditor/codeEditor"; import { CompParams } from "lowcoder-core"; import { EditorContext } from "comps/editorState"; import { valueComp } from "comps/generators"; import { CompExposingContext } from "comps/generators/withContext"; import { exposingDataForAutoComplete } from "comps/utils/exposingTypes"; import { ControlPropertyViewWrapper } from "lowcoder-design"; -import _ from "lodash"; -import { ReactNode, useContext, useMemo } from "react"; -import { CodeEditorProps } from "base/codeEditor/codeEditorTypes"; +import { debounce } from "lodash"; +import { ReactNode, Suspense, lazy, useContext, useMemo } from "react"; +import type { CodeEditorProps } from "base/codeEditor/codeEditorTypes"; + +const CodeEditor = lazy( + () => import("base/codeEditor/codeEditor") + .then(module => ({default: module.CodeEditor})) +) interface CodeTextEditorProps extends Omit { enableExposingDataAutoCompletion?: boolean; @@ -33,16 +38,18 @@ function CodeTextEditor(props: CodeTextEditorProps) { }, [compExposingData, editorState, enableExposingDataAutoCompletion]); return ( - onChange(state.doc.toString())} - enableClickCompName={editorState.forceShowGrid} - /> + + onChange(state.doc.toString())} + enableClickCompName={editorState.forceShowGrid} + /> + ); } @@ -53,7 +60,7 @@ export class CodeTextControl extends valueComp("") { super(params); // make sure handleChange's reference only changes when the instance changes, avoid CodeEditor frequent reconfigure - this.handleChange = _.debounce((codeText: string) => { + this.handleChange = debounce((codeText: string) => { this.dispatchChangeValueAction(codeText); }, 50); } diff --git a/client/packages/lowcoder/src/comps/controls/compNameControl.tsx b/client/packages/lowcoder/src/comps/controls/compNameControl.tsx index d7bf027cd..ad9324f32 100644 --- a/client/packages/lowcoder/src/comps/controls/compNameControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/compNameControl.tsx @@ -1,5 +1,5 @@ -import { PopupCard } from "lowcoder-design"; -import { Input } from "lowcoder-design"; +import { PopupCard } from "lowcoder-design/src/components/popupCard"; +import { Input } from "lowcoder-design/src/components/Input"; import { EditorContext } from "comps/editorState"; import { valueComp } from "comps/generators"; import { ControlPropertyViewWrapper } from "lowcoder-design"; diff --git a/client/packages/lowcoder/src/comps/controls/controlParams.tsx b/client/packages/lowcoder/src/comps/controls/controlParams.tsx index 7b84c439d..6ec80d566 100644 --- a/client/packages/lowcoder/src/comps/controls/controlParams.tsx +++ b/client/packages/lowcoder/src/comps/controls/controlParams.tsx @@ -1,6 +1,5 @@ -import { CodeEditorControlParams } from "base/codeEditor/codeEditorTypes"; +import type { CodeEditorControlParams } from "base/codeEditor/codeEditorTypes"; import { Comp } from "lowcoder-core"; -// import { CodeEditorControlParams } from "../../base/codeEditor/codeEditorTypes"; import { CSSProperties, ReactNode } from "react"; export type ControlLayout = "horizontal" | "vertical"; // set propertyView's layout, default horizontal; diff --git a/client/packages/lowcoder/src/comps/controls/eventHandlerControl.tsx b/client/packages/lowcoder/src/comps/controls/eventHandlerControl.tsx index 854cfeef3..20c600348 100644 --- a/client/packages/lowcoder/src/comps/controls/eventHandlerControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/eventHandlerControl.tsx @@ -20,7 +20,7 @@ import { QueryConfigItemWrapper, ValueFromOption, } from "lowcoder-design"; -import { Fragment, ReactNode, useContext, useEffect, useState } from "react"; +import { Fragment, ReactNode, useContext, useEffect, useState} from "react"; import { memo } from "util/cacheUtils"; import { EditorContext } from "../editorState"; import { ActionSelectorControl } from "./actionSelector/actionSelectorControl"; @@ -142,6 +142,11 @@ const EventHandlerControlPropertyView = (props: { type?: "query"; eventConfigs: EventConfigsType; }) => { + + + const editorState = useContext(EditorContext); + const [showNewCreate, setShowNewCreate] = useState(false); + const { dispatch, pushAction, @@ -149,11 +154,9 @@ const EventHandlerControlPropertyView = (props: { inline = false, items, eventConfigs, - type, + type } = props; - const editorState = useContext(EditorContext); - const [showNewCreate, setShowNewCreate] = useState(false); - + useEffect(() => setShowNewCreate(false), [dispatch]); const queryHandler = { @@ -232,9 +235,8 @@ const EventHandlerControlPropertyView = (props: { ); }; -class EventHandlerControl extends list( - SingleEventHandlerControl -) { +class EventHandlerControl extends list(SingleEventHandlerControl) { + @memo // @ts-ignore getView() { @@ -308,6 +310,12 @@ export function eventHandlerControl( return EventHandlerTempControl; } +export const refreshEvent: EventConfigType = { + label: trans("event.refresh"), + value: "refresh", + description: trans("event.refreshDesc"), +}; + export const submitEvent: EventConfigType = { label: trans("event.submit"), value: "submit", @@ -333,6 +341,107 @@ export const clickEvent: EventConfigType = { value: "click", description: trans("event.clickDesc"), }; +export const doubleClickEvent: EventConfigType = { + label: trans("event.doubleClick"), + value: "doubleClick", + description: trans("event.doubleClickDesc"), +}; +export const rightClickEvent: EventConfigType = { + label: trans("event.rightClick"), + value: "doubleClick", + description: trans("event.rightClickDesc"), +}; + +export const keyDownEvent: EventConfigType = { + label: trans("event.keyDown"), + value: "keyDown", + description: trans("event.keyDownDesc"), +}; + +export const selectEvent: EventConfigType = { + label: trans("event.select"), + value: "select", + description: trans("event.selectDesc"), +}; + +export const checkedEvent: EventConfigType = { + label: trans("event.checked"), + value: "checked", + description: trans("event.checkedDesc"), +}; + +export const uncheckedEvent: EventConfigType = { + label: trans("event.unchecked"), + value: "unchecked", + description: trans("event.uncheckedDesc"), +}; + +export const dragEvent: EventConfigType = { + label: trans("event.drag"), + value: "drag", + description: trans("event.dragDesc"), +}; + +export const dropEvent: EventConfigType = { + label: trans("event.drop"), + value: "drop", + description: trans("event.dropDesc"), +}; + +export const openEvent: EventConfigType = { + label: trans("event.open"), + value: "open", + description: trans("event.openDesc"), +}; + +export const playEvent: EventConfigType = { + label: trans("event.play"), + value: "play", + description: trans("event.playDesc"), +}; + +export const pauseEvent: EventConfigType = { + label: trans("event.pause"), + value: "pause", + description: trans("event.pauseDesc"), +}; + +export const endedEvent: EventConfigType = { + label: trans("event.ended"), + value: "ended", + description: trans("event.endedDesc"), +}; + +export const stepEvent: EventConfigType = { + label: trans("event.step"), + value: "step", + description: trans("event.stepDesc"), +}; + +export const nextEvent: EventConfigType = { + label: trans("event.next"), + value: "next", + description: trans("event.nextDesc"), +}; + +export const finishedEvent: EventConfigType = { + label: trans("event.finished"), + value: "finished", + description: trans("event.finishedDesc"), +}; + +export const savedEvent: EventConfigType = { + label: trans("event.saved"), + value: "saved", + description: trans("event.savedDesc"), +}; + +export const editedEvent: EventConfigType = { + label: trans("event.edited"), + value: "edited", + description: trans("event.editedDesc"), +}; + export const closeEvent: EventConfigType = { label: trans("event.close"), value: "close", @@ -353,6 +462,51 @@ export const mentionEvent: EventConfigType = { value: "mention", description: trans("event.mentionDesc"), }; + +export const startEvent: EventConfigType = { + label: trans("event.start"), + value: "start", + description: trans("event.startDesc"), +}; +export const resumeEvent: EventConfigType = { + label: trans("event.resume"), + value: "resume", + description: trans("event.resumeDesc"), +}; +export const countdownEvent: EventConfigType = { + label: trans("event.countdown"), + value: "countdown", + description: trans("event.countdownDesc"), +}; +export const resetEvent: EventConfigType = { + label: trans("event.reset"), + value: "reset", + description: trans("event.resetDesc"), +}; + + +// Meeting Events + +export const meetingStartEvent: EventConfigType = { + label: trans("event.meetingStart"), + value: "meetingStart", + description: trans("event.meetingStartDesc"), +}; +export const meetingEndEvent: EventConfigType = { + label: trans("event.meetingEnd"), + value: "meetingEnd", + description: trans("event.meetingEndDesc"), +}; +export const meetingJoinEvent: EventConfigType = { + label: trans("event.meetingJoin"), + value: "meetingJoin", + description: trans("event.meetingJoinDesc"), +}; +export const meetingLeaveEvent: EventConfigType = { + label: trans("event.meetingLeave"), + value: "meetingLeave", + description: trans("event.meetingLeaveDesc"), +}; export const audioUnmuted: EventConfigType = { label: trans("meeting.audioUnmuted"), value: "audioUnmuted", @@ -373,17 +527,146 @@ export const videoOn: EventConfigType = { value: "videoOn", description: trans("meeting.videoOn"), }; +export const showCameraEvent: EventConfigType = { + label: trans("event.showCamera"), + value: "showCamera", + description: trans("event.showCameraDesc"), +}; +export const hideCameraEvent: EventConfigType = { + label: trans("event.hideCamera"), + value: "hideCamera", + description: trans("event.hideCameraDesc"), +}; export const videoClicked: EventConfigType = { label: trans("meeting.videoClicked"), value: "videoClicked", description: trans("meeting.videoClicked"), }; + +// Collaboration Events + +export const shareScreenEvent: EventConfigType = { + label: trans("event.shareScreen"), + value: "shareScreen", + description: trans("event.shareScreenDesc"), +}; +export const shareScreenEndEvent: EventConfigType = { + label: trans("event.shareScreenEnd"), + value: "shareScreenEnd", + description: trans("event.shareScreenEndDesc"), +}; +export const shareControlEvent: EventConfigType = { + label: trans("event.shareControl"), + value: "shareControl", + description: trans("event.shareControlDesc"), +}; +export const shareControlEndEvent: EventConfigType = { + label: trans("event.shareControlEnd"), + value: "shareControlEnd", + description: trans("event.shareControlEndDesc"), +}; +export const shareContentEvent: EventConfigType = { + label: trans("event.shareContent"), + value: "shareContent", + description: trans("event.shareContentDesc"), +}; +export const shareContentEndEvent: EventConfigType = { + label: trans("event.shareContentEnd"), + value: "shareContentEnd", + description: trans("event.shareContentEndDesc"), +}; +export const muteEvent: EventConfigType = { + label: trans("event.mute"), + value: "mute", + description: trans("event.muteDesc"), +}; +export const unmuteEvent: EventConfigType = { + label: trans("event.unmute"), + value: "unmute", + description: trans("event.unmuteDesc"), +}; + +// Geo Map Events + +export const geoMapMoveEvent: EventConfigType = { + label: trans("event.geoMapMove"), + value: "geoMapMove", + description: trans("event.geoMapMoveDesc"), +}; +export const geoMapZoomEvent: EventConfigType = { + label: trans("event.geoMapZoom"), + value: "geoMapZoom", + description: trans("event.geoMapZoomDesc"), +}; +export const geoMapSelectEvent: EventConfigType = { + label: trans("event.geoMapSelect"), + value: "geoMapSelect", + description: trans("event.geoMapSelectDesc"), +}; + + +// Scanner Events + +export const scannerSuccessEvent: EventConfigType = { + label: trans("event.scannerSuccess"), + value: "scannerSuccess", + description: trans("event.scannerSuccessDesc"), +}; +export const scannerErrorEvent: EventConfigType = { + label: trans("event.scannerError"), + value: "scannerError", + description: trans("event.scannerErrorDesc"), +}; + +// Chart Events + +export const chartZoomEvent: EventConfigType = { + label: trans("event.chartZoom"), + value: "chartZoom", + description: trans("event.chartZoomDesc"), +}; +export const chartHoverEvent: EventConfigType = { + label: trans("event.chartHover"), + value: "chartHover", + description: trans("event.chartHoverDesc"), +}; +export const chartSelectEvent: EventConfigType = { + label: trans("event.chartSelect"), + value: "chartSelect", + description: trans("event.chartSelectDesc"), +}; +export const chartDeselectEvent: EventConfigType = { + label: trans("event.chartDeselect"), + value: "chartDeselect", + description: trans("event.chartDeselectDesc"), +}; + +export const selectedChangeEvent: EventConfigType = { + label: trans("event.selectedChange"), + value: "selectedChange", + description: trans("event.selectedChangeDesc"), +}; + +export const searchEvent: EventConfigType = { + label: trans("event.search"), + value: "search", + description: trans("event.searchDesc"), +}; + +export const clickExtraEvent: EventConfigType = { + label: trans("event.clickExtra"), + value: "clickExtra", + description: trans("event.clickExtraDesc"), +}; + +// Exports + export const InputEventHandlerControl = eventHandlerControl([ changeEvent, focusEvent, blurEvent, submitEvent, -] as const); +] as const); // , { title: trans("eventHandler.inputEventHandlers"), description: trans("eventHandler.inputEventHandlersDesc"), icon : "" } as const); export const ButtonEventHandlerControl = eventHandlerControl([ clickEvent, @@ -393,6 +676,56 @@ export const ChangeEventHandlerControl = eventHandlerControl([ changeEvent, ] as const); +export const EditedEventHandlerControl = eventHandlerControl([ + editedEvent, +] as const); + +export const ClickEventHandlerControl = eventHandlerControl([ + clickEvent, + doubleClickEvent, + rightClickEvent +] as const); + +export const KeyDownEventHandlerControl = eventHandlerControl([ + keyDownEvent, +] as const); + +export const CheckboxEventHandlerControl = eventHandlerControl([ + checkedEvent, + uncheckedEvent, +] as const); + +export const DragEventHandlerControl = eventHandlerControl([ + dragEvent, + dropEvent, +] as const); + +export const ElementEventHandlerControl = eventHandlerControl([ + openEvent, + editedEvent, + closeEvent, + savedEvent, + deleteEvent, +] as const); + +export const MediaEventHandlerControl = eventHandlerControl([ + playEvent, + pauseEvent, + nextEvent, + endedEvent, +] as const); + +export const StepEventHandlerControl = eventHandlerControl([ + stepEvent, + nextEvent, + finishedEvent, +] as const); + +export const ShareContentEventHandlerControl = eventHandlerControl([ + shareContentEvent, + shareContentEndEvent, +] as const); + export const SelectEventHandlerControl = eventHandlerControl([ changeEvent, focusEvent, @@ -401,6 +734,8 @@ export const SelectEventHandlerControl = eventHandlerControl([ export const ScannerEventHandlerControl = eventHandlerControl([ clickEvent, + // scannerSuccessEvent, + // scannerErrorEvent, successEvent, closeEvent, ] as const); @@ -408,7 +743,40 @@ export const ScannerEventHandlerControl = eventHandlerControl([ export const MeetingEventHandlerControl = eventHandlerControl([ audioMuted, audioUnmuted, - videoOff, - videoOn, + showCameraEvent, + hideCameraEvent, videoClicked, + shareScreenEvent, + shareScreenEndEvent, + shareControlEvent, + shareControlEndEvent, +] as const); + +export const GeoMapEventHandlerControl = eventHandlerControl([ + geoMapMoveEvent, + geoMapZoomEvent, + geoMapSelectEvent, ] as const); + +export const ChartEventHandlerControl = eventHandlerControl([ + chartZoomEvent, + chartHoverEvent, + chartSelectEvent, + chartDeselectEvent, +] as const); + +export const CollaborationEventHandlerControl = eventHandlerControl([ + shareScreenEvent, + shareScreenEndEvent, + shareControlEvent, + shareControlEndEvent, + shareContentEvent, + shareContentEndEvent, +] as const); + +export const CardEventHandlerControl = eventHandlerControl([ + clickEvent, + clickExtraEvent, + focusEvent, + blurEvent, +] as const); \ No newline at end of file diff --git a/client/packages/lowcoder/src/comps/controls/iconControl.tsx b/client/packages/lowcoder/src/comps/controls/iconControl.tsx index e33688510..15b5f9dc2 100644 --- a/client/packages/lowcoder/src/comps/controls/iconControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/iconControl.tsx @@ -1,5 +1,4 @@ -import { CodeEditorTooltipContainer } from "base/codeEditor/codeEditor"; -import { EditorState, EditorView } from "base/codeEditor/codeMirror"; +import type { EditorState, EditorView } from "base/codeEditor/codeMirror"; import { iconRegexp, iconWidgetClass } from "base/codeEditor/extensions/iconExtension"; import { i18nObjs, trans } from "i18n"; import { @@ -71,7 +70,7 @@ const Wrapper = styled.div` } `; -const IconPicker = (props: { +export const IconPicker = (props: { value: string; onChange: (value: string) => void; label?: ReactNode; diff --git a/client/packages/lowcoder/src/comps/controls/labelControl.tsx b/client/packages/lowcoder/src/comps/controls/labelControl.tsx index 74a4f26ac..81a46774e 100644 --- a/client/packages/lowcoder/src/comps/controls/labelControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/labelControl.tsx @@ -1,5 +1,5 @@ import { trans } from "i18n"; -import { green, red, yellow } from "@ant-design/colors"; +import { green, red, yellow } from "@ant-design/colors/es"; import { FormItemProps } from "antd/es/form/FormItem"; import { BoolControl } from "comps/controls/boolControl"; import { NumberControl, StringControl } from "comps/controls/codeControl"; @@ -9,17 +9,21 @@ import { MultiCompBuilder } from "comps/generators/multi"; import { labelCss, Section, Tooltip, UnderlineCss } from "lowcoder-design"; import { ValueFromOption } from "lowcoder-design"; import { isEmpty } from "lodash"; -import { ReactNode } from "react"; +import { Fragment, ReactNode } from "react"; import styled, { css } from "styled-components"; import { AlignLeft } from "lowcoder-design"; import { AlignRight } from "lowcoder-design"; import { StarIcon } from "lowcoder-design"; -import { heightCalculator, widthCalculator } from "./styleControlConstants"; +import { LabelStyleType, heightCalculator, widthCalculator } from "./styleControlConstants"; type LabelViewProps = Pick & { children: ReactNode; style?: Record; + labelStyle?: Record; + field?: Record; + inputFieldStyle?: Record; + childrenInputFieldStyle?: Record; }; const StyledStarIcon = styled(StarIcon)` @@ -40,11 +44,20 @@ function getStyle(style: any) { `; } -const LabelViewWrapper = styled.div<{ $style: any }>` - ${(props) => props.$style && getStyle(props.$style)} +const LabelViewWrapper = styled.div<{ $style: any, inputFieldStyle: any }>` +${(props) => { + return ( + props.$style && { + ...props.$style, + borderRadius: props.$style.radius, + } + ); + }} + ${(props) => props.inputFieldStyle && getStyle(props.inputFieldStyle)} display: flex; flex-direction: column; height: 100%; + border: ${(props)=>{return props.$style.borderWidth}} ${(props)=>{return props.$style.borderStyle}} ${(props)=>{return props.$style.border}} !important; `; const MainWrapper = styled.div<{ @@ -75,10 +88,22 @@ const LabelWrapper = styled.div<{ max-width: ${(props) => (props.$position === "row" ? "80%" : "100%")}; flex-shrink: 0; `; +// ${(props) => props.$border && UnderlineCss}; +// ${(props) => props.$border && `border-bottom:${props.$labelStyle.borderWidth} ${props.$labelStyle.borderStyle} ${!!props.$validateStatus && props?.$validateStatus === 'error' ? props.$labelStyle.validate : props.$labelStyle.border};`} -const Label = styled.span<{ $border: boolean }>` +const Label = styled.span<{ $border: boolean, $labelStyle: LabelStyleType, $validateStatus: "success" | "warning" | "error" | "validating" | null }>` ${labelCss}; - ${(props) => props.$border && UnderlineCss}; + font-family:${(props) => props.$labelStyle.fontFamily}; + font-weight:${(props) => props.$labelStyle.textWeight}; + font-style:${(props) => props.$labelStyle.fontStyle}; + text-transform:${(props) => props.$labelStyle.textTransform}; + text-decoration:${(props) => props.$labelStyle.textDecoration}; + font-size:${(props) => props.$labelStyle.textSize}; + color:${(props) => !!props.$validateStatus && props?.$validateStatus === 'error' ? props.$labelStyle.validate : props.$labelStyle.label} !important; + ${(props) => `border:${props.$labelStyle.borderWidth} ${props.$labelStyle.borderStyle} ${!!props.$validateStatus && props?.$validateStatus === 'error' ? props.$labelStyle.validate : props.$labelStyle.border};`} + border-radius:${(props) => props.$labelStyle.radius}; + padding:${(props) => props.$labelStyle.padding}; + margin:${(props) => props.$labelStyle.margin}; width: fit-content; user-select: text; white-space: nowrap; @@ -144,21 +169,23 @@ export const LabelControl = (function () { position: dropdownControl(PositionOptions, "row"), align: dropdownControl(AlignOptions, "left"), }; - return new MultiCompBuilder(childrenMap, (props) => (args: LabelViewProps) => ( - - (args: LabelViewProps) => + { + return + {!props.hidden && !isEmpty(props.text) && ( node.closest(".react-grid-item")} > - + {args.required && } @@ -210,15 +242,15 @@ export const LabelControl = (function () { args.validateStatus === "error" ? red.primary : args.validateStatus === "warning" - ? yellow.primary - : green.primary + ? yellow.primary + : green.primary } > {args.help} )} - - )) + } +) .setPropertyViewFn((children) => (
{children.text.propertyView({ label: trans("labelProp.text") })} diff --git a/client/packages/lowcoder/src/comps/controls/optionsControl.tsx b/client/packages/lowcoder/src/comps/controls/optionsControl.tsx index 1230a195e..5d71dbdb2 100644 --- a/client/packages/lowcoder/src/comps/controls/optionsControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/optionsControl.tsx @@ -1,5 +1,5 @@ import { ViewDocIcon } from "assets/icons"; -import { ArrayControl, BoolCodeControl, RadiusControl, StringControl } from "comps/controls/codeControl"; +import { ArrayControl, BoolCodeControl, NumberControl, RadiusControl, StringControl } from "comps/controls/codeControl"; import { dropdownControl, LeftRightControl } from "comps/controls/dropdownControl"; import { IconControl } from "comps/controls/iconControl"; import { MultiCompBuilder, valueComp, withContext, withDefault } from "comps/generators"; @@ -634,3 +634,68 @@ export const ColumnOptionControl = manualOptionsControl(ColumnOption, { autoIncField: "id", }); +let StepOption = new MultiCompBuilder( + { + value : NumberControl, + label: StringControl, + subTitle: StringControl, + description: StringControl, + icon: IconControl, + status: StringControl, + disabled: BoolCodeControl, + }, + (props) => props +).build(); + +StepOption = class extends StepOption implements OptionCompProperty { + propertyView(param: { autoMap?: boolean }) { + return ( + <> + {this.children.value.propertyView({ label: trans("stepOptionsControl.value"), tooltip: trans("stepOptionsControl.valueTooltip") })} + {this.children.label.propertyView({ label: trans("stepOptionsControl.title") })} + {this.children.subTitle.propertyView({ label: trans("stepOptionsControl.subTitle") })} + {this.children.description.propertyView({ label: trans("stepOptionsControl.description") })} + {this.children.icon.propertyView({ label: trans("stepOptionsControl.icon") })} + {this.children.status.propertyView({ label: trans("stepOptionsControl.status") })} + {disabledPropertyView(this.children)} + + ); + } +}; + +export const StepOptionControl = optionsControl(StepOption, { + initOptions: [ + { value: "1", label: "Step 1", subTitle: "Initialization", description: "Initial setup of parameters.", icon: "/icon:solid/play", status: "finish", disabled: "false" }, + { value: "2", label: "Step 2", subTitle: "Execution", description: "Execution of the main process.", icon: "/icon:solid/person-running", status: "process", disabled: "false" }, + { value: "3", label: "Step 3", subTitle: "Finalization", description: "Final steps to complete the process.", icon: "/icon:solid/circle-check", status: "wait", disabled: "true" }, + { value: "4", label: "Step 4", subTitle: "Completion", description: "Process completed successfully.", status: "wait", disabled: "true" }, + ], + uniqField: "label", +}); + + +let ColoredTagOption = new MultiCompBuilder( + { + label: StringControl, + icon: IconControl, + color: withDefault(ColorControl, ""), + }, + (props) => props +).build(); + +ColoredTagOption = class extends ColoredTagOption implements OptionCompProperty { + propertyView(param: { autoMap?: boolean }) { + return ( + <> + {this.children.label.propertyView({ label: trans("coloredTagOptionControl.tag") })} + {this.children.icon.propertyView({ label: trans("coloredTagOptionControl.icon") })} + {this.children.color.propertyView({ label: trans("coloredTagOptionControl.color") })} + + ); + } +}; + +export const ColoredTagOptionControl = optionsControl(ColoredTagOption, { + initOptions: [{ label: "Tag1", icon: "/icon:solid/tag", color: "#f50" }, { label: "Tag2", icon: "/icon:solid/tag", color: "#2db7f5" }], + uniqField: "label", +}); \ No newline at end of file diff --git a/client/packages/lowcoder/src/comps/controls/querySelectControl.tsx b/client/packages/lowcoder/src/comps/controls/querySelectControl.tsx index 435786ca4..9b0d3c574 100644 --- a/client/packages/lowcoder/src/comps/controls/querySelectControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/querySelectControl.tsx @@ -1,7 +1,7 @@ import { EditorContext } from "comps/editorState"; import { MultiCompBuilder, valueComp } from "comps/generators"; import { ControlPropertyViewWrapper } from "lowcoder-design"; -import { Dropdown } from "lowcoder-design"; +import { Dropdown } from "lowcoder-design/src/components/Dropdown"; import { useContext } from "react"; import { ControlParams } from "./controlParams"; diff --git a/client/packages/lowcoder/src/comps/controls/shapeControl.tsx b/client/packages/lowcoder/src/comps/controls/shapeControl.tsx new file mode 100644 index 000000000..fce1dd6b0 --- /dev/null +++ b/client/packages/lowcoder/src/comps/controls/shapeControl.tsx @@ -0,0 +1,297 @@ +import type { EditorState, EditorView } from "base/codeEditor/codeMirror"; +import { + iconRegexp, + iconWidgetClass, +} from "base/codeEditor/extensions/iconExtension"; +import { i18nObjs, trans } from "i18n"; +import { Coolshape } from "coolshapes-react"; +import { + AbstractComp, + CompAction, + CompActionTypes, + CompParams, + customAction, + DispatchType, + Node, + ValueAndMsg, +} from "lowcoder-core"; +import { + BlockGrayLabel, + controlItem, + ControlPropertyViewWrapper, + DeleteInputIcon, + iconPrefix, + ShapeSelect, + IconSelectBase, + removeQuote, + SwitchJsIcon, + SwitchWrapper, + TacoButton, + wrapperToControlItem, + useShape, +} from "lowcoder-design"; +import { ReactNode, useCallback, useState } from "react"; +import styled from "styled-components"; +import { setFieldsNoTypeCheck } from "util/objectUtils"; +import { StringControl } from "./codeControl"; +import { ControlParams } from "./controlParams"; + +const ButtonWrapper = styled.div` + width: 100%; + display: flex; + align-items: center; +`; +const ButtonIconWrapper = styled.div` + display: flex; + font-size: 16px; +`; +const ButtonText = styled.div` + margin: 0 4px; + flex: 1; + width: 0px; + line-height: 20px; + overflow: hidden; + text-overflow: ellipsis; + text-align: left; +`; +const StyledDeleteInputIcon = styled(DeleteInputIcon)` + margin-left: auto; + cursor: pointer; + + &:hover circle { + fill: #8b8fa3; + } +`; + +const StyledImage = styled.img` + height: 1em; + color: currentColor; +`; + +const Wrapper = styled.div` + > div:nth-of-type(1) { + margin-bottom: 4px; + } +`; + +const IconPicker = (props: { + value: string; + onChange: (value: string) => void; + label?: ReactNode; + IconType?: "OnlyAntd" | "All" | "default" | undefined; +}) => { + const icon = useShape(props.value); + console.log(props); + let shapeDetails = props.value; + console.log("shapeDetails ", shapeDetails); + + return ( + + + {props.value ? ( + + + + + + { + props.onChange(""); + e.stopPropagation(); + }} + /> + + ) : ( + + )} + + + ); +}; + +function onClickIcon(e: React.MouseEvent, v: EditorView) { + for (let t = e.target as HTMLElement | null; t; t = t.parentElement) { + if (t.classList.contains(iconWidgetClass)) { + const pos = v.posAtDOM(t); + const result = iconRegexp.exec(v.state.doc.sliceString(pos)); + if (result) { + const from = pos + result.index; + return { from, to: from + result[0].length }; + } + } + } +} + +function IconSpan(props: { value: string }) { + const icon = useShape(props.value); + return {icon?.getView() ?? props.value}; +} + +function cardRichContent(s: string) { + let result = s.match(iconRegexp); + if (result) { + const nodes: React.ReactNode[] = []; + let pos = 0; + for (const iconStr of result) { + const i = s.indexOf(iconStr, pos); + if (i >= 0) { + nodes.push(s.slice(pos, i)); + nodes.push(); + pos = i + iconStr.length; + } + } + nodes.push(s.slice(pos)); + return nodes; + } + return s; +} + +type Range = { + from: number; + to: number; +}; + + + +function isSelectValue(value: any) { + return !value || (typeof value === "string" && value.startsWith(iconPrefix)); +} + +type ChangeModeAction = { + useCodeEditor: boolean; +}; + +function ShapeControlView(props: { value: any }) { + const { value } = props; + console.log("ShapeControlView ", value); + const icon = useShape(value); + if (icon) { + return icon.getView(); + } + return ; +} + +export class ShapeControl extends AbstractComp< + ReactNode, + string, + Node> +> { + private readonly useCodeEditor: boolean; + private readonly codeControl: InstanceType; + + constructor(params: CompParams) { + super(params); + this.useCodeEditor = !isSelectValue(params.value); + this.codeControl = new StringControl(params); + } + + override getView(): ReactNode { + const value = this.codeControl.getView(); + return ; + } + + override getPropertyView(): ReactNode { + const value = this.codeControl.getView(); + return ; + } + + changeModeAction() { + return customAction( + { useCodeEditor: !this.useCodeEditor }, + true + ); + } + + propertyView(params: ControlParams) { + const jsContent = ( + this.dispatch(this.changeModeAction())} + /> + ); + return wrapperToControlItem( + + this.dispatchChangeValueAction(x)} + label={params.label} + IconType={params.IconType} + /> + + ); + } + + readonly IGNORABLE_DEFAULT_VALUE = ""; + override toJsonValue(): string { + if (this.useCodeEditor) { + return this.codeControl.toJsonValue(); + } + // in select mode, don't save editor's original value when saving + const v = removeQuote(this.codeControl.getView()); + return isSelectValue(v) ? v : ""; + } + + override reduce(action: CompAction): this { + switch (action.type) { + case CompActionTypes.CUSTOM: { + const useCodeEditor = (action.value as ChangeModeAction).useCodeEditor; + let codeControl = this.codeControl; + if (!this.useCodeEditor && useCodeEditor) { + // value should be transformed when switching to editor from select mode + const value = this.codeControl.toJsonValue(); + if (value && isSelectValue(value)) { + codeControl = codeControl.reduce( + codeControl.changeValueAction(`{{ "${value}" }}`) + ); + } + } + return setFieldsNoTypeCheck(this, { useCodeEditor, codeControl }); + } + case CompActionTypes.CHANGE_VALUE: { + const useCodeEditor = this.useCodeEditor + ? true + : !isSelectValue(action.value); + const codeControl = this.codeControl.reduce(action); + if ( + useCodeEditor !== this.useCodeEditor || + codeControl !== this.codeControl + ) { + return setFieldsNoTypeCheck(this, { useCodeEditor, codeControl }); + } + return this; + } + } + const codeControl = this.codeControl.reduce(action); + if (codeControl !== this.codeControl) { + return setFieldsNoTypeCheck(this, { codeControl }); + } + return this; + } + + override nodeWithoutCache() { + return this.codeControl.nodeWithoutCache(); + } + + exposingNode() { + return this.codeControl.exposingNode(); + } + + override changeDispatch(dispatch: DispatchType): this { + const result = setFieldsNoTypeCheck( + super.changeDispatch(dispatch), + { codeControl: this.codeControl.changeDispatch(dispatch) }, + { keepCacheKeys: ["node"] } + ); + return result; + } +} diff --git a/client/packages/lowcoder/src/comps/controls/simpleStringControl.tsx b/client/packages/lowcoder/src/comps/controls/simpleStringControl.tsx index 9e5136c2d..df947144c 100644 --- a/client/packages/lowcoder/src/comps/controls/simpleStringControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/simpleStringControl.tsx @@ -1,4 +1,4 @@ -import { Input } from "lowcoder-design"; +import { Input } from "lowcoder-design/src/components/Input"; import { SimpleComp } from "lowcoder-core"; import { ControlPropertyViewWrapper } from "lowcoder-design"; import { ControlParams } from "./controlParams"; diff --git a/client/packages/lowcoder/src/comps/controls/slotControl.tsx b/client/packages/lowcoder/src/comps/controls/slotControl.tsx index 0c798c5aa..587a42c2a 100644 --- a/client/packages/lowcoder/src/comps/controls/slotControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/slotControl.tsx @@ -10,7 +10,7 @@ import { BackgroundColorContext } from "comps/utils/backgroundColorContext"; import { CanvasContainerID } from "constants/domLocators"; import { Layers } from "constants/Layers"; import { trans } from "i18n"; -import { changeChildAction, ConstructorToView } from "lowcoder-core"; +import { changeChildAction, CompActionTypes, ConstructorToView } from "lowcoder-core"; import { HintPlaceHolder, TacoButton } from "lowcoder-design"; import { createContext, useContext } from "react"; import styled from "styled-components"; diff --git a/client/packages/lowcoder/src/comps/controls/styleControl.tsx b/client/packages/lowcoder/src/comps/controls/styleControl.tsx index ec5663a7e..0bd854ca3 100644 --- a/client/packages/lowcoder/src/comps/controls/styleControl.tsx +++ b/client/packages/lowcoder/src/comps/controls/styleControl.tsx @@ -8,16 +8,21 @@ import { trans } from "i18n"; import _ from "lodash"; import { controlItem, - IconRadius, IconReset, ExpandIcon, CompressIcon, TextSizeIcon, + TextTransformationIcon, FontFamilyIcon, TextWeightIcon, ShowBorderIcon, BorderWidthIcon, - ImageCompIcon, + ImageCompIconSmall, + RotationIcon, + TextDecorationIcon, + BorderStyleIcon, + BorderRadiusIcon, + TextStyleIcon, } from "lowcoder-design"; import { useContext } from "react"; import styled from "styled-components"; @@ -38,6 +43,7 @@ import { FontFamilyConfig, FontStyleConfig, BorderWidthConfig, + RotationConfig, BackgroundImageConfig, BackgroundImageRepeatConfig, BackgroundImageSizeConfig, @@ -53,6 +59,9 @@ import { FooterBackgroundImageSizeConfig, FooterBackgroundImagePositionConfig, FooterBackgroundImageOriginConfig, + TextTransformConfig, + TextDecorationConfig, + borderStyleConfig, } from "./styleControlConstants"; @@ -75,6 +84,10 @@ function isBorderWidthConfig(config: SingleColorConfig): config is BorderWidthCo return config.hasOwnProperty("borderWidth"); } +function isRotationConfig(config: SingleColorConfig): config is RotationConfig { + return config.hasOwnProperty("rotation"); +} + function isBackgroundImageConfig(config: SingleColorConfig): config is BackgroundImageConfig { return config.hasOwnProperty("backgroundImage"); } @@ -140,6 +153,15 @@ function isFontFamilyConfig(config: SingleColorConfig): config is FontFamilyConf function isFontStyleConfig(config: SingleColorConfig): config is FontStyleConfig { return config.hasOwnProperty("fontStyle"); } +function isTextTransformConfig(config: SingleColorConfig): config is TextTransformConfig { + return config.hasOwnProperty("textTransform"); +} +function isTextDecorationConfig(config: SingleColorConfig): config is TextDecorationConfig { + return config.hasOwnProperty("textDecoration"); +} +function isBorderStyleConfig(config: SingleColorConfig): config is borderStyleConfig { + return config.hasOwnProperty("borderStyle"); +} function isMarginConfig(config: SingleColorConfig): config is MarginConfig { return config.hasOwnProperty("margin"); @@ -164,6 +186,9 @@ function isEmptyRadius(radius: string) { function isEmptyBorderWidth(borderWidth: string) { return _.isEmpty(borderWidth); } +function isEmptyRotation(rotation: string) { + return _.isEmpty(rotation); +} function isEmptyBackgroundImageConfig(backgroundImage: string) { return _.isEmpty(backgroundImage); } @@ -222,6 +247,15 @@ function isEmptyFontFamily(fontFamily: string) { function isEmptyFontStyle(fontStyle: string) { return _.isEmpty(fontStyle); } +function isEmptyTextTransform(textTransform: string) { + return _.isEmpty(textTransform); +} +function isEmptyTextDecoration(textDecoration: string) { + return _.isEmpty(textDecoration); +} +function isEmptyBorderStyle(borderStyle: string) { + return _.isEmpty(borderStyle); +} function isEmptyMargin(margin: string) { return _.isEmpty(margin); @@ -252,6 +286,11 @@ function calcColors>( res[name] = props[name]; return; } + if (!isEmptyRotation(props[name]) && isRotationConfig(config)) { + res[name] = props[name]; + return; + } + if (!isEmptyBackgroundImageConfig(props[name]) && isBackgroundImageConfig(config)) { res[name] = props[name]; return; @@ -328,6 +367,18 @@ function calcColors>( res[name] = props[name]; return; } + if (!isEmptyTextTransform(props[name]) && isTextTransformConfig(config)) { + res[name] = props[name]; + return; + } + if (!isEmptyTextDecoration(props[name]) && isTextDecorationConfig(config)) { + res[name] = props[name]; + return; + } + if (!isEmptyBorderStyle(props[name]) && isBorderStyleConfig(config)) { + res[name] = props[name]; + return; + } if (!isEmptyMargin(props[name]) && isMarginConfig(config)) { res[name] = props[name]; return; @@ -353,6 +404,9 @@ function calcColors>( if (isBorderWidthConfig(config)) { res[name] = '0px'; } + if (isRotationConfig(config)) { + res[name] = '0deg'; + } if (isBackgroundImageConfig(config)) { res[name] = ''; } @@ -412,6 +466,15 @@ function calcColors>( if (isFontStyleConfig(config)) { res[name] = themeWithDefault[config.fontStyle] || 'normal' } + if(isTextTransformConfig(config)){ + res[name] = themeWithDefault[config.textTransform] || 'none' + } + if(isTextDecorationConfig(config)){ + res[name] = themeWithDefault[config.textDecoration] || 'none' + } + if(isBorderStyleConfig(config)){ + res[name] = themeWithDefault[config.borderStyle] || 'solid' + } if (isMarginConfig(config)) { res[name] = themeWithDefault[config.margin]; } @@ -521,14 +584,22 @@ const StyleContent = styled.div` } `; -const RadiusIcon = styled(IconRadius)` margin: 0 8px 0 -2px;`; -const BorderIcon = styled(BorderWidthIcon)` margin: 0 8px 0 -3px; padding: 3px;`; -const MarginIcon = styled(ExpandIcon)` margin: 0 8px 0 2px;`; -const PaddingIcon = styled(CompressIcon)` margin: 0 8px 0 2px;`; -const StyledTextSizeIcon = styled(TextSizeIcon)` margin: 0 8px 0 -3px; padding: 3px;`; -const StyledFontFamilyIcon = styled(FontFamilyIcon)` margin: 0 8px 0 -3px; padding: 3px;`; -const StyledTextWeightIcon = styled(TextWeightIcon)` margin: 0 8px 0 -3px; padding: 3px;`; -const StyledBackgroundImageIcon = styled(ImageCompIcon)` margin: 0 0px 0 -12px;`; +const MarginIcon = styled(ExpandIcon)` margin: 0 8px 0 2px; color: #888`; +const PaddingIcon = styled(CompressIcon)` margin: 0 8px 0 2px; color: #888`; +const RadiusPropIcon = styled(BorderRadiusIcon)` width: 24px; margin: 0 11px 0 0px; color: #888`; +const BorderPropIcon = styled(BorderWidthIcon)` margin: 0 8px 0 -3px; padding: 3px; color: #888`; +const BorderStylePropIcon = styled(BorderStyleIcon)` margin: 0 8px 0 -3px; padding: 3px; color: #888`; + +const StyledBackgroundImageIcon = styled(ImageCompIconSmall)` margin: 0 6px 0 0; padding: 2px; color: #888`; +const RotationPropIcon = styled(RotationIcon)` margin: 0 8px 0 -3px; padding: 3px; color: #888`; + +const StyledTextSizeIcon = styled(TextSizeIcon)` margin: 0 8px 0 -3px; padding: 3px; color: #888`; +const StyledTextTransformIcon = styled(TextTransformationIcon)` margin: 0 8px 0 -3px; padding: 3px; color: #888`; +const StyledFontFamilyIcon = styled(FontFamilyIcon)` margin: 0 8px 0 -3px; padding: 3px; color: #888`; +const StyledTextWeightIcon = styled(TextWeightIcon)` margin: 0 8px 0 -3px; padding: 3px; color: #888`; +const StyledTextStyleIcon = styled(TextStyleIcon)` margin: 0 8px 0 -3px; padding: 3px; color: #888`; +const StyledTextDecorationPropIcon = styled(TextDecorationIcon)` margin: 0 8px 0 -3px; padding: 3px; color: #888`; + const ResetIcon = styled(IconReset)` &:hover g g { @@ -544,12 +615,14 @@ export function styleControl(colorConfig if ( name === "radius" || name === "borderWidth" || + name === "rotation" || name === "cardRadius" || name === "textSize" || name === "textWeight" || name === "textTransform" || name === "textDecoration" || name === "fontFamily" || + name === "borderStyle" || name === "fontStyle" || name === "backgroundImage" || name === "backgroundImageRepeat" || @@ -569,6 +642,7 @@ export function styleControl(colorConfig name === "margin" || name === "padding" || name === "containerHeaderPadding" || + name === "containerSiderPadding" || name === "containerFooterPadding" || name === "containerBodyPadding" ) { @@ -615,9 +689,11 @@ export function styleControl(colorConfig name === "margin" || name === "padding" || name === "containerHeaderPadding" || + name === "containerSiderPadding" || name === "containerFooterPadding" || name === "containerBodyPadding" || name === "borderWidth" || + name === "rotation" || name === "backgroundImage" || name === "backgroundImageRepeat" || name === "backgroundImageSize" || @@ -678,7 +754,7 @@ export function styleControl(colorConfig children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], }) : name === "borderWidth" @@ -686,114 +762,115 @@ export function styleControl(colorConfig children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], - }) - : name === "margin" + }) : name === "borderStyle" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], }) - : (name === "padding" || - name === "containerheaderpadding" || - name === "containerfooterpadding" || - name === "containerbodypadding") + : name === "margin" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], }) - : name === "textSize" || - name === "padding" || + : name === "padding" || name === "containerHeaderPadding" || + name === "containerSiderPadding" || name === "containerFooterPadding" || name === "containerBodyPadding" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], }) - : name === "textWeight" + : name === "textSize" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], }) - : name === "fontFamily" + : name === "textWeight" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], }) - : name === "fontStyle" + : name === "fontFamily" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], - }) - : name === "backgroundImage" || name === "headerBackgroundImage" || name === "footerBackgroundImage" + }) : name === "textDecoration" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], - }) - : name === "backgroundImageRepeat" || name === "headerBackgroundImageRepeat" || name === "footerBackgroundImageRepeat" + }) : name === "textTransform" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], }) - : name === "backgroundImageSize" || name === "headerBackgroundImageSize" || name === "footerBackgroundImageSize" + : name === "fontStyle" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], }) - : name === "backgroundImagePosition" || name === "headerBackgroundImagePosition" || name === "footerBackgroundImagePosition" + : name === "backgroundImage" || name === "headerBackgroundImage" || name === "footerBackgroundImage" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], }) - : name === "backgroundImageOrigin" || name === "headerBackgroundImageOrigin" || name === "footerBackgroundImageOrigin" + : name === "backgroundImageRepeat" || name === "headerBackgroundImageRepeat" || name === "footerBackgroundImageRepeat" ? ( children[name] as InstanceType ).propertyView({ label: config.label, - preInputNode: , + preInputNode: , placeholder: props[name], }) - : children[name].propertyView({ - label: config.label, - panelDefaultColor: props[name], - // isDep: isDepColorConfig(config), - isDep: true, - depMsg: depMsg, - }) + : name === "rotation" + ? ( + children[name] as InstanceType + ).propertyView({ + label: config.label, + preInputNode: , + placeholder: props[name], + }) + : children[name].propertyView({ + label: config.label, + panelDefaultColor: props[name], + // isDep: isDepColorConfig(config), + isDep: true, + depMsg: depMsg, + }) } -
); })} diff --git a/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx b/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx index 1241ae070..1d5957332 100644 --- a/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx +++ b/client/packages/lowcoder/src/comps/controls/styleControlConstants.tsx @@ -23,6 +23,10 @@ export type BorderWidthConfig = CommonColorConfig & { readonly borderWidth: string; }; +export type RotationConfig = CommonColorConfig & { + readonly rotation: string; +}; + export type BackgroundImageConfig = CommonColorConfig & { readonly backgroundImage: string; }; export type BackgroundImageRepeatConfig = CommonColorConfig & { readonly backgroundImageRepeat: string; }; export type BackgroundImageSizeConfig = CommonColorConfig & { readonly backgroundImageSize: string; }; @@ -35,6 +39,12 @@ export type HeaderBackgroundImageSizeConfig = CommonColorConfig & { readonly hea export type HeaderBackgroundImagePositionConfig = CommonColorConfig & { readonly headerBackgroundImagePosition: string; }; export type HeaderBackgroundImageOriginConfig = CommonColorConfig & { readonly headerBackgroundImageOrigin: string; }; +export type SiderBackgroundImageConfig = CommonColorConfig & { readonly siderBackgroundImage: string; }; +export type SiderBackgroundImageRepeatConfig = CommonColorConfig & { readonly siderBackgroundImageRepeat: string; }; +export type SiderBackgroundImageSizeConfig = CommonColorConfig & { readonly siderBackgroundImageSize: string; }; +export type SiderBackgroundImagePositionConfig = CommonColorConfig & { readonly siderBackgroundImagePosition: string; }; +export type SiderBackgroundImageOriginConfig = CommonColorConfig & { readonly siderBackgroundImageOrigin: string; }; + export type FooterBackgroundImageConfig = CommonColorConfig & { readonly footerBackgroundImage: string; }; export type FooterBackgroundImageRepeatConfig = CommonColorConfig & { readonly footerBackgroundImageRepeat: string; }; export type FooterBackgroundImageSizeConfig = CommonColorConfig & { readonly footerBackgroundImageSize: string; }; @@ -63,7 +73,10 @@ export type borderStyleConfig = CommonColorConfig & { export type ContainerHeaderPaddingConfig = CommonColorConfig & { readonly containerHeaderPadding: string; +}; +export type ContainerSiderPaddingConfig = CommonColorConfig & { + readonly containerSiderPadding: string; }; export type ContainerBodyPaddingConfig = CommonColorConfig & { @@ -97,7 +110,7 @@ export type DepColorConfig = CommonColorConfig & { transformer: (color: string, ...rest: string[]) => string; }; -export type SingleColorConfig = SimpleColorConfig | DepColorConfig | RadiusConfig | BorderWidthConfig | borderStyleConfig | BackgroundImageConfig | BackgroundImageRepeatConfig | BackgroundImageSizeConfig | BackgroundImagePositionConfig | BackgroundImageOriginConfig | TextSizeConfig | TextWeightConfig | TextTransformConfig | TextDecorationConfig | FontFamilyConfig | FontStyleConfig | MarginConfig | PaddingConfig | ContainerHeaderPaddingConfig | ContainerFooterPaddingConfig | ContainerBodyPaddingConfig | HeaderBackgroundImageConfig | HeaderBackgroundImageRepeatConfig | HeaderBackgroundImageSizeConfig | HeaderBackgroundImagePositionConfig | HeaderBackgroundImageOriginConfig | FooterBackgroundImageConfig | FooterBackgroundImageRepeatConfig | FooterBackgroundImageSizeConfig | FooterBackgroundImagePositionConfig | FooterBackgroundImageOriginConfig; +export type SingleColorConfig = SimpleColorConfig | DepColorConfig | RadiusConfig | BorderWidthConfig | RotationConfig | borderStyleConfig | BackgroundImageConfig | BackgroundImageRepeatConfig | BackgroundImageSizeConfig | BackgroundImagePositionConfig | BackgroundImageOriginConfig | TextSizeConfig | TextWeightConfig | TextTransformConfig | TextDecorationConfig | FontFamilyConfig | FontStyleConfig | MarginConfig | PaddingConfig | ContainerHeaderPaddingConfig | ContainerSiderPaddingConfig | ContainerFooterPaddingConfig | ContainerBodyPaddingConfig | HeaderBackgroundImageConfig | HeaderBackgroundImageRepeatConfig | HeaderBackgroundImageSizeConfig | HeaderBackgroundImagePositionConfig | HeaderBackgroundImageOriginConfig | FooterBackgroundImageConfig | FooterBackgroundImageRepeatConfig | FooterBackgroundImageSizeConfig | FooterBackgroundImagePositionConfig | FooterBackgroundImageOriginConfig | SiderBackgroundImageConfig | SiderBackgroundImageRepeatConfig | SiderBackgroundImageSizeConfig | SiderBackgroundImagePositionConfig | SiderBackgroundImageOriginConfig; export const defaultTheme: ThemeDetail = { primary: "#3377FF", @@ -207,7 +220,7 @@ export function handleToHeadBg(color: string) { return darkenColor(color, 0.06); } if (toHex(color) === "#000000") { - return SECOND_SURFACE_COLOR; + return SURFACE_COLOR; } if (isDarkColor(color)) { return darkenColor(color, 0.06); @@ -294,6 +307,12 @@ const VALIDATE = { const ACCENT_VALIDATE = [ACCENT, VALIDATE] as const; +const ROTATION = { + name: "rotation", + label: "Rotation", + rotation: "rotation", +} as const; + const BORDER = { name: "border", label: trans("style.border"), @@ -391,6 +410,12 @@ const CONTAINER_HEADER_PADDING = { containerHeaderPadding: "padding", } as const; +const CONTAINER_SIDER_PADDING = { + name: "containerSiderPadding", + label: trans("style.containerSiderPadding"), + containerSiderPadding: "padding", +} as const; + const CONTAINER_FOOTER_PADDING = { name: "containerFooterPadding", label: trans("style.containerFooterPadding"), @@ -407,13 +432,19 @@ const TEXT_TRANSFORM = { name: "textTransform", label: trans("style.textTransform"), textTransform: "textTransform" -} +} as const; const TEXT_DECORATION = { name: "textDecoration", label: trans("style.textDecoration"), textDecoration: "textDecoration" -} +} as const; + +const BORDER_STYLE = { + name: "borderStyle", + label: trans("style.borderStyle"), + borderStyle: "borderStyle" +} as const; const getStaticBorder = (color: string = SECOND_SURFACE_COLOR) => ({ @@ -430,8 +461,19 @@ const HEADER_BACKGROUND = { transformer: toSelf, } as const; +const SIDER_BACKGROUND = { + name: "siderBackground", + label: trans("style.siderBackground"), + depName: "background", + depType: DEP_TYPE.SELF, + transformer: toSelf, +} as const; + const BG_STATIC_BORDER_RADIUS = [getBackground(), getStaticBorder(), RADIUS] as const; + const STYLING_FIELDS_SEQUENCE = [ + MARGIN, + PADDING, TEXT, TEXT_TRANSFORM, TEXT_DECORATION, @@ -440,11 +482,20 @@ const STYLING_FIELDS_SEQUENCE = [ FONT_FAMILY, FONT_STYLE, BORDER, + BORDER_STYLE, + RADIUS, + BORDER_WIDTH, + ROTATION, +] + +const STYLING_FIELDS_CONTAINER_SEQUENCE = [ MARGIN, PADDING, + BORDER, + BORDER_STYLE, RADIUS, BORDER_WIDTH, -] +]; const FILL = { name: "fill", @@ -623,6 +674,36 @@ export const ContainerHeaderStyle = [ }, ] as const; +export const ContainerSiderStyle = [ + CONTAINER_SIDER_PADDING, + SIDER_BACKGROUND, + { + name: "siderBackgroundImage", + label: trans("style.backgroundImage"), + siderBackgroundImage: "siderBackgroundImage", + }, + { + name: "siderBackgroundImageRepeat", + label: trans("style.backgroundImageRepeat"), + siderBackgroundImageRepeat: "siderBackgroundImageRepeat", + }, + { + name: "siderBackgroundImageSize", + label: trans("style.backgroundImageSize"), + siderBackgroundImageSize: "siderBackgroundImageSize", + }, + { + name: "siderBackgroundImagePosition", + label: trans("style.backgroundImagePosition"), + siderBackgroundImagePosition: "siderBackgroundImagePosition", + } + , { + name: "siderBackgroundImageOrigin", + label: trans("style.backgroundImageOrigin"), + siderBackgroundImageOrigin: "siderBackgroundImageOrigin", + }, +] as const; + export const ContainerBodyStyle = [ CONTAINER_BODY_PADDING, { @@ -696,7 +777,6 @@ export const ContainerFooterStyle = [ ] as const; export const SliderStyle = [ - LABEL, FILL, { name: "thumbBorder", @@ -716,14 +796,115 @@ export const SliderStyle = [ ] as const; export const InputLikeStyle = [ + getStaticBackground(SURFACE_COLOR), + ...STYLING_FIELDS_SEQUENCE, + ...ACCENT_VALIDATE, +] as const; + +// added by Mousheng + +export const ColorPickerStyle = [ LABEL, getStaticBackground(SURFACE_COLOR), ...STYLING_FIELDS_SEQUENCE, ...ACCENT_VALIDATE, ] as const; +export const AvatarStyle = [ + { + name: "background", + label: trans("avatarComp.avatarBackground"), + color: '#bfbfbf', + }, + FILL, +] as const; + +export const avatarContainerStyle = [ + getStaticBackground(SURFACE_COLOR), + ...STYLING_FIELDS_CONTAINER_SEQUENCE +] as const; + +export const avatarLabelStyle = [ + getStaticBackground(SURFACE_COLOR), + ...STYLING_FIELDS_SEQUENCE +] as const; + +export const avatarGroupStyle = [ + { + name: "fill", + label: trans("style.fill"), + color: '#FFFFFF', + }, + getBackground("primary"), +] as const; + +export const BadgeStyle = [ + { + name: "badgeColor", + label: trans("floatButton.badgeColor"), + color: "#ff4d4f", + }, +] as const; + +export const FloatButtonStyle = [ + getStaticBackground(SURFACE_COLOR), + BORDER, + BORDER_STYLE, + BORDER_WIDTH, +] as const; + +export const TransferStyle = [ + getStaticBackground(SURFACE_COLOR), + ...STYLING_FIELDS_CONTAINER_SEQUENCE +] as const; + +export const CardStyle = [ + getStaticBackground("#ffffff"), + { + name: "IconColor", + label: trans("card.IconColor"), + color: "#000000", + }, + { + name: "activateColor", + label: trans("card.hoverColor"), + depTheme: "primary", + depType: DEP_TYPE.SELF, + transformer: toSelf, + }, + CONTAINER_BODY_PADDING, + ...STYLING_FIELDS_CONTAINER_SEQUENCE +] as const; + +export const CardHeaderStyle = [ + getStaticBackground(SURFACE_COLOR), + ...STYLING_FIELDS_SEQUENCE, +] as const; + +export const timerStyle = [ + getBackground("primarySurface"), + ...STYLING_FIELDS_SEQUENCE +] as const; + +export const startButtonStyle = [ + getBackground("primarySurface"), + ...STYLING_FIELDS_SEQUENCE +] as const + +// end + +export const LabelStyle = [ + ...replaceAndMergeMultipleStyles([...InputLikeStyle], 'text', [LABEL]).filter((style) => style.name !== 'radius' && style.name !== 'background') +] + +export const InputFieldStyle = [ + getStaticBackground(SURFACE_COLOR), + getStaticBorder(), + ...STYLING_FIELDS_CONTAINER_SEQUENCE.filter((style) => ['border'].includes(style.name) === false), + // ...STYLING_FIELDS_CONTAINER_SEQUENCE, +] as const; + export const RatingStyle = [ - LABEL, { name: "checked", label: trans("style.checked"), @@ -739,7 +920,6 @@ export const RatingStyle = [ ] as const; export const SwitchStyle = [ - LABEL, { name: "handle", label: trans("style.handle"), @@ -798,22 +978,21 @@ export const MultiSelectStyle = [ ...ACCENT_VALIDATE, ] as const; +export const ChildrenMultiSelectStyle = [ + ...STYLING_FIELDS_SEQUENCE, + getStaticBackground(SURFACE_COLOR) +] as const; + export const TabContainerStyle = [ // Keep background related properties of container as STYLING_FIELDS_SEQUENCE has rest of the properties - ...replaceAndMergeMultipleStyles([...ContainerStyle.filter((style)=> ['border','radius','borderWidth','margin','padding'].includes(style.name) === false),...STYLING_FIELDS_SEQUENCE], 'text', [{ + ...replaceAndMergeMultipleStyles([...ContainerStyle.filter((style) => ['border', 'radius', 'borderWidth', 'margin', 'padding'].includes(style.name) === false), ...STYLING_FIELDS_SEQUENCE], 'text', [{ name: "tabText", label: trans("style.tabText"), depName: "headerBackground", - depType: DEP_TYPE.CONTRAST_TEXT, - transformer: contrastText, - },]), - { - name: "accent", - label: trans("style.tabAccent"), - depTheme: "primary", - depType: DEP_TYPE.SELF, + depType: TEXT, transformer: toSelf, - }, + },]), + ACCENT ] as const; export const ModalStyle = [ @@ -829,7 +1008,6 @@ export const ModalStyle = [ ] as const; export const CascaderStyle = [ - LABEL, ...getStaticBgBorderRadiusByBg(SURFACE_COLOR, "pc"), TEXT, ACCENT, @@ -861,7 +1039,7 @@ function checkAndUncheck() { } export const CheckboxStyle = [ - ...replaceAndMergeMultipleStyles(STYLING_FIELDS_SEQUENCE, 'text', [LABEL, STATIC_TEXT, VALIDATE]).filter((style) => style.name !== 'border'), + ...replaceAndMergeMultipleStyles(STYLING_FIELDS_SEQUENCE, 'text', [STATIC_TEXT, VALIDATE]).filter((style) => style.name !== 'border'), ...checkAndUncheck(), { name: "checked", @@ -874,7 +1052,7 @@ export const CheckboxStyle = [ ] as const; export const RadioStyle = [ - ...replaceAndMergeMultipleStyles(STYLING_FIELDS_SEQUENCE, 'text', [LABEL, STATIC_TEXT, VALIDATE]).filter((style) => style.name !== 'border' && style.name !== 'radius'), + ...replaceAndMergeMultipleStyles(STYLING_FIELDS_SEQUENCE, 'text', [STATIC_TEXT, VALIDATE]).filter((style) => style.name !== 'border' && style.name !== 'radius'), ...checkAndUncheck(), { name: "checked", @@ -886,20 +1064,35 @@ export const RadioStyle = [ HOVER_BACKGROUND_COLOR ] as const; + export const SegmentStyle = [ LABEL, - ...STYLING_FIELDS_SEQUENCE.filter((style)=> ['border','borderWidth'].includes(style.name) === false), + ...STYLING_FIELDS_SEQUENCE.filter((style) => ['border', 'borderWidth'].includes(style.name) === false), + // getStaticBorder(SECOND_SURFACE_COLOR), + { + name: "border", + label: trans("style.border"), + depName: "background", + transformer: backgroundToBorder, + }, + { + name: "borderWidth", + label: trans("style.borderWidth"), + borderWidth: "borderWidth", + }, + + getStaticBackground(SURFACE_COLOR), { name: "indicatorBackground", label: trans("style.indicatorBackground"), color: SURFACE_COLOR, }, - { - name: "background", - label: trans("style.background"), - depName: "indicatorBackground", - transformer: handleToSegmentBackground, - }, + // { + // name: "background", + // label: trans("style.background"), + // depName: "indicatorBackground", + // transformer: toSelf, + // }, { name: "text", label: trans("text"), @@ -907,9 +1100,53 @@ export const SegmentStyle = [ depType: DEP_TYPE.CONTRAST_TEXT, transformer: contrastText, }, + VALIDATE, ] as const; +export const StepsStyle = [ + { + name: "activeBackground", + label: trans("style.accent"), + depName: "activeBackground", + transformer: handleToSegmentBackground, + }, + { + name: "titleText", + label: trans("title"), + depName: "text", + depType: DEP_TYPE.SELF, + transformer: contrastText, + }, + ...STYLING_FIELDS_SEQUENCE.filter((style) => ['background', 'textSize','textDecoration'].includes(style.name) === false), + getBackground(), + { + name: "backgroundImage", + label: trans("style.backgroundImage"), + backgroundImage: "backgroundImage", + }, + { + name: "backgroundImageRepeat", + label: trans("style.backgroundImageRepeat"), + backgroundImageRepeat: "backgroundImageRepeat", + }, + { + name: "backgroundImageSize", + label: trans("style.backgroundImageSize"), + backgroundImageSize: "backgroundImageSize", + }, + { + name: "backgroundImagePosition", + label: trans("style.backgroundImagePosition"), + backgroundImagePosition: "backgroundImagePosition", + }, + { + name: "backgroundImageOrigin", + label: trans("style.backgroundImageOrigin"), + backgroundImageOrigin: "backgroundImageOrigin", + }, +] as const; + const LinkTextStyle = [ { name: "text", @@ -935,12 +1172,9 @@ const LinkTextStyle = [ export const TableStyle = [ MARGIN, PADDING, + BORDER_STYLE, + BORDER_WIDTH, ...BG_STATIC_BORDER_RADIUS, - { - name: "borderWidth", - label: trans("style.borderWidth"), - borderWidth: "borderWidth", - }, ] as const; export const TableToolbarStyle = [ @@ -962,10 +1196,12 @@ export const TableHeaderStyle = [ FONT_FAMILY, FONT_STYLE, TEXT, + getStaticBackground(SURFACE_COLOR), + getBackground('primarySurface'), { name: "headerBackground", label: trans("style.tableHeaderBackground"), - depName: "headerBackground", + depName: "background", transformer: handleToHeadBg, }, getStaticBorder(), @@ -987,6 +1223,9 @@ export const TableHeaderStyle = [ ] as const; export const TableRowStyle = [ + BORDER_WIDTH, + BORDER_STYLE, + ...BG_STATIC_BORDER_RADIUS, getBackground(), { name: "selectedRowBackground", @@ -1014,7 +1253,7 @@ export const TableColumnStyle = [ getStaticBackground("#00000000"), getStaticBorder(), MARGIN, - BORDER_WIDTH, + RADIUS, TEXT, TEXT_SIZE, @@ -1046,11 +1285,13 @@ export const FileViewerStyle = [ export const IframeStyle = [getBackground(), getStaticBorder("#00000000"), RADIUS, BORDER_WIDTH, MARGIN, PADDING] as const; export const DateTimeStyle = [ - LABEL, ...getStaticBgBorderRadiusByBg(SURFACE_COLOR), + getStaticBorder(SECOND_SURFACE_COLOR), TEXT, MARGIN, PADDING, + BORDER_STYLE, + BORDER_WIDTH, ...ACCENT_VALIDATE, ] as const; @@ -1075,11 +1316,11 @@ export const LinkStyle = [ ] as const; export const DividerStyle = [ - { + /* { name: "color", label: trans("color"), - color: lightenColor(SECOND_SURFACE_COLOR, 0.05), - }, + color: darkenColor(SECOND_SURFACE_COLOR, 0.1), + }, */ ...STYLING_FIELDS_SEQUENCE.map((style) => { if (style.name === 'text') { return { @@ -1144,11 +1385,11 @@ export const ImageStyle = [getStaticBorder("#00000000"), RADIUS, BORDER_WIDTH, M export const IconStyle = [ getStaticBackground("#00000000"), - getStaticBorder("#00000000"), + getStaticBorder("#00000000"), FILL, RADIUS, BORDER_WIDTH, - MARGIN, + MARGIN, PADDING] as const; export const ListViewStyle = BG_STATIC_BORDER_RADIUS; @@ -1192,7 +1433,6 @@ export const TimeLineStyle = [ ] as const; export const TreeStyle = [ - LABEL, ...getStaticBgBorderRadiusByBg(SURFACE_COLOR), TEXT, VALIDATE, @@ -1204,6 +1444,10 @@ export const DrawerStyle = [getBackground()] as const export const JsonEditorStyle = [LABEL] as const; +export const EchartsStyle = [ + getBackground("primarySurface"), +] as const; + export const CalendarStyle = [ getBackground("primarySurface"), { @@ -1249,7 +1493,6 @@ export const CalendarStyle = [ ] as const; export const SignatureStyle = [ - LABEL, ...getBgBorderRadiusByBg(), { name: "pen", @@ -1371,25 +1614,44 @@ export const RichTextEditorStyle = [ BORDER_WIDTH ] as const; +export type QRCodeStyleType = StyleConfigType; +export type AvatarStyleType = StyleConfigType; +export type AvatarLabelStyleType = StyleConfigType; +export type AvatarContainerStyleType = StyleConfigType; +export type AvatarGroupStyleType = StyleConfigType; +export type FloatButtonStyleType = StyleConfigType; +export type BadgeStyleType = StyleConfigType; +export type TransferStyleType = StyleConfigType; +export type CardStyleType = StyleConfigType; +export type CardHeaderStyleType = StyleConfigType; +export type timerStyleType = StyleConfigType; +export type StartButtonStyleType = StyleConfigType; + +export type LabelStyleType = StyleConfigType; export type InputLikeStyleType = StyleConfigType; +export type InputFieldStyleType = StyleConfigType; +export type ColorPickerStyleType = StyleConfigType; export type ButtonStyleType = StyleConfigType; export type ToggleButtonStyleType = StyleConfigType; export type TextStyleType = StyleConfigType; export type ContainerStyleType = StyleConfigType; export type ContainerHeaderStyleType = StyleConfigType; export type ContainerBodyStyleType = StyleConfigType; +export type ContainerSiderStyleType = StyleConfigType; export type ContainerFooterStyleType = StyleConfigType; export type SliderStyleType = StyleConfigType; export type RatingStyleType = StyleConfigType; export type SwitchStyleType = StyleConfigType; export type SelectStyleType = StyleConfigType; export type MultiSelectStyleType = StyleConfigType; +export type ChildrenMultiSelectStyleType = StyleConfigType; export type TabContainerStyleType = StyleConfigType; export type ModalStyleType = StyleConfigType; export type CascaderStyleType = StyleConfigType; export type CheckboxStyleType = StyleConfigType; export type RadioStyleType = StyleConfigType; export type SegmentStyleType = StyleConfigType; +export type StepsStyleType = StyleConfigType; export type TableStyleType = StyleConfigType; export type TableHeaderStyleType = StyleConfigType; export type TableToolbarStyleType = StyleConfigType; diff --git a/client/packages/lowcoder/src/comps/controls/tourStepControl.tsx b/client/packages/lowcoder/src/comps/controls/tourStepControl.tsx new file mode 100644 index 000000000..86e10f337 --- /dev/null +++ b/client/packages/lowcoder/src/comps/controls/tourStepControl.tsx @@ -0,0 +1,427 @@ +import { ArrowControl, BoolCodeControl, MaskControl, StringControl } from "comps/controls/codeControl"; +import { dropdownControl } from "comps/controls/dropdownControl"; +import { MultiCompBuilder, withDefault } from "comps/generators"; +import { list } from "comps/generators/list"; +import { ToViewReturn } from "comps/generators/multi"; +import { genRandomKey } from "comps/utils/idGenerator"; +import { hiddenPropertyView } from "comps/utils/propertyUtils"; +import { trans } from "i18n"; +import { mapValues } from "lodash"; +import { + Comp, + CompParams, + ConstructorToDataType, + ConstructorToView, + fromRecord, + MultiBaseComp, + SimpleAbstractComp, + withFunction +} from "lowcoder-core"; +import { controlItem, Dropdown, Option, OptionsType, ValueFromOption } from "lowcoder-design"; +import { getNextEntityName } from "util/stringUtils"; +import { BoolControl, ControlParams } from "lowcoder-sdk"; +import { ReactNode, useContext, useEffect, useState } from "react"; +import { EditorContext, EditorState } from "@lowcoder-ee/comps/editorState"; +import { PlacementOptions, TypeOptions } from "@lowcoder-ee/comps/comps/tourComp/tourControlConstants"; +import { + TourPlacementTooltip, + TourStepArrowTooltip, + TourStepMaskTooltip +} from "@lowcoder-ee/comps/comps/tourComp/tourTooltips"; + +// All options must contain label +type OptionChildType = { label: InstanceType }; +type OptionControlParam = { + // list title + title?: string; + // The new option's label name + newOptionLabel?: string; +}; + +type OptionPropertyParam = { + autoMap?: boolean; +}; + +interface TourStepCompProperty { + propertyView(param: OptionPropertyParam): React.ReactNode; +} + +function hasPropertyView(comp: any): comp is TourStepCompProperty { + return !!(comp as any).propertyView; +} + +// Add dataIndex to each comp, required for drag and drop sorting +function withDataIndex(VariantComp: T) { + // @ts-ignore + class WithDataIndexComp extends VariantComp { + dataIndex: string = genRandomKey(); + + getDataIndex() { + return this.dataIndex; + } + } + + return WithDataIndexComp as new ( + params: CompParams> + ) => WithDataIndexComp; +} + +// Deduplication, the same value takes the first one +function distinctValue>(data: T[], uniqField: keyof T) { + if (!data || data.length <= 0) { + return data; + } + const result: T[] = []; + data.reduce((uniqValSet, item) => { + const uniqVal = item[uniqField]; + if (!uniqValSet.has(uniqVal)) { + result.push(item); + } + uniqValSet.add(uniqVal); + return uniqValSet; + }, new Set()); + return result; +} + +type PickNumberFields = { + [key in keyof T]: T[key] extends number ? T[key] : never; +}; + +// Manually add options +export function manualTourStepsControl( + VariantComp: T, + config: { + // init value + initOptions?: ConstructorToDataType[]; + // Unique value field, used to deduplicate + uniqField?: keyof ConstructorToView; + // auto-increment field + autoIncField?: keyof PickNumberFields>; + } +) { + type OptionDataType = ConstructorToDataType; + const ManualComp = list(withDataIndex(VariantComp)); + const TmpManualOptionControl = new MultiCompBuilder( + { + manual: ManualComp, + }, + (props) => { + const view = props.manual.map((m) => m.getView()); + return config.uniqField ? distinctValue(view, config.uniqField) : view; + } + ) + .setPropertyViewFn(() => { + throw new Error("Method not implemented."); + }) + .build(); + + class ManualOptionControl extends TmpManualOptionControl { + exposingNode() { + return withFunction( + fromRecord( + mapValues(this.children.manual.children, (c1) => + fromRecord(mapValues(c1.children, (c2) => c2.exposingNode())) + ) + ), + (params) => Object.values(params) + ); + } + + private getNewId(): number { + const { autoIncField } = config; + if (!autoIncField) return 0; + const view = this.children.manual.getView().map((m) => m.getView()); + const ids = new Set(view.map((tab) => tab[autoIncField])); + let id = 0; + while (ids.has(id)) ++id; + return id; + } + + propertyView(param: OptionControlParam) { + const manualComp = this.children.manual; + const { autoIncField } = config; + const title = param.title ?? trans("tour.section1Subtitle"); + + return controlItem( + { filterText: title }, +