`s get reset. However, we also reset the
+// bottom margin to use `em` units instead of `em`.
+p {
+ margin-top: 0;
+ margin-bottom: 1em;
+}
+
+// Abbreviations
+//
+// 1. remove the bottom border in Firefox 39-.
+// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+// 3. Add explicit cursor to indicate changed behavior.
+// 4. Duplicate behavior to the data-* attribute for our tooltip plugin
+
+abbr[title],
+abbr[data-original-title] {
+ // 4
+ text-decoration: underline; // 2
+ text-decoration: underline dotted; // 2
+ border-bottom: 0; // 1
+ cursor: help; // 3
+}
+
+address {
+ margin-bottom: 1em;
+ font-style: normal;
+ line-height: inherit;
+}
+
+input[type='text'],
+input[type='password'],
+input[type='number'],
+textarea {
+ -webkit-appearance: none;
+}
+
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1em;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
+}
+
+dt {
+ font-weight: 500;
+}
+
+dd {
+ margin-bottom: 0.5em;
+ margin-left: 0; // Undo browser default
+}
+
+blockquote {
+ margin: 0 0 1em;
+}
+
+dfn {
+ font-style: italic; // Add the correct font style in Android 4.3-
+}
+
+b,
+strong {
+ font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari
+}
+
+small {
+ font-size: 80%; // Add the correct font size in all browsers
+}
+
+//
+// Prevent `sub` and `sup` elements from affecting the line height in
+// all browsers.
+//
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+//
+// Links
+//
+
+a {
+ color: @link-color;
+ text-decoration: @link-decoration;
+ background-color: transparent; // remove the gray background on active links in IE 10.
+ outline: none;
+ cursor: pointer;
+ transition: color 0.3s;
+ -webkit-text-decoration-skip: objects; // remove gaps in links underline in iOS 8+ and Safari 8+.
+
+ &:hover {
+ color: @link-hover-color;
+ }
+
+ &:active {
+ color: @link-active-color;
+ }
+
+ &:active,
+ &:hover {
+ text-decoration: @link-hover-decoration;
+ outline: 0;
+ }
+
+ // https://github.com/ant-design/ant-design/issues/22503
+ &:focus {
+ text-decoration: @link-focus-decoration;
+ outline: @link-focus-outline;
+ }
+
+ &[disabled] {
+ color: @disabled-color;
+ cursor: not-allowed;
+ }
+}
+
+//
+// Code
+//
+
+pre,
+code,
+kbd,
+samp {
+ font-size: 1em; // Correct the odd `em` font sizing in all browsers.
+ font-family: @code-family;
+}
+
+pre {
+ // remove browser default top margin
+ margin-top: 0;
+ // Reset browser default of `1em` to use `em`s
+ margin-bottom: 1em;
+ // Don't allow content to break outside
+ overflow: auto;
+}
+
+//
+// Figures
+//
+figure {
+ // Apply a consistent margin strategy (matches our type styles).
+ margin: 0 0 1em;
+}
+
+//
+// Images and content
+//
+
+img {
+ vertical-align: middle;
+ border-style: none; // remove the border on images inside links in IE 10-.
+}
+
+// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property.
+//
+// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11
+// DON'T remove the click delay when ` ` is present.
+// However, they DO support emoving the click delay via `touch-action: manipulation`.
+// See:
+// * https://getbootstrap.com/docs/4.0/content/reboot/#click-delay-optimization-for-touch
+// * http://caniuse.com/#feat=css-touch-action
+// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay
+
+a,
+area,
+button,
+[role='button'],
+input:not([type='range']),
+label,
+select,
+summary,
+textarea {
+ touch-action: manipulation;
+}
+
+//
+// Tables
+//
+
+table {
+ border-collapse: collapse; // Prevent double borders
+}
+
+caption {
+ padding-top: 0.75em;
+ padding-bottom: 0.3em;
+ color: @text-color-secondary;
+ text-align: left;
+ caption-side: bottom;
+}
+
+//
+// Forms
+//
+
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0; // remove the margin in Firefox and Safari
+ color: inherit;
+ font-size: inherit;
+ font-family: inherit;
+ line-height: inherit;
+}
+
+button,
+input {
+ overflow: visible; // Show the overflow in Edge
+}
+
+button,
+select {
+ text-transform: none; // remove the inheritance of text transform in Firefox
+}
+
+// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
+// controls in Android 4.
+// 2. Correct the inability to style clickable types in iOS and Safari.
+button,
+@{html-selector} [type="button"], /* 1 */
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button; // 2
+}
+
+// remove inner border and padding from Firefox, but don't restore the outline like Normalize.
+button::-moz-focus-inner,
+[type='button']::-moz-focus-inner,
+[type='reset']::-moz-focus-inner,
+[type='submit']::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+input[type='radio'],
+input[type='checkbox'] {
+ box-sizing: border-box; // 1. Add the correct box sizing in IE 10-
+ padding: 0; // 2. remove the padding in IE 10-
+}
+
+input[type='date'],
+input[type='time'],
+input[type='datetime-local'],
+input[type='month'] {
+ // remove the default appearance of temporal inputs to avoid a Mobile Safari
+ // bug where setting a custom line-height prevents text from being vertically
+ // centered within the input.
+ // See https://bugs.webkit.org/show_bug.cgi?id=139848
+ // and https://github.com/twbs/bootstrap/issues/11266
+ -webkit-appearance: listbox;
+}
+
+textarea {
+ overflow: auto; // remove the default vertical scrollbar in IE.
+ // Textareas should really only resize vertically so they don't break their (horizontal) containers.
+ resize: vertical;
+}
+
+fieldset {
+ // Browsers set a default `min-width: min-content;` on fieldsets,
+ // unlike e.g. `
`s, which have `min-width: 0;` by default.
+ // So we reset that to ensure fieldsets behave more like a standard block element.
+ // See https://github.com/twbs/bootstrap/issues/12359
+ // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
+ min-width: 0;
+ margin: 0;
+ // Reset the default outline behavior of fieldsets so they don't affect page layout.
+ padding: 0;
+ border: 0;
+}
+
+// 1. Correct the text wrapping in Edge and IE.
+// 2. Correct the color inheritance from `fieldset` elements in IE.
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%; // 1
+ margin-bottom: 0.5em;
+ padding: 0;
+ color: inherit; // 2
+ font-size: 1.5em;
+ line-height: inherit;
+ white-space: normal; // 1
+}
+
+progress {
+ vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.
+}
+
+// Correct the cursor style of incement and decement buttons in Chrome.
+[type='number']::-webkit-inner-spin-button,
+[type='number']::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type='search'] {
+ // This overrides the extra rounded corners on search inputs in iOS so that our
+ // `.form-control` class can properly style them. Note that this cannot simply
+ // be added to `.form-control` as it's not specific enough. For details, see
+ // https://github.com/twbs/bootstrap/issues/11586.
+ outline-offset: -2px; // 2. Correct the outline style in Safari.
+ -webkit-appearance: none;
+}
+
+//
+// remove the inner padding and cancel buttons in Chrome and Safari on macOS.
+//
+
+[type='search']::-webkit-search-cancel-button,
+[type='search']::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+//
+// 1. Correct the inability to style clickable types in iOS and Safari.
+// 2. Change font properties to `inherit` in Safari.
+//
+
+::-webkit-file-upload-button {
+ font: inherit; // 2
+ -webkit-appearance: button; // 1
+}
+
+//
+// Correct element displays
+//
+
+output {
+ display: inline-block;
+}
+
+summary {
+ display: list-item; // Add the correct display in all browsers
+}
+
+template {
+ display: none; // Add the correct display in IE
+}
+
+// Always hide an element with the `hidden` HTML attribute (from PureCSS).
+// Needed for proper display in IE 10-.
+[hidden] {
+ display: none !important;
+}
+
+mark {
+ padding: 0.2em;
+ background-color: @yellow-1;
+}
+
+::selection {
+ color: @text-color-inverse;
+ background: @text-selection-bg;
+}
+
+// Utility classes
+.clearfix {
+ .clearfix();
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/core/iconfont.less b/webapp/packages/supersonic-fe/src/assets/style/core/iconfont.less
new file mode 100644
index 000000000..597b8549e
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/core/iconfont.less
@@ -0,0 +1,22 @@
+@import '../themes/index';
+@import '../mixins/iconfont';
+
+.@{iconfont-css-prefix} {
+ .iconfont-mixin();
+
+ // https://github.com/ant-design/ant-design/issues/33703
+ & > & {
+ line-height: 0;
+ vertical-align: 0;
+ }
+
+ &[tabindex] {
+ cursor: pointer;
+ }
+}
+
+.@{iconfont-css-prefix}-spin,
+.@{iconfont-css-prefix}-spin::before {
+ display: inline-block;
+ animation: loadingCircle 1s infinite linear;
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/core/index.less b/webapp/packages/supersonic-fe/src/assets/style/core/index.less
new file mode 100644
index 000000000..c493947e8
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/core/index.less
@@ -0,0 +1,5 @@
+@import '../mixins/index';
+@import 'base';
+@import 'global';
+@import 'iconfont';
+@import 'motion';
diff --git a/webapp/packages/supersonic-fe/src/assets/style/core/motion.less b/webapp/packages/supersonic-fe/src/assets/style/core/motion.less
new file mode 100644
index 000000000..286d50eba
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/core/motion.less
@@ -0,0 +1,22 @@
+// @import '../mixins/motion'; This has moved to theme/xxx inside.
+@import 'motion/fade';
+@import 'motion/move';
+@import 'motion/other';
+@import 'motion/slide';
+@import 'motion/zoom';
+
+// For common/openAnimation
+.ant-motion-collapse-legacy {
+ overflow: hidden;
+
+ &-active {
+ transition: height @animation-duration-base @ease-in-out,
+ opacity @animation-duration-base @ease-in-out !important;
+ }
+}
+
+.ant-motion-collapse {
+ overflow: hidden;
+ transition: height @animation-duration-base @ease-in-out,
+ opacity @animation-duration-base @ease-in-out !important;
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/core/motion/fade.less b/webapp/packages/supersonic-fe/src/assets/style/core/motion/fade.less
new file mode 100644
index 000000000..f4a9513bc
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/core/motion/fade.less
@@ -0,0 +1,34 @@
+.fade-motion(@className, @keyframeName) {
+ @name: ~'@{ant-prefix}-@{className}';
+ .make-motion(@name, @keyframeName);
+ .@{name}-enter,
+ .@{name}-appear {
+ opacity: 0;
+ animation-timing-function: linear;
+ }
+ .@{name}-leave {
+ animation-timing-function: linear;
+ }
+}
+
+.fade-motion(fade, antFade);
+
+@keyframes antFadeIn {
+ 0% {
+ opacity: 0;
+ }
+
+ 100% {
+ opacity: 1;
+ }
+}
+
+@keyframes antFadeOut {
+ 0% {
+ opacity: 1;
+ }
+
+ 100% {
+ opacity: 0;
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/core/motion/move.less b/webapp/packages/supersonic-fe/src/assets/style/core/motion/move.less
new file mode 100644
index 000000000..733f26d70
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/core/motion/move.less
@@ -0,0 +1,129 @@
+.move-motion(@className, @keyframeName) {
+ @name: ~'@{ant-prefix}-@{className}';
+ .make-motion(@name, @keyframeName);
+ .@{name}-enter,
+ .@{name}-appear {
+ opacity: 0;
+ animation-timing-function: @ease-out-circ;
+ }
+ .@{name}-leave {
+ animation-timing-function: @ease-in-circ;
+ }
+}
+
+.move-motion(move-up, antMoveUp);
+.move-motion(move-down, antMoveDown);
+.move-motion(move-left, antMoveLeft);
+.move-motion(move-right, antMoveRight);
+
+@keyframes antMoveDownIn {
+ 0% {
+ transform: translateY(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+
+@keyframes antMoveDownOut {
+ 0% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+
+ 100% {
+ transform: translateY(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+
+@keyframes antMoveLeftIn {
+ 0% {
+ transform: translateX(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+
+@keyframes antMoveLeftOut {
+ 0% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+
+ 100% {
+ transform: translateX(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+
+@keyframes antMoveRightIn {
+ 0% {
+ transform: translateX(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+
+@keyframes antMoveRightOut {
+ 0% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+
+ 100% {
+ transform: translateX(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+
+@keyframes antMoveUpIn {
+ 0% {
+ transform: translateY(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+
+@keyframes antMoveUpOut {
+ 0% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+
+ 100% {
+ transform: translateY(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/core/motion/other.less b/webapp/packages/supersonic-fe/src/assets/style/core/motion/other.less
new file mode 100644
index 000000000..d1a25494e
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/core/motion/other.less
@@ -0,0 +1,51 @@
+@keyframes loadingCircle {
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+@click-animating-true: ~"[@{ant-prefix}-click-animating='true']";
+@click-animating-with-extra-node-true: ~"[@{ant-prefix}-click-animating-without-extra-node='true']";
+
+@{click-animating-true},
+@{click-animating-with-extra-node-true} {
+ position: relative;
+}
+
+html {
+ --antd-wave-shadow-color: @primary-color;
+ --scroll-bar: 0;
+}
+
+@click-animating-with-extra-node-true-after: ~'@{click-animating-with-extra-node-true}::after';
+
+@{click-animating-with-extra-node-true-after},
+.@{ant-prefix}-click-animating-node {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: block;
+ border-radius: inherit;
+ box-shadow: 0 0 0 0 @primary-color;
+ box-shadow: 0 0 0 0 var(--antd-wave-shadow-color);
+ opacity: 0.2;
+ animation: fadeEffect 2s @ease-out-circ, waveEffect 0.4s @ease-out-circ;
+ animation-fill-mode: forwards;
+ content: '';
+ pointer-events: none;
+}
+
+@keyframes waveEffect {
+ 100% {
+ box-shadow: 0 0 0 @primary-color;
+ box-shadow: 0 0 0 @wave-animation-width var(--antd-wave-shadow-color);
+ }
+}
+
+@keyframes fadeEffect {
+ 100% {
+ opacity: 0;
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/core/motion/slide.less b/webapp/packages/supersonic-fe/src/assets/style/core/motion/slide.less
new file mode 100644
index 000000000..7831b4bac
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/core/motion/slide.less
@@ -0,0 +1,131 @@
+.slide-motion(@className, @keyframeName) {
+ @name: ~'@{ant-prefix}-@{className}';
+ .make-motion(@name, @keyframeName);
+ .@{name}-enter,
+ .@{name}-appear {
+ transform: scale(0);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ animation-timing-function: @ease-out-quint;
+ }
+ .@{name}-leave {
+ animation-timing-function: @ease-in-quint;
+ }
+}
+
+.slide-motion(slide-up, antSlideUp);
+.slide-motion(slide-down, antSlideDown);
+.slide-motion(slide-left, antSlideLeft);
+.slide-motion(slide-right, antSlideRight);
+
+@keyframes antSlideUpIn {
+ 0% {
+ transform: scaleY(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: scaleY(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+}
+
+@keyframes antSlideUpOut {
+ 0% {
+ transform: scaleY(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+
+ 100% {
+ transform: scaleY(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+}
+
+@keyframes antSlideDownIn {
+ 0% {
+ transform: scaleY(0.8);
+ transform-origin: 100% 100%;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: scaleY(1);
+ transform-origin: 100% 100%;
+ opacity: 1;
+ }
+}
+
+@keyframes antSlideDownOut {
+ 0% {
+ transform: scaleY(1);
+ transform-origin: 100% 100%;
+ opacity: 1;
+ }
+
+ 100% {
+ transform: scaleY(0.8);
+ transform-origin: 100% 100%;
+ opacity: 0;
+ }
+}
+
+@keyframes antSlideLeftIn {
+ 0% {
+ transform: scaleX(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: scaleX(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+}
+
+@keyframes antSlideLeftOut {
+ 0% {
+ transform: scaleX(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+
+ 100% {
+ transform: scaleX(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+}
+
+@keyframes antSlideRightIn {
+ 0% {
+ transform: scaleX(0.8);
+ transform-origin: 100% 0%;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: scaleX(1);
+ transform-origin: 100% 0%;
+ opacity: 1;
+ }
+}
+
+@keyframes antSlideRightOut {
+ 0% {
+ transform: scaleX(1);
+ transform-origin: 100% 0%;
+ opacity: 1;
+ }
+
+ 100% {
+ transform: scaleX(0.8);
+ transform-origin: 100% 0%;
+ opacity: 0;
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/core/motion/zoom.less b/webapp/packages/supersonic-fe/src/assets/style/core/motion/zoom.less
new file mode 100644
index 000000000..72739b751
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/core/motion/zoom.less
@@ -0,0 +1,179 @@
+.zoom-motion(@className, @keyframeName, @duration: @animation-duration-base) {
+ @name: ~'@{ant-prefix}-@{className}';
+ .make-motion(@name, @keyframeName, @duration);
+ .@{name}-enter,
+ .@{name}-appear {
+ transform: scale(0); // need this by yiminghe
+ opacity: 0;
+ animation-timing-function: @ease-out-circ;
+
+ &-prepare {
+ transform: none;
+ }
+ }
+ .@{name}-leave {
+ animation-timing-function: @ease-in-out-circ;
+ }
+}
+
+// For Modal, Select choosen item
+.zoom-motion(zoom, antZoom);
+// For Popover, Popconfirm, Dropdown
+.zoom-motion(zoom-big, antZoomBig);
+// For Tooltip
+.zoom-motion(zoom-big-fast, antZoomBig, @animation-duration-fast);
+
+.zoom-motion(zoom-up, antZoomUp);
+.zoom-motion(zoom-down, antZoomDown);
+.zoom-motion(zoom-left, antZoomLeft);
+.zoom-motion(zoom-right, antZoomRight);
+
+@keyframes antZoomIn {
+ 0% {
+ transform: scale(0.2);
+ opacity: 0;
+ }
+
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+@keyframes antZoomOut {
+ 0% {
+ transform: scale(1);
+ }
+
+ 100% {
+ transform: scale(0.2);
+ opacity: 0;
+ }
+}
+
+@keyframes antZoomBigIn {
+ 0% {
+ transform: scale(0.8);
+ opacity: 0;
+ }
+
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+@keyframes antZoomBigOut {
+ 0% {
+ transform: scale(1);
+ }
+
+ 100% {
+ transform: scale(0.8);
+ opacity: 0;
+ }
+}
+
+@keyframes antZoomUpIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 50% 0%;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: scale(1);
+ transform-origin: 50% 0%;
+ }
+}
+
+@keyframes antZoomUpOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 50% 0%;
+ }
+
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 50% 0%;
+ opacity: 0;
+ }
+}
+
+@keyframes antZoomLeftIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 0% 50%;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: scale(1);
+ transform-origin: 0% 50%;
+ }
+}
+
+@keyframes antZoomLeftOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 0% 50%;
+ }
+
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 0% 50%;
+ opacity: 0;
+ }
+}
+
+@keyframes antZoomRightIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 100% 50%;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: scale(1);
+ transform-origin: 100% 50%;
+ }
+}
+
+@keyframes antZoomRightOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 100% 50%;
+ }
+
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 100% 50%;
+ opacity: 0;
+ }
+}
+
+@keyframes antZoomDownIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 50% 100%;
+ opacity: 0;
+ }
+
+ 100% {
+ transform: scale(1);
+ transform-origin: 50% 100%;
+ }
+}
+
+@keyframes antZoomDownOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 50% 100%;
+ }
+
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 50% 100%;
+ opacity: 0;
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/css.js b/webapp/packages/supersonic-fe/src/assets/style/css.js
new file mode 100644
index 000000000..b67dcb95d
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/css.js
@@ -0,0 +1 @@
+import './index.css';
\ No newline at end of file
diff --git a/webapp/packages/supersonic-fe/src/assets/style/dark.less b/webapp/packages/supersonic-fe/src/assets/style/dark.less
new file mode 100644
index 000000000..12a37313e
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/dark.less
@@ -0,0 +1,4 @@
+@root-entry-name: default;
+
+@import './themes/dark.less';
+@import './core/index';
diff --git a/webapp/packages/supersonic-fe/src/assets/style/default.css b/webapp/packages/supersonic-fe/src/assets/style/default.css
new file mode 100644
index 000000000..b363d9137
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/default.css
@@ -0,0 +1,1248 @@
+/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
+/* stylelint-disable no-duplicate-selectors */
+/* stylelint-disable */
+/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */
+[class^=ant-]::-ms-clear,
+[class*= ant-]::-ms-clear,
+[class^=ant-] input::-ms-clear,
+[class*= ant-] input::-ms-clear,
+[class^=ant-] input::-ms-reveal,
+[class*= ant-] input::-ms-reveal {
+ display: none;
+}
+/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */
+html,
+body {
+ width: 100%;
+ height: 100%;
+}
+input::-ms-clear,
+input::-ms-reveal {
+ display: none;
+}
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+html {
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -ms-overflow-style: scrollbar;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+@-ms-viewport {
+ width: device-width;
+}
+body {
+ margin: 0;
+ color: rgba(0, 0, 0, 0.85);
+ font-size: 14px;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
+ font-variant: tabular-nums;
+ line-height: 1.5715;
+ background-color: #fff;
+ font-feature-settings: 'tnum';
+}
+[tabindex='-1']:focus {
+ outline: none !important;
+}
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin-top: 0;
+ margin-bottom: 0.5em;
+ color: rgba(0, 0, 0, 0.85);
+ font-weight: 500;
+}
+p {
+ margin-top: 0;
+ margin-bottom: 1em;
+}
+abbr[title],
+abbr[data-original-title] {
+ text-decoration: underline;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ border-bottom: 0;
+ cursor: help;
+}
+address {
+ margin-bottom: 1em;
+ font-style: normal;
+ line-height: inherit;
+}
+input[type='text'],
+input[type='password'],
+input[type='number'],
+textarea {
+ -webkit-appearance: none;
+}
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1em;
+}
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
+}
+dt {
+ font-weight: 500;
+}
+dd {
+ margin-bottom: 0.5em;
+ margin-left: 0;
+}
+blockquote {
+ margin: 0 0 1em;
+}
+dfn {
+ font-style: italic;
+}
+b,
+strong {
+ font-weight: bolder;
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -0.25em;
+}
+sup {
+ top: -0.5em;
+}
+a {
+ color: #1890ff;
+ text-decoration: none;
+ background-color: transparent;
+ outline: none;
+ cursor: pointer;
+ transition: color 0.3s;
+ -webkit-text-decoration-skip: objects;
+}
+a:hover {
+ color: #40a9ff;
+}
+a:active {
+ color: #096dd9;
+}
+a:active,
+a:hover {
+ text-decoration: none;
+ outline: 0;
+}
+a:focus {
+ text-decoration: none;
+ outline: 0;
+}
+a[disabled] {
+ color: rgba(0, 0, 0, 0.25);
+ cursor: not-allowed;
+}
+pre,
+code,
+kbd,
+samp {
+ font-size: 1em;
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+}
+pre {
+ margin-top: 0;
+ margin-bottom: 1em;
+ overflow: auto;
+}
+figure {
+ margin: 0 0 1em;
+}
+img {
+ vertical-align: middle;
+ border-style: none;
+}
+a,
+area,
+button,
+[role='button'],
+input:not([type='range']),
+label,
+select,
+summary,
+textarea {
+ touch-action: manipulation;
+}
+table {
+ border-collapse: collapse;
+}
+caption {
+ padding-top: 0.75em;
+ padding-bottom: 0.3em;
+ color: rgba(0, 0, 0, 0.45);
+ text-align: left;
+ caption-side: bottom;
+}
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0;
+ color: inherit;
+ font-size: inherit;
+ font-family: inherit;
+ line-height: inherit;
+}
+button,
+input {
+ overflow: visible;
+}
+button,
+select {
+ text-transform: none;
+}
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+button::-moz-focus-inner,
+[type='button']::-moz-focus-inner,
+[type='reset']::-moz-focus-inner,
+[type='submit']::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+input[type='radio'],
+input[type='checkbox'] {
+ box-sizing: border-box;
+ padding: 0;
+}
+input[type='date'],
+input[type='time'],
+input[type='datetime-local'],
+input[type='month'] {
+ -webkit-appearance: listbox;
+}
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
+fieldset {
+ min-width: 0;
+ margin: 0;
+ padding: 0;
+ border: 0;
+}
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 0.5em;
+ padding: 0;
+ color: inherit;
+ font-size: 1.5em;
+ line-height: inherit;
+ white-space: normal;
+}
+progress {
+ vertical-align: baseline;
+}
+[type='number']::-webkit-inner-spin-button,
+[type='number']::-webkit-outer-spin-button {
+ height: auto;
+}
+[type='search'] {
+ outline-offset: -2px;
+ -webkit-appearance: none;
+}
+[type='search']::-webkit-search-cancel-button,
+[type='search']::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+output {
+ display: inline-block;
+}
+summary {
+ display: list-item;
+}
+template {
+ display: none;
+}
+[hidden] {
+ display: none !important;
+}
+mark {
+ padding: 0.2em;
+ background-color: #feffe6;
+}
+::-moz-selection {
+ color: #fff;
+ background: #1890ff;
+}
+::selection {
+ color: #fff;
+ background: #1890ff;
+}
+.clearfix::before {
+ display: table;
+ content: '';
+}
+.clearfix::after {
+ display: table;
+ clear: both;
+ content: '';
+}
+.anticon {
+ display: inline-flex;
+ align-items: center;
+ color: inherit;
+ font-style: normal;
+ line-height: 0;
+ text-align: center;
+ text-transform: none;
+ vertical-align: -0.125em;
+ text-rendering: optimizelegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.anticon > * {
+ line-height: 1;
+}
+.anticon svg {
+ display: inline-block;
+}
+.anticon::before {
+ display: none;
+}
+.anticon .anticon-icon {
+ display: block;
+}
+.anticon > .anticon {
+ line-height: 0;
+ vertical-align: 0;
+}
+.anticon[tabindex] {
+ cursor: pointer;
+}
+.anticon-spin,
+.anticon-spin::before {
+ display: inline-block;
+ animation: loadingCircle 1s infinite linear;
+}
+.ant-fade-enter,
+.ant-fade-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-fade-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-fade-enter.ant-fade-enter-active,
+.ant-fade-appear.ant-fade-appear-active {
+ animation-name: antFadeIn;
+ animation-play-state: running;
+}
+.ant-fade-leave.ant-fade-leave-active {
+ animation-name: antFadeOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-fade-enter,
+.ant-fade-appear {
+ opacity: 0;
+ animation-timing-function: linear;
+}
+.ant-fade-leave {
+ animation-timing-function: linear;
+}
+@keyframes antFadeIn {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+@keyframes antFadeOut {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+.ant-move-up-enter,
+.ant-move-up-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-up-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-up-enter.ant-move-up-enter-active,
+.ant-move-up-appear.ant-move-up-appear-active {
+ animation-name: antMoveUpIn;
+ animation-play-state: running;
+}
+.ant-move-up-leave.ant-move-up-leave-active {
+ animation-name: antMoveUpOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-move-up-enter,
+.ant-move-up-appear {
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-up-leave {
+ animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-down-enter,
+.ant-move-down-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-down-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-down-enter.ant-move-down-enter-active,
+.ant-move-down-appear.ant-move-down-appear-active {
+ animation-name: antMoveDownIn;
+ animation-play-state: running;
+}
+.ant-move-down-leave.ant-move-down-leave-active {
+ animation-name: antMoveDownOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-move-down-enter,
+.ant-move-down-appear {
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-down-leave {
+ animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-left-enter,
+.ant-move-left-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-left-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-left-enter.ant-move-left-enter-active,
+.ant-move-left-appear.ant-move-left-appear-active {
+ animation-name: antMoveLeftIn;
+ animation-play-state: running;
+}
+.ant-move-left-leave.ant-move-left-leave-active {
+ animation-name: antMoveLeftOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-move-left-enter,
+.ant-move-left-appear {
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-left-leave {
+ animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-right-enter,
+.ant-move-right-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-right-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-right-enter.ant-move-right-enter-active,
+.ant-move-right-appear.ant-move-right-appear-active {
+ animation-name: antMoveRightIn;
+ animation-play-state: running;
+}
+.ant-move-right-leave.ant-move-right-leave-active {
+ animation-name: antMoveRightOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-move-right-enter,
+.ant-move-right-appear {
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-right-leave {
+ animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+@keyframes antMoveDownIn {
+ 0% {
+ transform: translateY(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+ 100% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+@keyframes antMoveDownOut {
+ 0% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+ 100% {
+ transform: translateY(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+@keyframes antMoveLeftIn {
+ 0% {
+ transform: translateX(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+ 100% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+@keyframes antMoveLeftOut {
+ 0% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+ 100% {
+ transform: translateX(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+@keyframes antMoveRightIn {
+ 0% {
+ transform: translateX(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+ 100% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+@keyframes antMoveRightOut {
+ 0% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+ 100% {
+ transform: translateX(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+@keyframes antMoveUpIn {
+ 0% {
+ transform: translateY(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+ 100% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+@keyframes antMoveUpOut {
+ 0% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+ 100% {
+ transform: translateY(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+@keyframes loadingCircle {
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+[ant-click-animating='true'],
+[ant-click-animating-without-extra-node='true'] {
+ position: relative;
+}
+html {
+ --antd-wave-shadow-color: #1890ff;
+ --scroll-bar: 0;
+}
+[ant-click-animating-without-extra-node='true']::after,
+.ant-click-animating-node {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: block;
+ border-radius: inherit;
+ box-shadow: 0 0 0 0 #1890ff;
+ box-shadow: 0 0 0 0 var(--antd-wave-shadow-color);
+ opacity: 0.2;
+ animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1);
+ animation-fill-mode: forwards;
+ content: '';
+ pointer-events: none;
+}
+@keyframes waveEffect {
+ 100% {
+ box-shadow: 0 0 0 #1890ff;
+ box-shadow: 0 0 0 6px var(--antd-wave-shadow-color);
+ }
+}
+@keyframes fadeEffect {
+ 100% {
+ opacity: 0;
+ }
+}
+.ant-slide-up-enter,
+.ant-slide-up-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-up-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-up-enter.ant-slide-up-enter-active,
+.ant-slide-up-appear.ant-slide-up-appear-active {
+ animation-name: antSlideUpIn;
+ animation-play-state: running;
+}
+.ant-slide-up-leave.ant-slide-up-leave-active {
+ animation-name: antSlideUpOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-slide-up-enter,
+.ant-slide-up-appear {
+ transform: scale(0);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-up-leave {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-down-enter,
+.ant-slide-down-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-down-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-down-enter.ant-slide-down-enter-active,
+.ant-slide-down-appear.ant-slide-down-appear-active {
+ animation-name: antSlideDownIn;
+ animation-play-state: running;
+}
+.ant-slide-down-leave.ant-slide-down-leave-active {
+ animation-name: antSlideDownOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-slide-down-enter,
+.ant-slide-down-appear {
+ transform: scale(0);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-down-leave {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-left-enter,
+.ant-slide-left-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-left-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-left-enter.ant-slide-left-enter-active,
+.ant-slide-left-appear.ant-slide-left-appear-active {
+ animation-name: antSlideLeftIn;
+ animation-play-state: running;
+}
+.ant-slide-left-leave.ant-slide-left-leave-active {
+ animation-name: antSlideLeftOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-slide-left-enter,
+.ant-slide-left-appear {
+ transform: scale(0);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-left-leave {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-right-enter,
+.ant-slide-right-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-right-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-right-enter.ant-slide-right-enter-active,
+.ant-slide-right-appear.ant-slide-right-appear-active {
+ animation-name: antSlideRightIn;
+ animation-play-state: running;
+}
+.ant-slide-right-leave.ant-slide-right-leave-active {
+ animation-name: antSlideRightOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-slide-right-enter,
+.ant-slide-right-appear {
+ transform: scale(0);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-right-leave {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+@keyframes antSlideUpIn {
+ 0% {
+ transform: scaleY(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scaleY(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+}
+@keyframes antSlideUpOut {
+ 0% {
+ transform: scaleY(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+ 100% {
+ transform: scaleY(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+}
+@keyframes antSlideDownIn {
+ 0% {
+ transform: scaleY(0.8);
+ transform-origin: 100% 100%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scaleY(1);
+ transform-origin: 100% 100%;
+ opacity: 1;
+ }
+}
+@keyframes antSlideDownOut {
+ 0% {
+ transform: scaleY(1);
+ transform-origin: 100% 100%;
+ opacity: 1;
+ }
+ 100% {
+ transform: scaleY(0.8);
+ transform-origin: 100% 100%;
+ opacity: 0;
+ }
+}
+@keyframes antSlideLeftIn {
+ 0% {
+ transform: scaleX(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scaleX(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+}
+@keyframes antSlideLeftOut {
+ 0% {
+ transform: scaleX(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+ 100% {
+ transform: scaleX(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+}
+@keyframes antSlideRightIn {
+ 0% {
+ transform: scaleX(0.8);
+ transform-origin: 100% 0%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scaleX(1);
+ transform-origin: 100% 0%;
+ opacity: 1;
+ }
+}
+@keyframes antSlideRightOut {
+ 0% {
+ transform: scaleX(1);
+ transform-origin: 100% 0%;
+ opacity: 1;
+ }
+ 100% {
+ transform: scaleX(0.8);
+ transform-origin: 100% 0%;
+ opacity: 0;
+ }
+}
+.ant-zoom-enter,
+.ant-zoom-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-enter.ant-zoom-enter-active,
+.ant-zoom-appear.ant-zoom-appear-active {
+ animation-name: antZoomIn;
+ animation-play-state: running;
+}
+.ant-zoom-leave.ant-zoom-leave-active {
+ animation-name: antZoomOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-enter,
+.ant-zoom-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-enter-prepare,
+.ant-zoom-appear-prepare {
+ transform: none;
+}
+.ant-zoom-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-big-enter,
+.ant-zoom-big-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-big-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-big-enter.ant-zoom-big-enter-active,
+.ant-zoom-big-appear.ant-zoom-big-appear-active {
+ animation-name: antZoomBigIn;
+ animation-play-state: running;
+}
+.ant-zoom-big-leave.ant-zoom-big-leave-active {
+ animation-name: antZoomBigOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-big-enter,
+.ant-zoom-big-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-big-enter-prepare,
+.ant-zoom-big-appear-prepare {
+ transform: none;
+}
+.ant-zoom-big-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-big-fast-enter,
+.ant-zoom-big-fast-appear {
+ animation-duration: 0.1s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-big-fast-leave {
+ animation-duration: 0.1s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active,
+.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active {
+ animation-name: antZoomBigIn;
+ animation-play-state: running;
+}
+.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active {
+ animation-name: antZoomBigOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-big-fast-enter,
+.ant-zoom-big-fast-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-big-fast-enter-prepare,
+.ant-zoom-big-fast-appear-prepare {
+ transform: none;
+}
+.ant-zoom-big-fast-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-up-enter,
+.ant-zoom-up-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-up-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-up-enter.ant-zoom-up-enter-active,
+.ant-zoom-up-appear.ant-zoom-up-appear-active {
+ animation-name: antZoomUpIn;
+ animation-play-state: running;
+}
+.ant-zoom-up-leave.ant-zoom-up-leave-active {
+ animation-name: antZoomUpOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-up-enter,
+.ant-zoom-up-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-up-enter-prepare,
+.ant-zoom-up-appear-prepare {
+ transform: none;
+}
+.ant-zoom-up-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-down-enter,
+.ant-zoom-down-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-down-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-down-enter.ant-zoom-down-enter-active,
+.ant-zoom-down-appear.ant-zoom-down-appear-active {
+ animation-name: antZoomDownIn;
+ animation-play-state: running;
+}
+.ant-zoom-down-leave.ant-zoom-down-leave-active {
+ animation-name: antZoomDownOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-down-enter,
+.ant-zoom-down-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-down-enter-prepare,
+.ant-zoom-down-appear-prepare {
+ transform: none;
+}
+.ant-zoom-down-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-left-enter,
+.ant-zoom-left-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-left-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-left-enter.ant-zoom-left-enter-active,
+.ant-zoom-left-appear.ant-zoom-left-appear-active {
+ animation-name: antZoomLeftIn;
+ animation-play-state: running;
+}
+.ant-zoom-left-leave.ant-zoom-left-leave-active {
+ animation-name: antZoomLeftOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-left-enter,
+.ant-zoom-left-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-left-enter-prepare,
+.ant-zoom-left-appear-prepare {
+ transform: none;
+}
+.ant-zoom-left-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-right-enter,
+.ant-zoom-right-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-right-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-right-enter.ant-zoom-right-enter-active,
+.ant-zoom-right-appear.ant-zoom-right-appear-active {
+ animation-name: antZoomRightIn;
+ animation-play-state: running;
+}
+.ant-zoom-right-leave.ant-zoom-right-leave-active {
+ animation-name: antZoomRightOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-right-enter,
+.ant-zoom-right-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-right-enter-prepare,
+.ant-zoom-right-appear-prepare {
+ transform: none;
+}
+.ant-zoom-right-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+@keyframes antZoomIn {
+ 0% {
+ transform: scale(0.2);
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@keyframes antZoomOut {
+ 0% {
+ transform: scale(1);
+ }
+ 100% {
+ transform: scale(0.2);
+ opacity: 0;
+ }
+}
+@keyframes antZoomBigIn {
+ 0% {
+ transform: scale(0.8);
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@keyframes antZoomBigOut {
+ 0% {
+ transform: scale(1);
+ }
+ 100% {
+ transform: scale(0.8);
+ opacity: 0;
+ }
+}
+@keyframes antZoomUpIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 50% 0%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ transform-origin: 50% 0%;
+ }
+}
+@keyframes antZoomUpOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 50% 0%;
+ }
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 50% 0%;
+ opacity: 0;
+ }
+}
+@keyframes antZoomLeftIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 0% 50%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ transform-origin: 0% 50%;
+ }
+}
+@keyframes antZoomLeftOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 0% 50%;
+ }
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 0% 50%;
+ opacity: 0;
+ }
+}
+@keyframes antZoomRightIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 100% 50%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ transform-origin: 100% 50%;
+ }
+}
+@keyframes antZoomRightOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 100% 50%;
+ }
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 100% 50%;
+ opacity: 0;
+ }
+}
+@keyframes antZoomDownIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 50% 100%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ transform-origin: 50% 100%;
+ }
+}
+@keyframes antZoomDownOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 50% 100%;
+ }
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 50% 100%;
+ opacity: 0;
+ }
+}
+.ant-motion-collapse-legacy {
+ overflow: hidden;
+}
+.ant-motion-collapse-legacy-active {
+ transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
+}
+.ant-motion-collapse {
+ overflow: hidden;
+ transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/default.less b/webapp/packages/supersonic-fe/src/assets/style/default.less
new file mode 100644
index 000000000..ecec08453
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/default.less
@@ -0,0 +1,4 @@
+// This is same as `index.less` but given `root-entry-name` for `dist/antd.less` usage
+@root-entry-name: default;
+
+@import './index';
diff --git a/webapp/packages/supersonic-fe/src/assets/style/index-pure.less b/webapp/packages/supersonic-fe/src/assets/style/index-pure.less
new file mode 100644
index 000000000..04efa3b47
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/index-pure.less
@@ -0,0 +1,2 @@
+@import './themes/index';
+@import './core/index';
diff --git a/webapp/packages/supersonic-fe/src/assets/style/index.css b/webapp/packages/supersonic-fe/src/assets/style/index.css
new file mode 100644
index 000000000..b363d9137
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/index.css
@@ -0,0 +1,1248 @@
+/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
+/* stylelint-disable no-duplicate-selectors */
+/* stylelint-disable */
+/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */
+[class^=ant-]::-ms-clear,
+[class*= ant-]::-ms-clear,
+[class^=ant-] input::-ms-clear,
+[class*= ant-] input::-ms-clear,
+[class^=ant-] input::-ms-reveal,
+[class*= ant-] input::-ms-reveal {
+ display: none;
+}
+/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */
+html,
+body {
+ width: 100%;
+ height: 100%;
+}
+input::-ms-clear,
+input::-ms-reveal {
+ display: none;
+}
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+html {
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -ms-overflow-style: scrollbar;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+@-ms-viewport {
+ width: device-width;
+}
+body {
+ margin: 0;
+ color: rgba(0, 0, 0, 0.85);
+ font-size: 14px;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
+ font-variant: tabular-nums;
+ line-height: 1.5715;
+ background-color: #fff;
+ font-feature-settings: 'tnum';
+}
+[tabindex='-1']:focus {
+ outline: none !important;
+}
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin-top: 0;
+ margin-bottom: 0.5em;
+ color: rgba(0, 0, 0, 0.85);
+ font-weight: 500;
+}
+p {
+ margin-top: 0;
+ margin-bottom: 1em;
+}
+abbr[title],
+abbr[data-original-title] {
+ text-decoration: underline;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ border-bottom: 0;
+ cursor: help;
+}
+address {
+ margin-bottom: 1em;
+ font-style: normal;
+ line-height: inherit;
+}
+input[type='text'],
+input[type='password'],
+input[type='number'],
+textarea {
+ -webkit-appearance: none;
+}
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1em;
+}
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
+}
+dt {
+ font-weight: 500;
+}
+dd {
+ margin-bottom: 0.5em;
+ margin-left: 0;
+}
+blockquote {
+ margin: 0 0 1em;
+}
+dfn {
+ font-style: italic;
+}
+b,
+strong {
+ font-weight: bolder;
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -0.25em;
+}
+sup {
+ top: -0.5em;
+}
+a {
+ color: #1890ff;
+ text-decoration: none;
+ background-color: transparent;
+ outline: none;
+ cursor: pointer;
+ transition: color 0.3s;
+ -webkit-text-decoration-skip: objects;
+}
+a:hover {
+ color: #40a9ff;
+}
+a:active {
+ color: #096dd9;
+}
+a:active,
+a:hover {
+ text-decoration: none;
+ outline: 0;
+}
+a:focus {
+ text-decoration: none;
+ outline: 0;
+}
+a[disabled] {
+ color: rgba(0, 0, 0, 0.25);
+ cursor: not-allowed;
+}
+pre,
+code,
+kbd,
+samp {
+ font-size: 1em;
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+}
+pre {
+ margin-top: 0;
+ margin-bottom: 1em;
+ overflow: auto;
+}
+figure {
+ margin: 0 0 1em;
+}
+img {
+ vertical-align: middle;
+ border-style: none;
+}
+a,
+area,
+button,
+[role='button'],
+input:not([type='range']),
+label,
+select,
+summary,
+textarea {
+ touch-action: manipulation;
+}
+table {
+ border-collapse: collapse;
+}
+caption {
+ padding-top: 0.75em;
+ padding-bottom: 0.3em;
+ color: rgba(0, 0, 0, 0.45);
+ text-align: left;
+ caption-side: bottom;
+}
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0;
+ color: inherit;
+ font-size: inherit;
+ font-family: inherit;
+ line-height: inherit;
+}
+button,
+input {
+ overflow: visible;
+}
+button,
+select {
+ text-transform: none;
+}
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+button::-moz-focus-inner,
+[type='button']::-moz-focus-inner,
+[type='reset']::-moz-focus-inner,
+[type='submit']::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+input[type='radio'],
+input[type='checkbox'] {
+ box-sizing: border-box;
+ padding: 0;
+}
+input[type='date'],
+input[type='time'],
+input[type='datetime-local'],
+input[type='month'] {
+ -webkit-appearance: listbox;
+}
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
+fieldset {
+ min-width: 0;
+ margin: 0;
+ padding: 0;
+ border: 0;
+}
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 0.5em;
+ padding: 0;
+ color: inherit;
+ font-size: 1.5em;
+ line-height: inherit;
+ white-space: normal;
+}
+progress {
+ vertical-align: baseline;
+}
+[type='number']::-webkit-inner-spin-button,
+[type='number']::-webkit-outer-spin-button {
+ height: auto;
+}
+[type='search'] {
+ outline-offset: -2px;
+ -webkit-appearance: none;
+}
+[type='search']::-webkit-search-cancel-button,
+[type='search']::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+output {
+ display: inline-block;
+}
+summary {
+ display: list-item;
+}
+template {
+ display: none;
+}
+[hidden] {
+ display: none !important;
+}
+mark {
+ padding: 0.2em;
+ background-color: #feffe6;
+}
+::-moz-selection {
+ color: #fff;
+ background: #1890ff;
+}
+::selection {
+ color: #fff;
+ background: #1890ff;
+}
+.clearfix::before {
+ display: table;
+ content: '';
+}
+.clearfix::after {
+ display: table;
+ clear: both;
+ content: '';
+}
+.anticon {
+ display: inline-flex;
+ align-items: center;
+ color: inherit;
+ font-style: normal;
+ line-height: 0;
+ text-align: center;
+ text-transform: none;
+ vertical-align: -0.125em;
+ text-rendering: optimizelegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.anticon > * {
+ line-height: 1;
+}
+.anticon svg {
+ display: inline-block;
+}
+.anticon::before {
+ display: none;
+}
+.anticon .anticon-icon {
+ display: block;
+}
+.anticon > .anticon {
+ line-height: 0;
+ vertical-align: 0;
+}
+.anticon[tabindex] {
+ cursor: pointer;
+}
+.anticon-spin,
+.anticon-spin::before {
+ display: inline-block;
+ animation: loadingCircle 1s infinite linear;
+}
+.ant-fade-enter,
+.ant-fade-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-fade-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-fade-enter.ant-fade-enter-active,
+.ant-fade-appear.ant-fade-appear-active {
+ animation-name: antFadeIn;
+ animation-play-state: running;
+}
+.ant-fade-leave.ant-fade-leave-active {
+ animation-name: antFadeOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-fade-enter,
+.ant-fade-appear {
+ opacity: 0;
+ animation-timing-function: linear;
+}
+.ant-fade-leave {
+ animation-timing-function: linear;
+}
+@keyframes antFadeIn {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+@keyframes antFadeOut {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+.ant-move-up-enter,
+.ant-move-up-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-up-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-up-enter.ant-move-up-enter-active,
+.ant-move-up-appear.ant-move-up-appear-active {
+ animation-name: antMoveUpIn;
+ animation-play-state: running;
+}
+.ant-move-up-leave.ant-move-up-leave-active {
+ animation-name: antMoveUpOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-move-up-enter,
+.ant-move-up-appear {
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-up-leave {
+ animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-down-enter,
+.ant-move-down-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-down-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-down-enter.ant-move-down-enter-active,
+.ant-move-down-appear.ant-move-down-appear-active {
+ animation-name: antMoveDownIn;
+ animation-play-state: running;
+}
+.ant-move-down-leave.ant-move-down-leave-active {
+ animation-name: antMoveDownOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-move-down-enter,
+.ant-move-down-appear {
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-down-leave {
+ animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-left-enter,
+.ant-move-left-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-left-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-left-enter.ant-move-left-enter-active,
+.ant-move-left-appear.ant-move-left-appear-active {
+ animation-name: antMoveLeftIn;
+ animation-play-state: running;
+}
+.ant-move-left-leave.ant-move-left-leave-active {
+ animation-name: antMoveLeftOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-move-left-enter,
+.ant-move-left-appear {
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-left-leave {
+ animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-right-enter,
+.ant-move-right-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-right-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-move-right-enter.ant-move-right-enter-active,
+.ant-move-right-appear.ant-move-right-appear-active {
+ animation-name: antMoveRightIn;
+ animation-play-state: running;
+}
+.ant-move-right-leave.ant-move-right-leave-active {
+ animation-name: antMoveRightOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-move-right-enter,
+.ant-move-right-appear {
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-right-leave {
+ animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+@keyframes antMoveDownIn {
+ 0% {
+ transform: translateY(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+ 100% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+@keyframes antMoveDownOut {
+ 0% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+ 100% {
+ transform: translateY(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+@keyframes antMoveLeftIn {
+ 0% {
+ transform: translateX(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+ 100% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+@keyframes antMoveLeftOut {
+ 0% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+ 100% {
+ transform: translateX(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+@keyframes antMoveRightIn {
+ 0% {
+ transform: translateX(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+ 100% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+@keyframes antMoveRightOut {
+ 0% {
+ transform: translateX(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+ 100% {
+ transform: translateX(100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+@keyframes antMoveUpIn {
+ 0% {
+ transform: translateY(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+ 100% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+}
+@keyframes antMoveUpOut {
+ 0% {
+ transform: translateY(0%);
+ transform-origin: 0 0;
+ opacity: 1;
+ }
+ 100% {
+ transform: translateY(-100%);
+ transform-origin: 0 0;
+ opacity: 0;
+ }
+}
+@keyframes loadingCircle {
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+[ant-click-animating='true'],
+[ant-click-animating-without-extra-node='true'] {
+ position: relative;
+}
+html {
+ --antd-wave-shadow-color: #1890ff;
+ --scroll-bar: 0;
+}
+[ant-click-animating-without-extra-node='true']::after,
+.ant-click-animating-node {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: block;
+ border-radius: inherit;
+ box-shadow: 0 0 0 0 #1890ff;
+ box-shadow: 0 0 0 0 var(--antd-wave-shadow-color);
+ opacity: 0.2;
+ animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1);
+ animation-fill-mode: forwards;
+ content: '';
+ pointer-events: none;
+}
+@keyframes waveEffect {
+ 100% {
+ box-shadow: 0 0 0 #1890ff;
+ box-shadow: 0 0 0 6px var(--antd-wave-shadow-color);
+ }
+}
+@keyframes fadeEffect {
+ 100% {
+ opacity: 0;
+ }
+}
+.ant-slide-up-enter,
+.ant-slide-up-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-up-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-up-enter.ant-slide-up-enter-active,
+.ant-slide-up-appear.ant-slide-up-appear-active {
+ animation-name: antSlideUpIn;
+ animation-play-state: running;
+}
+.ant-slide-up-leave.ant-slide-up-leave-active {
+ animation-name: antSlideUpOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-slide-up-enter,
+.ant-slide-up-appear {
+ transform: scale(0);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-up-leave {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-down-enter,
+.ant-slide-down-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-down-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-down-enter.ant-slide-down-enter-active,
+.ant-slide-down-appear.ant-slide-down-appear-active {
+ animation-name: antSlideDownIn;
+ animation-play-state: running;
+}
+.ant-slide-down-leave.ant-slide-down-leave-active {
+ animation-name: antSlideDownOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-slide-down-enter,
+.ant-slide-down-appear {
+ transform: scale(0);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-down-leave {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-left-enter,
+.ant-slide-left-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-left-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-left-enter.ant-slide-left-enter-active,
+.ant-slide-left-appear.ant-slide-left-appear-active {
+ animation-name: antSlideLeftIn;
+ animation-play-state: running;
+}
+.ant-slide-left-leave.ant-slide-left-leave-active {
+ animation-name: antSlideLeftOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-slide-left-enter,
+.ant-slide-left-appear {
+ transform: scale(0);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-left-leave {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-right-enter,
+.ant-slide-right-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-right-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-slide-right-enter.ant-slide-right-enter-active,
+.ant-slide-right-appear.ant-slide-right-appear-active {
+ animation-name: antSlideRightIn;
+ animation-play-state: running;
+}
+.ant-slide-right-leave.ant-slide-right-leave-active {
+ animation-name: antSlideRightOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-slide-right-enter,
+.ant-slide-right-appear {
+ transform: scale(0);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-right-leave {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+@keyframes antSlideUpIn {
+ 0% {
+ transform: scaleY(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scaleY(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+}
+@keyframes antSlideUpOut {
+ 0% {
+ transform: scaleY(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+ 100% {
+ transform: scaleY(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+}
+@keyframes antSlideDownIn {
+ 0% {
+ transform: scaleY(0.8);
+ transform-origin: 100% 100%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scaleY(1);
+ transform-origin: 100% 100%;
+ opacity: 1;
+ }
+}
+@keyframes antSlideDownOut {
+ 0% {
+ transform: scaleY(1);
+ transform-origin: 100% 100%;
+ opacity: 1;
+ }
+ 100% {
+ transform: scaleY(0.8);
+ transform-origin: 100% 100%;
+ opacity: 0;
+ }
+}
+@keyframes antSlideLeftIn {
+ 0% {
+ transform: scaleX(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scaleX(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+}
+@keyframes antSlideLeftOut {
+ 0% {
+ transform: scaleX(1);
+ transform-origin: 0% 0%;
+ opacity: 1;
+ }
+ 100% {
+ transform: scaleX(0.8);
+ transform-origin: 0% 0%;
+ opacity: 0;
+ }
+}
+@keyframes antSlideRightIn {
+ 0% {
+ transform: scaleX(0.8);
+ transform-origin: 100% 0%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scaleX(1);
+ transform-origin: 100% 0%;
+ opacity: 1;
+ }
+}
+@keyframes antSlideRightOut {
+ 0% {
+ transform: scaleX(1);
+ transform-origin: 100% 0%;
+ opacity: 1;
+ }
+ 100% {
+ transform: scaleX(0.8);
+ transform-origin: 100% 0%;
+ opacity: 0;
+ }
+}
+.ant-zoom-enter,
+.ant-zoom-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-enter.ant-zoom-enter-active,
+.ant-zoom-appear.ant-zoom-appear-active {
+ animation-name: antZoomIn;
+ animation-play-state: running;
+}
+.ant-zoom-leave.ant-zoom-leave-active {
+ animation-name: antZoomOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-enter,
+.ant-zoom-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-enter-prepare,
+.ant-zoom-appear-prepare {
+ transform: none;
+}
+.ant-zoom-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-big-enter,
+.ant-zoom-big-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-big-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-big-enter.ant-zoom-big-enter-active,
+.ant-zoom-big-appear.ant-zoom-big-appear-active {
+ animation-name: antZoomBigIn;
+ animation-play-state: running;
+}
+.ant-zoom-big-leave.ant-zoom-big-leave-active {
+ animation-name: antZoomBigOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-big-enter,
+.ant-zoom-big-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-big-enter-prepare,
+.ant-zoom-big-appear-prepare {
+ transform: none;
+}
+.ant-zoom-big-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-big-fast-enter,
+.ant-zoom-big-fast-appear {
+ animation-duration: 0.1s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-big-fast-leave {
+ animation-duration: 0.1s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active,
+.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active {
+ animation-name: antZoomBigIn;
+ animation-play-state: running;
+}
+.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active {
+ animation-name: antZoomBigOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-big-fast-enter,
+.ant-zoom-big-fast-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-big-fast-enter-prepare,
+.ant-zoom-big-fast-appear-prepare {
+ transform: none;
+}
+.ant-zoom-big-fast-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-up-enter,
+.ant-zoom-up-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-up-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-up-enter.ant-zoom-up-enter-active,
+.ant-zoom-up-appear.ant-zoom-up-appear-active {
+ animation-name: antZoomUpIn;
+ animation-play-state: running;
+}
+.ant-zoom-up-leave.ant-zoom-up-leave-active {
+ animation-name: antZoomUpOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-up-enter,
+.ant-zoom-up-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-up-enter-prepare,
+.ant-zoom-up-appear-prepare {
+ transform: none;
+}
+.ant-zoom-up-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-down-enter,
+.ant-zoom-down-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-down-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-down-enter.ant-zoom-down-enter-active,
+.ant-zoom-down-appear.ant-zoom-down-appear-active {
+ animation-name: antZoomDownIn;
+ animation-play-state: running;
+}
+.ant-zoom-down-leave.ant-zoom-down-leave-active {
+ animation-name: antZoomDownOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-down-enter,
+.ant-zoom-down-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-down-enter-prepare,
+.ant-zoom-down-appear-prepare {
+ transform: none;
+}
+.ant-zoom-down-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-left-enter,
+.ant-zoom-left-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-left-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-left-enter.ant-zoom-left-enter-active,
+.ant-zoom-left-appear.ant-zoom-left-appear-active {
+ animation-name: antZoomLeftIn;
+ animation-play-state: running;
+}
+.ant-zoom-left-leave.ant-zoom-left-leave-active {
+ animation-name: antZoomLeftOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-left-enter,
+.ant-zoom-left-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-left-enter-prepare,
+.ant-zoom-left-appear-prepare {
+ transform: none;
+}
+.ant-zoom-left-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-right-enter,
+.ant-zoom-right-appear {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-right-leave {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-play-state: paused;
+}
+.ant-zoom-right-enter.ant-zoom-right-enter-active,
+.ant-zoom-right-appear.ant-zoom-right-appear-active {
+ animation-name: antZoomRightIn;
+ animation-play-state: running;
+}
+.ant-zoom-right-leave.ant-zoom-right-leave-active {
+ animation-name: antZoomRightOut;
+ animation-play-state: running;
+ pointer-events: none;
+}
+.ant-zoom-right-enter,
+.ant-zoom-right-appear {
+ transform: scale(0);
+ opacity: 0;
+ animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-right-enter-prepare,
+.ant-zoom-right-appear-prepare {
+ transform: none;
+}
+.ant-zoom-right-leave {
+ animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+@keyframes antZoomIn {
+ 0% {
+ transform: scale(0.2);
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@keyframes antZoomOut {
+ 0% {
+ transform: scale(1);
+ }
+ 100% {
+ transform: scale(0.2);
+ opacity: 0;
+ }
+}
+@keyframes antZoomBigIn {
+ 0% {
+ transform: scale(0.8);
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@keyframes antZoomBigOut {
+ 0% {
+ transform: scale(1);
+ }
+ 100% {
+ transform: scale(0.8);
+ opacity: 0;
+ }
+}
+@keyframes antZoomUpIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 50% 0%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ transform-origin: 50% 0%;
+ }
+}
+@keyframes antZoomUpOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 50% 0%;
+ }
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 50% 0%;
+ opacity: 0;
+ }
+}
+@keyframes antZoomLeftIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 0% 50%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ transform-origin: 0% 50%;
+ }
+}
+@keyframes antZoomLeftOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 0% 50%;
+ }
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 0% 50%;
+ opacity: 0;
+ }
+}
+@keyframes antZoomRightIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 100% 50%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ transform-origin: 100% 50%;
+ }
+}
+@keyframes antZoomRightOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 100% 50%;
+ }
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 100% 50%;
+ opacity: 0;
+ }
+}
+@keyframes antZoomDownIn {
+ 0% {
+ transform: scale(0.8);
+ transform-origin: 50% 100%;
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ transform-origin: 50% 100%;
+ }
+}
+@keyframes antZoomDownOut {
+ 0% {
+ transform: scale(1);
+ transform-origin: 50% 100%;
+ }
+ 100% {
+ transform: scale(0.8);
+ transform-origin: 50% 100%;
+ opacity: 0;
+ }
+}
+.ant-motion-collapse-legacy {
+ overflow: hidden;
+}
+.ant-motion-collapse-legacy-active {
+ transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
+}
+.ant-motion-collapse {
+ overflow: hidden;
+ transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/index.d.ts b/webapp/packages/supersonic-fe/src/assets/style/index.d.ts
new file mode 100644
index 000000000..d74e52ee9
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/index.d.ts
@@ -0,0 +1 @@
+import './index.less';
diff --git a/webapp/packages/supersonic-fe/src/assets/style/index.js b/webapp/packages/supersonic-fe/src/assets/style/index.js
new file mode 100644
index 000000000..17665f8be
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/index.js
@@ -0,0 +1 @@
+import './index.less';
\ No newline at end of file
diff --git a/webapp/packages/supersonic-fe/src/assets/style/index.less b/webapp/packages/supersonic-fe/src/assets/style/index.less
new file mode 100644
index 000000000..7882cea66
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/index.less
@@ -0,0 +1,3 @@
+@root-entry-name: default;
+
+@import './index-pure.less';
\ No newline at end of file
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/box.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/box.less
new file mode 100644
index 000000000..4bd3ffad7
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/box.less
@@ -0,0 +1,7 @@
+.box(@position: absolute) {
+ position: @position;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/clearfix.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/clearfix.less
new file mode 100644
index 000000000..07e89f801
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/clearfix.less
@@ -0,0 +1,16 @@
+// mixins for clearfix
+// ------------------------
+.clearfix() {
+ // https://github.com/ant-design/ant-design/issues/21301#issuecomment-583955229
+ &::before {
+ display: table;
+ content: '';
+ }
+
+ &::after {
+ // https://github.com/ant-design/ant-design/issues/21864
+ display: table;
+ clear: both;
+ content: '';
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/compact-item-vertical.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/compact-item-vertical.less
new file mode 100644
index 000000000..503b1f061
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/compact-item-vertical.less
@@ -0,0 +1,41 @@
+.compact-item-vertical-border-radius(@prefix-cls) {
+ &-item:not(&-first-item):not(&-last-item) {
+ border-radius: 0;
+ }
+
+ &-item&-first-item:not(&-last-item) {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ &-item&-last-item:not(&-first-item) {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ }
+}
+
+.compact-item-vertical-border(@prefix-cls) {
+ // border collapse
+ &-item:not(&-last-item) {
+ margin-bottom: -@border-width-base;
+ }
+
+ &-item {
+ &:hover,
+ &:focus,
+ &:active {
+ z-index: 2;
+ }
+
+ &[disabled] {
+ z-index: 0;
+ }
+ }
+}
+
+.compact-item-vertical(@prefix-cls) {
+ &-compact-vertical {
+ .compact-item-vertical-border(@prefix-cls);
+ .compact-item-vertical-border-radius(@prefix-cls);
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/compact-item.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/compact-item.less
new file mode 100644
index 000000000..cb4902764
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/compact-item.less
@@ -0,0 +1,133 @@
+.compact-item-border-radius(@prefix-cls, @bordered-item-cls: null) {
+ & when (@bordered-item-cls = null) {
+ // border-radius
+ &-item:not(&-first-item):not(&-last-item).@{prefix-cls} {
+ border-radius: 0;
+ }
+
+ &-item.@{prefix-cls}&-first-item:not(&-last-item):not(&-item-rtl) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+
+ &-item.@{prefix-cls}&-last-item:not(&-first-item):not(&-item-rtl) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ // ----------rtl for first item----------
+ &-item.@{prefix-cls}&-item-rtl&-first-item:not(&-last-item) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ // ----------rtl for last item----------
+ &-item.@{prefix-cls}&-item-rtl&-last-item:not(&-first-item) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+ }
+
+ & when (not (@bordered-item-cls = null)) {
+ // border-radius
+ &-item:not(&-first-item):not(&-last-item).@{prefix-cls} > .@{bordered-item-cls} {
+ border-radius: 0;
+ }
+
+ &-item&-first-item.@{prefix-cls}:not(&-last-item):not(&-item-rtl) > .@{bordered-item-cls} {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+
+ &-item&-last-item.@{prefix-cls}:not(&-first-item):not(&-item-rtl) > .@{bordered-item-cls} {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ // ----------rtl for first item----------
+ &-item.@{prefix-cls}&-first-item&-item-rtl:not(&-last-item) > .@{bordered-item-cls} {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ // ----------rtl for last item----------
+ &-item.@{prefix-cls}&-last-item&-item-rtl:not(&-first-item) > .@{bordered-item-cls} {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+ }
+}
+
+.compact-item-border(@prefix-cls, @bordered-item-cls: null, @special-open-cls) {
+ & when (@bordered-item-cls = null) {
+ // border collapse
+ &-item:not(&-last-item):not(&-item-rtl) {
+ margin-right: -@border-width-base;
+ }
+
+ // rtl border collapse
+ &-item:not(&-last-item)&-item-rtl {
+ margin-left: -@border-width-base;
+ }
+
+ &-item {
+ &:hover,
+ &:focus,
+ &:active {
+ z-index: 2;
+ }
+
+ // Select has an extra focus className
+ & when (not (@special-item-cls = null)) {
+ &.@{special-item-cls} {
+ z-index: 2;
+ }
+ }
+
+ &[disabled] {
+ z-index: 0;
+ }
+ }
+ }
+
+ & when (not (@bordered-item-cls = null)) {
+ // border collapse
+ &-item:not(&-last-item) {
+ margin-right: -@border-width-base;
+
+ &.@{prefix-cls}-compact-item-rtl {
+ margin-right: 0;
+ margin-left: -@border-width-base;
+ }
+ }
+
+ &-item {
+ &:hover,
+ &:focus,
+ &:active {
+ > * {
+ z-index: 2;
+ }
+ }
+
+ // Select has an special focus-item
+ & when (not (@special-item-cls = null)) {
+ &.@{special-item-cls} > * {
+ z-index: 2;
+ }
+ }
+
+ &[disabled] > * {
+ z-index: 0;
+ }
+ }
+ }
+}
+
+.compact-item(@prefix-cls, @bordered-item-cls: null, @special-item-cls: null) {
+ &-compact {
+ .compact-item-border(@prefix-cls, @bordered-item-cls, @special-item-cls);
+
+ .compact-item-border-radius(@prefix-cls, @bordered-item-cls);
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/compatibility.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/compatibility.less
new file mode 100644
index 000000000..9464a754a
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/compatibility.less
@@ -0,0 +1,13 @@
+// Compatibility for browsers.
+
+// Placeholder text
+.placeholder(@color: @input-placeholder-color) {
+ &::placeholder {
+ color: @color;
+ user-select: none; // https://github.com/ant-design/ant-design/pull/32639
+ }
+
+ &:placeholder-shown {
+ text-overflow: ellipsis;
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/customize.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/customize.less
new file mode 100644
index 000000000..6f6fc1864
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/customize.less
@@ -0,0 +1,181 @@
+// customize dark components background in popover containers(like Modal, Drawer, Card, Popover, Popconfirm, Notification, ...)
+// for dark theme
+.popover-customize-bg(@containerClass, @background: @popover-background, @prefix: @ant-prefix)
+ when
+ (@theme = dark) {
+ @picker-prefix-cls: ~'@{prefix}-picker';
+ @slider-prefix-cls: ~'@{prefix}-slider';
+ @anchor-prefix-cls: ~'@{prefix}-anchor';
+ @collapse-prefix-cls: ~'@{prefix}-collapse';
+ @tab-prefix-cls: ~'@{prefix}-tabs';
+ @timeline-prefix-cls: ~'@{prefix}-timeline';
+ @tree-prefix-cls: ~'@{prefix}-tree';
+ @card-prefix-cls: ~'@{prefix}-card';
+ @badge-prefix-cls: ~'@{prefix}-badge';
+ @transfer-prefix-cls: ~'@{prefix}-transfer';
+ @calendar-prefix-cls: ~'@{prefix}-picker-calendar';
+ @calendar-picker-prefix-cls: ~'@{prefix}-picker';
+ @table-prefix-cls: ~'@{prefix}-table';
+
+ @popover-border: @border-width-base @border-style-base @popover-customize-border-color;
+
+ .@{containerClass} {
+ .@{picker-prefix-cls}-clear,
+ .@{slider-prefix-cls}-handle,
+ .@{anchor-prefix-cls}-wrapper,
+ .@{collapse-prefix-cls}-content,
+ .@{timeline-prefix-cls}-item-head,
+ .@{card-prefix-cls} {
+ background-color: @background;
+ }
+
+ .@{transfer-prefix-cls} {
+ &-list {
+ &-header {
+ background: @background;
+ border-bottom: @popover-border;
+ }
+ &-content-item:not(.@{transfer-prefix-cls}-list-content-item-disabled):hover {
+ background-color: @item-hover-bg;
+ }
+ }
+ }
+
+ tr.@{table-prefix-cls}-expanded-row {
+ &,
+ &:hover {
+ > td {
+ background: #272727;
+ }
+ }
+ }
+ .@{table-prefix-cls}.@{table-prefix-cls}-small {
+ thead {
+ > tr {
+ > th {
+ background-color: @background;
+ border-bottom: @popover-border;
+ }
+ }
+ }
+ }
+ .@{table-prefix-cls} {
+ background-color: @background;
+ .@{table-prefix-cls}-row-expand-icon {
+ border: @popover-border;
+ }
+
+ tfoot {
+ > tr {
+ > th,
+ > td {
+ border-bottom: @popover-border;
+ }
+ }
+ }
+
+ thead {
+ > tr {
+ > th {
+ background-color: #272727;
+ border-bottom: @popover-border;
+ }
+ }
+ }
+
+ tbody {
+ > tr {
+ > td {
+ border-bottom: @popover-border;
+ &.@{table-prefix-cls}-cell-fix-left,
+ &.@{table-prefix-cls}-cell-fix-right {
+ background-color: @background;
+ }
+ }
+ &.@{table-prefix-cls}-row:hover {
+ > td {
+ background: @table-header-sort-active-bg;
+ }
+ }
+ }
+ }
+ &.@{table-prefix-cls}-bordered {
+ .@{table-prefix-cls}-title {
+ border: @popover-border;
+ }
+
+ // ============================= Cell =============================
+ thead > tr > th,
+ tbody > tr > td,
+ tfoot > tr > th,
+ tfoot > tr > td {
+ border-right: @popover-border;
+ }
+
+ // Fixed right should provides additional border
+ .@{table-prefix-cls}-cell-fix-right-first::after {
+ border-right: @popover-border;
+ }
+
+ // ============================ Header ============================
+ table > {
+ thead {
+ > tr:not(:last-child) > th {
+ border-bottom: @border-width-base @border-style-base @border-color-split;
+ }
+ }
+ }
+
+ // =========================== Content ============================
+ .@{table-prefix-cls}-container {
+ border: @popover-border;
+ }
+
+ // ========================== Expandable ==========================
+ .@{table-prefix-cls}-expanded-row-fixed {
+ &::after {
+ border-right: @popover-border;
+ }
+ }
+
+ .@{table-prefix-cls}-footer {
+ border: @popover-border;
+ }
+ }
+ .@{table-prefix-cls}-filter-trigger-container-open {
+ background-color: #525252;
+ }
+ }
+
+ .@{calendar-prefix-cls}-full {
+ background-color: @background;
+ .@{calendar-picker-prefix-cls}-panel {
+ background-color: @background;
+ .@{calendar-prefix-cls}-date {
+ border-top: 2px solid @popover-customize-border-color;
+ }
+ }
+ }
+
+ .@{tab-prefix-cls} {
+ &.@{tab-prefix-cls}-card .@{tab-prefix-cls}-card-bar .@{tab-prefix-cls}-tab-active {
+ background-color: @background;
+ border-bottom: @border-width-base solid @background;
+ }
+ }
+
+ .@{badge-prefix-cls} {
+ &-count {
+ box-shadow: 0 0 0 1px @background;
+ }
+ }
+
+ .@{tree-prefix-cls} {
+ &-show-line {
+ .@{tree-prefix-cls}-switcher {
+ background: @background;
+ }
+ }
+ }
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/iconfont.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/iconfont.less
new file mode 100644
index 000000000..aeb4e9672
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/iconfont.less
@@ -0,0 +1,29 @@
+.iconfont-mixin() {
+ display: inline-flex;
+ align-items: center;
+ color: @icon-color;
+ font-style: normal;
+ line-height: 0;
+ text-align: center;
+ text-transform: none;
+ vertical-align: -0.125em; // for SVG icon, see https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4
+ text-rendering: optimizelegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ > * {
+ line-height: 1;
+ }
+
+ svg {
+ display: inline-block;
+ }
+
+ &::before {
+ display: none; // dont display old icon.
+ }
+
+ & &-icon {
+ display: block;
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/index.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/index.less
new file mode 100644
index 000000000..5438846d1
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/index.less
@@ -0,0 +1,16 @@
+// Mixins
+// --------------------------------------------------
+@import 'size';
+@import 'compatibility';
+@import 'clearfix';
+@import 'iconfont';
+@import 'typography';
+@import 'customize';
+@import 'box';
+@import 'modal-mask';
+@import 'motion';
+@import 'reset';
+@import 'operation-unit';
+@import 'rounded-arrow';
+@import 'compact-item';
+@import 'compact-item-vertical';
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/modal-mask.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/modal-mask.less
new file mode 100644
index 000000000..b406bc1b4
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/modal-mask.less
@@ -0,0 +1,30 @@
+@import 'box';
+
+.modal-mask() {
+ pointer-events: none;
+
+ &.@{ant-prefix}-zoom-enter,
+ &.@{ant-prefix}-zoom-appear {
+ transform: none; // reset scale avoid mousePosition bug
+ opacity: 0;
+ animation-duration: @animation-duration-slow;
+ user-select: none; // https://github.com/ant-design/ant-design/issues/11777
+ }
+
+ &-mask {
+ .box(fixed);
+ z-index: @zindex-modal-mask;
+ height: 100%;
+ background-color: @modal-mask-bg;
+
+ &-hidden {
+ display: none;
+ }
+ }
+
+ &-wrap {
+ .box(fixed);
+ overflow: auto;
+ outline: 0;
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/motion.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/motion.less
new file mode 100644
index 000000000..1e1535000
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/motion.less
@@ -0,0 +1,33 @@
+.motion-common(@duration: @animation-duration-base) {
+ animation-duration: @duration;
+ animation-fill-mode: both;
+}
+
+.motion-common-leave(@duration: @animation-duration-base) {
+ animation-duration: @duration;
+ animation-fill-mode: both;
+}
+
+.make-motion(@className, @keyframeName, @duration: @animation-duration-base) {
+ .@{className}-enter,
+ .@{className}-appear {
+ .motion-common(@duration);
+
+ animation-play-state: paused;
+ }
+ .@{className}-leave {
+ .motion-common-leave(@duration);
+
+ animation-play-state: paused;
+ }
+ .@{className}-enter.@{className}-enter-active,
+ .@{className}-appear.@{className}-appear-active {
+ animation-name: ~'@{keyframeName}In';
+ animation-play-state: running;
+ }
+ .@{className}-leave.@{className}-leave-active {
+ animation-name: ~'@{keyframeName}Out';
+ animation-play-state: running;
+ pointer-events: none;
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/operation-unit.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/operation-unit.less
new file mode 100644
index 000000000..b69517111
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/operation-unit.less
@@ -0,0 +1,15 @@
+.operation-unit() {
+ color: @link-color;
+ outline: none;
+ cursor: pointer;
+ transition: color 0.3s;
+
+ &:focus-visible,
+ &:hover {
+ color: @link-hover-color;
+ }
+
+ &:active {
+ color: @link-active-color;
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/reset.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/reset.less
new file mode 100644
index 000000000..905c16e24
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/reset.less
@@ -0,0 +1,11 @@
+.reset-component() {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ color: @text-color;
+ font-size: @font-size-base;
+ font-variant: @font-variant-base;
+ line-height: @line-height-base;
+ list-style: none;
+ font-feature-settings: @font-feature-settings-base;
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/rounded-arrow.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/rounded-arrow.less
new file mode 100644
index 000000000..1c8264336
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/rounded-arrow.less
@@ -0,0 +1,44 @@
+.roundedArrow(@width, @outer-radius, @bg-color: var(--antd-arrow-background-color)) {
+ @corner-height: unit(((@outer-radius) * (1 - 1 / sqrt(2))));
+
+ @width-without-unit: unit(@width);
+ @outer-radius-without-unit: unit(@outer-radius);
+ @inner-radius-without-unit: unit(@arrow-border-radius);
+
+ @a-x: @width-without-unit - @corner-height;
+ @a-y: 2 * @width-without-unit + @corner-height;
+ @b-x: @a-x + @outer-radius-without-unit * (1 / sqrt(2));
+ @b-y: 2 * @width-without-unit;
+ @c-x: 2 * @width-without-unit - @inner-radius-without-unit;
+ @c-y: 2 * @width-without-unit;
+ @d-x: 2 * @width-without-unit;
+ @d-y: 2 * @width-without-unit - @inner-radius-without-unit;
+ @e-x: 2 * @width-without-unit;
+ @e-y: @f-y + @outer-radius-without-unit * (1 / sqrt(2));
+ @f-x: 2 * @width-without-unit + @corner-height;
+ @f-y: @width-without-unit - @corner-height;
+ @g-x: @f-x - 1;
+ @g-y: @f-y;
+ @h-x: @a-x;
+ @h-y: @a-y - 1;
+
+ border-radius: 0 0 @arrow-border-radius;
+ pointer-events: none;
+
+ &::before {
+ position: absolute;
+ top: -@width;
+ left: -@width;
+ width: @width * 3;
+ height: @width * 3;
+ background: @bg-color;
+ // Hack firefox: https://github.com/ant-design/ant-design/pull/33710#issuecomment-1015287825
+ background-repeat: no-repeat;
+ background-position: ceil(-@width + 1px) ceil(-@width + 1px);
+ content: '';
+ clip-path: inset(33% 33%); // For browsers that do not support path()
+ clip-path: path(
+ 'M @{a-x} @{a-y} A @{outer-radius-without-unit} @{outer-radius-without-unit} 0 0 1 @{b-x} @{b-y} L @{c-x} @{c-y} A @{inner-radius-without-unit} @{inner-radius-without-unit} 0 0 0 @{d-x} @{d-y} L @{e-x} @{e-y} A @{outer-radius-without-unit} @{outer-radius-without-unit} 0 0 1 @{f-x} @{f-y} L @{g-x} @{g-y} L @{h-x} @{h-y} Z'
+ );
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/size.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/size.less
new file mode 100644
index 000000000..a8be65089
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/size.less
@@ -0,0 +1,10 @@
+// Sizing shortcuts
+
+.size(@width; @height) {
+ width: @width;
+ height: @height;
+}
+
+.square(@size) {
+ .size(@size; @size);
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/mixins/typography.less b/webapp/packages/supersonic-fe/src/assets/style/mixins/typography.less
new file mode 100644
index 000000000..71a4d39b0
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/mixins/typography.less
@@ -0,0 +1,58 @@
+// =============== Common ===============
+.typography-paragraph() {
+ margin-bottom: 1em;
+}
+
+.typography-title(@fontSize; @fontWeight; @lineHeight; @headingColor; @headingMarginBottom;) {
+ margin-bottom: @headingMarginBottom;
+ color: @headingColor;
+ font-weight: @fontWeight;
+ font-size: @fontSize;
+ line-height: @lineHeight;
+}
+
+.typography-title-1() {
+ .typography-title(
+ @heading-1-size,
+ @typography-title-font-weight,
+ 1.23,
+ @heading-color,
+ @typography-title-margin-bottom
+ );
+}
+.typography-title-2() {
+ .typography-title(
+ @heading-2-size,
+ @typography-title-font-weight,
+ 1.35,
+ @heading-color,
+ @typography-title-margin-bottom
+ );
+}
+.typography-title-3() {
+ .typography-title(
+ @heading-3-size,
+ @typography-title-font-weight,
+ 1.35,
+ @heading-color,
+ @typography-title-margin-bottom
+ );
+}
+.typography-title-4() {
+ .typography-title(
+ @heading-4-size,
+ @typography-title-font-weight,
+ 1.4,
+ @heading-color,
+ @typography-title-margin-bottom
+ );
+}
+.typography-title-5() {
+ .typography-title(
+ @heading-5-size,
+ @typography-title-font-weight,
+ 1.5,
+ @heading-color,
+ @typography-title-margin-bottom
+ );
+}
diff --git a/webapp/packages/supersonic-fe/src/assets/style/themes/compact.less b/webapp/packages/supersonic-fe/src/assets/style/themes/compact.less
new file mode 100644
index 000000000..bd0b01de4
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/themes/compact.less
@@ -0,0 +1,295 @@
+@import './default.less';
+
+@line-height-base: 1.66667;
+@mode: compact;
+@font-size-base: 12px;
+@font-size-lg: @font-size-base + 2px;
+
+// default paddings
+@default-padding-lg: 24px; // containers
+@default-padding-md: 16px; // small containers and buttons
+@default-padding-sm: 12px; // Form controls and items
+@default-padding-xs: 8px; // small items
+@default-padding-xss: 4px; // more small
+
+// vertical paddings
+@padding-lg: 16px; // containers
+@padding-md: 8px; // small containers and buttons
+@padding-sm: 8px; // Form controls and items
+@padding-xs: 4px; // small items
+@padding-xss: 0px; // more small
+
+// vertical padding for all form controls
+@control-padding-horizontal: @padding-sm;
+@control-padding-horizontal-sm: @default-padding-xs;
+
+// vertical margins
+@margin-lg: 16px; // containers
+@margin-md: 8px; // small containers and buttons
+@margin-sm: 8px; // Form controls and items
+@margin-xs: 4px; // small items
+@margin-xss: 0px; // more small
+
+// height rules
+@height-base: 28px;
+@height-lg: 32px;
+@height-sm: 22px;
+
+// Button
+// ---
+@btn-padding-horizontal-base: @default-padding-sm - 1px;
+@btn-padding-horizontal-lg: @btn-padding-horizontal-base;
+@btn-padding-horizontal-sm: @default-padding-xs - 1px;
+@btn-square-only-icon-size-lg: 16px;
+@btn-square-only-icon-size: 14px;
+@btn-square-only-icon-size-sm: 12px;
+
+// Breadcrumb
+// ---
+@breadcrumb-font-size: @font-size-base;
+@breadcrumb-icon-font-size: @font-size-base;
+
+//Dropdown
+@dropdown-line-height: 18px;
+
+// Menu
+@menu-item-padding-horizontal: 12px;
+@menu-horizontal-line-height: 38px;
+@menu-inline-toplevel-item-height: 32px;
+@menu-item-height: 32px;
+@menu-item-vertical-margin: 0px;
+@menu-item-boundary-margin: 0px;
+@menu-icon-margin-right: 8px;
+
+// Checkbox
+@checkbox-size: 14px;
+@checkbox-group-item-margin-right: 6px;
+
+// picker
+@picker-panel-cell-height: 22px;
+@picker-panel-cell-width: 32px;
+@picker-text-height: 32px;
+@picker-time-panel-cell-height: 24px;
+@picker-panel-without-time-cell-height: 48px;
+
+// Form
+// ---
+@form-item-margin-bottom: 16px;
+@form-vertical-label-padding: 0 0 4px;
+
+// Rate
+// ---
+@rate-star-size: 16px;
+
+// Radio
+// ---
+@radio-size: 14px;
+@radio-wrapper-margin-right: 6px;
+
+// Switch
+// ---
+@switch-height: 20px;
+@switch-sm-height: 14px;
+@switch-min-width: 40px;
+@switch-sm-min-width: 24px;
+@switch-inner-margin-min: 4px;
+@switch-inner-margin-max: 22px;
+
+// Slider
+// ---
+@slider-handle-size: 12px;
+@slider-handle-margin-top: -4px;
+
+// Input
+// ---
+@input-padding-vertical-base: round(
+ max(
+ (round(((@input-height-base - @font-size-base * @line-height-base) / 2) * 10) / 10) -
+ @border-width-base,
+ 2px
+ )
+);
+@input-padding-horizontal-lg: 11px;
+
+// PageHeader
+// ---
+@page-header-padding: 16px;
+@page-header-padding-vertical: 8px;
+@page-header-heading-title: 16px;
+@page-header-heading-sub-title: 12px;
+@page-header-tabs-tab-font-size: 14px;
+
+// Pagination
+// ---
+@pagination-mini-options-size-changer-top: 1px;
+@pagination-item-size-sm: 22px;
+
+// Cascader
+// ----
+@cascader-dropdown-line-height: @dropdown-line-height;
+
+// Select
+// ---
+@select-dropdown-height: @height-base;
+@select-single-item-height-lg: 32px;
+@select-multiple-item-height: @input-height-base - max(@input-padding-vertical-base, 4) * 2; // Normal 24px
+@select-multiple-item-height-lg: 24px;
+@select-multiple-item-spacing-half: 3px;
+
+// Tree
+// ---
+@tree-title-height: 20px;
+
+// Transfer
+// ---
+@transfer-item-padding-vertical: 3px;
+@transfer-list-search-icon-top: 8px;
+@transfer-header-height: 36px;
+
+// Comment
+// ---
+@comment-actions-margin-bottom: 0px;
+@comment-actions-margin-top: @margin-xs;
+@comment-content-detail-p-margin-bottom: 0px;
+
+// Steps
+// ---
+@steps-icon-size: 24px;
+@steps-icon-custom-size: 20px;
+@steps-icon-custom-font-size: 20px;
+@steps-icon-custom-top: 2px;
+@steps-icon-margin: 2px 8px 2px 0;
+@steps-icon-font-size: @font-size-base;
+@steps-dot-top: 4px;
+@steps-icon-top: 0px;
+@steps-small-icon-size: 20px;
+@steps-vertical-icon-width: 12px;
+@steps-vertical-tail-width: 12px;
+@steps-vertical-tail-width-sm: 10px;
+// Collapse
+// ---
+//@collapse-header-padding-extra: 32px;
+@collapse-content-padding: @padding-md @padding-lg;
+
+// List
+// ---
+@list-item-meta-description-font-size: @font-size-sm;
+@list-item-padding-sm: 4px 12px;
+@list-item-padding-lg: 12px 16px;
+
+// Drawer
+// ---
+@drawer-header-padding: 11px @padding-lg;
+@drawer-footer-padding-vertical: @padding-sm;
+@drawer-footer-padding-horizontal: @padding-sm;
+@drawer-header-close-size: 44px;
+
+// Modal
+// --
+@modal-header-padding-vertical: 11px;
+@modal-header-padding: @modal-header-padding-vertical @modal-header-padding-horizontal;
+@modal-footer-padding-vertical: @padding-sm;
+@modal-header-close-size: @modal-header-title-line-height + 2 * @modal-header-padding-vertical;
+@modal-confirm-body-padding: 24px 24px 16px;
+
+// Message
+// ---
+@message-notice-content-padding: 8px 16px;
+
+// popover
+// --
+@popover-min-height: 28px;
+@popover-padding-horizontal: @default-padding-sm;
+
+// Card
+// ---
+@card-head-height: 36px;
+@card-head-font-size: @card-head-font-size-sm;
+@card-head-padding: 8.5px;
+@card-padding-base: 12px;
+@card-padding-base-sm: @card-padding-base;
+@card-head-height-sm: 30px;
+@card-head-padding-sm: 6px;
+@card-actions-li-margin: 4px 0;
+@card-head-tabs-margin-bottom: -9px;
+
+// Table
+// ---
+@table-padding-vertical: 12px;
+@table-padding-horizontal: 8px;
+@table-padding-vertical-md: 8px;
+@table-padding-horizontal-md: 8px;
+@table-padding-vertical-sm: 4px;
+@table-padding-horizontal-sm: 4px;
+@table-selection-column-width: 32px;
+
+// Statistic
+// ---
+@statistic-content-font-size: 20px;
+
+// Alert
+// ---
+@alert-with-description-no-icon-padding-vertical: 7px;
+@alert-with-description-padding-vertical: 11px;
+@alert-icon-top: 7px + @font-size-base * (@line-height-base / 2) - (@font-size-base / 2);
+@alert-with-description-icon-size: 20px;
+
+// Skeleton
+// ---
+@skeleton-paragraph-margin-top: 20px;
+@skeleton-paragraph-li-margin-top: 12px;
+@skeleton-paragraph-li-height: 14px;
+@skeleton-title-height: 14px;
+@skeleton-title-paragraph-margin-top: 20px;
+
+// Descriptions
+@descriptions-title-margin-bottom: 8px;
+@descriptions-default-padding: 12px @padding-lg;
+@descriptions-item-padding-bottom: @padding-xs;
+
+// Avatar
+// ---
+@avatar-size-base: 28px;
+@avatar-size-lg: 32px;
+@avatar-size-sm: 22px;
+@avatar-font-size-base: 16px;
+@avatar-font-size-lg: 20px;
+@avatar-font-size-sm: 12px;
+
+// Badge
+// ---
+@badge-height: 18px;
+
+// Tag
+// ---
+@tag-line-height: 18px;
+
+// Notification
+// ---
+@notification-padding-vertical: 12px;
+@notification-padding-horizontal: 16px;
+
+// Result
+// ---
+@result-title-font-size: 20px;
+@result-icon-font-size: 64px;
+@result-extra-margin: 24px 0 0 0;
+
+// Anchor
+// ---
+@anchor-link-top: 4px;
+@anchor-link-left: 16px;
+@anchor-link-padding: @anchor-link-top 0 @anchor-link-top @anchor-link-left;
+
+// Tabs
+// ---
+@tabs-card-horizontal-padding: 4px @padding-md;
+
+// Progress
+// ---
+@progress-circle-text-font-size: 0.833333em;
+
+// Image
+// ---
+@image-size-base: 48px;
+@image-font-size-base: 24px;
diff --git a/webapp/packages/supersonic-fe/src/assets/style/themes/dark.less b/webapp/packages/supersonic-fe/src/assets/style/themes/dark.less
new file mode 100644
index 000000000..4cfda904b
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/themes/dark.less
@@ -0,0 +1,457 @@
+@import './default.less';
+
+@theme: dark;
+// color palettes
+@blue-1: mix(color(~`colorPalette('@{blue-base}', 8) `), @component-background, 15%);
+@blue-2: mix(color(~`colorPalette('@{blue-base}', 7) `), @component-background, 25%);
+@blue-3: mix(@blue-base, @component-background, 30%);
+@blue-4: mix(@blue-base, @component-background, 45%);
+@blue-5: mix(@blue-base, @component-background, 65%);
+@blue-6: mix(@blue-base, @component-background, 85%);
+@blue-7: mix(color(~`colorPalette('@{blue-base}', 5) `), @component-background, 90%);
+@blue-8: mix(color(~`colorPalette('@{blue-base}', 4) `), @component-background, 95%);
+@blue-9: mix(color(~`colorPalette('@{blue-base}', 3) `), @component-background, 97%);
+@blue-10: mix(color(~`colorPalette('@{blue-base}', 2) `), @component-background, 98%);
+
+@purple-1: mix(color(~`colorPalette('@{purple-base}', 8) `), @component-background, 15%);
+@purple-2: mix(color(~`colorPalette('@{purple-base}', 7) `), @component-background, 25%);
+@purple-3: mix(@purple-base, @component-background, 30%);
+@purple-4: mix(@purple-base, @component-background, 45%);
+@purple-5: mix(@purple-base, @component-background, 65%);
+@purple-6: mix(@purple-base, @component-background, 85%);
+@purple-7: mix(color(~`colorPalette('@{purple-base}', 5) `), @component-background, 90%);
+@purple-8: mix(color(~`colorPalette('@{purple-base}', 4) `), @component-background, 95%);
+@purple-9: mix(color(~`colorPalette('@{purple-base}', 3) `), @component-background, 97%);
+@purple-10: mix(color(~`colorPalette('@{purple-base}', 2) `), @component-background, 98%);
+
+@cyan-1: mix(color(~`colorPalette('@{cyan-base}', 8) `), @component-background, 15%);
+@cyan-2: mix(color(~`colorPalette('@{cyan-base}', 7) `), @component-background, 25%);
+@cyan-3: mix(@cyan-base, @component-background, 30%);
+@cyan-4: mix(@cyan-base, @component-background, 45%);
+@cyan-5: mix(@cyan-base, @component-background, 65%);
+@cyan-6: mix(@cyan-base, @component-background, 85%);
+@cyan-7: mix(color(~`colorPalette('@{cyan-base}', 5) `), @component-background, 90%);
+@cyan-8: mix(color(~`colorPalette('@{cyan-base}', 4) `), @component-background, 95%);
+@cyan-9: mix(color(~`colorPalette('@{cyan-base}', 3) `), @component-background, 97%);
+@cyan-10: mix(color(~`colorPalette('@{cyan-base}', 2) `), @component-background, 98%);
+
+@green-1: mix(color(~`colorPalette('@{green-base}', 8) `), @component-background, 15%);
+@green-2: mix(color(~`colorPalette('@{green-base}', 7) `), @component-background, 25%);
+@green-3: mix(@green-base, @component-background, 30%);
+@green-4: mix(@green-base, @component-background, 45%);
+@green-5: mix(@green-base, @component-background, 65%);
+@green-6: mix(@green-base, @component-background, 85%);
+@green-7: mix(color(~`colorPalette('@{green-base}', 5) `), @component-background, 90%);
+@green-8: mix(color(~`colorPalette('@{green-base}', 4) `), @component-background, 95%);
+@green-9: mix(color(~`colorPalette('@{green-base}', 3) `), @component-background, 97%);
+@green-10: mix(color(~`colorPalette('@{green-base}', 2) `), @component-background, 98%);
+
+@magenta-1: mix(color(~`colorPalette('@{magenta-base}', 8) `), @component-background, 15%);
+@magenta-2: mix(color(~`colorPalette('@{magenta-base}', 7) `), @component-background, 25%);
+@magenta-3: mix(@magenta-base, @component-background, 30%);
+@magenta-4: mix(@magenta-base, @component-background, 45%);
+@magenta-5: mix(@magenta-base, @component-background, 65%);
+@magenta-6: mix(@magenta-base, @component-background, 85%);
+@magenta-7: mix(color(~`colorPalette('@{magenta-base}', 5) `), @component-background, 90%);
+@magenta-8: mix(color(~`colorPalette('@{magenta-base}', 4) `), @component-background, 95%);
+@magenta-9: mix(color(~`colorPalette('@{magenta-base}', 3) `), @component-background, 97%);
+@magenta-10: mix(color(~`colorPalette('@{magenta-base}', 2) `), @component-background, 98%);
+
+@pink-1: mix(color(~`colorPalette('@{pink-base}', 8) `), @component-background, 15%);
+@pink-2: mix(color(~`colorPalette('@{pink-base}', 7) `), @component-background, 25%);
+@pink-3: mix(@pink-base, @component-background, 30%);
+@pink-4: mix(@pink-base, @component-background, 45%);
+@pink-5: mix(@pink-base, @component-background, 65%);
+@pink-6: mix(@pink-base, @component-background, 85%);
+@pink-7: mix(color(~`colorPalette('@{pink-base}', 5) `), @component-background, 90%);
+@pink-8: mix(color(~`colorPalette('@{pink-base}', 4) `), @component-background, 95%);
+@pink-9: mix(color(~`colorPalette('@{pink-base}', 3) `), @component-background, 97%);
+@pink-10: mix(color(~`colorPalette('@{pink-base}', 2) `), @component-background, 98%);
+
+@red-1: mix(color(~`colorPalette('@{red-base}', 8) `), @component-background, 15%);
+@red-2: mix(color(~`colorPalette('@{red-base}', 7) `), @component-background, 25%);
+@red-3: mix(@red-base, @component-background, 30%);
+@red-4: mix(@red-base, @component-background, 45%);
+@red-5: mix(@red-base, @component-background, 65%);
+@red-6: mix(@red-base, @component-background, 85%);
+@red-7: mix(color(~`colorPalette('@{red-base}', 5) `), @component-background, 90%);
+@red-8: mix(color(~`colorPalette('@{red-base}', 4) `), @component-background, 95%);
+@red-9: mix(color(~`colorPalette('@{red-base}', 3) `), @component-background, 97%);
+@red-10: mix(color(~`colorPalette('@{red-base}', 2) `), @component-background, 98%);
+
+@orange-1: mix(color(~`colorPalette('@{orange-base}', 8) `), @component-background, 15%);
+@orange-2: mix(color(~`colorPalette('@{orange-base}', 7) `), @component-background, 25%);
+@orange-3: mix(@orange-base, @component-background, 30%);
+@orange-4: mix(@orange-base, @component-background, 45%);
+@orange-5: mix(@orange-base, @component-background, 65%);
+@orange-6: mix(@orange-base, @component-background, 85%);
+@orange-7: mix(color(~`colorPalette('@{orange-base}', 5) `), @component-background, 90%);
+@orange-8: mix(color(~`colorPalette('@{orange-base}', 4) `), @component-background, 95%);
+@orange-9: mix(color(~`colorPalette('@{orange-base}', 3) `), @component-background, 97%);
+@orange-10: mix(color(~`colorPalette('@{orange-base}', 2) `), @component-background, 98%);
+
+@yellow-1: mix(color(~`colorPalette('@{yellow-base}', 8) `), @component-background, 15%);
+@yellow-2: mix(color(~`colorPalette('@{yellow-base}', 7) `), @component-background, 25%);
+@yellow-3: mix(@yellow-base, @component-background, 30%);
+@yellow-4: mix(@yellow-base, @component-background, 45%);
+@yellow-5: mix(@yellow-base, @component-background, 65%);
+@yellow-6: mix(@yellow-base, @component-background, 85%);
+@yellow-7: mix(color(~`colorPalette('@{yellow-base}', 5) `), @component-background, 90%);
+@yellow-8: mix(color(~`colorPalette('@{yellow-base}', 4) `), @component-background, 95%);
+@yellow-9: mix(color(~`colorPalette('@{yellow-base}', 3) `), @component-background, 97%);
+@yellow-10: mix(color(~`colorPalette('@{yellow-base}', 2) `), @component-background, 98%);
+
+@volcano-1: mix(color(~`colorPalette('@{volcano-base}', 8) `), @component-background, 15%);
+@volcano-2: mix(color(~`colorPalette('@{volcano-base}', 7) `), @component-background, 25%);
+@volcano-3: mix(@volcano-base, @component-background, 30%);
+@volcano-4: mix(@volcano-base, @component-background, 45%);
+@volcano-5: mix(@volcano-base, @component-background, 65%);
+@volcano-6: mix(@volcano-base, @component-background, 85%);
+@volcano-7: mix(color(~`colorPalette('@{volcano-base}', 5) `), @component-background, 90%);
+@volcano-8: mix(color(~`colorPalette('@{volcano-base}', 4) `), @component-background, 95%);
+@volcano-9: mix(color(~`colorPalette('@{volcano-base}', 3) `), @component-background, 97%);
+@volcano-10: mix(color(~`colorPalette('@{volcano-base}', 2) `), @component-background, 98%);
+
+@geekblue-1: mix(color(~`colorPalette('@{geekblue-base}', 8) `), @component-background, 15%);
+@geekblue-2: mix(color(~`colorPalette('@{geekblue-base}', 7) `), @component-background, 25%);
+@geekblue-3: mix(@geekblue-base, @component-background, 30%);
+@geekblue-4: mix(@geekblue-base, @component-background, 45%);
+@geekblue-5: mix(@geekblue-base, @component-background, 65%);
+@geekblue-6: mix(@geekblue-base, @component-background, 85%);
+@geekblue-7: mix(color(~`colorPalette('@{geekblue-base}', 5) `), @component-background, 90%);
+@geekblue-8: mix(color(~`colorPalette('@{geekblue-base}', 4) `), @component-background, 95%);
+@geekblue-9: mix(color(~`colorPalette('@{geekblue-base}', 3) `), @component-background, 97%);
+@geekblue-10: mix(color(~`colorPalette('@{geekblue-base}', 2) `), @component-background, 98%);
+
+@lime-1: mix(color(~`colorPalette('@{lime-base}', 8) `), @component-background, 15%);
+@lime-2: mix(color(~`colorPalette('@{lime-base}', 7) `), @component-background, 25%);
+@lime-3: mix(@lime-base, @component-background, 30%);
+@lime-4: mix(@lime-base, @component-background, 45%);
+@lime-5: mix(@lime-base, @component-background, 65%);
+@lime-6: mix(@lime-base, @component-background, 85%);
+@lime-7: mix(color(~`colorPalette('@{lime-base}', 5) `), @component-background, 90%);
+@lime-8: mix(color(~`colorPalette('@{lime-base}', 4) `), @component-background, 95%);
+@lime-9: mix(color(~`colorPalette('@{lime-base}', 3) `), @component-background, 97%);
+@lime-10: mix(color(~`colorPalette('@{lime-base}', 2) `), @component-background, 98%);
+
+@gold-1: mix(color(~`colorPalette('@{gold-base}', 8) `), @component-background, 15%);
+@gold-2: mix(color(~`colorPalette('@{gold-base}', 7) `), @component-background, 25%);
+@gold-3: mix(@gold-base, @component-background, 30%);
+@gold-4: mix(@gold-base, @component-background, 45%);
+@gold-5: mix(@gold-base, @component-background, 65%);
+@gold-6: mix(@gold-base, @component-background, 85%);
+@gold-7: mix(color(~`colorPalette('@{gold-base}', 5) `), @component-background, 90%);
+@gold-8: mix(color(~`colorPalette('@{gold-base}', 4) `), @component-background, 95%);
+@gold-9: mix(color(~`colorPalette('@{gold-base}', 3) `), @component-background, 97%);
+@gold-10: mix(color(~`colorPalette('@{gold-base}', 2) `), @component-background, 98%);
+
+// Color used by default to control hover and active backgrounds and for
+// alert info backgrounds.
+@primary-1: mix(color(~`colorPalette('@{primary-color}', 8) `), @component-background, 15%);
+@primary-2: mix(color(~`colorPalette('@{primary-color}', 7) `), @component-background, 25%);
+@primary-3: mix(@primary-color, @component-background, 30%);
+@primary-4: mix(@primary-color, @component-background, 45%);
+@primary-5: mix(@primary-color, @component-background, 65%);
+@primary-6: @primary-color;
+@primary-7: mix(color(~`colorPalette('@{primary-color}', 5) `), @component-background, 90%);
+@primary-8: mix(color(~`colorPalette('@{primary-color}', 4) `), @component-background, 95%);
+@primary-9: mix(color(~`colorPalette('@{primary-color}', 3) `), @component-background, 97%);
+@primary-10: mix(color(~`colorPalette('@{primary-color}', 2) `), @component-background, 98%);
+
+// Layer background
+@popover-background: #1f1f1f;
+@popover-customize-border-color: #3a3a3a;
+@body-background: @black;
+@component-background: #141414;
+
+@text-color: fade(@white, 85%);
+@text-color-secondary: fade(@white, 45%);
+@text-color-inverse: @white;
+@icon-color-hover: fade(@white, 75%);
+@heading-color: fade(@white, 85%);
+
+// The background colors for active and hover states for things like
+// list items or table cells.
+@item-active-bg: @primary-1;
+@item-hover-bg: fade(@white, 8%);
+
+// Border color
+@border-color-base: #434343; // base border outline a component
+@border-color-split: #303030; // split border inside a component
+
+@background-color-light: fade(@white, 4%); // background of header and selected item
+@background-color-base: fade(@white, 8%); // Default grey background color
+
+// Disabled states
+@disabled-color: fade(@white, 30%);
+@disabled-bg: @background-color-base;
+@disabled-color-dark: fade(@white, 30%);
+
+// Tree
+// ---
+@tree-bg: transparent;
+
+// List
+// ---
+@list-customize-card-bg: transparent;
+
+// Shadow
+// ---
+@shadow-color: rgba(0, 0, 0, 0.45);
+@shadow-color-inverse: @component-background;
+@box-shadow-base: @shadow-2;
+@shadow-1-up: 0 -6px 16px -8px rgba(0, 0, 0, 0.32), 0 -9px 28px 0 rgba(0, 0, 0, 0.2),
+ 0 -12px 48px 16px rgba(0, 0, 0, 0.12);
+@shadow-1-down: 0 6px 16px -8px rgba(0, 0, 0, 0.32), 0 9px 28px 0 rgba(0, 0, 0, 0.2),
+ 0 12px 48px 16px rgba(0, 0, 0, 0.12);
+@shadow-1-right: 6px 0 16px -8px rgba(0, 0, 0, 0.32), 9px 0 28px 0 rgba(0, 0, 0, 0.2),
+ 12px 0 48px 16px rgba(0, 0, 0, 0.12);
+@shadow-2: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32),
+ 0 9px 28px 8px rgba(0, 0, 0, 0.2);
+
+// Buttons
+// ---
+@btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015);
+@btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
+@btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
+
+@btn-default-bg: transparent;
+
+@btn-default-ghost-color: @text-color;
+@btn-default-ghost-border: fade(@white, 25%);
+
+@btn-text-hover-bg: rgba(255, 255, 255, 0.03);
+
+// Checkbox
+// ---
+@checkbox-check-bg: transparent;
+
+// Descriptions
+// ---
+@descriptions-bg: @background-color-light;
+
+// Divider
+// ---
+@divider-color: rgba(255, 255, 255, 12%);
+
+// Modal
+// ---
+@modal-header-bg: @popover-background;
+@modal-header-border-color-split: @border-color-split;
+@modal-content-bg: @popover-background;
+@modal-footer-border-color-split: @border-color-split;
+
+// Radio
+// ---
+@radio-solid-checked-color: @white;
+@radio-dot-disabled-color: fade(@white, 20%);
+
+// Radio buttons
+// ---
+@radio-disabled-button-checked-bg: fade(@white, 20%);
+@radio-disabled-button-checked-color: @disabled-color;
+
+// Layout
+// ---
+@layout-body-background: @body-background;
+@layout-header-background: @popover-background;
+@layout-trigger-background: #262626;
+
+// Input
+// ---
+@input-bg: transparent;
+@input-placeholder-color: fade(@white, 30%);
+@input-icon-color: fade(@white, 30%);
+@input-number-handler-active-bg: @item-hover-bg;
+@input-icon-hover-color: fade(@white, 85%);
+
+// Select
+// ---
+@select-background: transparent;
+@select-dropdown-bg: @popover-background;
+@select-clear-background: @component-background;
+@select-selection-item-bg: fade(@white, 8);
+@select-selection-item-border-color: @border-color-split;
+@select-multiple-disabled-background: @component-background;
+@select-multiple-item-disabled-color: #595959;
+@select-multiple-item-disabled-border-color: @popover-background;
+
+// Cascader
+// ---
+@cascader-bg: transparent;
+@cascader-menu-bg: @popover-background;
+@cascader-menu-border-color-split: @border-color-split;
+
+// Tooltip
+// ---
+// Tooltip background color
+@tooltip-bg: #434343;
+
+// Menu
+// ---
+// dark theme
+@menu-dark-inline-submenu-bg: @component-background;
+@menu-dark-bg: @popover-background;
+@menu-popup-bg: @popover-background;
+
+// Message
+// ---
+@message-notice-content-bg: @popover-background;
+
+// Notification
+@notification-bg: @popover-background;
+
+// LINK
+@link-hover-color: @primary-5;
+@link-active-color: @primary-7;
+
+// Table
+// --
+@table-header-bg: #1d1d1d;
+@table-body-sort-bg: fade(@white, 1%);
+@table-row-hover-bg: #262626;
+@table-header-cell-split-color: fade(@white, 8%);
+@table-header-sort-bg: #262626;
+@table-header-filter-active-bg: #434343;
+@table-header-sort-active-bg: #303030;
+@table-fixed-header-sort-active-bg: #222;
+@table-filter-btns-bg: @popover-background;
+@table-expanded-row-bg: @table-header-bg;
+@table-filter-dropdown-bg: @popover-background;
+@table-expand-icon-bg: transparent;
+
+// Tag
+// ---
+@info-color-deprecated-bg: @primary-1;
+@info-color-deprecated-border: @primary-3;
+@success-color-deprecated-bg: @green-1;
+@success-color-deprecated-border: @green-3;
+@warning-color-deprecated-bg: @orange-1;
+@warning-color-deprecated-border: @orange-3;
+@error-color-deprecated-bg: @red-1;
+@error-color-deprecated-border: @red-3;
+
+// TimePicker
+// ---
+@picker-basic-cell-hover-with-range-color: darken(@primary-color, 35%);
+@picker-basic-cell-disabled-bg: #303030;
+@picker-border-color: @border-color-split;
+@picker-bg: transparent;
+@picker-date-hover-range-border-color: darken(@primary-color, 20%);
+
+// Dropdown
+// ---
+@dropdown-menu-bg: @popover-background;
+@dropdown-menu-submenu-disabled-bg: transparent;
+
+// Steps
+// ---
+@steps-nav-arrow-color: fade(@white, 20%);
+@steps-background: transparent;
+
+// Avatar
+// ---
+@avatar-bg: fade(@white, 30%);
+
+// Progress
+// ---
+@progress-steps-item-bg: fade(@white, 8%);
+
+// Calendar
+// ---
+@calendar-bg: @popover-background;
+@calendar-input-bg: @calendar-bg;
+@calendar-border-color: transparent;
+@calendar-full-bg: @component-background;
+
+// Badge
+// ---
+@badge-text-color: @white;
+
+// Popover
+@popover-bg: @popover-background;
+
+// Drawer
+@drawer-bg: @popover-background;
+
+// Card
+// ---
+@card-actions-background: @component-background;
+@card-skeleton-bg: #303030;
+@card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.64), 0 3px 6px 0 rgba(0, 0, 0, 0.48),
+ 0 5px 12px 4px rgba(0, 0, 0, 0.36);
+
+// Transfer
+// ---
+@transfer-item-hover-bg: #262626;
+
+// Comment
+// ---
+@comment-bg: transparent;
+@comment-author-time-color: fade(@white, 30%);
+@comment-action-hover-color: fade(@white, 65%);
+
+// Rate
+// ---
+@rate-star-bg: fade(@white, 12%);
+
+// Switch
+// ---
+@switch-bg: @white;
+
+// Pagination
+// ---
+@pagination-item-bg: transparent;
+@pagination-item-bg-active: transparent;
+@pagination-item-link-bg: transparent;
+@pagination-item-disabled-bg-active: fade(@white, 25%);
+@pagination-item-disabled-color-active: @black;
+@pagination-item-input-bg: @pagination-item-bg;
+
+// PageHeader
+// ---
+@page-header-back-color: @icon-color;
+@page-header-ghost-bg: transparent;
+
+// Slider
+// ---
+@slider-rail-background-color: #262626;
+@slider-rail-background-color-hover: @border-color-base;
+@slider-dot-border-color: @border-color-split;
+@slider-dot-border-color-active: @primary-4;
+
+// Skeleton
+// ---
+@skeleton-to-color: fade(@white, 16%);
+
+// Alert
+// ---
+@alert-success-border-color: @green-3;
+@alert-success-bg-color: @green-1;
+@alert-success-icon-color: @success-color;
+@alert-info-border-color: @primary-3;
+@alert-info-bg-color: @primary-1;
+@alert-info-icon-color: @info-color;
+@alert-warning-border-color: @gold-3;
+@alert-warning-bg-color: @gold-1;
+@alert-warning-icon-color: @warning-color;
+@alert-error-border-color: @red-3;
+@alert-error-bg-color: @red-1;
+@alert-error-icon-color: @error-color;
+
+// Timeline
+// ---
+@timeline-color: @border-color-split;
+@timeline-dot-color: @primary-color;
+
+// Mentions
+// ---
+@mentions-dropdown-bg: @popover-background;
+
+// Segmented
+// ---
+@segmented-bg: fade(@black, 25%);
+@segmented-hover-bg: fade(@black, 45%);
+@segmented-selected-bg: #333333;
+@segmented-label-color: fade(@white, 65%);
+@segmented-label-hover-color: fade(@white, 85%);
diff --git a/webapp/packages/supersonic-fe/src/assets/style/themes/default.less b/webapp/packages/supersonic-fe/src/assets/style/themes/default.less
new file mode 100644
index 000000000..5c5b47f7d
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/themes/default.less
@@ -0,0 +1,1084 @@
+/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
+@import '../color/colors';
+
+@theme: default;
+
+// The prefix to use on all css classes from ant.
+@ant-prefix: ant;
+
+// An override for the html selector for theme prefixes
+@html-selector: html;
+
+// [CSS-VARIABLE-REPLACE-BEGIN: html-variables]
+// [CSS-VARIABLE-REPLACE-END: html-variables]
+
+// -------- Colors -----------
+// >>> Primary
+@primary-color: @blue-6;
+@primary-color-hover: color(~`colorPalette('@{primary-color}', 5) `);
+@primary-color-active: color(~`colorPalette('@{primary-color}', 7) `);
+@primary-color-outline: fade(@primary-color, @outline-fade);
+
+@processing-color: @blue-6;
+
+// >>> Info
+@info-color: @primary-color;
+@info-color-deprecated-bg: color(~`colorPalette('@{info-color}', 1) `);
+@info-color-deprecated-border: color(~`colorPalette('@{info-color}', 3) `);
+
+// >>> Success
+@success-color: @green-6;
+@success-color-hover: color(~`colorPalette('@{success-color}', 5) `);
+@success-color-active: color(~`colorPalette('@{success-color}', 7) `);
+@success-color-outline: fade(@success-color, @outline-fade);
+@success-color-deprecated-bg: color(~`colorPalette('@{success-color}', 1) `);
+@success-color-deprecated-border: color(~`colorPalette('@{success-color}', 3) `);
+
+// >>> Warning
+@warning-color: @gold-6;
+@warning-color-hover: color(~`colorPalette('@{warning-color}', 5) `);
+@warning-color-active: color(~`colorPalette('@{warning-color}', 7) `);
+@warning-color-outline: fade(@warning-color, @outline-fade);
+@warning-color-deprecated-bg: color(~`colorPalette('@{warning-color}', 1) `);
+@warning-color-deprecated-border: color(~`colorPalette('@{warning-color}', 3) `);
+
+// >>> Error
+@error-color: @red-5;
+@error-color-hover: color(~`colorPalette('@{error-color}', 5) `);
+@error-color-active: color(~`colorPalette('@{error-color}', 7) `);
+@error-color-outline: fade(@error-color, @outline-fade);
+@error-color-deprecated-bg: color(~`colorPalette('@{error-color}', 1) `);
+@error-color-deprecated-border: color(~`colorPalette('@{error-color}', 3) `);
+
+@highlight-color: @red-5;
+@normal-color: #d9d9d9;
+@white: #fff;
+@black: #000;
+
+// Color used by default to control hover and active backgrounds and for
+// alert info backgrounds.
+@primary-1: color(~`colorPalette('@{primary-color}', 1) `); // replace tint(@primary-color, 90%)
+@primary-2: color(~`colorPalette('@{primary-color}', 2) `); // replace tint(@primary-color, 80%)
+@primary-3: color(~`colorPalette('@{primary-color}', 3) `); // unused
+@primary-4: color(~`colorPalette('@{primary-color}', 4) `); // unused
+@primary-5: color(
+ ~`colorPalette('@{primary-color}', 5) `
+); // color used to control the text color in many active and hover states, replace tint(@primary-color, 20%)
+@primary-6: @primary-color; // color used to control the text color of active buttons, don't use, use @primary-color
+@primary-7: color(~`colorPalette('@{primary-color}', 7) `); // replace shade(@primary-color, 5%)
+@primary-8: color(~`colorPalette('@{primary-color}', 8) `); // unused
+@primary-9: color(~`colorPalette('@{primary-color}', 9) `); // unused
+@primary-10: color(~`colorPalette('@{primary-color}', 10) `); // unused
+
+// Base Scaffolding Variables
+// ---
+
+// Background color for ``
+@body-background: #fff;
+// Base background color for most components
+@component-background: #fff;
+// Popover background color
+@popover-background: @component-background;
+@popover-customize-border-color: @border-color-split;
+@font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
+ 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
+ 'Noto Color Emoji';
+@code-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+@text-color: fade(@black, 85%);
+@text-color-secondary: fade(@black, 45%);
+@text-color-inverse: @white;
+@icon-color: inherit;
+@icon-color-hover: fade(@black, 75%);
+@heading-color: fade(@black, 85%);
+@text-color-dark: fade(@white, 85%);
+@text-color-secondary-dark: fade(@white, 65%);
+@text-selection-bg: @primary-color;
+@font-variant-base: tabular-nums;
+@font-feature-settings-base: 'tnum';
+@font-size-base: 14px;
+@font-size-lg: @font-size-base + 2px;
+@font-size-sm: 12px;
+@heading-1-size: ceil(@font-size-base * 2.71);
+@heading-2-size: ceil(@font-size-base * 2.14);
+@heading-3-size: ceil(@font-size-base * 1.71);
+@heading-4-size: ceil(@font-size-base * 1.42);
+@heading-5-size: ceil(@font-size-base * 1.14);
+// https://github.com/ant-design/ant-design/issues/20210
+@line-height-base: 1.5715;
+@border-radius-base: 2px;
+@border-radius-sm: 2px;
+
+// control border
+@control-border-radius: @border-radius-base;
+
+// arrow border
+@arrow-border-radius: 2px;
+
+// vertical paddings
+@padding-lg: 24px; // containers
+@padding-md: 16px; // small containers and buttons
+@padding-sm: 12px; // Form controls and items
+@padding-xs: 8px; // small items
+@padding-xss: 4px; // more small
+
+// vertical padding for all form controls
+@control-padding-horizontal: @padding-sm;
+@control-padding-horizontal-sm: @padding-xs;
+
+// vertical margins
+@margin-lg: 24px; // containers
+@margin-md: 16px; // small containers and buttons
+@margin-sm: 12px; // Form controls and items
+@margin-xs: 8px; // small items
+@margin-xss: 4px; // more small
+
+// height rules
+@height-base: 32px;
+@height-lg: 40px;
+@height-sm: 24px;
+
+// The background colors for active and hover states for things like
+// list items or table cells.
+@item-active-bg: @primary-1;
+@item-hover-bg: #f5f5f5;
+
+// ICONFONT
+@iconfont-css-prefix: anticon;
+
+// LINK
+@link-color: @primary-color;
+@link-hover-color: color(~`colorPalette('@{link-color}', 5) `);
+@link-active-color: color(~`colorPalette('@{link-color}', 7) `);
+@link-decoration: none;
+@link-hover-decoration: none;
+@link-focus-decoration: none;
+@link-focus-outline: 0;
+
+// Animation
+@ease-base-out: cubic-bezier(0.7, 0.3, 0.1, 1);
+@ease-base-in: cubic-bezier(0.9, 0, 0.3, 0.7);
+@ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);
+@ease-in: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+@ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
+@ease-out-back: cubic-bezier(0.12, 0.4, 0.29, 1.46);
+@ease-in-back: cubic-bezier(0.71, -0.46, 0.88, 0.6);
+@ease-in-out-back: cubic-bezier(0.71, -0.46, 0.29, 1.46);
+@ease-out-circ: cubic-bezier(0.08, 0.82, 0.17, 1);
+@ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+@ease-in-out-circ: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+@ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1);
+@ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+@ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);
+
+// Border color
+@border-color-base: hsv(0, 0, 85%); // base border outline a component
+@border-color-split: hsv(0, 0, 94%); // split border inside a component
+@border-color-inverse: @white;
+@border-width-base: 1px; // width of the border for a component
+@border-style-base: solid; // style of a components border
+
+// Outline
+@outline-blur-size: 0;
+@outline-width: 2px;
+@outline-color: @primary-color; // No use anymore
+@outline-fade: 20%;
+
+@background-color-light: hsv(0, 0, 98%); // background of header and selected item
+@background-color-base: hsv(0, 0, 96%); // Default grey background color
+
+// Disabled states
+@disabled-color: fade(#000, 25%);
+@disabled-bg: @background-color-base;
+@disabled-active-bg: tint(@black, 90%);
+@disabled-color-dark: fade(#fff, 35%);
+
+// Shadow
+@shadow-color: rgba(0, 0, 0, 0.15);
+@shadow-color-inverse: @component-background;
+@box-shadow-base: @shadow-2;
+@shadow-1-up: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05),
+ 0 -12px 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-down: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05),
+ 0 12px 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-left: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05),
+ -12px 0 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-right: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05),
+ 12px 0 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-2: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08),
+ 0 9px 28px 8px rgba(0, 0, 0, 0.05);
+
+// Buttons
+@btn-font-weight: 400;
+@btn-border-radius-base: @border-radius-base;
+@btn-border-radius-sm: @border-radius-base;
+@btn-border-width: @border-width-base;
+@btn-border-style: @border-style-base;
+@btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015);
+@btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
+@btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
+
+@btn-primary-color: #fff;
+@btn-primary-bg: @primary-color;
+
+@btn-default-color: @text-color;
+@btn-default-bg: @component-background;
+@btn-default-border: @border-color-base;
+
+@btn-danger-color: #fff;
+@btn-danger-bg: @error-color;
+@btn-danger-border: @error-color;
+
+@btn-disable-color: @disabled-color;
+@btn-disable-bg: @disabled-bg;
+@btn-disable-border: @border-color-base;
+
+@btn-default-ghost-color: @component-background;
+@btn-default-ghost-bg: transparent;
+@btn-default-ghost-border: @component-background;
+
+@btn-font-size-lg: @font-size-lg;
+@btn-font-size-sm: @font-size-base;
+@btn-padding-horizontal-base: @padding-md - 1px;
+@btn-padding-horizontal-lg: @btn-padding-horizontal-base;
+@btn-padding-horizontal-sm: @padding-xs - 1px;
+
+@btn-height-base: @height-base;
+@btn-height-lg: @height-lg;
+@btn-height-sm: @height-sm;
+
+@btn-line-height: @line-height-base;
+
+@btn-circle-size: @btn-height-base;
+@btn-circle-size-lg: @btn-height-lg;
+@btn-circle-size-sm: @btn-height-sm;
+
+@btn-square-size: @btn-height-base;
+@btn-square-size-lg: @btn-height-lg;
+@btn-square-size-sm: @btn-height-sm;
+@btn-square-only-icon-size: @font-size-base + 2px;
+@btn-square-only-icon-size-sm: @font-size-base;
+@btn-square-only-icon-size-lg: @btn-font-size-lg + 2px;
+
+@btn-group-border: @primary-5;
+
+@btn-link-hover-bg: transparent;
+@btn-text-hover-bg: rgba(0, 0, 0, 0.018);
+
+// Checkbox
+@checkbox-size: 16px;
+@checkbox-color: @primary-color;
+@checkbox-check-color: #fff;
+@checkbox-check-bg: @checkbox-check-color;
+@checkbox-border-width: @border-width-base;
+@checkbox-border-radius: @border-radius-sm;
+@checkbox-group-item-margin-right: 8px;
+
+// Descriptions
+@descriptions-bg: #fafafa;
+@descriptions-title-margin-bottom: 20px;
+@descriptions-default-padding: @padding-md @padding-lg;
+@descriptions-middle-padding: @padding-sm @padding-lg;
+@descriptions-small-padding: @padding-xs @padding-md;
+@descriptions-item-padding-bottom: @padding-md;
+@descriptions-item-trailing-colon: true;
+@descriptions-item-label-colon-margin-right: 8px;
+@descriptions-item-label-colon-margin-left: 2px;
+@descriptions-extra-color: @text-color;
+
+// Divider
+@divider-text-padding: 1em;
+@divider-orientation-margin: 5%;
+@divider-color: rgba(0, 0, 0, 6%);
+@divider-vertical-gutter: 8px;
+
+// Dropdown
+@dropdown-selected-color: @primary-color;
+@dropdown-menu-submenu-disabled-bg: @component-background;
+@dropdown-selected-bg: @item-active-bg;
+
+// Empty
+@empty-font-size: @font-size-base;
+
+// Radio
+@radio-size: 16px;
+@radio-top: 0.2em;
+@radio-border-width: 1px;
+@radio-dot-size: @radio-size - 8px;
+@radio-dot-color: @primary-color;
+@radio-dot-disabled-color: fade(@black, 20%);
+@radio-solid-checked-color: @component-background;
+
+// Radio buttons
+@radio-button-bg: @btn-default-bg;
+@radio-button-checked-bg: @btn-default-bg;
+@radio-button-color: @btn-default-color;
+@radio-button-hover-color: @primary-5;
+@radio-button-active-color: @primary-7;
+@radio-button-padding-horizontal: @padding-md - 1px;
+@radio-disabled-button-checked-bg: @disabled-active-bg;
+@radio-disabled-button-checked-color: @disabled-color;
+@radio-wrapper-margin-right: 8px;
+
+// Media queries breakpoints
+// @screen-xs and @screen-xs-min is not used in Grid
+// smallest break point is @screen-md
+@screen-xs: 480px;
+@screen-xs-min: @screen-xs;
+// 👆 Extra small screen / phone
+
+// 👇 Small screen / tablet
+@screen-sm: 576px;
+@screen-sm-min: @screen-sm;
+
+// Medium screen / desktop
+@screen-md: 768px;
+@screen-md-min: @screen-md;
+
+// Large screen / wide desktop
+@screen-lg: 992px;
+@screen-lg-min: @screen-lg;
+
+// Extra large screen / full hd
+@screen-xl: 1200px;
+@screen-xl-min: @screen-xl;
+
+// Extra extra large screen / large desktop
+@screen-xxl: 1600px;
+@screen-xxl-min: @screen-xxl;
+
+// provide a maximum
+@screen-xs-max: (@screen-sm-min - 1px);
+@screen-sm-max: (@screen-md-min - 1px);
+@screen-md-max: (@screen-lg-min - 1px);
+@screen-lg-max: (@screen-xl-min - 1px);
+@screen-xl-max: (@screen-xxl-min - 1px);
+
+// Grid system
+@grid-columns: 24;
+
+// Layout
+@layout-body-background: #f0f2f5;
+@layout-header-background: #001529;
+@layout-header-height: 64px;
+@layout-header-padding: 0 50px;
+@layout-header-color: @text-color;
+@layout-footer-padding: 24px 50px;
+@layout-footer-background: @layout-body-background;
+@layout-sider-background: @layout-header-background;
+@layout-trigger-height: 48px;
+@layout-trigger-background: #002140;
+@layout-trigger-color: #fff;
+@layout-zero-trigger-width: 36px;
+@layout-zero-trigger-height: 42px;
+// Layout light theme
+@layout-sider-background-light: #fff;
+@layout-trigger-background-light: #fff;
+@layout-trigger-color-light: @text-color;
+
+// z-index list, order by `z-index`
+@zindex-badge: auto;
+@zindex-table-fixed: 2;
+@zindex-affix: 10;
+@zindex-back-top: 10;
+@zindex-picker-panel: 10;
+@zindex-popup-close: 10;
+@zindex-modal: 1000;
+@zindex-modal-mask: 1000;
+@zindex-message: 1010;
+@zindex-notification: 1010;
+@zindex-popover: 1030;
+@zindex-dropdown: 1050;
+@zindex-picker: 1050;
+@zindex-popoconfirm: 1060;
+@zindex-tooltip: 1070;
+@zindex-image: 1080;
+
+// Animation
+@animation-duration-slow: 0.3s; // Modal
+@animation-duration-base: 0.2s;
+@animation-duration-fast: 0.1s; // Tooltip
+
+//CollapsePanel
+@collapse-panel-border-radius: @border-radius-base;
+
+//Dropdown
+@dropdown-menu-bg: @component-background;
+@dropdown-vertical-padding: 5px;
+@dropdown-edge-child-vertical-padding: 4px;
+@dropdown-font-size: @font-size-base;
+@dropdown-line-height: 22px;
+
+// Form
+// ---
+@label-required-color: @highlight-color;
+@label-color: @heading-color;
+@form-warning-input-bg: @input-bg;
+@form-item-margin-bottom: 24px;
+@form-item-trailing-colon: true;
+@form-vertical-label-padding: 0 0 8px;
+@form-vertical-label-margin: 0;
+@form-item-label-font-size: @font-size-base;
+@form-item-label-height: @input-height-base;
+@form-item-label-colon-margin-right: 8px;
+@form-item-label-colon-margin-left: 2px;
+@form-error-input-bg: @input-bg;
+
+// Input
+// ---
+@input-height-base: @height-base;
+@input-height-lg: @height-lg;
+@input-height-sm: @height-sm;
+@input-padding-horizontal: @control-padding-horizontal - 1px;
+@input-padding-horizontal-base: @input-padding-horizontal;
+@input-padding-horizontal-sm: @control-padding-horizontal-sm - 1px;
+@input-padding-horizontal-lg: @input-padding-horizontal;
+@input-padding-vertical-base: max(
+ (round(((@input-height-base - @font-size-base * @line-height-base) / 2) * 10) / 10) -
+ @border-width-base,
+ 3px
+);
+@input-padding-vertical-sm: max(
+ (round(((@input-height-sm - @font-size-base * @line-height-base) / 2) * 10) / 10) -
+ @border-width-base,
+ 0
+);
+@input-padding-vertical-lg: (
+ ceil(((@input-height-lg - @font-size-lg * @line-height-base) / 2) * 10) / 10
+ ) - @border-width-base;
+@input-placeholder-color: hsv(0, 0, 75%);
+@input-color: @text-color;
+@input-icon-color: @input-color;
+@input-border-color: @border-color-base;
+@input-bg: @component-background;
+@input-number-hover-border-color: @input-hover-border-color;
+@input-number-handler-active-bg: #f4f4f4;
+@input-number-handler-hover-bg: @primary-5;
+@input-number-handler-bg: @component-background;
+@input-number-handler-border-color: @border-color-base;
+@input-addon-bg: @background-color-light;
+@input-hover-border-color: @primary-5;
+@input-disabled-bg: @disabled-bg;
+@input-outline-offset: 0 0;
+@input-icon-hover-color: fade(@black, 85%);
+@input-disabled-color: @disabled-color;
+
+// Mentions
+// ---
+@mentions-dropdown-bg: @component-background;
+@mentions-dropdown-menu-item-hover-bg: @mentions-dropdown-bg;
+
+// Select
+// ---
+@select-border-color: @border-color-base;
+@select-item-selected-color: @text-color;
+@select-item-selected-font-weight: 600;
+@select-dropdown-bg: @component-background;
+@select-item-selected-bg: @primary-1;
+@select-item-active-bg: @item-hover-bg;
+@select-dropdown-vertical-padding: @dropdown-vertical-padding;
+@select-dropdown-font-size: @dropdown-font-size;
+@select-dropdown-line-height: @dropdown-line-height;
+@select-dropdown-height: 32px;
+@select-background: @component-background;
+@select-clear-background: @select-background;
+@select-selection-item-bg: @background-color-base;
+@select-selection-item-border-color: @border-color-split;
+@select-single-item-height-lg: 40px;
+@select-multiple-item-height: @input-height-base - @input-padding-vertical-base * 2; // Normal 24px
+@select-multiple-item-height-lg: 32px;
+@select-multiple-item-spacing-half: ceil((@input-padding-vertical-base / 2));
+@select-multiple-disabled-background: @input-disabled-bg;
+@select-multiple-item-disabled-color: #bfbfbf;
+@select-multiple-item-disabled-border-color: @select-border-color;
+
+// Cascader
+// ---
+@cascader-bg: @component-background;
+@cascader-item-selected-bg: @primary-1;
+@cascader-menu-bg: @component-background;
+@cascader-menu-border-color-split: @border-color-split;
+
+// Cascader
+// ----
+@cascader-dropdown-vertical-padding: @dropdown-vertical-padding;
+@cascader-dropdown-edge-child-vertical-padding: @dropdown-edge-child-vertical-padding;
+@cascader-dropdown-font-size: @dropdown-font-size;
+@cascader-dropdown-line-height: @dropdown-line-height;
+
+// Anchor
+// ---
+@anchor-bg: transparent;
+@anchor-border-color: @border-color-split;
+@anchor-link-top: 4px;
+@anchor-link-left: 16px;
+@anchor-link-padding: @anchor-link-top 0 @anchor-link-top @anchor-link-left;
+
+// Tooltip
+// ---
+// Tooltip max width
+@tooltip-max-width: 250px;
+// Tooltip text color
+@tooltip-color: #fff;
+// Tooltip background color
+@tooltip-bg: rgba(0, 0, 0, 0.75);
+// Tooltip arrow width
+@tooltip-arrow-width: 8px * sqrt(2);
+// Tooltip distance with trigger
+@tooltip-distance: @tooltip-arrow-width - 1px + 4px;
+// Tooltip arrow color
+@tooltip-arrow-color: @tooltip-bg;
+@tooltip-border-radius: @border-radius-base;
+
+// Popover
+// ---
+// Popover body background color
+@popover-bg: @component-background;
+// Popover text color
+@popover-color: @text-color;
+// Popover maximum width
+@popover-min-width: 177px;
+@popover-min-height: 32px;
+// Popover arrow width
+@popover-arrow-width: @tooltip-arrow-width;
+// Popover arrow color
+@popover-arrow-color: @popover-bg;
+// Popover outer arrow width
+// Popover outer arrow color
+@popover-arrow-outer-color: @popover-bg;
+// Popover distance with trigger
+@popover-distance: @popover-arrow-width + 4px;
+@popover-padding-horizontal: @padding-md;
+
+// Modal
+// --
+@modal-header-padding-vertical: @padding-md;
+@modal-header-padding-horizontal: @padding-lg;
+@modal-body-padding: @padding-lg;
+@modal-header-bg: @component-background;
+@modal-header-padding: @modal-header-padding-vertical @modal-header-padding-horizontal;
+@modal-header-border-width: @border-width-base;
+@modal-header-border-style: @border-style-base;
+@modal-header-title-line-height: 22px;
+@modal-header-title-font-size: @font-size-lg;
+@modal-header-border-color-split: @border-color-split;
+@modal-header-close-size: @modal-header-title-line-height + 2 * @modal-header-padding-vertical;
+@modal-content-bg: @component-background;
+@modal-heading-color: @heading-color;
+@modal-close-color: @text-color-secondary;
+@modal-footer-bg: transparent;
+@modal-footer-border-color-split: @border-color-split;
+@modal-footer-border-style: @border-style-base;
+@modal-footer-padding-vertical: 10px;
+@modal-footer-padding-horizontal: 16px;
+@modal-footer-border-width: @border-width-base;
+@modal-mask-bg: fade(@black, 45%);
+@modal-confirm-body-padding: 32px 32px 24px;
+@modal-confirm-title-font-size: @font-size-lg;
+@modal-border-radius: @border-radius-base;
+
+// Progress
+// --
+@progress-default-color: @processing-color;
+@progress-remaining-color: @background-color-base;
+@progress-info-text-color: @progress-text-color;
+@progress-radius: 100px;
+@progress-steps-item-bg: #f3f3f3;
+@progress-text-font-size: 1em;
+@progress-text-color: @text-color; // This is for circle text color, should be renamed better
+@progress-circle-text-font-size: 1em;
+// Menu
+// ---
+@menu-inline-toplevel-item-height: 40px;
+@menu-item-height: 40px;
+@menu-item-group-height: @line-height-base;
+@menu-collapsed-width: 80px;
+@menu-bg: @component-background;
+@menu-popup-bg: @component-background;
+@menu-item-color: @text-color;
+@menu-inline-submenu-bg: @background-color-light;
+@menu-highlight-color: @primary-color;
+@menu-highlight-danger-color: @error-color;
+@menu-item-active-bg: @primary-1;
+@menu-item-active-danger-bg: @red-1;
+@menu-item-active-border-width: 3px;
+@menu-item-group-title-color: @text-color-secondary;
+@menu-item-vertical-margin: 4px;
+@menu-item-font-size: @font-size-base;
+@menu-item-boundary-margin: 8px;
+@menu-item-padding-horizontal: 20px;
+@menu-item-padding: 0 @menu-item-padding-horizontal;
+@menu-horizontal-line-height: 46px;
+@menu-icon-margin-right: 10px;
+@menu-icon-size: @menu-item-font-size;
+@menu-icon-size-lg: @font-size-lg;
+@menu-item-group-title-font-size: @menu-item-font-size;
+
+// dark theme
+@menu-dark-color: @text-color-secondary-dark;
+@menu-dark-danger-color: @error-color;
+@menu-dark-bg: @layout-header-background;
+@menu-dark-arrow-color: #fff;
+@menu-dark-inline-submenu-bg: #000c17;
+@menu-dark-highlight-color: #fff;
+@menu-dark-item-active-bg: @primary-color;
+@menu-dark-item-active-danger-bg: @error-color;
+@menu-dark-selected-item-icon-color: @white;
+@menu-dark-selected-item-text-color: @white;
+@menu-dark-item-hover-bg: transparent;
+// Spin
+// ---
+@spin-dot-size-sm: 14px;
+@spin-dot-size: 20px;
+@spin-dot-size-lg: 32px;
+
+// Table
+// --
+@table-bg: @component-background;
+@table-header-bg: @background-color-light;
+@table-header-color: @heading-color;
+@table-header-sort-bg: @background-color-base;
+@table-body-sort-bg: #fafafa;
+@table-row-hover-bg: @background-color-light;
+@table-selected-row-color: inherit;
+@table-selected-row-bg: @primary-1;
+@table-body-selected-sort-bg: @table-selected-row-bg;
+@table-selected-row-hover-bg: darken(@table-selected-row-bg, 2%);
+@table-expanded-row-bg: #fbfbfb;
+@table-padding-vertical: 16px;
+@table-padding-horizontal: 16px;
+@table-padding-vertical-md: (@table-padding-vertical * 3 / 4);
+@table-padding-horizontal-md: (@table-padding-horizontal / 2);
+@table-padding-vertical-sm: (@table-padding-vertical / 2);
+@table-padding-horizontal-sm: (@table-padding-horizontal / 2);
+@table-border-color: @border-color-split;
+@table-border-radius-base: @border-radius-base;
+@table-footer-bg: @background-color-light;
+@table-footer-color: @heading-color;
+@table-header-bg-sm: @table-header-bg;
+@table-font-size: @font-size-base;
+@table-font-size-md: @table-font-size;
+@table-font-size-sm: @table-font-size;
+@table-header-cell-split-color: rgba(0, 0, 0, 0.06);
+// Sorter
+// Legacy: `table-header-sort-active-bg` is used for hover not real active
+@table-header-sort-active-bg: rgba(0, 0, 0, 0.04);
+@table-fixed-header-sort-active-bg: hsv(0, 0, 96%);
+
+// Filter
+@table-header-filter-active-bg: rgba(0, 0, 0, 0.04);
+@table-filter-btns-bg: inherit;
+@table-filter-dropdown-bg: @component-background;
+@table-expand-icon-bg: @component-background;
+@table-selection-column-width: 32px;
+// Sticky
+@table-sticky-scroll-bar-bg: fade(#000, 35%);
+@table-sticky-scroll-bar-radius: 4px;
+
+// Tag
+// --
+@tag-border-radius: @border-radius-base;
+@tag-default-bg: @background-color-light;
+@tag-default-color: @text-color;
+@tag-font-size: @font-size-sm;
+@tag-line-height: 20px;
+
+// TimePicker
+// ---
+@picker-bg: @component-background;
+@picker-basic-cell-hover-color: @item-hover-bg;
+@picker-basic-cell-active-with-range-color: @primary-1;
+@picker-basic-cell-hover-with-range-color: lighten(@primary-color, 35%);
+@picker-basic-cell-disabled-bg: rgba(0, 0, 0, 0.04);
+@picker-border-color: @border-color-split;
+@picker-date-hover-range-border-color: lighten(@primary-color, 20%);
+@picker-date-hover-range-color: @picker-basic-cell-hover-with-range-color;
+@picker-time-panel-column-width: 56px;
+@picker-time-panel-column-height: 224px;
+@picker-time-panel-cell-height: 28px;
+@picker-panel-cell-height: 24px;
+@picker-panel-cell-width: 36px;
+@picker-text-height: 40px;
+@picker-panel-without-time-cell-height: 66px;
+
+// Calendar
+// ---
+@calendar-bg: @component-background;
+@calendar-input-bg: @input-bg;
+@calendar-border-color: @border-color-inverse;
+@calendar-item-active-bg: @item-active-bg;
+@calendar-column-active-bg: fade(@calendar-item-active-bg, 20%);
+@calendar-full-bg: @calendar-bg;
+@calendar-full-panel-bg: @calendar-full-bg;
+
+// Carousel
+// ---
+@carousel-dot-width: 16px;
+@carousel-dot-height: 3px;
+@carousel-dot-active-width: 24px;
+
+// Badge
+// ---
+@badge-height: 20px;
+@badge-height-sm: 14px;
+@badge-dot-size: 6px;
+@badge-font-size: @font-size-sm;
+@badge-font-size-sm: @font-size-sm;
+@badge-font-weight: normal;
+@badge-status-size: 6px;
+@badge-text-color: @component-background;
+@badge-color: @highlight-color;
+
+// Rate
+// ---
+@rate-star-color: @yellow-6;
+@rate-star-bg: @border-color-split;
+@rate-star-size: 20px;
+@rate-star-hover-scale: scale(1.1);
+
+// Card
+// ---
+@card-head-color: @heading-color;
+@card-head-background: transparent;
+@card-head-font-size: @font-size-lg;
+@card-head-font-size-sm: @font-size-base;
+@card-head-padding: 16px;
+@card-head-padding-sm: (@card-head-padding / 2);
+@card-head-height: 48px;
+@card-head-height-sm: 36px;
+@card-inner-head-padding: 12px;
+@card-padding-base: 24px;
+@card-padding-base-sm: (@card-padding-base / 2);
+@card-actions-background: @component-background;
+@card-actions-li-margin: 12px 0;
+@card-skeleton-bg: #cfd8dc;
+@card-background: @component-background;
+@card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12),
+ 0 5px 12px 4px rgba(0, 0, 0, 0.09);
+@card-radius: @border-radius-base;
+@card-head-tabs-margin-bottom: -17px;
+@card-head-extra-color: @text-color;
+
+// Comment
+// ---
+@comment-bg: inherit;
+@comment-padding-base: @padding-md 0;
+@comment-nest-indent: 44px;
+@comment-font-size-base: @font-size-base;
+@comment-font-size-sm: @font-size-sm;
+@comment-author-name-color: @text-color-secondary;
+@comment-author-time-color: #ccc;
+@comment-action-color: @text-color-secondary;
+@comment-action-hover-color: #595959;
+@comment-actions-margin-bottom: inherit;
+@comment-actions-margin-top: @margin-sm;
+@comment-content-detail-p-margin-bottom: inherit;
+
+// Tabs
+// ---
+@tabs-card-head-background: @background-color-light;
+@tabs-card-height: 40px;
+@tabs-card-active-color: @primary-color;
+@tabs-card-horizontal-padding: (
+ (@tabs-card-height - floor(@font-size-base * @line-height-base)) / 2
+ ) - @border-width-base @padding-md;
+@tabs-card-horizontal-padding-sm: 6px @padding-md;
+@tabs-card-horizontal-padding-lg: 7px @padding-md 6px;
+@tabs-title-font-size: @font-size-base;
+@tabs-title-font-size-lg: @font-size-lg;
+@tabs-title-font-size-sm: @font-size-base;
+@tabs-ink-bar-color: @primary-color;
+@tabs-bar-margin: 0 0 @margin-md 0;
+@tabs-horizontal-gutter: 32px;
+@tabs-horizontal-margin: 0 0 0 @tabs-horizontal-gutter;
+@tabs-horizontal-margin-rtl: 0 0 0 32px;
+@tabs-horizontal-padding: @padding-sm 0;
+@tabs-horizontal-padding-lg: @padding-md 0;
+@tabs-horizontal-padding-sm: @padding-xs 0;
+@tabs-vertical-padding: @padding-xs @padding-lg;
+@tabs-vertical-margin: @margin-md 0 0 0;
+@tabs-scrolling-size: 32px;
+@tabs-highlight-color: @primary-color;
+@tabs-hover-color: @primary-5;
+@tabs-active-color: @primary-7;
+@tabs-card-gutter: 2px;
+@tabs-card-tab-active-border-top: 2px solid transparent;
+
+// BackTop
+// ---
+@back-top-color: #fff;
+@back-top-bg: @text-color-secondary;
+@back-top-hover-bg: @text-color;
+
+// Avatar
+// ---
+@avatar-size-base: 32px;
+@avatar-size-lg: 40px;
+@avatar-size-sm: 24px;
+@avatar-font-size-base: 18px;
+@avatar-font-size-lg: 24px;
+@avatar-font-size-sm: 14px;
+@avatar-bg: #ccc;
+@avatar-color: #fff;
+@avatar-border-radius: @border-radius-base;
+@avatar-group-overlapping: -8px;
+@avatar-group-space: 3px;
+@avatar-group-border-color: #fff;
+
+// Switch
+// ---
+@switch-height: 22px;
+@switch-sm-height: 16px;
+@switch-min-width: 44px;
+@switch-sm-min-width: 28px;
+@switch-disabled-opacity: 0.4;
+@switch-color: @primary-color;
+@switch-bg: @component-background;
+@switch-shadow-color: fade(#00230b, 20%);
+@switch-padding: 2px;
+@switch-inner-margin-min: ceil(@switch-height * 0.3);
+@switch-inner-margin-max: ceil(@switch-height * 1.1);
+@switch-sm-inner-margin-min: ceil(@switch-sm-height * 0.3);
+@switch-sm-inner-margin-max: ceil(@switch-sm-height * 1.1);
+
+// Pagination
+// ---
+@pagination-item-bg: @component-background;
+@pagination-item-size: @height-base;
+@pagination-item-size-sm: 24px;
+@pagination-font-family: @font-family;
+@pagination-font-weight-active: 500;
+@pagination-item-bg-active: @component-background;
+@pagination-item-link-bg: @component-background;
+@pagination-item-disabled-color-active: @disabled-color;
+@pagination-item-disabled-bg-active: @disabled-active-bg;
+@pagination-item-input-bg: @component-background;
+@pagination-mini-options-size-changer-top: 0px;
+
+// PageHeader
+// ---
+@page-header-padding: @padding-lg;
+@page-header-padding-vertical: @padding-md;
+@page-header-padding-breadcrumb: @padding-sm;
+@page-header-content-padding-vertical: @padding-sm;
+@page-header-back-color: #000;
+@page-header-ghost-bg: inherit;
+@page-header-heading-title: @heading-4-size;
+@page-header-heading-sub-title: 14px;
+@page-header-tabs-tab-font-size: 16px;
+
+// Breadcrumb
+// ---
+@breadcrumb-base-color: @text-color-secondary;
+@breadcrumb-last-item-color: @text-color;
+@breadcrumb-font-size: @font-size-base;
+@breadcrumb-icon-font-size: @font-size-base;
+@breadcrumb-link-color: @text-color-secondary;
+@breadcrumb-link-color-hover: @text-color;
+@breadcrumb-separator-color: @text-color-secondary;
+@breadcrumb-separator-margin: 0 @padding-xs;
+
+// Slider
+// ---
+@slider-margin: 10px 6px 10px;
+@slider-rail-background-color: @background-color-base;
+@slider-rail-background-color-hover: #e1e1e1;
+@slider-track-background-color: @primary-3;
+@slider-track-background-color-hover: @primary-4;
+@slider-handle-border-width: 2px;
+@slider-handle-background-color: @component-background;
+@slider-handle-color: @primary-3;
+@slider-handle-color-hover: @primary-4;
+@slider-handle-color-focus: tint(@primary-color, 20%);
+@slider-handle-color-focus-shadow: fade(@primary-color, 12%);
+@slider-handle-color-tooltip-open: @primary-color;
+@slider-handle-size: 14px;
+@slider-handle-margin-top: -5px;
+@slider-handle-margin-left: -5px;
+@slider-handle-shadow: 0;
+@slider-dot-border-color: @border-color-split;
+@slider-dot-border-color-active: tint(@primary-color, 50%);
+@slider-disabled-color: @disabled-color;
+@slider-disabled-background-color: @component-background;
+
+// Tree
+// ---
+@tree-bg: @component-background;
+@tree-title-height: 24px;
+@tree-child-padding: 18px;
+@tree-directory-selected-color: #fff;
+@tree-directory-selected-bg: @primary-color;
+@tree-node-hover-bg: @item-hover-bg;
+@tree-node-selected-bg: @primary-2;
+
+// Collapse
+// ---
+@collapse-header-padding: @padding-sm @padding-md;
+@collapse-header-padding-extra: 40px;
+@collapse-header-bg: @background-color-light;
+@collapse-content-padding: @padding-md;
+@collapse-content-bg: @component-background;
+@collapse-header-arrow-left: 16px;
+
+// Skeleton
+// ---
+@skeleton-color: rgba(190, 190, 190, 0.2);
+@skeleton-to-color: shade(@skeleton-color, 5%);
+@skeleton-paragraph-margin-top: 28px;
+@skeleton-paragraph-li-margin-top: @margin-md;
+@skeleton-paragraph-li-height: 16px;
+@skeleton-title-height: 16px;
+@skeleton-title-paragraph-margin-top: @margin-lg;
+
+// Transfer
+// ---
+@transfer-header-height: 40px;
+@transfer-item-height: @height-base;
+@transfer-disabled-bg: @disabled-bg;
+@transfer-list-height: 200px;
+@transfer-item-hover-bg: @item-hover-bg;
+@transfer-item-selected-hover-bg: darken(@item-active-bg, 2%);
+@transfer-item-padding-vertical: 6px;
+@transfer-list-search-icon-top: 12px;
+
+// Message
+// ---
+@message-notice-content-padding: 10px 16px;
+@message-notice-content-bg: @component-background;
+// Motion
+// ---
+@wave-animation-width: 6px;
+
+// Alert
+// ---
+@alert-success-border-color: ~`colorPalette('@{success-color}', 3) `;
+@alert-success-bg-color: ~`colorPalette('@{success-color}', 1) `;
+@alert-success-icon-color: @success-color;
+@alert-info-border-color: ~`colorPalette('@{info-color}', 3) `;
+@alert-info-bg-color: ~`colorPalette('@{info-color}', 1) `;
+@alert-info-icon-color: @info-color;
+@alert-warning-border-color: ~`colorPalette('@{warning-color}', 3) `;
+@alert-warning-bg-color: ~`colorPalette('@{warning-color}', 1) `;
+@alert-warning-icon-color: @warning-color;
+@alert-error-border-color: ~`colorPalette('@{error-color}', 3) `;
+@alert-error-bg-color: ~`colorPalette('@{error-color}', 1) `;
+@alert-error-icon-color: @error-color;
+@alert-message-color: @heading-color;
+@alert-text-color: @text-color;
+@alert-close-color: @text-color-secondary;
+@alert-close-hover-color: @icon-color-hover;
+@alert-padding-vertical: @padding-xs;
+@alert-padding-horizontal: @padding-md - 1px;
+@alert-no-icon-padding-vertical: @padding-xs;
+@alert-with-description-no-icon-padding-vertical: @padding-md - 1px;
+@alert-with-description-padding-vertical: @padding-md - 1px;
+@alert-with-description-padding: @alert-with-description-padding-vertical 15px
+ @alert-with-description-no-icon-padding-vertical @alert-with-description-icon-size;
+@alert-icon-top: 8px + @font-size-base * (@line-height-base / 2) - (@font-size-base / 2);
+@alert-with-description-icon-size: 24px;
+
+// List
+// ---
+@list-header-background: transparent;
+@list-footer-background: transparent;
+@list-empty-text-padding: @padding-md;
+@list-item-padding: @padding-sm 0;
+@list-item-padding-sm: @padding-xs @padding-md;
+@list-item-padding-lg: 16px 24px;
+@list-item-meta-margin-bottom: @padding-md;
+@list-item-meta-avatar-margin-right: @padding-md;
+@list-item-meta-title-margin-bottom: @padding-sm;
+@list-customize-card-bg: @component-background;
+@list-item-meta-description-font-size: @font-size-base;
+
+// Statistic
+// ---
+@statistic-title-font-size: @font-size-base;
+@statistic-content-font-size: 24px;
+@statistic-unit-font-size: 24px;
+@statistic-font-family: @font-family;
+
+// Drawer
+// ---
+@drawer-header-padding: @padding-md @padding-lg;
+@drawer-body-padding: @padding-lg;
+@drawer-bg: @component-background;
+@drawer-footer-padding-vertical: @modal-footer-padding-vertical;
+@drawer-footer-padding-horizontal: @modal-footer-padding-horizontal;
+@drawer-header-close-size: 56px;
+@drawer-title-font-size: @font-size-lg;
+@drawer-title-line-height: 22px;
+
+// Timeline
+// ---
+@timeline-width: 2px;
+@timeline-color: @border-color-split;
+@timeline-dot-border-width: 2px;
+@timeline-dot-color: @primary-color;
+@timeline-dot-bg: @component-background;
+@timeline-item-padding-bottom: 20px;
+
+// Typography
+// ---
+@typography-title-font-weight: 600;
+@typography-title-margin-top: 1.2em;
+@typography-title-margin-bottom: 0.5em;
+
+// Upload
+// ---
+@upload-actions-color: @text-color-secondary;
+
+// Steps
+// ---
+@process-tail-color: @border-color-split;
+@steps-nav-arrow-color: fade(@black, 25%);
+@steps-background: @component-background;
+@steps-icon-size: 32px;
+@steps-icon-custom-size: @steps-icon-size;
+@steps-icon-custom-top: 0px;
+@steps-icon-custom-font-size: 24px;
+@steps-icon-top: -0.5px;
+@steps-icon-font-size: @font-size-lg;
+@steps-icon-margin: 0 8px 0 0;
+@steps-title-line-height: @height-base;
+@steps-small-icon-size: 24px;
+@steps-small-icon-margin: 0 8px 0 0;
+@steps-dot-size: 8px;
+@steps-dot-top: 2px;
+@steps-current-dot-size: 10px;
+@steps-description-max-width: 140px;
+@steps-nav-content-max-width: auto;
+@steps-vertical-icon-width: 16px;
+@steps-vertical-tail-width: 16px;
+@steps-vertical-tail-width-sm: 12px;
+
+// Notification
+// ---
+@notification-bg: @component-background;
+@notification-padding-vertical: 16px;
+@notification-padding-horizontal: 24px;
+
+// Result
+// ---
+@result-title-font-size: 24px;
+@result-subtitle-font-size: @font-size-base;
+@result-icon-font-size: 72px;
+@result-extra-margin: 24px 0 0 0;
+
+// Image
+// ---
+@image-size-base: 48px;
+@image-font-size-base: 24px;
+@image-bg: #f5f5f5;
+@image-color: #fff;
+@image-mask-font-size: 16px;
+@image-preview-operation-size: 18px;
+@image-preview-operation-color: @text-color-dark;
+@image-preview-operation-disabled-color: fade(@image-preview-operation-color, 25%);
+
+// Segmented
+// ---
+@segmented-bg: fade(@black, 4%);
+@segmented-hover-bg: fade(@black, 6%);
+@segmented-selected-bg: @white;
+@segmented-label-color: fade(@black, 65%);
+@segmented-label-hover-color: #262626;
diff --git a/webapp/packages/supersonic-fe/src/assets/style/themes/index.less b/webapp/packages/supersonic-fe/src/assets/style/themes/index.less
new file mode 100644
index 000000000..fd29f584c
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/themes/index.less
@@ -0,0 +1,7 @@
+// Default using variable as entry to support site variable version
+// This will be replaced in webpack bundle
+// @root-entry-name: variable;
+
+// @import './default.less';
+// @import './variable.less';
+@import './@{root-entry-name}.less';
diff --git a/webapp/packages/supersonic-fe/src/assets/style/themes/variable.less b/webapp/packages/supersonic-fe/src/assets/style/themes/variable.less
new file mode 100644
index 000000000..3a8e45e52
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/themes/variable.less
@@ -0,0 +1,1139 @@
+/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
+@import '../color/colors';
+
+@theme: variable;
+
+// The prefix to use on all css classes from ant.
+@ant-prefix: ant;
+
+// An override for the html selector for theme prefixes
+@html-selector: html;
+
+@{html-selector} {
+ @base-primary: @blue-6;
+
+ // ========= Primary Color =========
+ --@{ant-prefix}-primary-color: @base-primary;
+ --@{ant-prefix}-primary-color-hover: color(~`colorPalette('@{base-primary}', 5) `);
+ --@{ant-prefix}-primary-color-active: color(~`colorPalette('@{base-primary}', 7) `);
+ --@{ant-prefix}-primary-color-outline: fade(@base-primary, @outline-fade);
+
+ // Legacy
+ @legacy-primary-1: color(~`colorPalette('@{base-primary}', 1) `);
+
+ --@{ant-prefix}-primary-1: @legacy-primary-1;
+ --@{ant-prefix}-primary-2: color(~`colorPalette('@{base-primary}', 2) `);
+ --@{ant-prefix}-primary-3: color(~`colorPalette('@{base-primary}', 3) `);
+ --@{ant-prefix}-primary-4: color(~`colorPalette('@{base-primary}', 4) `);
+ --@{ant-prefix}-primary-5: color(~`colorPalette('@{base-primary}', 5) `);
+ --@{ant-prefix}-primary-6: @base-primary;
+ --@{ant-prefix}-primary-7: color(~`colorPalette('@{base-primary}', 7) `);
+
+ // Deprecated
+ --@{ant-prefix}-primary-color-deprecated-pure: ~'';
+ --@{ant-prefix}-primary-color-deprecated-l-35: lighten(@base-primary, 35%);
+ --@{ant-prefix}-primary-color-deprecated-l-20: lighten(@base-primary, 20%);
+ --@{ant-prefix}-primary-color-deprecated-t-20: tint(@base-primary, 20%);
+ --@{ant-prefix}-primary-color-deprecated-t-50: tint(@base-primary, 50%);
+ --@{ant-prefix}-primary-color-deprecated-f-12: fade(@base-primary, 12%);
+ --@{ant-prefix}-primary-color-active-deprecated-f-30: fade(@legacy-primary-1, 30%);
+ --@{ant-prefix}-primary-color-active-deprecated-d-02: darken(@legacy-primary-1, 2%);
+
+ // ========= Success Color =========
+ --@{ant-prefix}-success-color: @green-6;
+ --@{ant-prefix}-success-color-hover: color(~`colorPalette('@{green-6}', 5) `);
+ --@{ant-prefix}-success-color-active: color(~`colorPalette('@{green-6}', 7) `);
+ --@{ant-prefix}-success-color-outline: fade(@green-6, @outline-fade);
+ --@{ant-prefix}-success-color-deprecated-bg: ~`colorPalette('@{green-6}', 1) `;
+ --@{ant-prefix}-success-color-deprecated-border: ~`colorPalette('@{green-6}', 3) `;
+
+ // ========== Error Color ==========
+ --@{ant-prefix}-error-color: @red-5;
+ --@{ant-prefix}-error-color-hover: color(~`colorPalette('@{red-5}', 5) `);
+ --@{ant-prefix}-error-color-active: color(~`colorPalette('@{red-5}', 7) `);
+ --@{ant-prefix}-error-color-outline: fade(@red-5, @outline-fade);
+ --@{ant-prefix}-error-color-deprecated-bg: ~`colorPalette('@{red-5}', 1) `;
+ --@{ant-prefix}-error-color-deprecated-border: ~`colorPalette('@{red-5}', 3) `;
+
+ // ========= Warning Color =========
+ --@{ant-prefix}-warning-color: @gold-6;
+ --@{ant-prefix}-warning-color-hover: color(~`colorPalette('@{gold-6}', 5) `);
+ --@{ant-prefix}-warning-color-active: color(~`colorPalette('@{gold-6}', 7) `);
+ --@{ant-prefix}-warning-color-outline: fade(@gold-6, @outline-fade);
+ --@{ant-prefix}-warning-color-deprecated-bg: ~`colorPalette('@{gold-6}', 1) `;
+ --@{ant-prefix}-warning-color-deprecated-border: ~`colorPalette('@{gold-6}', 3) `;
+
+ // ========== Info Color ===========
+ --@{ant-prefix}-info-color: @base-primary;
+ --@{ant-prefix}-info-color-deprecated-bg: ~`colorPalette('@{base-primary}', 1) `;
+ --@{ant-prefix}-info-color-deprecated-border: ~`colorPalette('@{base-primary}', 3) `;
+}
+
+// -------- Colors -----------
+// >>> Primary
+@primary-color: ~'var(--@{ant-prefix}-primary-color)';
+@primary-color-hover: ~'var(--@{ant-prefix}-primary-color-hover)';
+@primary-color-active: ~'var(--@{ant-prefix}-primary-color-active)';
+@primary-color-outline: ~'var(--@{ant-prefix}-primary-color-outline)';
+
+@processing-color: @primary-color;
+
+// >>> Info
+@info-color: ~'var(--@{ant-prefix}-info-color)';
+@info-color-deprecated-bg: ~'var(--@{ant-prefix}-info-color-deprecated-bg)';
+@info-color-deprecated-border: ~'var(--@{ant-prefix}-info-color-deprecated-border)';
+
+// >>> Success
+@success-color: ~'var(--@{ant-prefix}-success-color)';
+@success-color-hover: ~'var(--@{ant-prefix}-success-color-hover)';
+@success-color-active: ~'var(--@{ant-prefix}-success-color-active)';
+@success-color-outline: ~'var(--@{ant-prefix}-success-color-outline)';
+@success-color-deprecated-bg: ~'var(--@{ant-prefix}-success-color-deprecated-bg)';
+@success-color-deprecated-border: ~'var(--@{ant-prefix}-success-color-deprecated-border)';
+
+// >>> Warning
+@warning-color: ~'var(--@{ant-prefix}-warning-color)';
+@warning-color-hover: ~'var(--@{ant-prefix}-warning-color-hover)';
+@warning-color-active: ~'var(--@{ant-prefix}-warning-color-active)';
+@warning-color-outline: ~'var(--@{ant-prefix}-warning-color-outline)';
+@warning-color-deprecated-bg: ~'var(--@{ant-prefix}-warning-color-deprecated-bg)';
+@warning-color-deprecated-border: ~'var(--@{ant-prefix}-warning-color-deprecated-border)';
+
+// >>> Error
+@error-color: ~'var(--@{ant-prefix}-error-color)';
+@error-color-hover: ~'var(--@{ant-prefix}-error-color-hover)';
+@error-color-active: ~'var(--@{ant-prefix}-error-color-active)';
+@error-color-outline: ~'var(--@{ant-prefix}-error-color-outline)';
+@error-color-deprecated-bg: ~'var(--@{ant-prefix}-error-color-deprecated-bg)';
+@error-color-deprecated-border: ~'var(--@{ant-prefix}-error-color-deprecated-border)';
+
+@highlight-color: @red-5;
+@normal-color: #d9d9d9;
+@white: #fff;
+@black: #000;
+
+// Color used by default to control hover and active backgrounds and for
+// alert info backgrounds.
+@primary-1: ~'var(--@{ant-prefix}-primary-1)'; // replace tint(@primary-color, 90%)
+@primary-2: ~'var(--@{ant-prefix}-primary-2)'; // replace tint(@primary-color, 80%)
+@primary-3: ~'var(--@{ant-prefix}-primary-3)'; // unused
+@primary-4: ~'var(--@{ant-prefix}-primary-4)'; // unused
+@primary-5: ~'var(--@{ant-prefix}-primary-5)'; // color used to control the text color in many active and hover states, replace tint(@primary-color, 20%)
+@primary-6: ~'var(--@{ant-prefix}-primary-6)'; // color used to control the text color of active buttons, don't use, use @primary-color
+@primary-7: ~'var(--@{ant-prefix}-primary-7)'; // replace shade(@primary-color, 5%)
+@primary-8: color(~`colorPalette('@{primary-color}', 8) `); // unused
+@primary-9: color(~`colorPalette('@{primary-color}', 9) `); // unused
+@primary-10: color(~`colorPalette('@{primary-color}', 10) `); // unused
+
+// Base Scaffolding Variables
+// ---
+
+// Background color for ``
+@body-background: #fff;
+// Base background color for most components
+@component-background: #fff;
+// Popover background color
+@popover-background: @component-background;
+@popover-customize-border-color: @border-color-split;
+@font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
+ 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
+ 'Noto Color Emoji';
+@code-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+@text-color: fade(@black, 85%);
+@text-color-secondary: fade(@black, 45%);
+@text-color-inverse: @white;
+@icon-color: inherit;
+@icon-color-hover: fade(@black, 75%);
+@heading-color: fade(@black, 85%);
+@text-color-dark: fade(@white, 85%);
+@text-color-secondary-dark: fade(@white, 65%);
+@text-selection-bg: @primary-color;
+@font-variant-base: tabular-nums;
+@font-feature-settings-base: 'tnum';
+@font-size-base: 14px;
+@font-size-lg: @font-size-base + 2px;
+@font-size-sm: 12px;
+@heading-1-size: ceil(@font-size-base * 2.71);
+@heading-2-size: ceil(@font-size-base * 2.14);
+@heading-3-size: ceil(@font-size-base * 1.71);
+@heading-4-size: ceil(@font-size-base * 1.42);
+@heading-5-size: ceil(@font-size-base * 1.14);
+// https://github.com/ant-design/ant-design/issues/20210
+@line-height-base: 1.5715;
+@border-radius-base: 2px;
+@border-radius-sm: 2px;
+
+// control border
+@control-border-radius: @border-radius-base;
+
+// arrow border
+@arrow-border-radius: @border-radius-sm;
+
+// vertical paddings
+@padding-lg: 24px; // containers
+@padding-md: 16px; // small containers and buttons
+@padding-sm: 12px; // Form controls and items
+@padding-xs: 8px; // small items
+@padding-xss: 4px; // more small
+
+// vertical padding for all form controls
+@control-padding-horizontal: @padding-sm;
+@control-padding-horizontal-sm: @padding-xs;
+
+// vertical margins
+@margin-lg: 24px; // containers
+@margin-md: 16px; // small containers and buttons
+@margin-sm: 12px; // Form controls and items
+@margin-xs: 8px; // small items
+@margin-xss: 4px; // more small
+
+// height rules
+@height-base: 32px;
+@height-lg: 40px;
+@height-sm: 24px;
+
+// The background colors for active and hover states for things like
+// list items or table cells.
+@item-active-bg: @primary-1;
+@item-hover-bg: #f5f5f5;
+
+// ICONFONT
+@iconfont-css-prefix: anticon;
+
+// LINK
+@link-color: @primary-color;
+@link-hover-color: @primary-color-hover;
+@link-active-color: @primary-color-active;
+@link-decoration: none;
+@link-hover-decoration: none;
+@link-focus-decoration: none;
+@link-focus-outline: 0;
+
+// Animation
+@ease-base-out: cubic-bezier(0.7, 0.3, 0.1, 1);
+@ease-base-in: cubic-bezier(0.9, 0, 0.3, 0.7);
+@ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);
+@ease-in: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+@ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
+@ease-out-back: cubic-bezier(0.12, 0.4, 0.29, 1.46);
+@ease-in-back: cubic-bezier(0.71, -0.46, 0.88, 0.6);
+@ease-in-out-back: cubic-bezier(0.71, -0.46, 0.29, 1.46);
+@ease-out-circ: cubic-bezier(0.08, 0.82, 0.17, 1);
+@ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+@ease-in-out-circ: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+@ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1);
+@ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+@ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);
+
+// Border color
+@border-color-base: hsv(0, 0, 85%); // base border outline a component
+@border-color-split: rgba(0, 0, 0, 0.06); // split border inside a component
+@border-color-inverse: @white;
+@border-width-base: 1px; // width of the border for a component
+@border-style-base: solid; // style of a components border
+
+// Outline
+@outline-blur-size: 0;
+@outline-width: 2px;
+@outline-color: @primary-color; // No use anymore
+@outline-fade: 20%;
+
+@background-color-light: hsv(0, 0, 98%); // background of header and selected item
+@background-color-base: hsv(0, 0, 96%); // Default grey background color
+
+// Disabled states
+@disabled-color: fade(#000, 25%);
+@disabled-bg: @background-color-base;
+@disabled-active-bg: tint(@black, 90%);
+@disabled-color-dark: fade(#fff, 35%);
+
+// Shadow
+@shadow-color: rgba(0, 0, 0, 0.15);
+@shadow-color-inverse: @component-background;
+@box-shadow-base: @shadow-2;
+@shadow-1-up: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05),
+ 0 -12px 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-down: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05),
+ 0 12px 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-left: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05),
+ -12px 0 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-right: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05),
+ 12px 0 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-2: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08),
+ 0 9px 28px 8px rgba(0, 0, 0, 0.05);
+
+// Buttons
+@btn-font-weight: 400;
+@btn-border-radius-base: @border-radius-base;
+@btn-border-radius-sm: @border-radius-base;
+@btn-border-width: @border-width-base;
+@btn-border-style: @border-style-base;
+@btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015);
+@btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
+@btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
+
+@btn-primary-color: #fff;
+@btn-primary-bg: @primary-color;
+
+@btn-default-color: @text-color;
+@btn-default-bg: @component-background;
+@btn-default-border: @border-color-base;
+
+@btn-danger-color: #fff;
+@btn-danger-bg: @error-color;
+@btn-danger-border: @error-color;
+
+@btn-disable-color: @disabled-color;
+@btn-disable-bg: @disabled-bg;
+@btn-disable-border: @border-color-base;
+
+@btn-default-ghost-color: @component-background;
+@btn-default-ghost-bg: transparent;
+@btn-default-ghost-border: @component-background;
+
+@btn-font-size-lg: @font-size-lg;
+@btn-font-size-sm: @font-size-base;
+@btn-padding-horizontal-base: @padding-md - 1px;
+@btn-padding-horizontal-lg: @btn-padding-horizontal-base;
+@btn-padding-horizontal-sm: @padding-xs - 1px;
+
+@btn-height-base: @height-base;
+@btn-height-lg: @height-lg;
+@btn-height-sm: @height-sm;
+
+@btn-line-height: @line-height-base;
+
+@btn-circle-size: @btn-height-base;
+@btn-circle-size-lg: @btn-height-lg;
+@btn-circle-size-sm: @btn-height-sm;
+
+@btn-square-size: @btn-height-base;
+@btn-square-size-lg: @btn-height-lg;
+@btn-square-size-sm: @btn-height-sm;
+@btn-square-only-icon-size: @font-size-base + 2px;
+@btn-square-only-icon-size-sm: @font-size-base;
+@btn-square-only-icon-size-lg: @btn-font-size-lg + 2px;
+
+@btn-group-border: @primary-5;
+
+@btn-link-hover-bg: transparent;
+@btn-text-hover-bg: rgba(0, 0, 0, 0.018);
+
+// Checkbox
+@checkbox-size: 16px;
+@checkbox-color: @primary-color;
+@checkbox-check-color: #fff;
+@checkbox-check-bg: @checkbox-check-color;
+@checkbox-border-width: @border-width-base;
+@checkbox-border-radius: @border-radius-sm;
+@checkbox-group-item-margin-right: 8px;
+
+// Descriptions
+@descriptions-bg: #fafafa;
+@descriptions-title-margin-bottom: 20px;
+@descriptions-default-padding: @padding-md @padding-lg;
+@descriptions-middle-padding: @padding-sm @padding-lg;
+@descriptions-small-padding: @padding-xs @padding-md;
+@descriptions-item-padding-bottom: @padding-md;
+@descriptions-item-trailing-colon: true;
+@descriptions-item-label-colon-margin-right: 8px;
+@descriptions-item-label-colon-margin-left: 2px;
+@descriptions-extra-color: @text-color;
+
+// Divider
+@divider-text-padding: 1em;
+@divider-orientation-margin: 5%;
+@divider-color: rgba(0, 0, 0, 6%);
+@divider-vertical-gutter: 8px;
+
+// Dropdown
+@dropdown-selected-color: @primary-color;
+@dropdown-menu-submenu-disabled-bg: @component-background;
+@dropdown-selected-bg: @item-active-bg;
+
+// Empty
+@empty-font-size: @font-size-base;
+
+// Radio
+@radio-size: 16px;
+@radio-top: 0.2em;
+@radio-border-width: 1px;
+@radio-dot-size: @radio-size - 8px;
+@radio-dot-color: @primary-color;
+@radio-dot-disabled-color: fade(@black, 20%);
+@radio-solid-checked-color: @component-background;
+
+// Radio buttons
+@radio-button-bg: @btn-default-bg;
+@radio-button-checked-bg: @btn-default-bg;
+@radio-button-color: @btn-default-color;
+@radio-button-hover-color: @primary-5;
+@radio-button-active-color: @primary-7;
+@radio-button-padding-horizontal: @padding-md - 1px;
+@radio-disabled-button-checked-bg: @disabled-active-bg;
+@radio-disabled-button-checked-color: @disabled-color;
+@radio-wrapper-margin-right: 8px;
+
+// Media queries breakpoints
+// @screen-xs and @screen-xs-min is not used in Grid
+// smallest break point is @screen-md
+@screen-xs: 480px;
+@screen-xs-min: @screen-xs;
+// 👆 Extra small screen / phone
+
+// 👇 Small screen / tablet
+@screen-sm: 576px;
+@screen-sm-min: @screen-sm;
+
+// Medium screen / desktop
+@screen-md: 768px;
+@screen-md-min: @screen-md;
+
+// Large screen / wide desktop
+@screen-lg: 992px;
+@screen-lg-min: @screen-lg;
+
+// Extra large screen / full hd
+@screen-xl: 1200px;
+@screen-xl-min: @screen-xl;
+
+// Extra extra large screen / large desktop
+@screen-xxl: 1600px;
+@screen-xxl-min: @screen-xxl;
+
+// provide a maximum
+@screen-xs-max: (@screen-sm-min - 1px);
+@screen-sm-max: (@screen-md-min - 1px);
+@screen-md-max: (@screen-lg-min - 1px);
+@screen-lg-max: (@screen-xl-min - 1px);
+@screen-xl-max: (@screen-xxl-min - 1px);
+
+// Grid system
+@grid-columns: 24;
+
+// Layout
+@layout-body-background: #f0f2f5;
+@layout-header-background: #001529;
+@layout-header-height: 64px;
+@layout-header-padding: 0 50px;
+@layout-header-color: @text-color;
+@layout-footer-padding: 24px 50px;
+@layout-footer-background: @layout-body-background;
+@layout-sider-background: @layout-header-background;
+@layout-trigger-height: 48px;
+@layout-trigger-background: #002140;
+@layout-trigger-color: #fff;
+@layout-zero-trigger-width: 36px;
+@layout-zero-trigger-height: 42px;
+// Layout light theme
+@layout-sider-background-light: #fff;
+@layout-trigger-background-light: #fff;
+@layout-trigger-color-light: @text-color;
+
+// z-index list, order by `z-index`
+@zindex-badge: auto;
+@zindex-table-fixed: 2;
+@zindex-affix: 10;
+@zindex-back-top: 10;
+@zindex-picker-panel: 10;
+@zindex-popup-close: 10;
+@zindex-modal: 1000;
+@zindex-modal-mask: 1000;
+@zindex-message: 1010;
+@zindex-notification: 1010;
+@zindex-popover: 1030;
+@zindex-dropdown: 1050;
+@zindex-picker: 1050;
+@zindex-popoconfirm: 1060;
+@zindex-tooltip: 1070;
+@zindex-image: 1080;
+
+// Animation
+@animation-duration-slow: 0.3s; // Modal
+@animation-duration-base: 0.2s;
+@animation-duration-fast: 0.1s; // Tooltip
+
+//CollapsePanel
+@collapse-panel-border-radius: @border-radius-base;
+
+//Dropdown
+@dropdown-menu-bg: @component-background;
+@dropdown-vertical-padding: 5px;
+@dropdown-edge-child-vertical-padding: 4px;
+@dropdown-font-size: @font-size-base;
+@dropdown-line-height: 22px;
+
+// Form
+// ---
+@label-required-color: @highlight-color;
+@label-color: @heading-color;
+@form-warning-input-bg: @input-bg;
+@form-item-margin-bottom: 24px;
+@form-item-trailing-colon: true;
+@form-vertical-label-padding: 0 0 8px;
+@form-vertical-label-margin: 0;
+@form-item-label-font-size: @font-size-base;
+@form-item-label-height: @input-height-base;
+@form-item-label-colon-margin-right: 8px;
+@form-item-label-colon-margin-left: 2px;
+@form-error-input-bg: @input-bg;
+
+// Input
+// ---
+@input-height-base: @height-base;
+@input-height-lg: @height-lg;
+@input-height-sm: @height-sm;
+@input-padding-horizontal: @control-padding-horizontal - 1px;
+@input-padding-horizontal-base: @input-padding-horizontal;
+@input-padding-horizontal-sm: @control-padding-horizontal-sm - 1px;
+@input-padding-horizontal-lg: @input-padding-horizontal;
+@input-padding-vertical-base: max(
+ (round(((@input-height-base - @font-size-base * @line-height-base) / 2) * 10) / 10) -
+ @border-width-base,
+ 3px
+);
+@input-padding-vertical-sm: max(
+ (round(((@input-height-sm - @font-size-base * @line-height-base) / 2) * 10) / 10) -
+ @border-width-base,
+ 0
+);
+@input-padding-vertical-lg: (
+ ceil(((@input-height-lg - @font-size-lg * @line-height-base) / 2) * 10) / 10
+ ) - @border-width-base;
+@input-placeholder-color: hsv(0, 0, 75%);
+@input-color: @text-color;
+@input-icon-color: @input-color;
+@input-border-color: @border-color-base;
+@input-bg: @component-background;
+@input-number-hover-border-color: @input-hover-border-color;
+@input-number-handler-active-bg: #f4f4f4;
+@input-number-handler-hover-bg: @primary-5;
+@input-number-handler-bg: @component-background;
+@input-number-handler-border-color: @border-color-base;
+@input-addon-bg: @background-color-light;
+@input-hover-border-color: @primary-5;
+@input-disabled-bg: @disabled-bg;
+@input-outline-offset: 0 0;
+@input-icon-hover-color: fade(@black, 85%);
+@input-disabled-color: @disabled-color;
+
+// Mentions
+// ---
+@mentions-dropdown-bg: @component-background;
+@mentions-dropdown-menu-item-hover-bg: @mentions-dropdown-bg;
+
+// Select
+// ---
+@select-border-color: @border-color-base;
+@select-item-selected-color: @text-color;
+@select-item-selected-font-weight: 600;
+@select-dropdown-bg: @component-background;
+@select-item-selected-bg: @primary-1;
+@select-item-active-bg: @item-hover-bg;
+@select-dropdown-vertical-padding: @dropdown-vertical-padding;
+@select-dropdown-font-size: @dropdown-font-size;
+@select-dropdown-line-height: @dropdown-line-height;
+@select-dropdown-height: 32px;
+@select-background: @component-background;
+@select-clear-background: @select-background;
+@select-selection-item-bg: @background-color-base;
+@select-selection-item-border-color: @border-color-split;
+@select-single-item-height-lg: 40px;
+@select-multiple-item-height: @input-height-base - @input-padding-vertical-base * 2; // Normal 24px
+@select-multiple-item-height-lg: 32px;
+@select-multiple-item-spacing-half: ceil((@input-padding-vertical-base / 2));
+@select-multiple-disabled-background: @input-disabled-bg;
+@select-multiple-item-disabled-color: #bfbfbf;
+@select-multiple-item-disabled-border-color: @select-border-color;
+
+// Cascader
+// ---
+@cascader-bg: @component-background;
+@cascader-item-selected-bg: @primary-1;
+@cascader-menu-bg: @component-background;
+@cascader-menu-border-color-split: @border-color-split;
+
+// Cascader
+// ----
+@cascader-dropdown-vertical-padding: @dropdown-vertical-padding;
+@cascader-dropdown-edge-child-vertical-padding: @dropdown-edge-child-vertical-padding;
+@cascader-dropdown-font-size: @dropdown-font-size;
+@cascader-dropdown-line-height: @dropdown-line-height;
+
+// Anchor
+// ---
+@anchor-bg: transparent;
+@anchor-border-color: @border-color-split;
+@anchor-link-top: 4px;
+@anchor-link-left: 16px;
+@anchor-link-padding: @anchor-link-top 0 @anchor-link-top @anchor-link-left;
+
+// Tooltip
+// ---
+// Tooltip max width
+@tooltip-max-width: 250px;
+// Tooltip text color
+@tooltip-color: #fff;
+// Tooltip background color
+@tooltip-bg: rgba(0, 0, 0, 0.75);
+// Tooltip arrow width
+@tooltip-arrow-width: 8px * sqrt(2);
+// Tooltip distance with trigger
+@tooltip-distance: @tooltip-arrow-width - 1px + 4px;
+// Tooltip arrow color
+@tooltip-arrow-color: @tooltip-bg;
+@tooltip-border-radius: @border-radius-base;
+
+// Popover
+// ---
+// Popover body background color
+@popover-bg: @component-background;
+// Popover text color
+@popover-color: @text-color;
+// Popover maximum width
+@popover-min-width: 177px;
+@popover-min-height: 32px;
+// Popover arrow width
+@popover-arrow-width: @tooltip-arrow-width;
+// Popover arrow color
+@popover-arrow-color: @popover-bg;
+// Popover outer arrow width
+// Popover outer arrow color
+@popover-arrow-outer-color: @popover-bg;
+// Popover distance with trigger
+@popover-distance: @popover-arrow-width + 4px;
+@popover-padding-horizontal: @padding-md;
+
+// Modal
+// --
+@modal-header-padding-vertical: @padding-md;
+@modal-header-padding-horizontal: @padding-lg;
+@modal-body-padding: @padding-lg;
+@modal-header-bg: @component-background;
+@modal-header-padding: @modal-header-padding-vertical @modal-header-padding-horizontal;
+@modal-header-border-width: @border-width-base;
+@modal-header-border-style: @border-style-base;
+@modal-header-title-line-height: 22px;
+@modal-header-title-font-size: @font-size-lg;
+@modal-header-border-color-split: @border-color-split;
+@modal-header-close-size: @modal-header-title-line-height + 2 * @modal-header-padding-vertical;
+@modal-content-bg: @component-background;
+@modal-heading-color: @heading-color;
+@modal-close-color: @text-color-secondary;
+@modal-footer-bg: transparent;
+@modal-footer-border-color-split: @border-color-split;
+@modal-footer-border-style: @border-style-base;
+@modal-footer-padding-vertical: 10px;
+@modal-footer-padding-horizontal: 16px;
+@modal-footer-border-width: @border-width-base;
+@modal-mask-bg: fade(@black, 45%);
+@modal-confirm-body-padding: 32px 32px 24px;
+@modal-confirm-title-font-size: @font-size-lg;
+@modal-border-radius: @border-radius-base;
+
+// Progress
+// --
+@progress-default-color: @processing-color;
+@progress-remaining-color: rgba(0, 0, 0, 0.04);
+@progress-info-text-color: @progress-text-color;
+@progress-radius: 100px;
+@progress-steps-item-bg: #f3f3f3;
+@progress-text-font-size: 1em;
+@progress-text-color: @text-color; // This is for circle text color, should be renamed better
+@progress-circle-text-font-size: 1em;
+// Menu
+// ---
+@menu-inline-toplevel-item-height: 40px;
+@menu-item-height: 40px;
+@menu-item-group-height: @line-height-base;
+@menu-collapsed-width: 80px;
+@menu-bg: @component-background;
+@menu-popup-bg: @component-background;
+@menu-item-color: @text-color;
+@menu-inline-submenu-bg: @background-color-light;
+@menu-highlight-color: @primary-color;
+@menu-highlight-danger-color: @error-color;
+@menu-item-active-bg: @primary-1;
+@menu-item-active-danger-bg: @red-1;
+@menu-item-active-border-width: 3px;
+@menu-item-group-title-color: @text-color-secondary;
+@menu-item-vertical-margin: 4px;
+@menu-item-font-size: @font-size-base;
+@menu-item-boundary-margin: 8px;
+@menu-item-padding-horizontal: 20px;
+@menu-item-padding: 0 @menu-item-padding-horizontal;
+@menu-horizontal-line-height: 46px;
+@menu-icon-margin-right: 10px;
+@menu-icon-size: @menu-item-font-size;
+@menu-icon-size-lg: @font-size-lg;
+@menu-item-group-title-font-size: @menu-item-font-size;
+
+// dark theme
+@menu-dark-color: @text-color-secondary-dark;
+@menu-dark-danger-color: @error-color;
+@menu-dark-bg: @layout-header-background;
+@menu-dark-arrow-color: #fff;
+@menu-dark-inline-submenu-bg: #000c17;
+@menu-dark-highlight-color: #fff;
+@menu-dark-item-active-bg: @primary-color;
+@menu-dark-item-active-danger-bg: @error-color;
+@menu-dark-selected-item-icon-color: @white;
+@menu-dark-selected-item-text-color: @white;
+@menu-dark-item-hover-bg: transparent;
+// Spin
+// ---
+@spin-dot-size-sm: 14px;
+@spin-dot-size: 20px;
+@spin-dot-size-lg: 32px;
+
+// Table
+// --
+@table-bg: @component-background;
+@table-header-bg: @background-color-light;
+@table-header-color: @heading-color;
+@table-header-sort-bg: @background-color-base;
+@table-body-sort-bg: #fafafa;
+@table-row-hover-bg: @background-color-light;
+@table-selected-row-color: inherit;
+@table-selected-row-bg: @primary-1;
+@table-body-selected-sort-bg: @table-selected-row-bg;
+@table-selected-row-hover-bg: ~'var(--@{ant-prefix}-primary-color-active-deprecated-d-02)';
+@table-expanded-row-bg: #fbfbfb;
+@table-padding-vertical: 16px;
+@table-padding-horizontal: 16px;
+@table-padding-vertical-md: (@table-padding-vertical * 3 / 4);
+@table-padding-horizontal-md: (@table-padding-horizontal / 2);
+@table-padding-vertical-sm: (@table-padding-vertical / 2);
+@table-padding-horizontal-sm: (@table-padding-horizontal / 2);
+@table-border-color: @border-color-split;
+@table-border-radius-base: @border-radius-base;
+@table-footer-bg: @background-color-light;
+@table-footer-color: @heading-color;
+@table-header-bg-sm: @table-header-bg;
+@table-font-size: @font-size-base;
+@table-font-size-md: @table-font-size;
+@table-font-size-sm: @table-font-size;
+@table-header-cell-split-color: rgba(0, 0, 0, 0.06);
+// Sorter
+// Legacy: `table-header-sort-active-bg` is used for hover not real active
+@table-header-sort-active-bg: rgba(0, 0, 0, 0.04);
+@table-fixed-header-sort-active-bg: hsv(0, 0, 96%);
+
+// Filter
+@table-header-filter-active-bg: rgba(0, 0, 0, 0.04);
+@table-filter-btns-bg: inherit;
+@table-filter-dropdown-bg: @component-background;
+@table-expand-icon-bg: @component-background;
+@table-selection-column-width: 32px;
+// Sticky
+@table-sticky-scroll-bar-bg: fade(#000, 35%);
+@table-sticky-scroll-bar-radius: 4px;
+
+// Tag
+// --
+@tag-border-radius: @border-radius-base;
+@tag-default-bg: @background-color-light;
+@tag-default-color: @text-color;
+@tag-font-size: @font-size-sm;
+@tag-line-height: 20px;
+
+// TimePicker
+// ---
+@picker-bg: @component-background;
+@picker-basic-cell-hover-color: @item-hover-bg;
+@picker-basic-cell-active-with-range-color: @primary-1;
+@picker-basic-cell-hover-with-range-color: ~'var(--@{ant-prefix}-primary-color-deprecated-l-35)';
+@picker-basic-cell-disabled-bg: rgba(0, 0, 0, 0.04);
+@picker-border-color: @border-color-split;
+@picker-date-hover-range-border-color: ~'var(--@{ant-prefix}-primary-color-deprecated-l-20)';
+@picker-date-hover-range-color: @picker-basic-cell-hover-with-range-color;
+@picker-time-panel-column-width: 56px;
+@picker-time-panel-column-height: 224px;
+@picker-time-panel-cell-height: 28px;
+@picker-panel-cell-height: 24px;
+@picker-panel-cell-width: 36px;
+@picker-text-height: 40px;
+@picker-panel-without-time-cell-height: 66px;
+
+// Calendar
+// ---
+@calendar-bg: @component-background;
+@calendar-input-bg: @input-bg;
+@calendar-border-color: @border-color-inverse;
+@calendar-item-active-bg: @item-active-bg;
+@calendar-column-active-bg: ~'var(--@{ant-prefix}-primary-color-active-deprecated-f-30)';
+@calendar-full-bg: @calendar-bg;
+@calendar-full-panel-bg: @calendar-full-bg;
+
+// Carousel
+// ---
+@carousel-dot-width: 16px;
+@carousel-dot-height: 3px;
+@carousel-dot-active-width: 24px;
+
+// Badge
+// ---
+@badge-height: 20px;
+@badge-height-sm: 14px;
+@badge-dot-size: 6px;
+@badge-font-size: @font-size-sm;
+@badge-font-size-sm: @font-size-sm;
+@badge-font-weight: normal;
+@badge-status-size: 6px;
+@badge-text-color: @component-background;
+@badge-color: @highlight-color;
+
+// Rate
+// ---
+@rate-star-color: @yellow-6;
+@rate-star-bg: @border-color-split;
+@rate-star-size: 20px;
+@rate-star-hover-scale: scale(1.1);
+
+// Card
+// ---
+@card-head-color: @heading-color;
+@card-head-background: transparent;
+@card-head-font-size: @font-size-lg;
+@card-head-font-size-sm: @font-size-base;
+@card-head-padding: 16px;
+@card-head-padding-sm: (@card-head-padding / 2);
+@card-head-height: 48px;
+@card-head-height-sm: 36px;
+@card-inner-head-padding: 12px;
+@card-padding-base: 24px;
+@card-padding-base-sm: (@card-padding-base / 2);
+@card-actions-background: @component-background;
+@card-actions-li-margin: 12px 0;
+@card-skeleton-bg: #cfd8dc;
+@card-background: @component-background;
+@card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12),
+ 0 5px 12px 4px rgba(0, 0, 0, 0.09);
+@card-radius: @border-radius-base;
+@card-head-tabs-margin-bottom: -17px;
+@card-head-extra-color: @text-color;
+
+// Comment
+// ---
+@comment-bg: inherit;
+@comment-padding-base: @padding-md 0;
+@comment-nest-indent: 44px;
+@comment-font-size-base: @font-size-base;
+@comment-font-size-sm: @font-size-sm;
+@comment-author-name-color: @text-color-secondary;
+@comment-author-time-color: #ccc;
+@comment-action-color: @text-color-secondary;
+@comment-action-hover-color: #595959;
+@comment-actions-margin-bottom: inherit;
+@comment-actions-margin-top: @margin-sm;
+@comment-content-detail-p-margin-bottom: inherit;
+
+// Tabs
+// ---
+@tabs-card-head-background: @background-color-light;
+@tabs-card-height: 40px;
+@tabs-card-active-color: @primary-color;
+@tabs-card-horizontal-padding: (
+ (@tabs-card-height - floor(@font-size-base * @line-height-base)) / 2
+ ) - @border-width-base @padding-md;
+@tabs-card-horizontal-padding-sm: 6px @padding-md;
+@tabs-card-horizontal-padding-lg: 7px @padding-md 6px;
+@tabs-title-font-size: @font-size-base;
+@tabs-title-font-size-lg: @font-size-lg;
+@tabs-title-font-size-sm: @font-size-base;
+@tabs-ink-bar-color: @primary-color;
+@tabs-bar-margin: 0 0 @margin-md 0;
+@tabs-horizontal-gutter: 32px;
+@tabs-horizontal-margin: 0 0 0 @tabs-horizontal-gutter;
+@tabs-horizontal-margin-rtl: 0 0 0 32px;
+@tabs-horizontal-padding: @padding-sm 0;
+@tabs-horizontal-padding-lg: @padding-md 0;
+@tabs-horizontal-padding-sm: @padding-xs 0;
+@tabs-vertical-padding: @padding-xs @padding-lg;
+@tabs-vertical-margin: @margin-md 0 0 0;
+@tabs-scrolling-size: 32px;
+@tabs-highlight-color: @primary-color;
+@tabs-hover-color: @primary-5;
+@tabs-active-color: @primary-7;
+@tabs-card-gutter: 2px;
+@tabs-card-tab-active-border-top: 2px solid transparent;
+
+// BackTop
+// ---
+@back-top-color: #fff;
+@back-top-bg: @text-color-secondary;
+@back-top-hover-bg: @text-color;
+
+// Avatar
+// ---
+@avatar-size-base: 32px;
+@avatar-size-lg: 40px;
+@avatar-size-sm: 24px;
+@avatar-font-size-base: 18px;
+@avatar-font-size-lg: 24px;
+@avatar-font-size-sm: 14px;
+@avatar-bg: #ccc;
+@avatar-color: #fff;
+@avatar-border-radius: @border-radius-base;
+@avatar-group-overlapping: -8px;
+@avatar-group-space: 3px;
+@avatar-group-border-color: #fff;
+
+// Switch
+// ---
+@switch-height: 22px;
+@switch-sm-height: 16px;
+@switch-min-width: 44px;
+@switch-sm-min-width: 28px;
+@switch-disabled-opacity: 0.4;
+@switch-color: @primary-color;
+@switch-bg: @component-background;
+@switch-shadow-color: fade(#00230b, 20%);
+@switch-padding: 2px;
+@switch-inner-margin-min: ceil(@switch-height * 0.3);
+@switch-inner-margin-max: ceil(@switch-height * 1.1);
+@switch-sm-inner-margin-min: ceil(@switch-sm-height * 0.3);
+@switch-sm-inner-margin-max: ceil(@switch-sm-height * 1.1);
+
+// Pagination
+// ---
+@pagination-item-bg: @component-background;
+@pagination-item-size: @height-base;
+@pagination-item-size-sm: 24px;
+@pagination-font-family: @font-family;
+@pagination-font-weight-active: 500;
+@pagination-item-bg-active: @component-background;
+@pagination-item-link-bg: @component-background;
+@pagination-item-disabled-color-active: @disabled-color;
+@pagination-item-disabled-bg-active: @disabled-active-bg;
+@pagination-item-input-bg: @component-background;
+@pagination-mini-options-size-changer-top: 0px;
+
+// PageHeader
+// ---
+@page-header-padding: @padding-lg;
+@page-header-padding-vertical: @padding-md;
+@page-header-padding-breadcrumb: @padding-sm;
+@page-header-content-padding-vertical: @padding-sm;
+@page-header-back-color: #000;
+@page-header-ghost-bg: inherit;
+@page-header-heading-title: @heading-4-size;
+@page-header-heading-sub-title: 14px;
+@page-header-tabs-tab-font-size: 16px;
+
+// Breadcrumb
+// ---
+@breadcrumb-base-color: @text-color-secondary;
+@breadcrumb-last-item-color: @text-color;
+@breadcrumb-font-size: @font-size-base;
+@breadcrumb-icon-font-size: @font-size-base;
+@breadcrumb-link-color: @text-color-secondary;
+@breadcrumb-link-color-hover: @text-color;
+@breadcrumb-separator-color: @text-color-secondary;
+@breadcrumb-separator-margin: 0 @padding-xs;
+
+// Slider
+// ---
+@slider-margin: 10px 6px 10px;
+@slider-rail-background-color: @background-color-base;
+@slider-rail-background-color-hover: #e1e1e1;
+@slider-track-background-color: @primary-3;
+@slider-track-background-color-hover: @primary-4;
+@slider-handle-border-width: 2px;
+@slider-handle-background-color: @component-background;
+@slider-handle-color: @primary-3;
+@slider-handle-color-hover: @primary-4;
+@slider-handle-color-focus: ~'var(--@{ant-prefix}-primary-color-deprecated-t-20)';
+@slider-handle-color-focus-shadow: ~'var(--@{ant-prefix}-primary-color-deprecated-f-12)';
+@slider-handle-color-tooltip-open: @primary-color;
+@slider-handle-size: 14px;
+@slider-handle-margin-top: -5px;
+@slider-handle-margin-left: -5px;
+@slider-handle-shadow: 0;
+@slider-dot-border-color: @border-color-split;
+@slider-dot-border-color-active: ~'var(--@{ant-prefix}-primary-color-deprecated-t-50)';
+@slider-disabled-color: @disabled-color;
+@slider-disabled-background-color: @component-background;
+
+// Tree
+// ---
+@tree-bg: @component-background;
+@tree-title-height: 24px;
+@tree-child-padding: 18px;
+@tree-directory-selected-color: #fff;
+@tree-directory-selected-bg: @primary-color;
+@tree-node-hover-bg: @item-hover-bg;
+@tree-node-selected-bg: @primary-2;
+
+// Collapse
+// ---
+@collapse-header-padding: @padding-sm @padding-md;
+@collapse-header-padding-extra: 40px;
+@collapse-header-bg: @background-color-light;
+@collapse-content-padding: @padding-md;
+@collapse-content-bg: @component-background;
+@collapse-header-arrow-left: 16px;
+
+// Skeleton
+// ---
+@skeleton-color: rgba(190, 190, 190, 0.2);
+@skeleton-to-color: shade(@skeleton-color, 5%);
+@skeleton-paragraph-margin-top: 28px;
+@skeleton-paragraph-li-margin-top: @margin-md;
+@skeleton-paragraph-li-height: 16px;
+@skeleton-title-height: 16px;
+@skeleton-title-paragraph-margin-top: @margin-lg;
+
+// Transfer
+// ---
+@transfer-header-height: 40px;
+@transfer-item-height: @height-base;
+@transfer-disabled-bg: @disabled-bg;
+@transfer-list-height: 200px;
+@transfer-item-hover-bg: @item-hover-bg;
+@transfer-item-selected-hover-bg: ~'var(--@{ant-prefix}-primary-color-active-deprecated-d-02)';
+@transfer-item-padding-vertical: 6px;
+@transfer-list-search-icon-top: 12px;
+
+// Message
+// ---
+@message-notice-content-padding: 10px 16px;
+@message-notice-content-bg: @component-background;
+// Motion
+// ---
+@wave-animation-width: 6px;
+
+// Alert
+// ---
+@alert-success-border-color: @success-color-deprecated-border;
+@alert-success-bg-color: @success-color-deprecated-bg;
+@alert-success-icon-color: @success-color;
+@alert-info-border-color: @info-color-deprecated-border;
+@alert-info-bg-color: @info-color-deprecated-bg;
+@alert-info-icon-color: @info-color;
+@alert-warning-border-color: @warning-color-deprecated-border;
+@alert-warning-bg-color: @warning-color-deprecated-bg;
+@alert-warning-icon-color: @warning-color;
+@alert-error-border-color: @error-color-deprecated-border;
+@alert-error-bg-color: @error-color-deprecated-bg;
+@alert-error-icon-color: @error-color;
+@alert-message-color: @heading-color;
+@alert-text-color: @text-color;
+@alert-close-color: @text-color-secondary;
+@alert-close-hover-color: @icon-color-hover;
+@alert-padding-vertical: @padding-xs;
+@alert-padding-horizontal: @padding-md - 1px;
+@alert-no-icon-padding-vertical: @padding-xs;
+@alert-with-description-no-icon-padding-vertical: @padding-md - 1px;
+@alert-with-description-padding-vertical: @padding-md - 1px;
+@alert-with-description-padding: @alert-with-description-padding-vertical 15px
+ @alert-with-description-no-icon-padding-vertical @alert-with-description-icon-size;
+@alert-icon-top: 8px + @font-size-base * (@line-height-base / 2) - (@font-size-base / 2);
+@alert-with-description-icon-size: 24px;
+
+// List
+// ---
+@list-header-background: transparent;
+@list-footer-background: transparent;
+@list-empty-text-padding: @padding-md;
+@list-item-padding: @padding-sm 0;
+@list-item-padding-sm: @padding-xs @padding-md;
+@list-item-padding-lg: 16px 24px;
+@list-item-meta-margin-bottom: @padding-md;
+@list-item-meta-avatar-margin-right: @padding-md;
+@list-item-meta-title-margin-bottom: @padding-sm;
+@list-customize-card-bg: @component-background;
+@list-item-meta-description-font-size: @font-size-base;
+
+// Statistic
+// ---
+@statistic-title-font-size: @font-size-base;
+@statistic-content-font-size: 24px;
+@statistic-unit-font-size: 24px;
+@statistic-font-family: @font-family;
+
+// Drawer
+// ---
+@drawer-header-padding: @padding-md @padding-lg;
+@drawer-body-padding: @padding-lg;
+@drawer-bg: @component-background;
+@drawer-footer-padding-vertical: @modal-footer-padding-vertical;
+@drawer-footer-padding-horizontal: @modal-footer-padding-horizontal;
+@drawer-header-close-size: 56px;
+@drawer-title-font-size: @font-size-lg;
+@drawer-title-line-height: 22px;
+
+// Timeline
+// ---
+@timeline-width: 2px;
+@timeline-color: @border-color-split;
+@timeline-dot-border-width: 2px;
+@timeline-dot-color: @primary-color;
+@timeline-dot-bg: @component-background;
+@timeline-item-padding-bottom: 20px;
+
+// Typography
+// ---
+@typography-title-font-weight: 600;
+@typography-title-margin-top: 1.2em;
+@typography-title-margin-bottom: 0.5em;
+
+// Upload
+// ---
+@upload-actions-color: @text-color-secondary;
+
+// Steps
+// ---
+@process-tail-color: @border-color-split;
+@steps-nav-arrow-color: fade(@black, 25%);
+@steps-background: @component-background;
+@steps-icon-size: 32px;
+@steps-icon-custom-size: @steps-icon-size;
+@steps-icon-custom-top: 0px;
+@steps-icon-custom-font-size: 24px;
+@steps-icon-top: -0.5px;
+@steps-icon-font-size: @font-size-lg;
+@steps-icon-margin: 0 8px 0 0;
+@steps-title-line-height: @height-base;
+@steps-small-icon-size: 24px;
+@steps-small-icon-margin: 0 8px 0 0;
+@steps-dot-size: 8px;
+@steps-dot-top: 2px;
+@steps-current-dot-size: 10px;
+@steps-description-max-width: 140px;
+@steps-nav-content-max-width: auto;
+@steps-vertical-icon-width: 16px;
+@steps-vertical-tail-width: 16px;
+@steps-vertical-tail-width-sm: 12px;
+
+// Notification
+// ---
+@notification-bg: @component-background;
+@notification-padding-vertical: 16px;
+@notification-padding-horizontal: 24px;
+
+// Result
+// ---
+@result-title-font-size: 24px;
+@result-subtitle-font-size: @font-size-base;
+@result-icon-font-size: 72px;
+@result-extra-margin: 24px 0 0 0;
+
+// Image
+// ---
+@image-size-base: 48px;
+@image-font-size-base: 24px;
+@image-bg: #f5f5f5;
+@image-color: #fff;
+@image-mask-font-size: 16px;
+@image-preview-operation-size: 18px;
+@image-preview-operation-color: @text-color-dark;
+@image-preview-operation-disabled-color: fade(@image-preview-operation-color, 25%);
+
+// Segmented
+// ---
+@segmented-bg: fade(@black, 4%);
+@segmented-hover-bg: fade(@black, 6%);
+@segmented-selected-bg: @white;
+@segmented-label-color: fade(@black, 65%);
+@segmented-label-hover-color: #262626;
diff --git a/webapp/packages/supersonic-fe/src/assets/style/variable.less b/webapp/packages/supersonic-fe/src/assets/style/variable.less
new file mode 100644
index 000000000..6c702934c
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/assets/style/variable.less
@@ -0,0 +1,4 @@
+@root-entry-name: variable;
+
+@import './themes/variable.less';
+@import './core/index';
diff --git a/webapp/packages/supersonic-fe/src/components/BatchCtrlDropDownButton/index.less b/webapp/packages/supersonic-fe/src/components/BatchCtrlDropDownButton/index.less
new file mode 100644
index 000000000..e69de29bb
diff --git a/webapp/packages/supersonic-fe/src/components/BatchCtrlDropDownButton/index.tsx b/webapp/packages/supersonic-fe/src/components/BatchCtrlDropDownButton/index.tsx
new file mode 100644
index 000000000..7a6a76bda
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/components/BatchCtrlDropDownButton/index.tsx
@@ -0,0 +1,165 @@
+import { Space, Popconfirm, Dropdown, DatePicker, Popover, Button, Radio } from 'antd';
+import { FC, useState, useRef } from 'react';
+import {
+ PlaySquareOutlined,
+ StopOutlined,
+ CloudDownloadOutlined,
+ DeleteOutlined,
+} from '@ant-design/icons';
+
+export type BatchCtrlDropDownButtonProps = {
+ onMenuClick?: (key: string) => void;
+ onDownloadDateRangeChange?: (dateRange: string[], pickerType: string) => void;
+ onDeleteConfirm?: () => void;
+ downloadLoading?: boolean;
+ disabledList?: string[];
+ hiddenList?: string[];
+};
+const { RangePicker } = DatePicker;
+
+const BatchCtrlDropDownButton: FC
= ({
+ onMenuClick,
+ onDownloadDateRangeChange,
+ onDeleteConfirm,
+ downloadLoading,
+ disabledList = [],
+ hiddenList = [],
+}) => {
+ const [popoverOpenState, setPopoverOpenState] = useState(false);
+ const [pickerType, setPickerType] = useState('day');
+ const dateRangeRef = useRef([]);
+ const dropdownButtonItems: any[] = [
+ {
+ key: 'batchStart',
+ label: '批量启用',
+ icon: ,
+ disabled: disabledList?.includes('batchStart'),
+ },
+ {
+ key: 'batchStop',
+ label: '批量停用',
+ icon: ,
+ disabled: disabledList?.includes('batchStop'),
+ },
+ {
+ key: 'batchDownload',
+ label: (
+ {
+ setPopoverOpenState(true);
+ }}
+ >
+ 批量下载
+
+ ),
+ icon: ,
+ disabled: disabledList?.includes('batchDownload'),
+ },
+ {
+ key: 'batchDeleteDivider',
+ type: 'divider',
+ },
+ {
+ key: 'batchDelete',
+ label: (
+ {
+ onDeleteConfirm?.();
+ }}
+ >
+ 批量删除
+
+ ),
+ icon: ,
+ disabled: disabledList?.includes('batchDelete'),
+ },
+ ].filter((item) => {
+ return !hiddenList.includes(item.key);
+ });
+
+ const popoverConfig = {
+ title: '选择下载区间',
+ content: (
+
+ {
+ setPickerType(e.target.value);
+ }}
+ >
+ 按日
+ 按周
+ 按月
+
+ {
+ dateRangeRef.current = date;
+ return;
+ }}
+ picker={pickerType as any}
+ allowClear={true}
+ />
+
+
+ {
+ const [startMoment, endMoment] = dateRangeRef.current;
+ let searchDateRange = [
+ startMoment?.format('YYYY-MM-DD'),
+ endMoment?.format('YYYY-MM-DD'),
+ ];
+ if (pickerType === 'week') {
+ searchDateRange = [
+ startMoment?.startOf('isoWeek').format('YYYY-MM-DD'),
+ endMoment?.startOf('isoWeek').format('YYYY-MM-DD'),
+ ];
+ }
+ if (pickerType === 'month') {
+ searchDateRange = [
+ startMoment?.startOf('month').format('YYYY-MM-DD'),
+ endMoment?.startOf('month').format('YYYY-MM-DD'),
+ ];
+ }
+ onDownloadDateRangeChange?.(searchDateRange, pickerType);
+ }}
+ >
+ 下载
+
+
+
+
+ ),
+ };
+
+ return (
+ {
+ setPopoverOpenState(open);
+ }}
+ >
+ {
+ onMenuClick?.(key);
+ },
+ }}
+ >
+ 批量操作
+
+
+ );
+};
+
+export default BatchCtrlDropDownButton;
diff --git a/webapp/packages/supersonic-fe/src/components/HeaderDropdown/index.less b/webapp/packages/supersonic-fe/src/components/HeaderDropdown/index.less
index 004b53ebd..6c61395fe 100644
--- a/webapp/packages/supersonic-fe/src/components/HeaderDropdown/index.less
+++ b/webapp/packages/supersonic-fe/src/components/HeaderDropdown/index.less
@@ -1,12 +1,13 @@
-@import '~antd/es/style/themes/default.less';
+
.container > * {
- background-color: @popover-bg;
+ background-color: #fff;
border-radius: 4px;
- box-shadow: @shadow-1-down;
+ box-shadow: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05),
+ 0 12px 48px 16px rgba(0, 0, 0, 0.03);
}
-@media screen and (max-width: @screen-xs) {
+@media screen and (max-width: 480px) {
.container {
width: 100% !important;
}
diff --git a/webapp/packages/supersonic-fe/src/components/MStar/index.tsx b/webapp/packages/supersonic-fe/src/components/MStar/index.tsx
new file mode 100644
index 000000000..b89d187c1
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/components/MStar/index.tsx
@@ -0,0 +1,30 @@
+import React, { useState, useEffect } from 'react';
+import { StarOutlined, StarFilled } from '@ant-design/icons';
+import styles from './style.less';
+
+type Props = {
+ star?: boolean;
+ onToggleCollect: (star: boolean) => void;
+};
+
+const MStar: React.FC = ({ star = false, onToggleCollect }) => {
+ const [starState, setStarState] = useState(star);
+ useEffect(() => {
+ setStarState(star);
+ }, [star]);
+
+ return (
+ {
+ event.stopPropagation();
+ setStarState(!starState);
+ onToggleCollect(!starState);
+ }}
+ >
+ {starState === false ? : }
+
+ );
+};
+
+export default MStar;
diff --git a/webapp/packages/supersonic-fe/src/components/MStar/style.less b/webapp/packages/supersonic-fe/src/components/MStar/style.less
new file mode 100644
index 000000000..0fa1f22a3
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/components/MStar/style.less
@@ -0,0 +1,6 @@
+.collectDashboard {
+ color: #546174;
+ &.dashboardCollected {
+ display: block !important;
+ }
+}
\ No newline at end of file
diff --git a/webapp/packages/supersonic-fe/src/components/RightContent/AvatarDropdown.tsx b/webapp/packages/supersonic-fe/src/components/RightContent/AvatarDropdown.tsx
index 0f400db14..2480173bf 100644
--- a/webapp/packages/supersonic-fe/src/components/RightContent/AvatarDropdown.tsx
+++ b/webapp/packages/supersonic-fe/src/components/RightContent/AvatarDropdown.tsx
@@ -54,7 +54,7 @@ const AvatarDropdown: React.FC = () => {
- {currentUser.staffName}
+ {currentUser.staffName}
);
diff --git a/webapp/packages/supersonic-fe/src/components/RightContent/index.less b/webapp/packages/supersonic-fe/src/components/RightContent/index.less
index 96a612134..6fb2026a9 100644
--- a/webapp/packages/supersonic-fe/src/components/RightContent/index.less
+++ b/webapp/packages/supersonic-fe/src/components/RightContent/index.less
@@ -1,4 +1,4 @@
-@import '~antd/es/style/themes/default.less';
+
@pro-header-hover-bg: rgba(0, 0, 0, 0.025);
@@ -26,15 +26,17 @@
padding: 0 12px;
cursor: pointer;
transition: all 0.3s;
-
+ color: #fff;
>span {
vertical-align: middle;
}
+
&:hover {
- background: @pro-header-hover-bg;
+ background: #296df3;
}
+
&:global(.opened) {
background: @pro-header-hover-bg;
}
@@ -57,49 +59,3 @@
}
}
}
-
-.dark {
- .action {
- .download {
- display: flex;
- align-items: center;
- }
-
- .menuName {
- margin-left: 5px;
- color: #fff;
- font-size: 13px;
- }
-
- &:hover {
- background: #296df3;
- }
-
- &:global(.opened) {
- background: #252a3d;
- }
- }
-}
-
-.actionIcon {
- font-size: 20px;
-}
-
-
-
-.tooltip {
- padding-top: 0 !important;
- font-size: 12px !important;
-
- :global {
- .ant-tooltip-arrow {
- display: none;
- }
-
- .ant-tooltip-inner {
- min-height: 0 !important;
- padding: 3px 6px !important;
- }
- }
-}
-
diff --git a/webapp/packages/supersonic-fe/src/components/RightContent/index.tsx b/webapp/packages/supersonic-fe/src/components/RightContent/index.tsx
index 3c84e8f0e..99fed0d32 100644
--- a/webapp/packages/supersonic-fe/src/components/RightContent/index.tsx
+++ b/webapp/packages/supersonic-fe/src/components/RightContent/index.tsx
@@ -5,7 +5,6 @@ import Avatar from './AvatarDropdown';
import { SettingOutlined } from '@ant-design/icons';
import { getSystemConfig } from '@/services/user';
import styles from './index.less';
-import cx from 'classnames';
export type SiderTheme = 'light' | 'dark';
@@ -21,27 +20,20 @@ const GlobalHeaderRight: React.FC = () => {
}
const { currentUser = {} } = initialState as any;
- const { layout } = initialState.settings;
- let className = styles.right;
-
const querySystemConfig = async () => {
const { code, data } = await getSystemConfig();
if (code === 200) {
const { admins } = data;
- if (admins.includes(currentUser?.staffName)) {
+ if (Array.isArray(admins) && admins.includes(currentUser?.staffName)) {
setHasSettingPermisson(true);
}
}
};
- if (layout === 'top' || layout === 'mix') {
- className = cx(styles.right, styles.dark);
- }
-
function handleLogin() {}
return (
-
+
{hasSettingPermisson && (
span {
display: inline-block;
diff --git a/webapp/packages/supersonic-fe/src/components/TagSelect/index.less b/webapp/packages/supersonic-fe/src/components/TagSelect/index.less
index 9cff6d372..df780a7a6 100644
--- a/webapp/packages/supersonic-fe/src/components/TagSelect/index.less
+++ b/webapp/packages/supersonic-fe/src/components/TagSelect/index.less
@@ -1,4 +1,3 @@
-@import '~antd/es/style/themes/default.less';
.tagSelect {
position: relative;
@@ -12,7 +11,7 @@
.ant-tag {
margin-right: 24px;
padding: 0 8px;
- font-size: @font-size-base;
+ font-size: 14px;
}
}
&.expanded {
diff --git a/webapp/packages/supersonic-fe/src/global.less b/webapp/packages/supersonic-fe/src/global.less
index 28d25ced7..279eeef5c 100644
--- a/webapp/packages/supersonic-fe/src/global.less
+++ b/webapp/packages/supersonic-fe/src/global.less
@@ -1,4 +1,4 @@
-@import '~antd/es/style/themes/default.less';
+
:root:root {
--primary-color: #f87653;
@@ -30,6 +30,7 @@ body,
height: 100%;
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Microsoft YaHei,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";
-webkit-font-smoothing:antialiased;
+ margin: 0;
}
.colorWeak {
@@ -55,7 +56,7 @@ ol {
list-style: none;
}
-@media (max-width: @screen-xs) {
+@media (max-width: 480px) {
.ant-table {
width: 100%;
overflow-x: auto;
@@ -111,26 +112,46 @@ ol {
.ant-spin-spinning {
max-height: none !important;
}
-
.loadingPlaceholder {
height: 100vh;
}
}
+.ant-pro-layout .ant-pro-layout-content {
+ padding: 0;
+ background-color: #f0f2f5;
+}
+
+
.ellipsis {
overflow: hidden;
text-overflow: ellipsis;
}
-.ant-menu-dark.ant-menu-horizontal>.ant-menu-item,
-.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu {
+.ant-pro-top-nav-header-menu {
+ padding: 0!important;
+ line-height: unset!important;
+}
+
+.ant-menu-root>.ant-menu-item,
+.ant-menu-root>.ant-menu-submenu {
font-weight: bold;
font-size: 14px;
-
&>span>a,
&>a {
color: white;
+ &:hover {
+ color: white;
+ }
}
+ &:hover {
+ background-color: #296DF3!important;
+ }
+}
+
+.ant-menu-root>.ant-menu-item.ant-menu-item-selected {
+ background-color: #296DF3!important;
+ color: white;
}
.ant-pro-top-nav-header-logo h1 {
@@ -143,63 +164,19 @@ ol {
backdrop-filter: blur(10px) !important;
}
-.ant-menu.ant-menu-dark {
- color: #fff;
-}
-.ant-menu-submenu-selected {
- background-color: #296DF3 !important;
-}
-
-.ant-menu.ant-menu-dark .ant-menu-sub {
- background-color: #fff;
- .ant-menu-item-selected {
- background-color: #296DF3;
- .ant-pro-menu-item-title {
- color: #fff;
- }
- }
- .ant-menu-item {
- &:hover {
- background-color: #e3e3e3;
-
- .ant-menu-item-selected {
- background-color: #e3e3e3;
- .ant-pro-menu-item-title {
- color: #181a1a !important;
- }
- }
- .ant-pro-menu-item-title {
- color: #181a1a !important;
- }
- }
- & > span > a {
- color: #181a1a;
- &:hover {
- color: #181a1a;
- }
- }
- }
-}
-.ant-menu-item:active {
- background: inherit
-}
-// .ant-menu-dark .ant-menu-item > span > a {
-// color: #181a1a;
-// &:hover {
-// color: #fff;
-// }
-// }
-// .ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-selected {
-// // color: #fff;
-// background-color: #1b4aef;
+// .ant-menu-submenu-selected {
+// background-color: #296DF3 !important;
// }
-.customizeHeader {
- background-color: rgba(0, 0, 0, 0.2);
- backdrop-filter: blur(10px);
-}
+
+
+// .ant-menu-item:active {
+// background: inherit
+// }
+
+
.ant-pro-top-nav-header-main-left {
min-width: 100px !important;
@@ -210,64 +187,31 @@ ol {
}
-.link {
- color: #296df3;
- cursor: pointer;
-}
+// .link {
+// color: #296df3;
+// cursor: pointer;
+// }
-.closeTab {
- position: relative;
- width: 10px;
- height: 10px;
- // opacity: 0;
-}
-.closeTab::before,
-.closeTab::after {
- position: absolute;
- top: -2px;
- left: 0;
- width: 1px;
- height: 10px;
- background-color: rgb(50, 50, 50);
- content: ' ';
-}
-
-.closeTab::before {
- transform: rotate(45deg);
-}
-
-.closeTab::after {
- transform: rotate(-45deg);
-}
-
-.dot {
- float: right;
- width: 8px;
- height: 8px;
- background: #bfbfbf;
- border-radius: 100%;
-}
-
-.bdWrapper {
- margin: -24px;
- .ant-layout-sider {
- top: 48px !important;
- }
-}
+// .dot {
+// float: right;
+// width: 8px;
+// height: 8px;
+// background: #bfbfbf;
+// border-radius: 100%;
+// }
.logo {
position: relative;
- padding-bottom: 5px;
color: #fff;
font-size: 20px;
font-weight: 700;
padding-right: 50px;
}
-.ant-notification-topRight {
- right: 240px !important;
-}
+// .ant-notification-topRight {
+// right: 240px !important;
+// }
.g6ContextMenuContainer {
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceBasicForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceBasicForm.tsx
index 08d6a53d6..6869988d8 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceBasicForm.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceBasicForm.tsx
@@ -1,7 +1,8 @@
-import React, { useEffect, useState } from 'react';
+import React, { useState } from 'react';
import { Form, Input, Spin, Select, message } from 'antd';
import type { FormInstance } from 'antd/lib/form';
import { getDbNames, getTables } from '../../service';
+import SqlEditor from '@/components/SqlEditor';
import { ISemantic } from '../../data';
const FormItem = Form.Item;
@@ -123,6 +124,13 @@ const DataSourceBasicForm: React.FC = ({ isEdit, databaseConfigList, mode
+ {/*
+
+ */}
);
};
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceCreateForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceCreateForm.tsx
index 9eed5d3a6..d1ced256c 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceCreateForm.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Datasource/components/DataSourceCreateForm.tsx
@@ -24,7 +24,7 @@ export type CreateFormProps = {
basicInfoFormMode?: 'normal' | 'fast';
onDataBaseTableChange?: (tableName: string) => void;
onDataSourceBtnClick?: () => void;
- // modalSolt: ReactNode;
+ onOpenDataSourceEdit?: () => void;
};
const { Step } = Steps;
@@ -45,6 +45,7 @@ const DataSourceCreateForm: React.FC = ({
databaseId,
basicInfoFormMode,
onDataSourceBtnClick,
+ onOpenDataSourceEdit,
children,
}) => {
const isEdit = !!dataSourceItem?.id;
@@ -59,7 +60,7 @@ const DataSourceCreateForm: React.FC = ({
const updateFormVal = (val: any) => {
formValRef.current = val;
};
-
+ const [sqlFilter, setSqlFilter] = useState('');
useEffect(() => {
const hasEmpty = fields.some((item) => {
const { name, isCreateDimension, isCreateMetric } = item;
@@ -170,6 +171,7 @@ const DataSourceCreateForm: React.FC = ({
queryType: basicInfoFormMode === 'fast' ? 'table_query' : 'sql_query',
tableQuery: dbName && tableName ? `${dbName}.${tableName}` : '',
modelId: isEdit ? dataSourceItem.modelId : modelId,
+ filterSql: sqlFilter,
};
const queryDatasource = isEdit ? updateDatasource : createDatasource;
const { code, msg, data } = await queryDatasource(queryParams);
@@ -221,7 +223,7 @@ const DataSourceCreateForm: React.FC = ({
const initData = async () => {
const { queryType, tableQuery } = dataSourceItem.datasourceDetail;
let tableQueryInitValue = {};
- let columns = fieldColumns;
+ let columns = fieldColumns || [];
if (queryType === 'table_query') {
const tableQueryString = tableQuery || '';
const [dbName, tableName] = tableQueryString.split('.');
@@ -235,7 +237,8 @@ const DataSourceCreateForm: React.FC = ({
};
const formatterInitData = (columns: any[], extendParams: Record = {}) => {
- const { id, name, bizName, description, datasourceDetail, databaseId } = dataSourceItem as any;
+ const { id, name, bizName, description, datasourceDetail, databaseId, filterSql } =
+ dataSourceItem as any;
const { dimensions, identifiers, measures } = datasourceDetail;
const initValue = {
id,
@@ -243,6 +246,7 @@ const DataSourceCreateForm: React.FC = ({
bizName,
description,
databaseId,
+ filterSql,
...extendParams,
// ...tableQueryInitValue,
};
@@ -250,6 +254,7 @@ const DataSourceCreateForm: React.FC = ({
...formValRef.current,
...initValue,
};
+ setSqlFilter(filterSql);
updateFormVal(editInitFormVal);
form.setFieldsValue(initValue);
const formatFields = [
@@ -261,10 +266,24 @@ const DataSourceCreateForm: React.FC = ({
};
useEffect(() => {
- if (isEdit) {
- initData();
- } else {
- initFields([], fieldColumns);
+ const { queryType } = dataSourceItem?.datasourceDetail || {};
+ if (queryType === 'table_query') {
+ if (isEdit) {
+ initData();
+ } else {
+ initFields([], fieldColumns);
+ }
+ }
+ }, [dataSourceItem]);
+
+ useEffect(() => {
+ const { queryType } = dataSourceItem?.datasourceDetail || {};
+ if (queryType !== 'table_query') {
+ if (isEdit) {
+ initData();
+ } else {
+ initFields([], fieldColumns);
+ }
}
}, [dataSourceItem, fieldColumns]);
@@ -306,7 +325,14 @@ const DataSourceCreateForm: React.FC = ({
return (
<>
-
+ {
+ setSqlFilter(sql);
+ }}
+ sql={sqlFilter}
+ />
= ({
type="primary"
onClick={() => {
handleNext();
+ if (!isEdit && Array.isArray(fields) && fields.length === 0) {
+ onOpenDataSourceEdit?.();
+ }
}}
>
下一步
@@ -381,7 +410,7 @@ const DataSourceCreateForm: React.FC = ({
void;
+ sql: string;
fields: FieldItem[];
onFieldChange: (fieldName: string, data: Partial) => void;
};
@@ -41,7 +45,7 @@ const getCreateFieldName = (type: EnumDataSourceType) => {
// const editState = !isUndefined(record[isCreateName]) ? !!record[isCreateName] : true;
};
-const FieldForm: React.FC = ({ fields, onFieldChange }) => {
+const FieldForm: React.FC = ({ fields, sql, onFieldChange, onSqlChange }) => {
const handleFieldChange = (record: FieldItem, fieldName: string, value: any) => {
onFieldChange(record.bizName, {
...record,
@@ -271,6 +275,14 @@ const FieldForm: React.FC = ({ fields, onFieldChange }) => {
pagination={false}
scroll={{ y: 500 }}
/>
+ 过滤SQL}
+ tooltip="主要用于词典导入场景, 对维度值进行过滤 格式: field1 = 'xxx' and field2 = 'yyy'"
+ >
+
+
>
);
};
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Detail.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Detail.tsx
index 67c68c881..282a52afd 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Detail.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Detail.tsx
@@ -15,6 +15,7 @@ import MetricTrendSection from '@/pages/SemanticModel/Metric/components/MetricTr
import { SENSITIVE_LEVEL_ENUM, SENSITIVE_LEVEL_COLOR } from '../constant';
import type { TabsProps } from 'antd';
import { ISemantic } from '../data';
+import MetricStar from './components/MetricStar';
const { Content } = Layout;
type Props = {
@@ -31,20 +32,6 @@ interface DescriptionItemProps {
icon: ReactNode;
}
-// type InfoListItemChildrenItem = {
-// label: string;
-// value: string;
-// content?: ReactNode;
-// hideItem?: boolean;
-// };
-
-// type InfoListItem = {
-// title: string;
-// hideItem?: boolean;
-// render?: () => ReactNode;
-// children?: InfoListItemChildrenItem[];
-// };
-
const DescriptionItem = ({ title, content, icon }: DescriptionItemProps) => (
@@ -59,10 +46,7 @@ const DescriptionItem = ({ title, content, icon }: DescriptionItemProps) => (
const MetricDetail: React.FC
= ({ domainManger }) => {
const params: any = useParams();
const metricId = params.metricId;
- // const bizName = params.bizName;
- // const [infoList, setInfoList] = useState([]);
- // const { selectModelName } = domainManger;
const [metircData, setMetircData] = useState();
useEffect(() => {
queryMetricData(metricId);
@@ -77,112 +61,20 @@ const MetricDetail: React.FC = ({ domainManger }) => {
message.error(msg);
};
- // useEffect(() => {
- // if (!metircData) {
- // return;
- // }
- // const {
- // alias,
- // bizName,
- // createdBy,
- // createdAt,
- // updatedAt,
- // description,
- // sensitiveLevel,
- // modelName,
- // } = metircData;
-
- // const list = [
- // {
- // title: '基本信息',
- // children: [
- // {
- // label: '字段名称',
- // value: bizName,
- // },
- // {
- // label: '别名',
- // hideItem: !alias,
- // value: alias || '-',
- // },
- // {
- // label: '所属模型',
- // value: modelName,
- // content: {modelName || selectModelName} ,
- // },
-
- // {
- // label: '描述',
- // value: description,
- // },
- // ],
- // },
- // {
- // title: '应用信息',
- // children: [
- // {
- // label: '敏感度',
- // value: SENSITIVE_LEVEL_ENUM[sensitiveLevel],
- // },
- // ],
- // },
- // // {
- // // title: '指标趋势',
- // // render: () => (
- // //
- // //
- // //
- // //
- // //
- // // ),
- // // },
- // {
- // title: '创建信息',
- // children: [
- // {
- // label: '创建人',
- // value: createdBy,
- // },
- // {
- // label: '创建时间',
- // value: createdAt ? moment(createdAt).format('YYYY-MM-DD HH:mm:ss') : '',
- // },
- // {
- // label: '更新时间',
- // value: updatedAt ? moment(updatedAt).format('YYYY-MM-DD HH:mm:ss') : '',
- // },
- // ],
- // },
- // ];
-
- // setInfoList(list);
- // }, [metircData]);
-
const tabItems: TabsProps['items'] = [
{
key: 'metricTrend',
label: '图表',
children: ,
},
- // {
- // key: '2',
- // label: 'Tab 2',
- // children: 'Content of Tab Pane 2',
- // },
];
const contentStyle: React.CSSProperties = {
minHeight: 120,
color: '#fff',
- // marginRight: 15,
backgroundColor: '#fff',
};
- // const siderStyle: React.CSSProperties = {
- // width: '300px',
- // backgroundColor: '#fff',
- // };
-
return (
@@ -200,20 +92,21 @@ const MetricDetail: React.FC = ({ domainManger }) => {
+
{metircData?.name}
{metircData?.alias && `[${metircData.alias}]`}
{metircData?.name && (
<>
- |
+ |
{metircData?.bizName}
>
)}
{metircData?.sensitiveLevel !== undefined && (
- {SENSITIVE_LEVEL_ENUM[metircData.sensitiveLevel]}敏感度
+ {SENSITIVE_LEVEL_ENUM[metircData.sensitiveLevel]}
)}
@@ -235,19 +128,6 @@ const MetricDetail: React.FC = ({ domainManger }) => {
{metircData?.createdBy ? (
<>
- {/*
- }
- content={metircData?.modelName}
- />
-
- }
- content={metircData?.description}
- />
-
*/}
= ({ domainManger }) => {
- {/*
- <>
-
- {infoList.map((item) => {
- const { children, title, render } = item;
- return (
-
-
{title}
- {render?.() ||
- (Array.isArray(children) &&
- children.map((childrenItem) => {
- return (
-
-
-
-
-
- );
- }))}
-
-
- );
- })}
-
- >
- */}
);
};
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Market.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Market.tsx
index 31ecd3a58..f4b916fab 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Market.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/Market.tsx
@@ -1,17 +1,6 @@
import type { ActionType, ProColumns } from '@ant-design/pro-table';
import ProTable from '@ant-design/pro-table';
-import {
- message,
- Space,
- Popconfirm,
- Tag,
- Spin,
- Dropdown,
- DatePicker,
- Popover,
- Button,
- Radio,
-} from 'antd';
+import { message, Space, Popconfirm, Tag, Spin, Tooltip } from 'antd';
import React, { useRef, useState, useEffect } from 'react';
import type { Dispatch } from 'umi';
import { connect, history, useModel } from 'umi';
@@ -28,23 +17,17 @@ import MetricInfoCreateForm from '../components/MetricInfoCreateForm';
import MetricCardList from './components/MetricCardList';
import NodeInfoDrawer from '../SemanticGraph/components/NodeInfoDrawer';
import { SemanticNodeType, StatusEnum } from '../enum';
-import moment, { Moment } from 'moment';
+import moment from 'moment';
import styles from './style.less';
import { ISemantic } from '../data';
-import {
- PlaySquareOutlined,
- StopOutlined,
- CloudDownloadOutlined,
- DeleteOutlined,
-} from '@ant-design/icons';
+import BatchCtrlDropDownButton from '@/components/BatchCtrlDropDownButton';
+import MetricStar from './components/MetricStar';
type Props = {
dispatch: Dispatch;
domainManger: StateType;
};
-const { RangePicker } = DatePicker;
-
type QueryMetricListParams = {
id?: string;
name?: string;
@@ -58,7 +41,6 @@ const ClassMetricTable: React.FC
= ({ domainManger, dispatch }) => {
const { initialState = {} } = useModel('@@initialState');
const { currentUser = {} } = initialState as any;
-
const { selectDomainId, selectModelId: modelId } = domainManger;
const [createModalVisible, setCreateModalVisible] = useState(false);
const defaultPagination = {
@@ -75,10 +57,7 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => {
showType: localStorage.getItem('metricMarketShowType') === '1' ? true : false,
});
const [infoDrawerVisible, setInfoDrawerVisible] = useState(false);
- const [popoverOpenState, setPopoverOpenState] = useState(false);
- const [pickerType, setPickerType] = useState('day');
- const dateRangeRef = useRef([]);
const [downloadLoading, setDownloadLoading] = useState(false);
const actionRef = useRef();
@@ -152,7 +131,11 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => {
}
};
- const downloadMetricQuery = async (ids: React.Key[], dateStringList: string[]) => {
+ const downloadMetricQuery = async (
+ ids: React.Key[],
+ dateStringList: string[],
+ pickerType: string,
+ ) => {
if (Array.isArray(ids) && ids.length > 0) {
setDownloadLoading(true);
const [startDate, endDate] = dateStringList;
@@ -166,7 +149,6 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => {
},
});
setDownloadLoading(false);
- setPopoverOpenState(false);
}
};
@@ -184,14 +166,18 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => {
dataIndex: 'name',
title: '指标名称',
render: (_, record: any) => {
+ const { id, isCollect } = record;
return (
- {
- history.push(`/metric/detail/${record.id}`);
- }}
- >
- {record.name}
-
+
+
+ {
+ history.push(`/metric/detail/${record.id}`);
+ }}
+ >
+ {record.name}
+
+
);
},
},
@@ -343,43 +329,7 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => {
}),
};
- const dropdownButtonItems: any[] = [
- {
- key: 'batchStart',
- label: '批量启用',
- icon: ,
- },
- {
- key: 'batchStop',
- label: '批量停用',
- icon: ,
- },
- {
- key: 'batchDownload',
- // label: '批量下载',
- label: 批量下载 ,
- icon: ,
- },
- {
- type: 'divider',
- },
- {
- key: 'batchDelete',
- label: (
- {
- queryBatchUpdateStatus(selectedRowKeys, StatusEnum.DELETED);
- }}
- >
- 批量删除
-
- ),
- icon: ,
- },
- ];
-
- const onMenuClick = ({ key }: { key: string }) => {
+ const onMenuClick = (key: string) => {
switch (key) {
case 'batchStart':
queryBatchUpdateStatus(selectedRowKeys, StatusEnum.ONLINE);
@@ -387,69 +337,11 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => {
case 'batchStop':
queryBatchUpdateStatus(selectedRowKeys, StatusEnum.OFFLINE);
break;
- case 'batchDownload':
- setPopoverOpenState(true);
default:
break;
}
};
- const popoverConfig = {
- title: '选择下载区间',
- content: (
-
- {
- setPickerType(e.target.value);
- }}
- >
- 按日
- 按周
- 按月
-
- {
- dateRangeRef.current = date;
- return;
- }}
- picker={pickerType as any}
- allowClear={true}
- />
-
-
- {
- const [startMoment, endMoment] = dateRangeRef.current;
- let searchDateRange = [
- startMoment?.format('YYYY-MM-DD'),
- endMoment?.format('YYYY-MM-DD'),
- ];
- if (pickerType === 'week') {
- searchDateRange = [
- startMoment?.startOf('isoWeek').format('YYYY-MM-DD'),
- endMoment?.startOf('isoWeek').format('YYYY-MM-DD'),
- ];
- }
- if (pickerType === 'month') {
- searchDateRange = [
- startMoment?.startOf('month').format('YYYY-MM-DD'),
- endMoment?.startOf('month').format('YYYY-MM-DD'),
- ];
- }
- downloadMetricQuery(selectedRowKeys, searchDateRange);
- }}
- >
- 下载
-
-
-
-
- ),
- };
+
return (
<>
@@ -499,21 +391,17 @@ const ClassMetricTable: React.FC
= ({ domainManger, dispatch }) => {
...rowSelection,
}}
toolBarRender={() => [
- {
- setPopoverOpenState(open);
+ downloadLoading={downloadLoading}
+ onDeleteConfirm={() => {
+ queryBatchUpdateStatus(selectedRowKeys, StatusEnum.DELETED);
}}
- >
-
- 批量操作
-
- ,
+ onMenuClick={onMenuClick}
+ onDownloadDateRangeChange={(searchDateRange, pickerType) => {
+ downloadMetricQuery(selectedRowKeys, searchDateRange, pickerType);
+ }}
+ />,
]}
loading={loading}
onChange={(data: any) => {
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricStar.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricStar.tsx
new file mode 100644
index 000000000..36c241618
--- /dev/null
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/components/MetricStar.tsx
@@ -0,0 +1,38 @@
+import { Tooltip, message } from 'antd';
+import React, { useState } from 'react';
+import { metricStarState } from '../../service';
+import MStar from '@/components/MStar';
+
+type Props = {
+ metricId: number;
+ initState?: boolean;
+ onChange?: (state: boolean) => void;
+};
+
+const MetricStar: React.FC = ({ metricId, initState = false }) => {
+ const [star, setStar] = useState(initState);
+
+ const starStateChange = async (id: number, state: boolean) => {
+ const { code, msg } = await metricStarState({ id, state });
+ if (code === 200) {
+ setStar(state);
+ } else {
+ message.error(msg);
+ }
+ };
+
+ return (
+
+
+ {
+ starStateChange(metricId, star);
+ }}
+ />
+
+
+ );
+};
+
+export default MetricStar;
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/style.less b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/style.less
index 5a0727363..55123c57b 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/style.less
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/Metric/style.less
@@ -120,7 +120,8 @@
height: calc(100vh - 50px);
.title {
margin-bottom: 0;
- // padding: 20px;
+ margin-top:0;
+ background-color: #fff;
font-size: 20px;
line-height: 34px;
border-bottom: 1px solid #d9d9d9;
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx
index 9adc51a41..284222946 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/OverviewContainer.tsx
@@ -203,7 +203,7 @@ const OverviewContainer: React.FC = ({ mode, domainManger, dispatch }) =>
-
+ {/*
{selectDomainName ? `${selectDomainName}` : '主题域信息'}
{selectModelName && (
@@ -213,7 +213,7 @@ const OverviewContainer: React.FC = ({ mode, domainManger, dispatch }) =>
>
)}
-
+
*/}
{
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTypeModal.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTypeModal.tsx
index 1ca970b67..af7cf934e 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTypeModal.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassDataSourceTypeModal.tsx
@@ -118,7 +118,7 @@ const ClassDataSourceTypeModal: React.FC = ({
cover={
}
>
@@ -137,7 +137,7 @@ const ClassDataSourceTypeModal: React.FC = ({
style={{ height: 220 }}
cover={
}
>
@@ -185,6 +185,9 @@ const ClassDataSourceTypeModal: React.FC = ({
onDataSourceBtnClick={() => {
setDataSourceEditOpen(true);
}}
+ onOpenDataSourceEdit={() => {
+ setDataSourceEditOpen(true);
+ }}
>
= ({ domainManger, dispatch }) => {
},
];
- const onMenuClick = ({ key }: { key: string }) => {
+ const onMenuClick = (key: string) => {
switch (key) {
case 'batchStart':
queryBatchUpdateStatus(selectedRowKeys, StatusEnum.ONLINE);
@@ -386,12 +387,14 @@ const ClassDimensionTable: React.FC = ({ domainManger, dispatch }) => {
>
创建维度
,
-
- 批量操作
- ,
+ onDeleteConfirm={() => {
+ queryBatchUpdateStatus(selectedRowKeys, StatusEnum.DELETED);
+ }}
+ hiddenList={['batchDownload']}
+ onMenuClick={onMenuClick}
+ />,
]}
/>
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx
index 86d6d04a9..c77880765 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ClassMetricTable.tsx
@@ -1,16 +1,21 @@
import type { ActionType, ProColumns } from '@ant-design/pro-table';
import ProTable from '@ant-design/pro-table';
-import { message, Button, Space, Popconfirm, Input, Tag, Dropdown } from 'antd';
+import { message, Button, Space, Popconfirm, Input, Tag } from 'antd';
import React, { useRef, useState } from 'react';
import type { Dispatch } from 'umi';
import { StatusEnum } from '../enum';
import { connect } from 'umi';
import type { StateType } from '../model';
import { SENSITIVE_LEVEL_ENUM } from '../constant';
-import { queryMetric, deleteMetric, updateExprMetric, batchUpdateMetricStatus } from '../service';
+import {
+ queryMetric,
+ deleteMetric,
+ batchUpdateMetricStatus,
+ batchDownloadMetric,
+} from '../service';
import MetricInfoCreateForm from './MetricInfoCreateForm';
-
+import BatchCtrlDropDownButton from '@/components/BatchCtrlDropDownButton';
import moment from 'moment';
import styles from './style.less';
import { ISemantic } from '../data';
@@ -32,20 +37,7 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => {
});
const actionRef = useRef();
- const updateStatus = async (data: ISemantic.IMetricItem) => {
- const { code, msg } = await updateExprMetric(data);
- if (code === 200) {
- actionRef?.current?.reload();
- dispatch({
- type: 'domainManger/queryMetricList',
- payload: {
- modelId,
- },
- });
- return;
- }
- message.error(msg);
- };
+ const [downloadLoading, setDownloadLoading] = useState(false);
const queryBatchUpdateStatus = async (ids: React.Key[], status: StatusEnum) => {
if (Array.isArray(ids) && ids.length === 0) {
@@ -268,31 +260,7 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => {
},
};
- const dropdownButtonItems = [
- {
- key: 'batchStart',
- label: '批量启用',
- },
- {
- key: 'batchStop',
- label: '批量停用',
- },
- {
- key: 'batchDelete',
- label: (
- {
- queryBatchUpdateStatus(selectedRowKeys, StatusEnum.DELETED);
- }}
- >
- 批量删除
-
- ),
- },
- ];
-
- const onMenuClick = ({ key }: { key: string }) => {
+ const onMenuClick = (key: string) => {
switch (key) {
case 'batchStart':
queryBatchUpdateStatus(selectedRowKeys, StatusEnum.ONLINE);
@@ -305,6 +273,27 @@ const ClassMetricTable: React.FC = ({ domainManger, dispatch }) => {
}
};
+ const downloadMetricQuery = async (
+ ids: React.Key[],
+ dateStringList: string[],
+ pickerType: string,
+ ) => {
+ if (Array.isArray(ids) && ids.length > 0) {
+ setDownloadLoading(true);
+ const [startDate, endDate] = dateStringList;
+ await batchDownloadMetric({
+ metricIds: ids,
+ dateInfo: {
+ dateMode: 'BETWEEN',
+ startDate,
+ endDate,
+ period: pickerType.toUpperCase(),
+ },
+ });
+ setDownloadLoading(false);
+ }
+ };
+
return (
<>
= ({ domainManger, dispatch }) => {
>
创建指标
,
-
- 批量操作
- ,
+ downloadLoading={downloadLoading}
+ onDeleteConfirm={() => {
+ queryBatchUpdateStatus(selectedRowKeys, StatusEnum.DELETED);
+ }}
+ onMenuClick={onMenuClick}
+ onDownloadDateRangeChange={(searchDateRange, pickerType) => {
+ downloadMetricQuery(selectedRowKeys, searchDateRange, pickerType);
+ }}
+ />,
]}
/>
{createModalVisible && (
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainList.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainList.tsx
index 922fa9edf..fe31b1a75 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainList.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DomainList.tsx
@@ -179,32 +179,33 @@ const DomainListTree: FC = ({
return (
-
-
- {/* */}
-
- {/* */}
-
- {createDomainBtnVisible && (
-
-
- }
- size="small"
- onClick={() => {
- setProjectInfoParams({ type: 'top', modelType: 'add' });
- setProjectInfoModalVisible(true);
- onCreateDomainBtnClick?.();
- }}
- />
-
- {/*
+
+
+
+ {/* */}
+
+ {/* */}
+
+ {createDomainBtnVisible && (
+
+
+ }
+ size="small"
+ onClick={() => {
+ setProjectInfoParams({ type: 'top', modelType: 'add' });
+ setProjectInfoModalVisible(true);
+ onCreateDomainBtnClick?.();
+ }}
+ />
+
+ {/*
{
setProjectInfoParams({ type: 'top', modelType: 'add' });
@@ -214,10 +215,10 @@ const DomainListTree: FC = ({
className={styles.addBtn}
/>
*/}
-
- )}
-
-
+
+ )}
+
+
= ({
onMenuChange,
}) => {
const defaultTabKey = 'xflow';
- const { selectDomainId, domainList, selectModelId } = domainManger;
+ const { selectDomainId, domainList, selectModelId, selectModelName, selectDomainName } =
+ domainManger;
+
const tabItem = [
{
label: '模型管理',
@@ -126,40 +128,49 @@ const DomainManagerTab: React.FC = ({
return (
<>
+ {
+ onBackDomainBtnClick?.();
+ }}
+ style={selectModelName ? {} : { color: '#296df3', fontWeight: 'bold' }}
+ >
+
+ {selectDomainName}
+
+ ),
+ },
+ {
+ type: 'separator',
+ separator: selectModelName ? '/' : '',
+ },
+ {
+ title: selectModelName ? (
+ {
+ history.push(`/model/${selectDomainId}/${selectModelId}/`);
+ }}
+ style={{ color: '#296df3' }}
+ >
+
+ {selectModelName}
+
+ ) : undefined,
+ },
+ ]}
+ />
- {!!selectModelId && (
- {
- onBackDomainBtnClick?.();
- }}
- >
-
-
- )}
- >
- ),
- // right: isModel ? (
- // }
- // onClick={() => {
- // onBackDomainBtnClick?.();
- // }}
- // style={{ marginRight: 10, marginBottom: 5 }}
- // >
- // 返回主题域
- //
- // ) : undefined,
- }}
onChange={(menuKey: string) => {
onMenuChange?.(menuKey);
}}
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx
index 0909f57a8..f5de02521 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/MetricInfoCreateForm.tsx
@@ -455,7 +455,7 @@ const MetricInfoCreateForm: React.FC = ({
forceRender
width={1300}
style={{ top: 48 }}
- bodyStyle={{ padding: '32px 40px 48px' }}
+ styles={{ padding: '32px 40px 48px' }}
destroyOnClose
title={`${isEdit ? '编辑' : '新建'}指标`}
maskClosable={false}
diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelCreateFormModal.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelCreateFormModal.tsx
index 7e225ebf5..1ec5a81b9 100644
--- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelCreateFormModal.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/ModelCreateFormModal.tsx
@@ -96,7 +96,7 @@ const ModelCreateFormModal: React.FC = (props) => {
return (
= ({ domainManger }) => {
>
编辑
- {/* {
- setPermissonData(record);
- setDimensionModalVisible(true);
- }}
- >
- 维度授权
-
- {
- setPermissonData(record);
- setMetricModalVisible(true);
- }}
- >
- 指标授权
- */}
= (props) => {
return (
{
+ const { id, state } = data;
+ if (state) {
+ return request(`${process.env.API_BASE_URL}collect/createCollectionIndicators`, {
+ method: 'POST',
+ data: { id },
+ });
+ } else {
+ return request(`${process.env.API_BASE_URL}collect/deleteCollectionIndicators/${id}`, {
+ method: 'DELETE',
+ });
+ }
+}
diff --git a/webapp/packages/supersonic-fe/src/pages/System/index.tsx b/webapp/packages/supersonic-fe/src/pages/System/index.tsx
index 6fbd8a604..69d9cdbc9 100644
--- a/webapp/packages/supersonic-fe/src/pages/System/index.tsx
+++ b/webapp/packages/supersonic-fe/src/pages/System/index.tsx
@@ -1,16 +1,34 @@
import styles from './style.less';
-import { Button, Form, Input, InputNumber, message, Space, Switch, Divider } from 'antd';
+import {
+ Button,
+ Form,
+ Input,
+ InputNumber,
+ message,
+ Space,
+ Switch,
+ Select,
+ Divider,
+ Anchor,
+ Row,
+ Col,
+} from 'antd';
import React, { useState, useEffect } from 'react';
import { getSystemConfig, saveSystemConfig } from '@/services/user';
import ProCard from '@ant-design/pro-card';
import SelectTMEPerson from '@/components/SelectTMEPerson';
import { SystemConfigParametersItem, SystemConfig } from './types';
+import { groupBy } from 'lodash';
const FormItem = Form.Item;
const { TextArea } = Input;
const System: React.FC = () => {
- const [systemConfig, setSystemConfig] = useState([]);
-
+ const [systemConfig, setSystemConfig] = useState>(
+ {},
+ );
+ const [anchorItems, setAnchorItems] = useState<{ key: string; href: string; title: string }[]>(
+ [],
+ );
const [configSource, setConfigSource] = useState();
useEffect(() => {
@@ -21,7 +39,16 @@ const System: React.FC = () => {
const { code, data, msg } = await getSystemConfig();
if (code === 200) {
const { parameters, admins } = data;
- setSystemConfig(parameters);
+ const groupByConfig = groupBy(parameters, 'module');
+ const anchor = Object.keys(groupByConfig).map((key: string) => {
+ return {
+ key,
+ href: `#${key}`,
+ title: key,
+ };
+ });
+ setAnchorItems(anchor);
+ setSystemConfig(groupByConfig);
setInitData(admins, parameters);
setConfigSource(data);
} else {
@@ -29,8 +56,8 @@ const System: React.FC = () => {
}
};
- const setInitData = (admins: string[], systemConfig: SystemConfigParametersItem[]) => {
- const fieldsValue = systemConfig.reduce(
+ const setInitData = (admins: string[], systemConfigParameters: SystemConfigParametersItem[]) => {
+ const fieldsValue = systemConfigParameters.reduce(
(fields, item) => {
const { name, value } = item;
return {
@@ -48,7 +75,7 @@ const System: React.FC = () => {
const { code, msg } = await saveSystemConfig({
...configSource,
admins: submitData.admins,
- parameters: systemConfig.map((item) => {
+ parameters: configSource!.parameters.map((item) => {
const { name } = item;
if (submitData[name] !== undefined) {
return {
@@ -68,68 +95,99 @@ const System: React.FC = () => {
return (
<>
-
-
- {
- querySaveSystemConfig();
- }}
- >
- 保 存
-
-
- }
- >
-