From 5bd8f7c93ec32d748f6e0bccc9dde956c5ed860d Mon Sep 17 00:00:00 2001 From: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com> Date: Sun, 29 Aug 2021 13:36:17 +0200 Subject: [PATCH] :sparkles: Implement design system (#2050) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * split up main, sass imports, import new nds * migrate most buttons * update sizes based on feedback * update copy buttons * update executions list * fix issues * force message box buttons * update warning color * update more buttons * wrap message box buttons * update last component * lint fixes * add build report step * breakout imports * set package.json * fix notification bug * clean up imports * use build directories directly * update imports * remove xl size * update number inputs * fix input width * update line height, fix icon bug * fix up editor * fix spacing between buttons * Reset line height * revert changes to this * revert changes * clean up button sizes * change to outline * update select height * update tooltip * remove build report step * clean up impl * remove regenerator runtime * add design system repo * apply editorconfig * apply editor config prettier * lint issue * switch to tabs * switch to single space * update eslintrc * remove git modules * update sass package * support dart sass * add build * update dependency * update contributing.md * set repo * update versions * add tslint step * update spacing to spaces, add dev step * add test step * add test step * update browser lint rc * remove .github * delete .gitignore * set comment for icons * remove preview link * update button interface * update types * set types * clean up intro * update intro * remove assets * move into preview * remove headline comment * reduce theme build * loading executions * match deps versions * match deps versions * fix lint issues * fix lint issues * update callback * disable codacy for docs.css * fix storybook issues * add design system to docker image * update spacing around delete sort button * set line height to stop juggling headline * update sizes * clean up vars * fix scss issues * update button vars * add shade color * fix button without click * fix buttons bug * fix bug with executions list * clean up theme * update link styling * fix typo * run prettier * :art: code format * :art: code format * 🔥 remove empty files * :sparkles: N8n 2284 new inputs (#2075) * implement inputs * prettier fixes * revert unnessary change * move input components and tooltip * remove form elements * move select * update input placements * update sizes * update credentails * clean up select size * fix caret issue * update inputs * clean up select * fix tags dropdown border * clean up tags input * fix workflow name bug * clean up select here * add sizes template * fix option caret * fix input sizes * update date input size * remove tags input override * update prop * update input size * center run data inputs * update disabled colors * update execution header * update scrollbar * update text area spacing * fix items in header * update run data tooltip * remove popover * update prefix positions * add filterable demo * address design issues * fix input issues, flip boolean input to text * update input sufffix colors * remove override * speed up switch, fix toggle spacing issue * update icon * remove icon classes * clean up inputs * clean up inputs with icons * update input spacing again * update suffix position * build * Add support for xlarge inputs * fix input issues * fix input issue * update listeners * update number inputs for settings * update append/prepend spacing * clean up inputs, set expression input as text * fix type errors * fix workflow number input * fix tags dropdown bug * fix bugs * fix menu item bug * remove font weight from link element * remove default * fix select option * fix contrast issues * allow overflow x for multi selects * fix icon * update options select * fix issue that resolves expression to null * update how actions are centered * fix up selects * update selects to support limiting size * update option styles * :zap: Apply suggestions BHesseldieck Co-authored-by: Ben Hesseldieck <1849459+BHesseldieck@users.noreply.github.com> * :art: code format Co-authored-by: Jan Co-authored-by: Ben Hesseldieck <1849459+BHesseldieck@users.noreply.github.com> Co-authored-by: Ben Hesseldieck * ⏪ Revert "🔥 remove empty files" This reverts commit e91ace4e52403f4a6b00b7be68b86fc48b7d8fef. * :zap: Remove private from n8n-design-system package * :art: Change to spaces to stay consistent with editorconfig & others package files * :zap: Fix year in license Co-authored-by: Ben Hesseldieck <1849459+BHesseldieck@users.noreply.github.com> Co-authored-by: Ben Hesseldieck Co-authored-by: Jan Co-authored-by: Jan Oberhauser --- CONTRIBUTING.md | 1 + docker/images/n8n-custom/Dockerfile | 1 + packages/design-system/.browserslistrc | 3 + packages/design-system/.editorconfig | 15 + packages/design-system/.eslintrc.js | 19 + packages/design-system/.npmignore | 26 + .../.storybook/font-awesome-icons.js | 169 ++ packages/design-system/.storybook/fonts.scss | 1 + packages/design-system/.storybook/main.js | 38 + packages/design-system/.storybook/preview.js | 65 + .../design-system/.storybook/storybook.scss | 12 + packages/design-system/LICENSE.md | 228 ++ packages/design-system/README.md | 45 + packages/design-system/babel.config.js | 6 + packages/design-system/gulpfile.js | 36 + packages/design-system/jest.config.js | 3 + packages/design-system/package.json | 81 + .../components/N8nButton/Button.stories.js | 122 + .../src/components/N8nButton/Button.vue | 299 +++ .../src/components/N8nButton/index.d.ts | 46 + .../src/components/N8nButton/index.js | 3 + .../src/components/N8nIcon/Icon.stories.js | 45 + .../src/components/N8nIcon/Icon.vue | 56 + .../src/components/N8nIcon/index.d.ts | 13 + .../src/components/N8nIcon/index.js | 3 + .../N8nIconButton/IconButton.stories.js | 98 + .../components/N8nIconButton/IconButton.vue | 60 + .../src/components/N8nIconButton/index.d.ts | 29 + .../src/components/N8nIconButton/index.js | 3 + .../src/components/N8nInput/Input.stories.js | 122 + .../src/components/N8nInput/Input.vue | 92 + .../src/components/N8nInput/index.js | 3 + .../N8nInputLabel/InputLabel.stories.js | 27 + .../components/N8nInputLabel/InputLabel.vue | 57 + .../src/components/N8nInputLabel/index.js | 3 + .../N8nInputNumber/InputNumber.stories.js | 94 + .../components/N8nInputNumber/InputNumber.vue | 7 + .../src/components/N8nInputNumber/index.js | 3 + .../src/components/N8nOption/Option.vue | 7 + .../src/components/N8nOption/index.js | 3 + .../components/N8nSelect/Select.stories.js | 138 + .../src/components/N8nSelect/Select.vue | 124 + .../src/components/N8nSelect/index.js | 3 + .../components/N8nSpinner/Spinner.stories.js | 24 + .../src/components/N8nSpinner/Spinner.vue | 27 + .../src/components/N8nSpinner/index.d.ts | 7 + .../src/components/N8nSpinner/index.js | 3 + .../components/N8nTooltip/Tooltip.stories.js | 49 + .../src/components/N8nTooltip/Tooltip.vue | 7 + .../src/components/N8nTooltip/index.js | 3 + .../src/components/component.d.ts | 10 + .../design-system/src/components/index.d.ts | 1 + .../design-system/src/components/index.js | 23 + .../src/docs/Introduction.stories.mdx | 5 + packages/design-system/src/main.d.ts | 1 + packages/design-system/src/main.js | 10 + .../design-system/src/shims-element-ui.d.ts | 7 + packages/design-system/src/shims-tsx.d.ts | 13 + packages/design-system/src/shims-vue.d.ts | 4 + .../src/styleguide/ColorCircles.vue | 129 + .../design-system/src/styleguide/Sizes.vue | 83 + .../src/styleguide/TextClasses.vue | 49 + .../src/styleguide/VariableTable.vue | 80 + .../src/styleguide/border.stories.mdx | 49 + .../src/styleguide/colors.stories.mdx | 131 + .../src/styleguide/fonts.stories.mdx | 59 + .../src/styleguide/spacing.stories.mdx | 26 + .../src/styleguide/text.stories.mdx | 38 + .../design-system/theme/preview/docs.min.css | 2373 +++++++++++++++++ .../design-system/theme/preview/index.html | 1525 +++++++++++ .../design-system/theme/src/_tokens.dark.scss | 260 ++ packages/design-system/theme/src/_tokens.scss | 307 +++ packages/design-system/theme/src/alert.scss | 147 + packages/design-system/theme/src/aside.scss | 7 + .../design-system/theme/src/autocomplete.scss | 80 + packages/design-system/theme/src/avatar.scss | 51 + packages/design-system/theme/src/backtop.scss | 22 + packages/design-system/theme/src/badge.scss | 58 + packages/design-system/theme/src/base.scss | 3 + .../theme/src/breadcrumb-item.scss | 0 .../design-system/theme/src/breadcrumb.scss | 57 + .../design-system/theme/src/button-group.scss | 84 + packages/design-system/theme/src/button.scss | 107 + .../design-system/theme/src/calendar.scss | 79 + packages/design-system/theme/src/card.scss | 32 + .../theme/src/carousel-item.scss | 50 + .../design-system/theme/src/carousel.scss | 164 ++ .../theme/src/cascader-panel.scss | 121 + .../design-system/theme/src/cascader.scss | 183 ++ .../theme/src/checkbox-button.scss | 0 .../theme/src/checkbox-group.scss | 0 .../design-system/theme/src/checkbox.scss | 380 +++ packages/design-system/theme/src/col.scss | 158 ++ .../theme/src/collapse-item.scss | 0 .../design-system/theme/src/collapse.scss | 63 + .../design-system/theme/src/color-picker.scss | 382 +++ .../design-system/theme/src/common/popup.scss | 42 + .../theme/src/common/transition.scss | 102 + .../theme/src/common/typography.scss | 66 + .../design-system/theme/src/common/var.scss | 1191 +++++++++ .../design-system/theme/src/container.scss | 14 + .../design-system/theme/src/date-picker.scss | 12 + .../theme/src/date-picker/date-picker.scss | 97 + .../src/date-picker/date-range-picker.scss | 101 + .../theme/src/date-picker/date-table.scss | 151 ++ .../theme/src/date-picker/month-table.scss | 83 + .../theme/src/date-picker/picker-panel.scss | 128 + .../theme/src/date-picker/picker.scss | 198 ++ .../theme/src/date-picker/time-picker.scss | 87 + .../src/date-picker/time-range-picker.scss | 32 + .../theme/src/date-picker/time-spinner.scss | 110 + .../theme/src/date-picker/year-table.scss | 52 + packages/design-system/theme/src/dialog.scss | 124 + packages/design-system/theme/src/display.scss | 12 + packages/design-system/theme/src/divider.scss | 47 + packages/design-system/theme/src/drawer.scss | 217 ++ .../theme/src/dropdown-item.scss | 0 .../theme/src/dropdown-menu.scss | 0 .../design-system/theme/src/dropdown.scss | 185 ++ .../theme/src/fonts/element-icons.ttf | Bin 0 -> 55956 bytes .../theme/src/fonts/element-icons.woff | Bin 0 -> 28200 bytes packages/design-system/theme/src/footer.scss | 8 + .../design-system/theme/src/form-item.scss | 0 packages/design-system/theme/src/form.scss | 168 ++ packages/design-system/theme/src/header.scss | 8 + packages/design-system/theme/src/icon.scss | 1169 ++++++++ packages/design-system/theme/src/image.scss | 176 ++ packages/design-system/theme/src/index.scss | 83 + .../theme/src/infinite-scroll.scss | 0 .../theme/src/infiniteScroll.scss | 0 .../design-system/theme/src/input-number.scss | 181 ++ packages/design-system/theme/src/input.scss | 356 +++ packages/design-system/theme/src/link.scss | 80 + packages/design-system/theme/src/loading.scss | 96 + packages/design-system/theme/src/main.scss | 12 + .../theme/src/menu-item-group.scss | 0 .../design-system/theme/src/menu-item.scss | 0 packages/design-system/theme/src/menu.scss | 289 ++ .../design-system/theme/src/message-box.scss | 237 ++ packages/design-system/theme/src/message.scss | 120 + .../theme/src/mixins/_button.scss | 170 ++ .../theme/src/mixins/config.scss | 4 + .../theme/src/mixins/function.scss | 54 + .../theme/src/mixins/mixins.scss | 209 ++ .../design-system/theme/src/mixins/utils.scss | 39 + .../design-system/theme/src/notification.scss | 100 + .../design-system/theme/src/option-group.scss | 42 + packages/design-system/theme/src/option.scss | 40 + .../design-system/theme/src/page-header.scss | 41 + .../design-system/theme/src/pagination.scss | 296 ++ .../design-system/theme/src/popconfirm.scss | 16 + packages/design-system/theme/src/popover.scss | 42 + packages/design-system/theme/src/popper.scss | 101 + .../design-system/theme/src/progress.scss | 140 + .../design-system/theme/src/radio-button.scss | 134 + .../design-system/theme/src/radio-group.scss | 9 + packages/design-system/theme/src/radio.scss | 200 ++ packages/design-system/theme/src/rate.scss | 50 + packages/design-system/theme/src/reset.scss | 241 ++ packages/design-system/theme/src/row.scss | 37 + .../design-system/theme/src/scrollbar.scss | 72 + .../theme/src/select-dropdown.scss | 59 + packages/design-system/theme/src/select.scss | 158 ++ packages/design-system/theme/src/slider.scss | 246 ++ packages/design-system/theme/src/spinner.scss | 43 + packages/design-system/theme/src/step.scss | 316 +++ packages/design-system/theme/src/steps.scss | 21 + packages/design-system/theme/src/submenu.scss | 0 packages/design-system/theme/src/switch.scss | 116 + .../design-system/theme/src/tab-pane.scss | 0 .../design-system/theme/src/table-column.scss | 97 + packages/design-system/theme/src/table.scss | 572 ++++ packages/design-system/theme/src/tabs.scss | 606 +++++ packages/design-system/theme/src/tag.scss | 163 ++ .../design-system/theme/src/time-picker.scss | 8 + .../design-system/theme/src/time-select.scss | 37 + .../theme/src/timeline-item.scss | 86 + .../design-system/theme/src/timeline.scss | 14 + packages/design-system/theme/src/tooltip.scss | 147 + .../design-system/theme/src/transfer.scss | 229 ++ packages/design-system/theme/src/tree.scss | 124 + packages/design-system/theme/src/upload.scss | 609 +++++ packages/design-system/tsconfig.json | 29 + packages/design-system/tslint.json | 80 + packages/editor-ui/package.json | 35 +- packages/editor-ui/src/components/About.vue | 4 +- .../src/components/BinaryDataDisplay.vue | 14 +- .../src/components/CollectionParameter.vue | 34 +- .../src/components/CredentialsEdit.vue | 15 +- .../src/components/CredentialsInput.vue | 62 +- .../src/components/CredentialsList.vue | 29 +- .../components/DuplicateWorkflowDialog.vue | 16 +- .../src/components/Error/NodeViewError.vue | 7 +- .../src/components/ExecutionsList.vue | 105 +- .../ExpandableInput/ExpandableInputBase.vue | 7 +- .../ExpandableInput/ExpandableInputEdit.vue | 6 - .../src/components/ExpressionEdit.vue | 3 + .../components/FixedCollectionParameter.vue | 32 +- .../ExecutionDetails/ExecutionDetails.vue | 4 +- .../MainHeader/ExecutionDetails/ReadOnly.vue | 6 +- .../src/components/MainHeader/MainHeader.vue | 4 - .../editor-ui/src/components/MainSidebar.vue | 4 +- packages/editor-ui/src/components/Modal.vue | 7 +- .../src/components/MultipleParameter.vue | 14 +- packages/editor-ui/src/components/Node.vue | 14 +- .../src/components/NodeCreator/MainPanel.vue | 8 +- .../components/NodeCreator/NodeCreator.vue | 2 +- .../src/components/NodeCredentials.vue | 51 +- .../editor-ui/src/components/NodeSettings.vue | 84 +- .../editor-ui/src/components/NodeWebhooks.vue | 5 +- .../src/components/ParameterInput.vue | 333 ++- .../src/components/ParameterInputFull.vue | 23 +- .../src/components/ParameterInputList.vue | 12 +- .../src/components/PushConnectionTracker.vue | 4 +- packages/editor-ui/src/components/RunData.vue | 156 +- .../src/components/SaveWorkflowButton.vue | 46 +- .../editor-ui/src/components/TagsDropdown.vue | 49 +- .../src/components/TagsManager/NoTagsView.vue | 4 +- .../components/TagsManager/TagsManager.vue | 2 +- .../TagsManager/TagsView/TagsTable.vue | 45 +- .../TagsManager/TagsView/TagsTableHeader.vue | 17 +- .../editor-ui/src/components/TextEdit.vue | 2 +- .../src/components/VariableSelector.vue | 2 +- .../src/components/VariableSelectorItem.vue | 2 +- .../src/components/WarningTooltip.vue | 6 +- .../src/components/WorkflowActivator.vue | 6 +- .../editor-ui/src/components/WorkflowOpen.vue | 6 +- .../src/components/WorkflowSettings.vue | 121 +- .../src/components/mixins/emitter.ts | 4 +- .../src/components/mixins/genericHelpers.ts | 1 + .../src/components/mixins/showMessage.ts | 5 +- .../src/components/mixins/workflowHelpers.ts | 3 +- packages/editor-ui/src/main.ts | 187 +- .../editor-ui/src/n8n-theme-variables.scss | 13 - packages/editor-ui/src/n8n-theme.scss | 250 +- packages/editor-ui/src/plugins/compontents.ts | 158 ++ packages/editor-ui/src/plugins/directives.ts | 8 + packages/editor-ui/src/plugins/icons.ts | 172 ++ packages/editor-ui/src/plugins/index.ts | 3 + packages/editor-ui/src/views/NodeView.vue | 87 +- 240 files changed, 22656 insertions(+), 1214 deletions(-) create mode 100644 packages/design-system/.browserslistrc create mode 100644 packages/design-system/.editorconfig create mode 100644 packages/design-system/.eslintrc.js create mode 100644 packages/design-system/.npmignore create mode 100644 packages/design-system/.storybook/font-awesome-icons.js create mode 100644 packages/design-system/.storybook/fonts.scss create mode 100644 packages/design-system/.storybook/main.js create mode 100644 packages/design-system/.storybook/preview.js create mode 100644 packages/design-system/.storybook/storybook.scss create mode 100644 packages/design-system/LICENSE.md create mode 100644 packages/design-system/README.md create mode 100644 packages/design-system/babel.config.js create mode 100644 packages/design-system/gulpfile.js create mode 100644 packages/design-system/jest.config.js create mode 100644 packages/design-system/package.json create mode 100644 packages/design-system/src/components/N8nButton/Button.stories.js create mode 100644 packages/design-system/src/components/N8nButton/Button.vue create mode 100644 packages/design-system/src/components/N8nButton/index.d.ts create mode 100644 packages/design-system/src/components/N8nButton/index.js create mode 100644 packages/design-system/src/components/N8nIcon/Icon.stories.js create mode 100644 packages/design-system/src/components/N8nIcon/Icon.vue create mode 100644 packages/design-system/src/components/N8nIcon/index.d.ts create mode 100644 packages/design-system/src/components/N8nIcon/index.js create mode 100644 packages/design-system/src/components/N8nIconButton/IconButton.stories.js create mode 100644 packages/design-system/src/components/N8nIconButton/IconButton.vue create mode 100644 packages/design-system/src/components/N8nIconButton/index.d.ts create mode 100644 packages/design-system/src/components/N8nIconButton/index.js create mode 100644 packages/design-system/src/components/N8nInput/Input.stories.js create mode 100644 packages/design-system/src/components/N8nInput/Input.vue create mode 100644 packages/design-system/src/components/N8nInput/index.js create mode 100644 packages/design-system/src/components/N8nInputLabel/InputLabel.stories.js create mode 100644 packages/design-system/src/components/N8nInputLabel/InputLabel.vue create mode 100644 packages/design-system/src/components/N8nInputLabel/index.js create mode 100644 packages/design-system/src/components/N8nInputNumber/InputNumber.stories.js create mode 100644 packages/design-system/src/components/N8nInputNumber/InputNumber.vue create mode 100644 packages/design-system/src/components/N8nInputNumber/index.js create mode 100644 packages/design-system/src/components/N8nOption/Option.vue create mode 100644 packages/design-system/src/components/N8nOption/index.js create mode 100644 packages/design-system/src/components/N8nSelect/Select.stories.js create mode 100644 packages/design-system/src/components/N8nSelect/Select.vue create mode 100644 packages/design-system/src/components/N8nSelect/index.js create mode 100644 packages/design-system/src/components/N8nSpinner/Spinner.stories.js create mode 100644 packages/design-system/src/components/N8nSpinner/Spinner.vue create mode 100644 packages/design-system/src/components/N8nSpinner/index.d.ts create mode 100644 packages/design-system/src/components/N8nSpinner/index.js create mode 100644 packages/design-system/src/components/N8nTooltip/Tooltip.stories.js create mode 100644 packages/design-system/src/components/N8nTooltip/Tooltip.vue create mode 100644 packages/design-system/src/components/N8nTooltip/index.js create mode 100644 packages/design-system/src/components/component.d.ts create mode 100644 packages/design-system/src/components/index.d.ts create mode 100644 packages/design-system/src/components/index.js create mode 100644 packages/design-system/src/docs/Introduction.stories.mdx create mode 100644 packages/design-system/src/main.d.ts create mode 100644 packages/design-system/src/main.js create mode 100644 packages/design-system/src/shims-element-ui.d.ts create mode 100644 packages/design-system/src/shims-tsx.d.ts create mode 100644 packages/design-system/src/shims-vue.d.ts create mode 100644 packages/design-system/src/styleguide/ColorCircles.vue create mode 100644 packages/design-system/src/styleguide/Sizes.vue create mode 100644 packages/design-system/src/styleguide/TextClasses.vue create mode 100644 packages/design-system/src/styleguide/VariableTable.vue create mode 100644 packages/design-system/src/styleguide/border.stories.mdx create mode 100644 packages/design-system/src/styleguide/colors.stories.mdx create mode 100644 packages/design-system/src/styleguide/fonts.stories.mdx create mode 100644 packages/design-system/src/styleguide/spacing.stories.mdx create mode 100644 packages/design-system/src/styleguide/text.stories.mdx create mode 100644 packages/design-system/theme/preview/docs.min.css create mode 100644 packages/design-system/theme/preview/index.html create mode 100644 packages/design-system/theme/src/_tokens.dark.scss create mode 100644 packages/design-system/theme/src/_tokens.scss create mode 100644 packages/design-system/theme/src/alert.scss create mode 100644 packages/design-system/theme/src/aside.scss create mode 100644 packages/design-system/theme/src/autocomplete.scss create mode 100644 packages/design-system/theme/src/avatar.scss create mode 100644 packages/design-system/theme/src/backtop.scss create mode 100644 packages/design-system/theme/src/badge.scss create mode 100644 packages/design-system/theme/src/base.scss create mode 100644 packages/design-system/theme/src/breadcrumb-item.scss create mode 100644 packages/design-system/theme/src/breadcrumb.scss create mode 100644 packages/design-system/theme/src/button-group.scss create mode 100644 packages/design-system/theme/src/button.scss create mode 100644 packages/design-system/theme/src/calendar.scss create mode 100644 packages/design-system/theme/src/card.scss create mode 100644 packages/design-system/theme/src/carousel-item.scss create mode 100644 packages/design-system/theme/src/carousel.scss create mode 100644 packages/design-system/theme/src/cascader-panel.scss create mode 100644 packages/design-system/theme/src/cascader.scss create mode 100644 packages/design-system/theme/src/checkbox-button.scss create mode 100644 packages/design-system/theme/src/checkbox-group.scss create mode 100644 packages/design-system/theme/src/checkbox.scss create mode 100644 packages/design-system/theme/src/col.scss create mode 100644 packages/design-system/theme/src/collapse-item.scss create mode 100644 packages/design-system/theme/src/collapse.scss create mode 100644 packages/design-system/theme/src/color-picker.scss create mode 100644 packages/design-system/theme/src/common/popup.scss create mode 100644 packages/design-system/theme/src/common/transition.scss create mode 100644 packages/design-system/theme/src/common/typography.scss create mode 100644 packages/design-system/theme/src/common/var.scss create mode 100644 packages/design-system/theme/src/container.scss create mode 100644 packages/design-system/theme/src/date-picker.scss create mode 100644 packages/design-system/theme/src/date-picker/date-picker.scss create mode 100644 packages/design-system/theme/src/date-picker/date-range-picker.scss create mode 100644 packages/design-system/theme/src/date-picker/date-table.scss create mode 100644 packages/design-system/theme/src/date-picker/month-table.scss create mode 100644 packages/design-system/theme/src/date-picker/picker-panel.scss create mode 100644 packages/design-system/theme/src/date-picker/picker.scss create mode 100644 packages/design-system/theme/src/date-picker/time-picker.scss create mode 100644 packages/design-system/theme/src/date-picker/time-range-picker.scss create mode 100644 packages/design-system/theme/src/date-picker/time-spinner.scss create mode 100644 packages/design-system/theme/src/date-picker/year-table.scss create mode 100644 packages/design-system/theme/src/dialog.scss create mode 100644 packages/design-system/theme/src/display.scss create mode 100644 packages/design-system/theme/src/divider.scss create mode 100644 packages/design-system/theme/src/drawer.scss create mode 100644 packages/design-system/theme/src/dropdown-item.scss create mode 100644 packages/design-system/theme/src/dropdown-menu.scss create mode 100644 packages/design-system/theme/src/dropdown.scss create mode 100644 packages/design-system/theme/src/fonts/element-icons.ttf create mode 100644 packages/design-system/theme/src/fonts/element-icons.woff create mode 100644 packages/design-system/theme/src/footer.scss create mode 100644 packages/design-system/theme/src/form-item.scss create mode 100644 packages/design-system/theme/src/form.scss create mode 100644 packages/design-system/theme/src/header.scss create mode 100644 packages/design-system/theme/src/icon.scss create mode 100644 packages/design-system/theme/src/image.scss create mode 100644 packages/design-system/theme/src/index.scss create mode 100644 packages/design-system/theme/src/infinite-scroll.scss create mode 100644 packages/design-system/theme/src/infiniteScroll.scss create mode 100644 packages/design-system/theme/src/input-number.scss create mode 100644 packages/design-system/theme/src/input.scss create mode 100644 packages/design-system/theme/src/link.scss create mode 100644 packages/design-system/theme/src/loading.scss create mode 100644 packages/design-system/theme/src/main.scss create mode 100644 packages/design-system/theme/src/menu-item-group.scss create mode 100644 packages/design-system/theme/src/menu-item.scss create mode 100644 packages/design-system/theme/src/menu.scss create mode 100644 packages/design-system/theme/src/message-box.scss create mode 100644 packages/design-system/theme/src/message.scss create mode 100644 packages/design-system/theme/src/mixins/_button.scss create mode 100644 packages/design-system/theme/src/mixins/config.scss create mode 100644 packages/design-system/theme/src/mixins/function.scss create mode 100644 packages/design-system/theme/src/mixins/mixins.scss create mode 100644 packages/design-system/theme/src/mixins/utils.scss create mode 100644 packages/design-system/theme/src/notification.scss create mode 100644 packages/design-system/theme/src/option-group.scss create mode 100644 packages/design-system/theme/src/option.scss create mode 100644 packages/design-system/theme/src/page-header.scss create mode 100644 packages/design-system/theme/src/pagination.scss create mode 100644 packages/design-system/theme/src/popconfirm.scss create mode 100644 packages/design-system/theme/src/popover.scss create mode 100644 packages/design-system/theme/src/popper.scss create mode 100644 packages/design-system/theme/src/progress.scss create mode 100644 packages/design-system/theme/src/radio-button.scss create mode 100644 packages/design-system/theme/src/radio-group.scss create mode 100644 packages/design-system/theme/src/radio.scss create mode 100644 packages/design-system/theme/src/rate.scss create mode 100644 packages/design-system/theme/src/reset.scss create mode 100644 packages/design-system/theme/src/row.scss create mode 100644 packages/design-system/theme/src/scrollbar.scss create mode 100644 packages/design-system/theme/src/select-dropdown.scss create mode 100644 packages/design-system/theme/src/select.scss create mode 100644 packages/design-system/theme/src/slider.scss create mode 100644 packages/design-system/theme/src/spinner.scss create mode 100644 packages/design-system/theme/src/step.scss create mode 100644 packages/design-system/theme/src/steps.scss create mode 100644 packages/design-system/theme/src/submenu.scss create mode 100644 packages/design-system/theme/src/switch.scss create mode 100644 packages/design-system/theme/src/tab-pane.scss create mode 100644 packages/design-system/theme/src/table-column.scss create mode 100644 packages/design-system/theme/src/table.scss create mode 100644 packages/design-system/theme/src/tabs.scss create mode 100644 packages/design-system/theme/src/tag.scss create mode 100644 packages/design-system/theme/src/time-picker.scss create mode 100644 packages/design-system/theme/src/time-select.scss create mode 100644 packages/design-system/theme/src/timeline-item.scss create mode 100644 packages/design-system/theme/src/timeline.scss create mode 100644 packages/design-system/theme/src/tooltip.scss create mode 100644 packages/design-system/theme/src/transfer.scss create mode 100644 packages/design-system/theme/src/tree.scss create mode 100644 packages/design-system/theme/src/upload.scss create mode 100644 packages/design-system/tsconfig.json create mode 100644 packages/design-system/tslint.json create mode 100644 packages/editor-ui/src/plugins/compontents.ts create mode 100644 packages/editor-ui/src/plugins/directives.ts create mode 100644 packages/editor-ui/src/plugins/icons.ts create mode 100644 packages/editor-ui/src/plugins/index.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 830a3b6ae5..286cf7a98e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,6 +37,7 @@ The most important directories: - [/packages/core](/packages/core) - Core code which handles workflow execution, active webhooks and workflows + - [/packages/design-system](/packages/design-system) - Vue frontend components - [/packages/editor-ui](/packages/editor-ui) - Vue frontend workflow editor - [/packages/node-dev](/packages/node-dev) - CLI to create new n8n-nodes - [/packages/nodes-base](/packages/nodes-base) - Base n8n nodes diff --git a/docker/images/n8n-custom/Dockerfile b/docker/images/n8n-custom/Dockerfile index 9136e15b17..8b39df673f 100644 --- a/docker/images/n8n-custom/Dockerfile +++ b/docker/images/n8n-custom/Dockerfile @@ -14,6 +14,7 @@ COPY lerna.json . COPY package.json . COPY packages/cli/ ./packages/cli/ COPY packages/core/ ./packages/core/ +COPY packages/design-system/ ./packages/design-system/ COPY packages/editor-ui/ ./packages/editor-ui/ COPY packages/nodes-base/ ./packages/nodes-base/ COPY packages/workflow/ ./packages/workflow/ diff --git a/packages/design-system/.browserslistrc b/packages/design-system/.browserslistrc new file mode 100644 index 0000000000..9dee646463 --- /dev/null +++ b/packages/design-system/.browserslistrc @@ -0,0 +1,3 @@ +> 1% +last 2 versions +not ie <= 8 diff --git a/packages/design-system/.editorconfig b/packages/design-system/.editorconfig new file mode 100644 index 0000000000..9e24325d41 --- /dev/null +++ b/packages/design-system/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +indent_style = tab +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[package.json] +indent_style = space +indent_size = 2 + +[*.ts] +quote_type = single diff --git a/packages/design-system/.eslintrc.js b/packages/design-system/.eslintrc.js new file mode 100644 index 0000000000..3d4832a690 --- /dev/null +++ b/packages/design-system/.eslintrc.js @@ -0,0 +1,19 @@ +module.exports = { + root: true, + env: { + node: true, + }, + extends: ['plugin:vue/essential', '@vue/typescript'], + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + semi: [2, 'always'], + indent: ['error', 'tab'], + 'comma-dangle': ['error', 'always-multiline'], + 'no-tabs': 0, + 'no-labels': 0, + }, + parserOptions: { + parser: '@typescript-eslint/parser', + }, +}; diff --git a/packages/design-system/.npmignore b/packages/design-system/.npmignore new file mode 100644 index 0000000000..15ceddfd7f --- /dev/null +++ b/packages/design-system/.npmignore @@ -0,0 +1,26 @@ +.DS_Store +storybook-static + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.md +*.stories.js +*.mdx diff --git a/packages/design-system/.storybook/font-awesome-icons.js b/packages/design-system/.storybook/font-awesome-icons.js new file mode 100644 index 0000000000..ca24a7f7a8 --- /dev/null +++ b/packages/design-system/.storybook/font-awesome-icons.js @@ -0,0 +1,169 @@ +/** + * These icons are only defined for storybook build + * Editor icons are defined seperately + */ +import { library } from '@fortawesome/fontawesome-svg-core'; +import { + faAngleDoubleLeft, + faAngleDown, + faAngleRight, + faAngleUp, + faArrowLeft, + faArrowRight, + faAt, + faBook, + faBug, + faCalendar, + faCheck, + faChevronDown, + faChevronUp, + faCode, + faCodeBranch, + faCog, + faCogs, + faClone, + faCloud, + faCloudDownloadAlt, + faCopy, + faCut, + faDotCircle, + faEdit, + faEnvelope, + faEye, + faExclamationTriangle, + faExpand, + faExternalLinkAlt, + faExchangeAlt, + faFile, + faFileArchive, + faFileCode, + faFileDownload, + faFileExport, + faFileImport, + faFilePdf, + faFolderOpen, + faGift, + faHdd, + faHome, + faHourglass, + faImage, + faInbox, + faInfo, + faInfoCircle, + faKey, + faMapSigns, + faNetworkWired, + faPause, + faPen, + faPlay, + faPlayCircle, + faPlus, + faPlusCircle, + faQuestion, + faQuestionCircle, + faRedo, + faRss, + faSave, + faSearch, + faSearchMinus, + faSearchPlus, + faServer, + faSignInAlt, + faSlidersH, + faSpinner, + faStop, + faSun, + faSync, + faSyncAlt, + faTable, + faTasks, + faTerminal, + faThLarge, + faTimes, + faTrash, + faUndo, + faUsers, + faClock, +} from '@fortawesome/free-solid-svg-icons'; +import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'; + +library.add(faAngleDoubleLeft); +library.add(faAngleDown); +library.add(faAngleRight); +library.add(faAngleUp); +library.add(faArrowLeft); +library.add(faArrowRight); +library.add(faAt); +library.add(faBook); +library.add(faBug); +library.add(faCalendar); +library.add(faCheck); +library.add(faChevronDown); +library.add(faChevronUp); +library.add(faCode); +library.add(faCodeBranch); +library.add(faCog); +library.add(faCogs); +library.add(faClone); +library.add(faCloud); +library.add(faCloudDownloadAlt); +library.add(faCopy); +library.add(faCut); +library.add(faDotCircle); +library.add(faEdit); +library.add(faEnvelope); +library.add(faEye); +library.add(faExclamationTriangle); +library.add(faExpand); +library.add(faExternalLinkAlt); +library.add(faExchangeAlt); +library.add(faFile); +library.add(faFileArchive); +library.add(faFileCode); +library.add(faFileDownload); +library.add(faFileExport); +library.add(faFileImport); +library.add(faFilePdf); +library.add(faFolderOpen); +library.add(faGift); +library.add(faHdd); +library.add(faHome); +library.add(faHourglass); +library.add(faImage); +library.add(faInbox); +library.add(faInfo); +library.add(faInfoCircle); +library.add(faKey); +library.add(faMapSigns); +library.add(faNetworkWired); +library.add(faPause); +library.add(faPen); +library.add(faPlay); +library.add(faPlayCircle); +library.add(faPlus); +library.add(faPlusCircle); +library.add(faQuestion); +library.add(faQuestionCircle); +library.add(faRedo); +library.add(faRss); +library.add(faSave); +library.add(faSearch); +library.add(faSearchMinus); +library.add(faSearchPlus); +library.add(faServer); +library.add(faSignInAlt); +library.add(faSlidersH); +library.add(faSpinner); +library.add(faStop); +library.add(faSun); +library.add(faSync); +library.add(faSyncAlt); +library.add(faTable); +library.add(faTasks); +library.add(faTerminal); +library.add(faThLarge); +library.add(faTimes); +library.add(faTrash); +library.add(faUndo); +library.add(faUsers); +library.add(faClock); diff --git a/packages/design-system/.storybook/fonts.scss b/packages/design-system/.storybook/fonts.scss new file mode 100644 index 0000000000..e6e5ab65d6 --- /dev/null +++ b/packages/design-system/.storybook/fonts.scss @@ -0,0 +1 @@ +@import url('https://fonts.googleapis.com/css?family=Open+Sans&display=swap'); diff --git a/packages/design-system/.storybook/main.js b/packages/design-system/.storybook/main.js new file mode 100644 index 0000000000..9cd8b91c03 --- /dev/null +++ b/packages/design-system/.storybook/main.js @@ -0,0 +1,38 @@ +const path = require('path'); + +module.exports = { + stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + 'storybook-addon-designs', + 'storybook-addon-themes', + ], + webpackFinal: async (config, { configType }) => { + config.module.rules.push({ + test: /\.scss$/, + oneOf: [ + { + resourceQuery: /module/, + use: [ + 'vue-style-loader', + { + loader: 'css-loader', + options: { + modules: true, + }, + }, + 'sass-loader', + ], + include: path.resolve(__dirname, '../'), + }, + { + use: ['vue-style-loader', 'css-loader', 'sass-loader'], + include: path.resolve(__dirname, '../'), + }, + ], + }); + + return config; + }, +}; diff --git a/packages/design-system/.storybook/preview.js b/packages/design-system/.storybook/preview.js new file mode 100644 index 0000000000..e914e03921 --- /dev/null +++ b/packages/design-system/.storybook/preview.js @@ -0,0 +1,65 @@ +import './font-awesome-icons'; +import './storybook.scss'; + +import lang from 'element-ui/lib/locale/lang/en'; +import locale from 'element-ui/lib/locale'; + +import Vue from 'vue'; + +locale.use(lang); + +// https://github.com/storybookjs/storybook/issues/6153 +Vue.prototype.toJSON = function () { + return this; +}; + +export const parameters = { + actions: { + argTypesRegex: '^on[A-Z].*', + }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, + backgrounds: { + default: '--color-background-xlight', + values: [ + { + name: '--color-background-dark', + value: 'var(--color-background-dark)', + }, + { + name: '--color-background-base', + value: 'var(--color-background-base)', + }, + { + name: '--color-background-light', + value: 'var(--color-background-light)', + }, + { + name: '--color-background-lighter', + value: 'var(--color-background-lighter)', + }, + { + name: '--color-background-xlight', + value: 'var(--color-background-xlight)', + }, + ], + }, + themes: { + list: [ + { + name: 'dark', + class: 'theme-dark', + color: '#000', + }, + ], + }, + options: { + storySort: { + order: ['Docs', 'Styleguide', 'Atoms'], + }, + }, +}; diff --git a/packages/design-system/.storybook/storybook.scss b/packages/design-system/.storybook/storybook.scss new file mode 100644 index 0000000000..604fe53985 --- /dev/null +++ b/packages/design-system/.storybook/storybook.scss @@ -0,0 +1,12 @@ +@use "./fonts.scss"; + +@use "~/theme/src/base.scss" with ( + $font-path: '~element-ui/lib/theme-chalk/fonts', +); + +@use "~/theme/src/reset.scss"; +@use "~/theme/src/index.scss"; + +.multi-container > * { + margin-bottom: 10px; +} diff --git a/packages/design-system/LICENSE.md b/packages/design-system/LICENSE.md new file mode 100644 index 0000000000..3c24ea75af --- /dev/null +++ b/packages/design-system/LICENSE.md @@ -0,0 +1,228 @@ +“Commons Clause” License Condition v1.0 + +The Software is provided to you by the Licensor under the +License, as defined below, subject to the following condition. + +Without limiting other conditions in the License, the grant +of rights under the License will not include, and the License +does not grant to you, the right to Sell the Software. + +For purposes of the foregoing, “Sell” means practicing any or +all of the rights granted to you under the License to provide +to third parties, for a fee or other consideration (including +without limitation fees for hosting or consulting/ support +services related to the Software), a product or service whose +value derives, entirely or substantially, from the functionality +of the Software. Any license notice or attribution required by +the License must also include this Commons Clause License +Condition notice. + +Software: n8n + +License: Apache 2.0 with Commons Clause + +Licensor: n8n GmbH + +--- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2021 n8n GmbH + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/packages/design-system/README.md b/packages/design-system/README.md new file mode 100644 index 0000000000..044b67facd --- /dev/null +++ b/packages/design-system/README.md @@ -0,0 +1,45 @@ +# n8n-design-system + +A component system for [n8n](https://n8n.io) using Storybook to preview. + +## Project setup + +``` +npm install +``` + +### Compiles and hot-reloads for development + +``` +npm run storybook +``` + +### Build static pages + +``` +npm run build:storybook +``` + +### Run your unit tests + +``` +npm run test:unit +``` + +### Lints and fixes files + +``` +npm run lint +``` + +### Build css files + +``` +npm run build:theme +``` + +### Monitor theme files and build any changes + +``` +npm run watch:theme +``` diff --git a/packages/design-system/babel.config.js b/packages/design-system/babel.config.js new file mode 100644 index 0000000000..7a1252c310 --- /dev/null +++ b/packages/design-system/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: ['@vue/cli-plugin-babel/preset'], + plugins: [ + ['@babel/plugin-proposal-private-property-in-object', { loose: true }], + ], +}; diff --git a/packages/design-system/gulpfile.js b/packages/design-system/gulpfile.js new file mode 100644 index 0000000000..b3da277cd9 --- /dev/null +++ b/packages/design-system/gulpfile.js @@ -0,0 +1,36 @@ +'use strict'; + +const gulp = require('gulp'); +const sass = require('gulp-dart-sass'); +const autoprefixer = require('gulp-autoprefixer'); +const cleanCSS = require('gulp-clean-css'); + +gulp.task('build:theme', gulp.series([compileTheme, copyThemeFonts])); + +gulp.task( + 'watch:theme', + gulp.series([ + 'build:theme', + () => { + gulp.watch('./theme/src/**/*.scss', gulp.series(['build:theme'])); + }, + ]), +); + +function compileTheme() { + return gulp + .src('./theme/src/index.scss') + .pipe(sass.sync()) + .pipe( + autoprefixer({ + browsers: ['ie > 9', 'last 2 versions'], + cascade: false, + }), + ) + .pipe(cleanCSS()) + .pipe(gulp.dest('./theme/dist')); +} + +function copyThemeFonts() { + return gulp.src('./theme/src/fonts/**').pipe(gulp.dest('./theme/dist/fonts')); +} diff --git a/packages/design-system/jest.config.js b/packages/design-system/jest.config.js new file mode 100644 index 0000000000..ce8dfc33cd --- /dev/null +++ b/packages/design-system/jest.config.js @@ -0,0 +1,3 @@ +module.exports = { + preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel', +}; diff --git a/packages/design-system/package.json b/packages/design-system/package.json new file mode 100644 index 0000000000..399ab82047 --- /dev/null +++ b/packages/design-system/package.json @@ -0,0 +1,81 @@ +{ + "name": "n8n-design-system", + "version": "0.1.0", + "license": "SEE LICENSE IN LICENSE.md", + "homepage": "https://n8n.io", + "author": { + "name": "Mutasem Aldmour", + "email": "mutasem@n8n.io" + }, + "main": "src/main.js", + "repository": { + "type": "git", + "url": "git+https://github.com/n8n-io/n8n.git" + }, + "scripts": { + "build": "npm run build:theme", + "build:vue": "vue-cli-service build --target lib ./src/main.js --report", + "dev": "npm run watch:theme", + "test": "npm run test:unit", + "build:storybook": "build-storybook", + "storybook": "start-storybook -p 6006", + "test:unit": "vue-cli-service test:unit --passWithNoTests", + "lint": "vue-cli-service lint", + "build:theme": "gulp build:theme", + "watch:theme": "gulp watch:theme", + "tslint": "tslint -p tsconfig.json -c tslint.json", + "tslintfix": "tslint --fix -p tsconfig.json -c tslint.json" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "1.x", + "@fortawesome/free-solid-svg-icons": "5.x", + "@fortawesome/vue-fontawesome": "2.x", + "core-js": "3.x", + "element-ui": "2.13.x" + }, + "devDependencies": { + "@fortawesome/fontawesome-svg-core": "^1.2.35", + "@fortawesome/free-solid-svg-icons": "^5.15.3", + "@fortawesome/vue-fontawesome": "^2.0.2", + "core-js": "^3.6.5", + "element-ui": "~2.13.0", + "storybook-addon-themes": "^6.1.0", + "vue": "^2.6.11", + "vue-class-component": "^7.2.3", + "vue-property-decorator": "^9.1.2", + "@babel/core": "^7.14.6", + "@storybook/addon-actions": "^6.3.6", + "@storybook/addon-essentials": "^6.3.6", + "@storybook/addon-links": "^6.3.6", + "@storybook/vue": "^6.3.6", + "@types/jest": "^26.0.13", + "@typescript-eslint/eslint-plugin": "^4.18.0", + "@typescript-eslint/parser": "^4.18.0", + "@vue/cli-plugin-babel": "~4.5.0", + "@vue/cli-plugin-eslint": "~4.5.0", + "@vue/cli-plugin-typescript": "~4.5.0", + "@vue/cli-plugin-unit-jest": "~4.5.0", + "@vue/cli-service": "~4.5.0", + "@vue/eslint-config-prettier": "^6.0.0", + "@vue/eslint-config-typescript": "^7.0.0", + "@vue/test-utils": "^1.0.3", + "babel-loader": "^8.2.2", + "eslint": "^6.8.0", + "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-vue": "^6.2.2", + "fibers": "^5.0.0", + "gulp": "^4.0.0", + "prettier": "^2.2.1", + "sass": "^1.26.5", + "sass-loader": "^8.0.2", + "storybook-addon-designs": "^6.0.1", + "typescript": "~3.9.7", + "vue-loader": "^15.9.7", + "vue-template-compiler": "^2.6.11", + "gulp-autoprefixer": "^4.0.0", + "gulp-clean-css": "^4.3.0", + "gulp-dart-sass": "^1.0.2", + "node-notifier": ">=8.0.1", + "trim": ">=0.0.3" + } +} diff --git a/packages/design-system/src/components/N8nButton/Button.stories.js b/packages/design-system/src/components/N8nButton/Button.stories.js new file mode 100644 index 0000000000..504ea1af38 --- /dev/null +++ b/packages/design-system/src/components/N8nButton/Button.stories.js @@ -0,0 +1,122 @@ +import N8nButton from './Button.vue'; +import { action } from '@storybook/addon-actions'; + +export default { + title: 'Atoms/Button', + component: N8nButton, + argTypes: { + label: { + control: 'text', + }, + title: { + control: 'text', + }, + type: { + control: 'select', + options: ['primary', 'outline', 'light', 'text'], + }, + size: { + control: { + type: 'select', + options: ['small', 'medium', 'large'], + }, + }, + loading: { + control: { + type: 'boolean', + }, + }, + icon: { + control: { + type: 'text', + }, + }, + iconSize: { + control: { + type: 'select', + options: ['small', 'medium', 'large'], + }, + }, + circle: { + control: { + type: 'boolean', + }, + }, + fullWidth: { + type: 'boolean', + }, + theme: { + type: 'select', + options: ['success', 'danger', 'warning'], + }, + float: { + type: 'select', + options: ['left', 'right'], + }, + }, + parameters: { + design: { + type: 'figma', + url: 'https://www.figma.com/file/DxLbnIyMK8X0uLkUguFV4n/n8n-design-system_v1?node-id=5%3A1147', + }, + }, +}; + +const methods = { + onClick: action('click'), +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nButton, + }, + template: '', + methods, +}); + +export const Button = Template.bind({}); +Button.args = { + label: 'Button', +}; + +const ManyTemplate = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nButton, + }, + template: + '
', + methods, +}); + +export const Primary = ManyTemplate.bind({}); +Primary.args = { + type: 'primary', + label: 'Button', +}; + +export const Outline = ManyTemplate.bind({}); +Outline.args = { + type: 'outline', + label: 'Button', +}; + +export const Light = ManyTemplate.bind({}); +Light.args = { + type: 'light', + label: 'Button', +}; + +export const WithIcon = ManyTemplate.bind({}); +WithIcon.args = { + label: 'Button', + icon: 'plus-circle', +}; + +export const Text = ManyTemplate.bind({}); +Text.args = { + type: 'text', + label: 'Button', + icon: 'plus-circle', +}; diff --git a/packages/design-system/src/components/N8nButton/Button.vue b/packages/design-system/src/components/N8nButton/Button.vue new file mode 100644 index 0000000000..fc10624442 --- /dev/null +++ b/packages/design-system/src/components/N8nButton/Button.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/packages/design-system/src/components/N8nButton/index.d.ts b/packages/design-system/src/components/N8nButton/index.d.ts new file mode 100644 index 0000000000..b70b0b8418 --- /dev/null +++ b/packages/design-system/src/components/N8nButton/index.d.ts @@ -0,0 +1,46 @@ +import { N8nComponent, N8nComponentSize } from '../component'; + +/** Button type */ +export type ButtonType = 'primary' | 'outline' | 'light' | 'text'; + +/** Button themes */ +export type ButtonTheme = 'success' | 'warning' | 'danger'; + +/** Button Component */ +export declare class N8nButton extends N8nComponent { + /** Button text */ + label: string; + + /** Button title on hover */ + title: string; + + /** Color scheme */ + theme: ButtonTheme; + + /** Button size */ + size: N8nComponentSize; + + /** Button type */ + type: ButtonType; + + /** Determine whether it's a circular button */ + circle: boolean; + + /** Determine whether it's loading */ + loading: boolean; + + /** Disable the button */ + disabled: boolean; + + /** Button icon, accepts an icon name of font awesome icon component */ + icon: string; + + /** Size of icon */ + iconSize: N8nComponentSize; + + /** Full width */ + fullWidth: boolean; + + /** Float left or right */ + float: boolean; +} diff --git a/packages/design-system/src/components/N8nButton/index.js b/packages/design-system/src/components/N8nButton/index.js new file mode 100644 index 0000000000..f477689bf3 --- /dev/null +++ b/packages/design-system/src/components/N8nButton/index.js @@ -0,0 +1,3 @@ +import N8nButton from './Button.vue'; + +export default N8nButton; diff --git a/packages/design-system/src/components/N8nIcon/Icon.stories.js b/packages/design-system/src/components/N8nIcon/Icon.stories.js new file mode 100644 index 0000000000..0b626a5768 --- /dev/null +++ b/packages/design-system/src/components/N8nIcon/Icon.stories.js @@ -0,0 +1,45 @@ +import N8nIcon from './Icon.vue'; + +export default { + title: 'Atoms/Icon', + component: N8nIcon, + argTypes: { + icon: { + control: 'text', + }, + size: { + control: { + type: 'select', + options: ['small', 'medium', 'large'], + }, + }, + spin: { + control: { + type: 'boolean', + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nIcon, + }, + template: '', +}); + +export const Clock = Template.bind({}); +Clock.args = { + icon: 'clock', +}; + +export const Plus = Template.bind({}); +Plus.args = { + icon: 'plus', +}; + +export const Stop = Template.bind({}); +Stop.args = { + icon: 'stop', +}; diff --git a/packages/design-system/src/components/N8nIcon/Icon.vue b/packages/design-system/src/components/N8nIcon/Icon.vue new file mode 100644 index 0000000000..52457db0ac --- /dev/null +++ b/packages/design-system/src/components/N8nIcon/Icon.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/packages/design-system/src/components/N8nIcon/index.d.ts b/packages/design-system/src/components/N8nIcon/index.d.ts new file mode 100644 index 0000000000..62181a33b6 --- /dev/null +++ b/packages/design-system/src/components/N8nIcon/index.d.ts @@ -0,0 +1,13 @@ +import { N8nComponent, N8nComponentSize } from '../component'; + +/** Button Component */ +export declare class N8nIcon extends N8nComponent { + /** icon name, accepts an icon name of font awesome icon component */ + icon: string; + + /** Size of icon */ + size: N8nComponentSize; + + /** Whether icon should be spinning */ + spin: boolean; +} diff --git a/packages/design-system/src/components/N8nIcon/index.js b/packages/design-system/src/components/N8nIcon/index.js new file mode 100644 index 0000000000..aeb12bb638 --- /dev/null +++ b/packages/design-system/src/components/N8nIcon/index.js @@ -0,0 +1,3 @@ +import Icon from './Icon.vue'; + +export default Icon; diff --git a/packages/design-system/src/components/N8nIconButton/IconButton.stories.js b/packages/design-system/src/components/N8nIconButton/IconButton.stories.js new file mode 100644 index 0000000000..fe99328783 --- /dev/null +++ b/packages/design-system/src/components/N8nIconButton/IconButton.stories.js @@ -0,0 +1,98 @@ +import N8nIconButton from './IconButton.vue'; +import { action } from '@storybook/addon-actions'; + +export default { + title: 'Atoms/Icon Button', + component: N8nIconButton, + argTypes: { + type: { + control: 'select', + options: ['primary', 'outline', 'light', 'text'], + }, + title: { + control: 'text', + }, + size: { + control: { + type: 'select', + options: ['small', 'medium', 'large', 'xlarge'], + }, + }, + loading: { + control: { + type: 'boolean', + }, + }, + icon: { + control: { + type: 'text', + }, + }, + theme: { + control: { + type: 'select', + options: ['success', 'warning', 'danger'], + }, + }, + }, + parameters: { + backgrounds: { default: '--color-background-light' }, + }, +}; + +const methods = { + onClick: action('click'), +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nIconButton, + }, + template: '', + methods, +}); + +export const Button = Template.bind({}); +Button.args = { + icon: 'plus', + title: 'my title', +}; + +const ManyTemplate = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nIconButton, + }, + template: + '
', + methods, +}); + +export const Primary = ManyTemplate.bind({}); +Primary.args = { + icon: 'plus', + title: 'my title', + type: 'primary', +}; + +export const Outline = ManyTemplate.bind({}); +Outline.args = { + icon: 'plus', + title: 'my title', + type: 'outline', +}; + +export const Light = ManyTemplate.bind({}); +Light.args = { + icon: 'plus', + title: 'my title', + type: 'light', +}; + +export const Text = ManyTemplate.bind({}); +Text.args = { + icon: 'plus', + title: 'my title', + type: 'text', +}; diff --git a/packages/design-system/src/components/N8nIconButton/IconButton.vue b/packages/design-system/src/components/N8nIconButton/IconButton.vue new file mode 100644 index 0000000000..0ace9defb8 --- /dev/null +++ b/packages/design-system/src/components/N8nIconButton/IconButton.vue @@ -0,0 +1,60 @@ + + + diff --git a/packages/design-system/src/components/N8nIconButton/index.d.ts b/packages/design-system/src/components/N8nIconButton/index.d.ts new file mode 100644 index 0000000000..d939a7e040 --- /dev/null +++ b/packages/design-system/src/components/N8nIconButton/index.d.ts @@ -0,0 +1,29 @@ +import { N8nComponent, N8nComponentSize } from '../component'; +import { ButtonTheme, ButtonType } from '../N8nButton'; + +/** Icon Button Component */ +export declare class N8nIconButton extends N8nComponent { + /** Button type */ + type: ButtonType; + + /** Button title on hover */ + title: string; + + /** Button size */ + size: N8nComponentSize | 'xlarge'; + + /** icon size */ + iconSize: N8nComponentSize; + + /** Determine whether it's loading */ + loading: boolean; + + /** Disable the button */ + disabled: boolean; + + /** Button icon, accepts an icon name of font awesome icon component */ + icon: string; + + /** Button theme */ + theme: ButtonTheme; +} diff --git a/packages/design-system/src/components/N8nIconButton/index.js b/packages/design-system/src/components/N8nIconButton/index.js new file mode 100644 index 0000000000..bcad6cbea7 --- /dev/null +++ b/packages/design-system/src/components/N8nIconButton/index.js @@ -0,0 +1,3 @@ +import IconButton from './IconButton.vue'; + +export default IconButton; diff --git a/packages/design-system/src/components/N8nInput/Input.stories.js b/packages/design-system/src/components/N8nInput/Input.stories.js new file mode 100644 index 0000000000..ee8c637f9a --- /dev/null +++ b/packages/design-system/src/components/N8nInput/Input.stories.js @@ -0,0 +1,122 @@ +import N8nInput from './Input.vue'; +import N8nIcon from '../N8nIcon'; +import { action } from '@storybook/addon-actions'; + +export default { + title: 'Atoms/Input', + component: N8nInput, + argTypes: { + type: { + control: 'select', + options: ['text', 'textarea'], + }, + placeholder: { + control: 'text', + }, + disabled: { + control: { + type: 'boolean', + }, + }, + size: { + control: 'select', + options: ['xlarge', 'large', 'medium', 'small', 'mini'], + }, + }, + parameters: { + backgrounds: { default: '--color-background-light' }, + }, +}; + +const methods = { + onInput: action('input'), + onFocus: action('input'), + onChange: action('input'), +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nInput, + }, + template: '', + data() { + return { + val: '', + }; + }, + methods, +}); + +export const Input = Template.bind({}); +Input.args = { + placeholder: 'placeholder...', +}; + +const ManyTemplate = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nInput, + }, + template: + '
', + methods, + data() { + return { + val: '', + }; + }, +}); + +export const Text = ManyTemplate.bind({}); +Text.args = { + type: 'text', + placeholder: 'placeholder...', +}; + +export const TextArea = ManyTemplate.bind({}); +TextArea.args = { + type: 'textarea', + placeholder: 'placeholder...', +}; + + +const WithPrefix = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nIcon, + N8nInput, + }, + template: '', + data() { + return { + val: '', + }; + }, + methods, +}); + +export const WithPrefixIcon = WithPrefix.bind({}); +WithPrefixIcon.args = { + placeholder: 'placeholder...', +}; + +const WithSuffix = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nIcon, + N8nInput, + }, + template: '', + data() { + return { + val: '', + }; + }, + methods, +}); + +export const WithSuffixIcon = WithSuffix.bind({}); +WithSuffixIcon.args = { + placeholder: 'placeholder...', +}; diff --git a/packages/design-system/src/components/N8nInput/Input.vue b/packages/design-system/src/components/N8nInput/Input.vue new file mode 100644 index 0000000000..50734fcdee --- /dev/null +++ b/packages/design-system/src/components/N8nInput/Input.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/packages/design-system/src/components/N8nInput/index.js b/packages/design-system/src/components/N8nInput/index.js new file mode 100644 index 0000000000..bbd9777415 --- /dev/null +++ b/packages/design-system/src/components/N8nInput/index.js @@ -0,0 +1,3 @@ +import N8nInput from './Input.vue'; + +export default N8nInput; diff --git a/packages/design-system/src/components/N8nInputLabel/InputLabel.stories.js b/packages/design-system/src/components/N8nInputLabel/InputLabel.stories.js new file mode 100644 index 0000000000..828d22b113 --- /dev/null +++ b/packages/design-system/src/components/N8nInputLabel/InputLabel.stories.js @@ -0,0 +1,27 @@ +import N8nInputLabel from './InputLabel.vue'; +import N8nInput from '../N8nInput'; + +export default { + title: 'Atoms/Input Label', + component: N8nInputLabel, + argTypes: {}, + parameters: { + backgrounds: { default: '--color-background-light' }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nInputLabel, + N8nInput, + }, + template: + '
', +}); + +export const InputLabel = Template.bind({}); +InputLabel.args = { + label: 'input label', + tooltipText: 'more info...', +}; diff --git a/packages/design-system/src/components/N8nInputLabel/InputLabel.vue b/packages/design-system/src/components/N8nInputLabel/InputLabel.vue new file mode 100644 index 0000000000..c800f73de8 --- /dev/null +++ b/packages/design-system/src/components/N8nInputLabel/InputLabel.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/packages/design-system/src/components/N8nInputLabel/index.js b/packages/design-system/src/components/N8nInputLabel/index.js new file mode 100644 index 0000000000..0b6438a472 --- /dev/null +++ b/packages/design-system/src/components/N8nInputLabel/index.js @@ -0,0 +1,3 @@ +import N8nInputLabel from './InputLabel.vue'; + +export default N8nInputLabel; diff --git a/packages/design-system/src/components/N8nInputNumber/InputNumber.stories.js b/packages/design-system/src/components/N8nInputNumber/InputNumber.stories.js new file mode 100644 index 0000000000..aec44f1838 --- /dev/null +++ b/packages/design-system/src/components/N8nInputNumber/InputNumber.stories.js @@ -0,0 +1,94 @@ +import N8nInputNumber from './InputNumber.vue'; +import { action } from '@storybook/addon-actions'; + +export default { + title: 'Atoms/Input Number', + component: N8nInputNumber, + argTypes: { + placeholder: { + control: 'text', + }, + disabled: { + control: { + type: 'boolean', + }, + }, + controls: { + control: { + type: 'boolean', + }, + }, + precision: { + control: { + type: 'number', + }, + }, + min: { + control: { + type: 'number', + }, + }, + max: { + control: { + type: 'number', + }, + }, + step: { + control: { + type: 'number', + }, + }, + title: { + control: 'text', + }, + }, + parameters: { + backgrounds: { default: '--color-background-light' }, + }, +}; + +const methods = { + onInput: action('input'), +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nInputNumber, + }, + template: '', + data() { + return { + val: null, + }; + }, + methods, +}); + +export const Input = Template.bind({}); +Input.args = { + placeholder: 'placeholder...', + controls: false, +}; + +const ManyTemplate = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nInputNumber, + }, + template: + '
', + methods, + data() { + return { + val: '', + }; + }, +}); + +export const Sizes = ManyTemplate.bind({}); +Sizes.args = { + placeholder: 'placeholder...', + controls: false, +}; + diff --git a/packages/design-system/src/components/N8nInputNumber/InputNumber.vue b/packages/design-system/src/components/N8nInputNumber/InputNumber.vue new file mode 100644 index 0000000000..b2ac52b2c8 --- /dev/null +++ b/packages/design-system/src/components/N8nInputNumber/InputNumber.vue @@ -0,0 +1,7 @@ + diff --git a/packages/design-system/src/components/N8nInputNumber/index.js b/packages/design-system/src/components/N8nInputNumber/index.js new file mode 100644 index 0000000000..187d727e0e --- /dev/null +++ b/packages/design-system/src/components/N8nInputNumber/index.js @@ -0,0 +1,3 @@ +import N8nInputNumber from './InputNumber.vue'; + +export default N8nInputNumber; diff --git a/packages/design-system/src/components/N8nOption/Option.vue b/packages/design-system/src/components/N8nOption/Option.vue new file mode 100644 index 0000000000..f7e0ef8a49 --- /dev/null +++ b/packages/design-system/src/components/N8nOption/Option.vue @@ -0,0 +1,7 @@ + diff --git a/packages/design-system/src/components/N8nOption/index.js b/packages/design-system/src/components/N8nOption/index.js new file mode 100644 index 0000000000..c4c5c93ec8 --- /dev/null +++ b/packages/design-system/src/components/N8nOption/index.js @@ -0,0 +1,3 @@ +import N8nOption from './Option.vue'; + +export default N8nOption; diff --git a/packages/design-system/src/components/N8nSelect/Select.stories.js b/packages/design-system/src/components/N8nSelect/Select.stories.js new file mode 100644 index 0000000000..824c858ace --- /dev/null +++ b/packages/design-system/src/components/N8nSelect/Select.stories.js @@ -0,0 +1,138 @@ +import N8nSelect from './Select.vue'; +import N8nOption from '../N8nOption'; +import { action } from '@storybook/addon-actions'; + +export default { + title: 'Atoms/Select', + component: N8nSelect, + argTypes: { + disabled: { + control: { + type: 'boolean', + }, + }, + size: { + control: { + type: 'select', + options: ['large', 'medium', 'small', 'mini'], + }, + }, + loading: { + control: { + type: 'boolean', + }, + }, + filterable: { + control: { + type: 'boolean', + }, + }, + defaultFirstOption: { + control: { + type: 'boolean', + }, + }, + }, + parameters: { + backgrounds: { default: '--color-background-light' }, + }, +}; + +const methods = { + onInput: action('input'), + onChange: action('change'), +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nSelect, + N8nOption, + }, + template: 'op1op2', + data() { + return { + val: '', + }; + }, + methods, +}); + +export const Input = Template.bind({}); + +export const Filterable = Template.bind({}); +Filterable.args = { + filterable: true, + defaultFirstOption: true, +}; + +const selects = ['large', 'medium', 'small', 'mini'].map((size) => `op1op2`).join(''); + +const ManyTemplate = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nSelect, + N8nOption, + }, + template: `
${selects}
`, + methods, + data() { + return { + val: '', + }; + }, +}); + +export const Sizes = ManyTemplate.bind({}); +Sizes.args = { + type: 'text', + label: 'text input:', + placeholder: 'placeholder...', +}; + +const selectsWithIcon = ['xlarge', 'large', 'medium', 'small', 'mini'].map((size) => `op1op2`).join(''); + +const ManyTemplateWithIcon = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nSelect, + N8nOption, + }, + template: `
${selectsWithIcon}
`, + methods, + data() { + return { + val: '', + }; + }, +}); + +export const WithIcon = ManyTemplateWithIcon.bind({}); +WithIcon.args = { + type: 'text', + label: 'text input:', + placeholder: 'placeholder...', +}; + + +const LimitedWidthTemplate = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nSelect, + N8nOption, + }, + template: '
op1op2 test very long ipsum lipsum test jskdfjsld kjfdslk jfdslkfj lksdjf
', + data() { + return { + val: '', + }; + }, + methods, +}); + +export const LimitedWidth = LimitedWidthTemplate.bind({}); +LimitedWidth.args = { + type: 'text', + label: 'text input:', + placeholder: 'placeholder...', +}; diff --git a/packages/design-system/src/components/N8nSelect/Select.vue b/packages/design-system/src/components/N8nSelect/Select.vue new file mode 100644 index 0000000000..4646cbc8ea --- /dev/null +++ b/packages/design-system/src/components/N8nSelect/Select.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/packages/design-system/src/components/N8nSelect/index.js b/packages/design-system/src/components/N8nSelect/index.js new file mode 100644 index 0000000000..a9f34a52ee --- /dev/null +++ b/packages/design-system/src/components/N8nSelect/index.js @@ -0,0 +1,3 @@ +import N8nSelect from './Select.vue'; + +export default N8nSelect; diff --git a/packages/design-system/src/components/N8nSpinner/Spinner.stories.js b/packages/design-system/src/components/N8nSpinner/Spinner.stories.js new file mode 100644 index 0000000000..82b6436412 --- /dev/null +++ b/packages/design-system/src/components/N8nSpinner/Spinner.stories.js @@ -0,0 +1,24 @@ +import N8nSpinner from './Spinner.vue'; + +export default { + title: 'Atoms/Spinner', + component: N8nSpinner, + argTypes: { + size: { + control: { + type: 'select', + options: ['small', 'medium', 'large'], + }, + }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nSpinner, + }, + template: '', +}); + +export const Spinner = Template.bind({}); diff --git a/packages/design-system/src/components/N8nSpinner/Spinner.vue b/packages/design-system/src/components/N8nSpinner/Spinner.vue new file mode 100644 index 0000000000..a39a3c5679 --- /dev/null +++ b/packages/design-system/src/components/N8nSpinner/Spinner.vue @@ -0,0 +1,27 @@ + + + diff --git a/packages/design-system/src/components/N8nSpinner/index.d.ts b/packages/design-system/src/components/N8nSpinner/index.d.ts new file mode 100644 index 0000000000..d2a0ce12f5 --- /dev/null +++ b/packages/design-system/src/components/N8nSpinner/index.d.ts @@ -0,0 +1,7 @@ +import { N8nComponent, N8nComponentSize } from '../component'; + +/** Spinner Component */ +export declare class N8nSpinner extends N8nComponent { + /** Icon size */ + size: N8nComponentSize; +} diff --git a/packages/design-system/src/components/N8nSpinner/index.js b/packages/design-system/src/components/N8nSpinner/index.js new file mode 100644 index 0000000000..b6dadd9b52 --- /dev/null +++ b/packages/design-system/src/components/N8nSpinner/index.js @@ -0,0 +1,3 @@ +import Spinner from './Spinner.vue'; + +export default Spinner; diff --git a/packages/design-system/src/components/N8nTooltip/Tooltip.stories.js b/packages/design-system/src/components/N8nTooltip/Tooltip.stories.js new file mode 100644 index 0000000000..60c2a410e4 --- /dev/null +++ b/packages/design-system/src/components/N8nTooltip/Tooltip.stories.js @@ -0,0 +1,49 @@ +import N8nTooltip from './Tooltip.vue'; + +export default { + title: 'Atoms/Tooltip', + component: N8nTooltip, + argTypes: { + effect: { + control: 'select', + options: ['dark', 'light'], + }, + placement: { + control: 'select', + options: [ + 'top', + 'top-start', + 'top-end', + 'bottom', + 'bottom-start', + 'bottom-end', + 'left', + 'left-start', + 'left-end', + 'right', + 'right-start', + 'right-end', + ], + }, + disabled: { + control: { type: 'boolean' }, + }, + }, + parameters: { + backgrounds: { default: '--color-background-light' }, + }, +}; + +const Template = (args, { argTypes }) => ({ + props: Object.keys(argTypes), + components: { + N8nTooltip, + }, + template: + '
yo
', +}); + +export const Tooltip = Template.bind({}); +Tooltip.args = { + content: '...', +}; diff --git a/packages/design-system/src/components/N8nTooltip/Tooltip.vue b/packages/design-system/src/components/N8nTooltip/Tooltip.vue new file mode 100644 index 0000000000..123be53762 --- /dev/null +++ b/packages/design-system/src/components/N8nTooltip/Tooltip.vue @@ -0,0 +1,7 @@ + diff --git a/packages/design-system/src/components/N8nTooltip/index.js b/packages/design-system/src/components/N8nTooltip/index.js new file mode 100644 index 0000000000..1b31abd702 --- /dev/null +++ b/packages/design-system/src/components/N8nTooltip/index.js @@ -0,0 +1,3 @@ +import N8nTooltip from './Tooltip.vue'; + +export default N8nTooltip; diff --git a/packages/design-system/src/components/component.d.ts b/packages/design-system/src/components/component.d.ts new file mode 100644 index 0000000000..006d5a85ec --- /dev/null +++ b/packages/design-system/src/components/component.d.ts @@ -0,0 +1,10 @@ +import Vue from 'vue'; + +/** N8n component common definition */ +export declare class N8nComponent extends Vue { + /** Install component into Vue */ + static install(vue: typeof Vue): void; +} + +/** Component size definition for button, input, etc */ +export type N8nComponentSize = 'large' | 'medium' | 'small'; diff --git a/packages/design-system/src/components/index.d.ts b/packages/design-system/src/components/index.d.ts new file mode 100644 index 0000000000..19b518d8ae --- /dev/null +++ b/packages/design-system/src/components/index.d.ts @@ -0,0 +1 @@ +declare module './N8nButton'; diff --git a/packages/design-system/src/components/index.js b/packages/design-system/src/components/index.js new file mode 100644 index 0000000000..fea7b995ac --- /dev/null +++ b/packages/design-system/src/components/index.js @@ -0,0 +1,23 @@ +import N8nButton from './N8nButton'; +import N8nIcon from './N8nIcon'; +import N8nIconButton from './N8nIconButton'; +import N8nInput from './N8nInput'; +import N8nInputLabel from './N8nInputLabel'; +import N8nInputNumber from './N8nInputNumber'; +import N8nOption from './N8nOption'; +import N8nSelect from './N8nSelect'; +import N8nSpinner from './N8nSpinner'; +import N8nTooltip from './N8nTooltip'; + +export { + N8nButton, + N8nIcon, + N8nIconButton, + N8nInput, + N8nInputLabel, + N8nInputNumber, + N8nOption, + N8nSelect, + N8nSpinner, + N8nTooltip, +}; diff --git a/packages/design-system/src/docs/Introduction.stories.mdx b/packages/design-system/src/docs/Introduction.stories.mdx new file mode 100644 index 0000000000..961486cf9e --- /dev/null +++ b/packages/design-system/src/docs/Introduction.stories.mdx @@ -0,0 +1,5 @@ + + +# Welcome to n8n Storybook + +This project includes components that make up n8n editor. diff --git a/packages/design-system/src/main.d.ts b/packages/design-system/src/main.d.ts new file mode 100644 index 0000000000..ed730c2988 --- /dev/null +++ b/packages/design-system/src/main.d.ts @@ -0,0 +1 @@ +declare module 'n8n-design-system'; diff --git a/packages/design-system/src/main.js b/packages/design-system/src/main.js new file mode 100644 index 0000000000..a214d84b97 --- /dev/null +++ b/packages/design-system/src/main.js @@ -0,0 +1,10 @@ +import * as components from './components'; + +for (const key in components) { + const component = components[key]; + component.install = function (Vue) { + Vue.component(component.name, component); + }; +} + +export * from './components'; diff --git a/packages/design-system/src/shims-element-ui.d.ts b/packages/design-system/src/shims-element-ui.d.ts new file mode 100644 index 0000000000..6af21baf4b --- /dev/null +++ b/packages/design-system/src/shims-element-ui.d.ts @@ -0,0 +1,7 @@ +declare module 'element-ui/lib/button'; +declare module 'element-ui/lib/input'; +declare module 'element-ui/lib/tooltip'; +declare module 'element-ui/lib/input-number'; +declare module 'element-ui/lib/select'; +declare module 'element-ui/lib/option'; + diff --git a/packages/design-system/src/shims-tsx.d.ts b/packages/design-system/src/shims-tsx.d.ts new file mode 100644 index 0000000000..f92b1fd7e3 --- /dev/null +++ b/packages/design-system/src/shims-tsx.d.ts @@ -0,0 +1,13 @@ +import Vue, { VNode } from 'vue'; + +declare global { + namespace JSX { + // tslint:disable no-empty-interface + interface Element extends VNode {} + // tslint:disable no-empty-interface + interface ElementClass extends Vue {} + interface IntrinsicElements { + [elem: string]: any; + } + } +} diff --git a/packages/design-system/src/shims-vue.d.ts b/packages/design-system/src/shims-vue.d.ts new file mode 100644 index 0000000000..b3a21c6cdb --- /dev/null +++ b/packages/design-system/src/shims-vue.d.ts @@ -0,0 +1,4 @@ +declare module '*.vue' { + import Vue from 'vue'; + export default Vue; +} diff --git a/packages/design-system/src/styleguide/ColorCircles.vue b/packages/design-system/src/styleguide/ColorCircles.vue new file mode 100644 index 0000000000..3fc46b3b71 --- /dev/null +++ b/packages/design-system/src/styleguide/ColorCircles.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/packages/design-system/src/styleguide/Sizes.vue b/packages/design-system/src/styleguide/Sizes.vue new file mode 100644 index 0000000000..373d6f7a26 --- /dev/null +++ b/packages/design-system/src/styleguide/Sizes.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/packages/design-system/src/styleguide/TextClasses.vue b/packages/design-system/src/styleguide/TextClasses.vue new file mode 100644 index 0000000000..0948ebfab9 --- /dev/null +++ b/packages/design-system/src/styleguide/TextClasses.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/packages/design-system/src/styleguide/VariableTable.vue b/packages/design-system/src/styleguide/VariableTable.vue new file mode 100644 index 0000000000..6f7c48dd4f --- /dev/null +++ b/packages/design-system/src/styleguide/VariableTable.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/packages/design-system/src/styleguide/border.stories.mdx b/packages/design-system/src/styleguide/border.stories.mdx new file mode 100644 index 0000000000..d5a83e064d --- /dev/null +++ b/packages/design-system/src/styleguide/border.stories.mdx @@ -0,0 +1,49 @@ +import { Meta, Story, Canvas } from '@storybook/addon-docs'; +import VariableTable from './VariableTable.vue'; + + + +# Border Radius + + + + {{ + template: ``, + components: { + VariableTable, + }, + }} + + + +# Border Width + + + + {{ + template: ``, + components: { + VariableTable, + }, + }} + + + + + + {{ + template: ``, + components: { + VariableTable, + }, + }} + + diff --git a/packages/design-system/src/styleguide/colors.stories.mdx b/packages/design-system/src/styleguide/colors.stories.mdx new file mode 100644 index 0000000000..16e372bcd3 --- /dev/null +++ b/packages/design-system/src/styleguide/colors.stories.mdx @@ -0,0 +1,131 @@ +import { Meta, Story, Canvas } from '@storybook/addon-docs'; +import ColorCircles from './ColorCircles.vue'; + + + +# Colors + +## Primary + + + + {{ + template: ``, + components: { + ColorCircles, + }, + }} + + + +## Outline + + + + {{ + template: ``, + components: { + ColorCircles, + }, + }} + + + +## Success + + + + {{ + template: ``, + components: { + ColorCircles, + }, + }} + + + +## Warning + + + + {{ + template: ``, + components: { + ColorCircles, + }, + }} + + + +## Danger + + + + {{ + template: ``, + components: { + ColorCircles, + }, + }} + + + +## Info + + + + {{ + template: ``, + components: { + ColorCircles, + }, + }} + + + +## Text + + + + {{ + template: ``, + components: { + ColorCircles, + }, + }} + + + +## Foreground + + + + {{ + template: ``, + components: { + ColorCircles, + }, + }} + + + +## Background + + + + {{ + template: ``, + components: { + ColorCircles, + }, + }} + + diff --git a/packages/design-system/src/styleguide/fonts.stories.mdx b/packages/design-system/src/styleguide/fonts.stories.mdx new file mode 100644 index 0000000000..ebf468b385 --- /dev/null +++ b/packages/design-system/src/styleguide/fonts.stories.mdx @@ -0,0 +1,59 @@ +import { Meta, Story, Canvas } from '@storybook/addon-docs'; +import Sizes from './Sizes.vue'; +import VariableTable from './VariableTable.vue'; + + + +# Font + +## Font Sizes + + + + {{ + template: ``, + components: { + Sizes, + }, + }} + + + +## Line Heights + + + + {{ + template: ``, + components: { + VariableTable, + }, + }} + + + +## Font Weights + + + + {{ + template: ``, + components: { + VariableTable, + }, + }} + + + +## Font Family + + + + {{ + template: ``, + components: { + VariableTable, + }, + }} + + diff --git a/packages/design-system/src/styleguide/spacing.stories.mdx b/packages/design-system/src/styleguide/spacing.stories.mdx new file mode 100644 index 0000000000..bd604fe1d8 --- /dev/null +++ b/packages/design-system/src/styleguide/spacing.stories.mdx @@ -0,0 +1,26 @@ +import { Meta, Story, Canvas } from '@storybook/addon-docs'; +import Sizes from './Sizes.vue'; +import TextClasses from './TextClasses.vue'; + + + +# Spacing + + + + {{ + template: ``, + components: { + Sizes, + }, + }} + + diff --git a/packages/design-system/src/styleguide/text.stories.mdx b/packages/design-system/src/styleguide/text.stories.mdx new file mode 100644 index 0000000000..f48680afc4 --- /dev/null +++ b/packages/design-system/src/styleguide/text.stories.mdx @@ -0,0 +1,38 @@ +import { Meta, Story, Canvas } from '@storybook/addon-docs'; +import TextClasses from './TextClasses.vue'; + + + +# Regular + + + + {{ + template: ``, + components: { + TextClasses, + }, + }} + + + +# Bold + + + + {{ + template: ``, + components: { + TextClasses, + }, + }} + + diff --git a/packages/design-system/theme/preview/docs.min.css b/packages/design-system/theme/preview/docs.min.css new file mode 100644 index 0000000000..2c8df6b64d --- /dev/null +++ b/packages/design-system/theme/preview/docs.min.css @@ -0,0 +1,2373 @@ +.color-wrap { + padding: 20px; +} +.box-card-header { + display: flex; + justify-content: space-between; + align-items: center; +} +.demo-line { + margin: 15px 0; +} +.component-preview h4 { + font-size: 20px; + margin: 40px 0 20px; + color: #909399; +} +.demo-block { + border: 1px solid #ebebeb; + border-radius: 3px; + transition: 0.2s; +} +.demo-block.hover { + box-shadow: 0 0 8px 0 rgba(232, 237, 250, 0.6), + 0 2px 4px 0 rgba(232, 237, 250, 0.5); +} +.demo-block code { + font-family: Menlo, Monaco, Consolas, Courier, monospace; +} +.demo-block .demo-button { + float: right; +} +.demo-block .source { + padding: 24px; +} +.demo-block .meta { + background-color: #fafafa; + border-top: 1px solid #eaeefb; + overflow: hidden; + height: 0; + transition: height 0.2s; +} +.demo-block .description { + padding: 20px; + box-sizing: border-box; + border: 1px solid #ebebeb; + border-radius: 3px; + font-size: 14px; + line-height: 22px; + color: #666; + word-break: break-word; + margin: 10px; + background-color: #fff; +} +.demo-block .description p { + margin: 0; + line-height: 26px; +} +.demo-block .description code { + color: #5e6d82; + background-color: #e6effb; + margin: 0 4px; + display: inline-block; + padding: 1px 5px; + font-size: 12px; + border-radius: 3px; + height: 18px; + line-height: 18px; +} +.demo-block .highlight pre { + margin: 0; +} +.demo-block .highlight code.hljs { + margin: 0; + border: none; + max-height: none; + border-radius: 0; +} +.demo-block .highlight code.hljs:before { + content: none; +} +.demo-block .demo-block-control { + border-top: 1px solid #eaeefb; + height: 44px; + box-sizing: border-box; + background-color: #fff; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + text-align: center; + margin-top: -1px; + color: #d3dce6; + cursor: pointer; + position: relative; +} +.demo-block .demo-block-control.is-fixed { + position: fixed; + bottom: 0; + width: 868px; +} +.demo-block .demo-block-control i { + font-size: 16px; + line-height: 44px; + transition: 0.3s; +} +.demo-block .demo-block-control i.hovering { + transform: translateX(-40px); +} +.demo-block .demo-block-control > span { + position: absolute; + transform: translateX(-30px); + font-size: 14px; + line-height: 44px; + transition: 0.3s; + display: inline-block; +} +.demo-block .demo-block-control:hover { + color: #409eff; + background-color: #f9fafc; +} +.demo-block .demo-block-control .text-slide-enter, +.demo-block .demo-block-control .text-slide-leave-active { + opacity: 0; + transform: translateX(10px); +} +.demo-block .demo-block-control .control-button { + line-height: 26px; + position: absolute; + top: 0; + right: 0; + font-size: 14px; + padding-left: 5px; + padding-right: 25px; +} +.footer { + background-color: #f7fbfd; + width: 100%; + padding: 40px 150px; + margin-top: -340px; + box-sizing: border-box; + height: 340px; +} +.footer .container { + box-sizing: border-box; + width: auto; +} +.footer .footer-main { + font-size: 0; + display: inline-block; + vertical-align: top; + margin-right: 110px; +} +.footer .footer-main h4 { + font-size: 18px; + color: #333; + line-height: 1; + margin: 0 0 15px; +} +.footer .footer-main .footer-main-link { + display: block; + margin: 0; + line-height: 2; + font-size: 14px; + color: #666; +} +.footer .footer-main .footer-main-link:hover { + color: #333; +} +.footer .footer-social { + float: right; + text-align: right; +} +.footer .footer-social .footer-social-title { + color: #666; + font-size: 18px; + line-height: 1; + margin: 0 0 20px; + padding: 0; + font-weight: 700; +} +.footer .footer-social .elementdoc { + transition: 0.3s; + display: inline-block; + line-height: 32px; + text-align: center; + color: #c8d6e8; + background-color: transparent; + size: 32px; + font-size: 32px; + vertical-align: middle; + margin-right: 20px; +} +.footer .footer-social .elementdoc:hover { + transform: scale(1.2); + color: #8d99ab; +} +.footer .footer-social .doc-icon-gitter { + margin-right: 0; +} +.el-popover.footer-popover { + padding: 0; + min-width: 120px; + line-height: normal; + box-shadow: 0 0 11px 0 rgba(174, 187, 211, 0.24); +} +.el-popover.footer-popover .footer-popover-title { + border-bottom: 1px solid #eaeefb; + height: 30px; + line-height: 30px; + text-align: center; + color: #99a9bf; + background-color: #f8f9fe; +} +.el-popover.footer-popover img { + size: 100px; + margin: 10px; +} +@media (max-width: 1140px) { + .footer { + height: auto; + } +} +@media (max-width: 1000px) { + .footer-social { + display: none; + } +} +@media (max-width: 768px) { + .footer .footer-main { + margin-bottom: 30px; + } +} +.theme-picker { + height: 80px; + display: inline-block; +} +.theme-picker .el-color-picker__trigger { + vertical-align: middle; +} +.theme-picker-dropdown .el-color-dropdown__link-btn { + display: none; +} +.algolia-search { + width: 450px !important; +} +.algolia-search.is-empty .el-autocomplete-suggestion__list { + padding-bottom: 0; +} +.algolia-search .el-autocomplete-suggestion__list { + position: static !important; + padding-bottom: 28px; +} +.algolia-search li { + border-bottom: 1px solid #ebebeb; +} +.algolia-search li:last-child { + border-bottom: none; +} +.algolia-search .algolia-highlight { + color: #409eff; + font-weight: 700; +} +.algolia-search .algolia-search-title { + font-size: 14px; + margin: 6px 0; + line-height: 1.8; +} +.algolia-search .algolia-search-separator { + padding: 0 6px; +} +.algolia-search .algolia-search-content { + font-size: 12px; + margin: 6px 0; + line-height: 2.4; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.algolia-search .algolia-search-link { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + padding-right: 20px; + background-color: #e4e7ed; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-sizing: border-box; + text-align: right; +} +.algolia-search .algolia-search-link:hover { + background-color: #e4e7ed; +} +.algolia-search .algolia-search-link img { + display: inline-block; + height: 17px; + margin-top: 10px; +} +.algolia-search .algolia-search-empty { + margin: 5px 0; + text-align: center; + color: #999; +} +.progress[data-v-3285c94c] { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 2px; + width: 0; + transition: width 0.2s, opacity 0.4s; + opacity: 1; + z-index: 999999; +} +.loadingClass { + z-index: 0 !important; +} +.loadingClass .el-loading-spinner { + top: 0; + margin-top: 30%; +} +.headerWrapper[data-v-70469f40] { + height: 80px; +} +#v3-banner[data-v-70469f40] { + background-color: #409eff; + min-height: 30px; + padding: 5px 60px; + z-index: 19; + box-sizing: border-box; + text-align: center; + color: #eee; +} +#v3-banner a[data-v-70469f40] { + color: #fff; + font-weight: 700; +} +.header[data-v-70469f40] { + height: 80px; + background-color: #fff; + color: #fff; + top: 0; + left: 0; + width: 100%; + line-height: 80px; + z-index: 100; + position: relative; +} +.header .container[data-v-70469f40] { + height: 100%; + box-sizing: border-box; + border-bottom: 1px solid #dcdfe6; +} +.header .nav-lang-spe[data-v-70469f40] { + color: #888; +} +.header h1[data-v-70469f40] { + margin: 0; + float: left; + font-size: 32px; + font-weight: 400; +} +.header h1 a[data-v-70469f40] { + color: #333; + text-decoration: none; + display: block; +} +.header h1 span[data-v-70469f40] { + font-size: 12px; + display: inline-block; + width: 34px; + height: 18px; + border: 1px solid hsla(0, 0%, 100%, 0.5); + text-align: center; + line-height: 18px; + vertical-align: middle; + margin-left: 10px; + border-radius: 3px; +} +.header .nav[data-v-70469f40] { + float: right; + height: 100%; + line-height: 80px; + background: transparent; + padding: 0; + margin: 0; +} +.header .nav[data-v-70469f40]:after, +.header .nav[data-v-70469f40]:before { + display: table; + content: ''; +} +.header .nav[data-v-70469f40]:after { + clear: both; +} +.header .nav-gap[data-v-70469f40] { + position: relative; + width: 1px; + height: 80px; + padding: 0 20px; +} +.header .nav-gap[data-v-70469f40]:before { + content: ''; + position: absolute; + top: calc(50% - 8px); + width: 1px; + height: 16px; + background: #ebebeb; +} +.header .nav-logo-small[data-v-70469f40], +.header .nav-logo[data-v-70469f40] { + vertical-align: sub; +} +.header .nav-logo-small[data-v-70469f40] { + display: none; +} +.header .nav-item[data-v-70469f40] { + margin: 0; + float: left; + list-style: none; + position: relative; + cursor: pointer; +} +.header .nav-item.nav-algolia-search[data-v-70469f40] { + cursor: default; +} +.header .nav-item.lang-item[data-v-70469f40], +.header .nav-item[data-v-70469f40]:last-child { + cursor: default; + margin-left: 34px; +} +.header .nav-item.lang-item span[data-v-70469f40], +.header .nav-item:last-child span[data-v-70469f40] { + opacity: 0.8; +} +.header .nav-item.lang-item .nav-lang[data-v-70469f40], +.header .nav-item:last-child .nav-lang[data-v-70469f40] { + cursor: pointer; + display: inline-block; + height: 100%; + color: #888; +} +.header .nav-item.lang-item .nav-lang[data-v-70469f40]:hover, +.header .nav-item:last-child .nav-lang[data-v-70469f40]:hover { + color: #409eff; +} +.header .nav-item.lang-item .nav-lang.active[data-v-70469f40], +.header .nav-item:last-child .nav-lang.active[data-v-70469f40] { + font-weight: 700; + color: #409eff; +} +.header .nav-item a[data-v-70469f40] { + text-decoration: none; + color: #1989fa; + opacity: 0.5; + display: block; + padding: 0 22px; +} +.header .nav-item a.active[data-v-70469f40], +.header .nav-item a[data-v-70469f40]:hover { + opacity: 1; +} +.header .nav-item a.active[data-v-70469f40]:after { + content: ''; + display: inline-block; + position: absolute; + bottom: 0; + left: calc(50% - 15px); + width: 30px; + height: 2px; + background: #409eff; +} +.nav-dropdown[data-v-70469f40] { + margin-bottom: 6px; + padding-left: 18px; + width: 100%; +} +.nav-dropdown span[data-v-70469f40] { + display: block; + width: 100%; + font-size: 16px; + color: #888; + line-height: 40px; + transition: 0.2s; + padding-bottom: 6px; + user-select: none; +} +.nav-dropdown span[data-v-70469f40]:hover { + cursor: pointer; +} +.nav-dropdown i[data-v-70469f40] { + transition: 0.2s; + font-size: 12px; + color: #979797; + transform: translateY(-2px); +} +.nav-dropdown .is-active i[data-v-70469f40], +.nav-dropdown .is-active span[data-v-70469f40] { + color: #409eff; +} +.nav-dropdown .is-active i[data-v-70469f40] { + transform: rotate(180deg) translateY(3px); +} +.nav-dropdown:hover i[data-v-70469f40], +.nav-dropdown:hover span[data-v-70469f40] { + color: #409eff; +} +.nav-dropdown-list[data-v-70469f40] { + width: auto; +} +@media (max-width: 850px) { + .header .nav-logo[data-v-70469f40] { + display: none; + } + .header .nav-logo-small[data-v-70469f40] { + display: inline-block; + } + .header .nav-item[data-v-70469f40] { + margin-left: 6px; + } + .header .nav-item.lang-item[data-v-70469f40], + .header .nav-item[data-v-70469f40]:last-child { + margin-left: 10px; + } + .header .nav-item a[data-v-70469f40] { + padding: 0 5px; + } + .header .nav-algolia-search[data-v-70469f40], + .header .nav-theme-switch[data-v-70469f40] { + display: none; + } +} +@media (max-width: 700px) { + .header .container[data-v-70469f40] { + padding: 0 12px; + } + .header .nav-item a[data-v-70469f40] { + font-size: 12px; + vertical-align: top; + } + .header .nav-item.lang-item[data-v-70469f40] { + height: 100%; + } + .header .nav-item.lang-item .nav-lang[data-v-70469f40] { + display: flex; + align-items: center; + } + .header .nav-item.lang-item .nav-lang span[data-v-70469f40] { + padding-bottom: 0; + } + .header .nav-dropdown[data-v-70469f40] { + padding: 0; + } + .header .nav-dropdown span[data-v-70469f40] { + font-size: 12px; + } + .header .nav-gap[data-v-70469f40] { + padding: 0 8px; + } + .header .nav-versions[data-v-70469f40] { + display: none; + } +} +.side-nav { + width: 100%; + box-sizing: border-box; + padding-right: 30px; + transition: opacity 0.3s; +} +.side-nav.is-fade { + transition: opacity 3s; +} +.side-nav li { + list-style: none; +} +.side-nav ul { + padding: 0; + margin: 0; + overflow: hidden; +} +.side-nav > ul > .nav-item > a { + margin-top: 15px; +} +.side-nav > ul > .nav-item:nth-child(-n + 4) > a { + margin-top: 0; +} +.side-nav .nav-item a { + font-size: 16px; + color: #333; + line-height: 40px; + height: 40px; + margin: 0; + padding: 0; + text-decoration: none; + display: block; + position: relative; + transition: 0.15s ease-out; + font-weight: 700; +} +.side-nav .nav-item a.active { + color: #409eff; +} +.side-nav .nav-item .nav-item a { + display: block; + height: 40px; + color: #444; + line-height: 40px; + font-size: 14px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + font-weight: 400; +} +.side-nav .nav-item .nav-item a.active, +.side-nav .nav-item .nav-item a:hover { + color: #409eff; +} +.side-nav .nav-item.sponsors > .sub-nav { + margin-top: -10px; +} +.side-nav .nav-item.sponsors > a { + color: #777; + font-weight: 300; + font-size: 14px; +} +.side-nav .nav-item.sponsors .nav-item { + display: inline-block; +} +.side-nav .nav-item.sponsors .nav-item a { + height: auto; + display: inline-block; + vertical-align: middle; + margin: 8px 12px 12px 0; +} +.side-nav .nav-item.sponsors .nav-item a img { + width: 42px; +} +.side-nav .nav-item.sponsors .nav-item:first-child a img { + width: 36px; +} +.side-nav .nav-group__title { + font-size: 12px; + color: #999; + line-height: 26px; + margin-top: 15px; +} +.side-nav #code-sponsor-widget { + margin: 0 0 0 -20px; +} +.nav-dropdown-list { + width: 120px; + margin-top: -8px; +} +.footer-nav, +.nav-dropdown-list li { + font-size: 14px; +} +.footer-nav { + padding: 40px 0; + color: #333; +} +.footer-nav:after { + content: ''; + display: block; + clear: both; +} +.footer-nav i { + transition: 0.3s; + color: #999; + vertical-align: baseline; +} +.footer-nav-link { + cursor: pointer; + transition: 0.3s; +} +.footer-nav-link:hover, +.footer-nav-link:hover i { + color: #409eff; +} +.footer-nav-left { + float: left; + margin-left: -4px; +} +.footer-nav-right { + float: right; + margin-right: -4px; +} +.demo-block.demo-alert .el-alert { + margin: 20px 0 0; +} +.demo-block.demo-alert .el-alert:first-child { + margin: 0; +} +.demo-badge.demo-block .el-dropdown { + vertical-align: middle; +} +.demo-badge.demo-block .share-button { + width: 36px; + padding: 10px; +} +.demo-badge.demo-block .mark { + margin-top: 8px; + line-height: 1; + float: right; +} +.demo-badge.demo-block .item { + margin-right: 40px; +} +.demo-border .text { + width: 15%; +} +.demo-border .line { + width: 70%; +} +.demo-border .line div { + width: 100%; + height: 0; + border-top: 1px solid #eee; +} +.demo-border .line .dashed { + border-top: 2px dashed #eee; +} +.demo-shadow { + height: 100px; + width: 50%; + border: 1px solid #eee; +} +.demo-shadow-text { + line-height: 50px; + color: #666; + font-size: 14px; +} +.demo-radius .title { + color: #666; + font-size: 18px; + margin: 10px 0; +} +.demo-radius .value { + color: #333; + font-size: 16px; + margin: 10px 0; +} +.demo-radius .radius { + height: 60px; + width: 70%; + border: 1px solid #d7dae2; + border-radius: 0; + margin-top: 20px; +} +.demo-radius .radius-30 { + border-radius: 30px; +} +.demo-block.demo-button .el-row { + margin-bottom: 20px; +} +.demo-block.demo-button .el-row:last-child { + margin-bottom: 0; +} +.demo-block.demo-button .el-button + .el-button { + margin-left: 10px; +} +.demo-block.demo-button .el-button-group .el-button + .el-button { + margin-left: 0; +} +.demo-block.demo-button .el-button-group + .el-button-group { + margin-left: 10px; +} +.demo-calendar.demo-block .is-selected { + color: #1989fa; +} +.demo-block.demo-card .text { + font-size: 14px; +} +.demo-block.demo-card .time { + font-size: 13px; + color: #999; +} +.demo-block.demo-card .bottom { + margin-top: 13px; + line-height: 12px; +} +.demo-block.demo-card .item { + margin-bottom: 18px; +} +.demo-block.demo-card .button { + padding: 0; + float: right; +} +.demo-block.demo-card .image { + width: 100%; + display: block; +} +.demo-block.demo-card .box-card { + width: 480px; +} +.demo-carousel .block { + padding: 30px; + text-align: center; + border-right: 1px solid #eff2f6; + display: inline-block; + width: 49%; + box-sizing: border-box; +} +.demo-carousel .block:last-child { + border-right: none; +} +.demo-carousel .demonstration { + display: block; + color: #8492a6; + font-size: 14px; + margin-bottom: 20px; +} +.demo-carousel .el-carousel__container { + text-align: center; +} +.demo-carousel .el-carousel__item h3 { + color: #fff; + font-size: 18px; + line-height: 300px; + margin: 0; +} +.demo-carousel .el-carousel__item h3.small { + font-size: 14px; + line-height: 150px; +} +.demo-carousel .el-carousel__item h3.medium { + font-size: 14px; + line-height: 200px; +} +.demo-carousel .el-carousel__item:nth-child(2n) { + background-color: #99a9bf; +} +.demo-carousel .el-carousel__item:nth-child(odd) { + background-color: #d3dce6; +} +.demo-cascader .el-cascader { + width: 222px; +} +.demo-cascader-size .el-cascader { + vertical-align: top; + margin-right: 15px; +} +.demo-cascader .source > div { + display: flex; +} +.demo-cascader .block { + padding: 30px 0; + text-align: center; + border-right: 1px solid #eff2f6; + width: 50%; + box-sizing: border-box; +} +.demo-cascader .block:last-child { + border-right: none; +} +.demo-cascader .demonstration { + display: block; + color: #8492a6; + font-size: 14px; + margin-bottom: 20px; +} +.demo-collapse .el-collapse-item__header .header-icon { + margin-left: 5px; +} +.demo-color-picker .block { + padding: 30px 0; + text-align: center; + border-right: 1px solid #eff2f6; + display: inline-block; + width: 50%; + box-sizing: border-box; +} +.demo-color-picker .block:last-child { + border-right: none; +} +.demo-color-picker .demonstration { + display: block; + color: #8492a6; + font-size: 14px; + margin-bottom: 20px; +} +.demo-color-picker .el-color-picker + .el-color-picker { + margin-left: 20px; +} +.demo-color-box { + position: relative; + border-radius: 4px; + padding: 20px; + margin: 5px 0; + height: 114px; + box-sizing: border-box; + color: #fff; + font-size: 14px; +} +.demo-color-box .value { + font-size: 12px; + opacity: 0.69; + line-height: 24px; +} +.demo-color-box-other { + height: 74px; + margin: 10px 0 !important; + border-radius: 4px 4px 4px 4px !important; + padding: 15px 20px; +} +.demo-color-box-group .demo-color-box { + border-radius: 0; + margin: 0; +} +.demo-color-box-group .demo-color-box:first-child { + border-radius: 4px 4px 0 0; +} +.bg-color-sub, +.demo-color-box-group .demo-color-box:last-child { + border-radius: 0 0 4px 4px; +} +.bg-color-sub { + width: 100%; + height: 40px; + left: 0; + bottom: 0; + position: absolute; +} +.bg-blue-sub-item { + width: 11.1111111%; + height: 100%; + display: inline-block; +} +.bg-blue-sub-item:first-child { + border-radius: 0 0 0 4px; +} +.bg-success-sub-item { + width: 50%; + height: 100%; + display: inline-block; +} +.bg-success-sub-item:first-child { + border-radius: 0 0 0 4px; +} +.bg-success-sub-item:last-child { + border-radius: 0 0 4px 0; +} +.bg-transparent { + border: 1px solid #fcc3c3; + color: #303133; + background: url("data:image/svg+xml;utf8,"); + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%, auto; +} +.demo-color-box-lite { + color: #303133; +} +.el-footer, +.el-header { + background-color: #b3c0d1; + color: #333; + line-height: 60px; +} +.el-aside { + color: #333; +} +#chang-jian-ye-mian-bu-ju + .demo-container .el-footer, +#chang-jian-ye-mian-bu-ju + .demo-container .el-header { + text-align: center; +} +#chang-jian-ye-mian-bu-ju + .demo-container .el-aside { + background-color: #d3dce6; + text-align: center; + line-height: 200px; +} +#chang-jian-ye-mian-bu-ju + .demo-container .el-main { + background-color: #e9eef3; + color: #333; + text-align: center; + line-height: 160px; +} +#chang-jian-ye-mian-bu-ju + .demo-container > .source > .el-container { + margin-bottom: 40px; +} +#chang-jian-ye-mian-bu-ju + + .demo-container + > .source + > .el-container:nth-child(5) + .el-aside, +#chang-jian-ye-mian-bu-ju + + .demo-container + > .source + > .el-container:nth-child(6) + .el-aside { + line-height: 260px; +} +#chang-jian-ye-mian-bu-ju + + .demo-container + > .source + > .el-container:nth-child(7) + .el-aside { + line-height: 320px; +} +.demo-block.demo-date-picker .source > div { + padding: 0; + display: flex; + flex-wrap: wrap; +} +.demo-date-picker .block { + padding: 30px 0; + text-align: center; + border-right: 1px solid #eff2f6; + flex: 1; +} +.demo-date-picker .block:last-child { + border-right: none; +} +.demo-date-picker .container { + flex: 1; + border-right: 1px solid #eff2f6; +} +.demo-date-picker .container .block { + border-right: none; +} +.demo-date-picker .container .block:last-child { + border-top: 1px solid #eff2f6; +} +.demo-date-picker .container:last-child { + border-right: none; +} +.demo-date-picker .demonstration { + display: block; + color: #8492a6; + font-size: 14px; + margin-bottom: 20px; +} +.demo-block.demo-datetime-picker .source > div { + padding: 0; + display: flex; +} +.demo-datetime-picker .block { + padding: 30px 0; + text-align: center; + border-right: 1px solid #eff2f6; + flex: 1; +} +.demo-datetime-picker .block:last-child { + border-right: none; +} +.demo-datetime-picker .demonstration { + display: block; + color: #8492a6; + font-size: 14px; + margin-bottom: 20px; +} +.demo-block.demo-dialog .dialog-footer button:first-child { + margin-right: 10px; +} +.demo-block.demo-dialog .full-image { + width: 100%; +} +.demo-block.demo-dialog .el-dialog__wrapper { + margin: 0; +} +.demo-block.demo-dialog .el-input, +.demo-block.demo-dialog .el-select { + width: 300px; +} +.demo-block.demo-dialog .el-button--text { + margin-right: 15px; +} +.demo-block .el-dropdown { + vertical-align: top; +} +.demo-block .el-dropdown + .el-dropdown { + margin-left: 15px; +} +.demo-block .el-dropdown-link { + cursor: pointer; + color: #409eff; +} +.demo-block .el-icon-arrow-down { + font-size: 12px; +} +.block-col-2 { + margin: -24px; +} +.block-col-2 .el-col { + padding: 30px 0; + text-align: center; + border-right: 1px solid #eff2f6; +} +.block-col-2 .el-col:last-child { + border-right: 0; +} +.demo-dropdown .demonstration { + display: block; + color: #8492a6; + font-size: 14px; + margin-bottom: 20px; +} +.demo-form .el-select .el-input { + width: 380px; +} +.demo-form .el-form { + width: 460px; +} +.demo-form .line { + text-align: center; +} +.demo-form .el-checkbox-group { + width: 320px; + margin: 0; + padding: 0; + list-style: none; +} +.demo-form .el-checkbox-group:after, +.demo-form .el-checkbox-group:before { + content: ' '; + display: table; +} +.demo-form .el-checkbox-group:after { + clear: both; + visibility: hidden; + font-size: 0; + height: 0; +} +.demo-form .el-checkbox-group .el-checkbox { + float: left; + width: 160px; + margin: 0; + padding: 0; +} +.demo-form .el-checkbox-group .el-checkbox + .el-checkbox { + margin-left: 0; +} +.demo-form .demo-form-normal { + width: 460px; +} +.demo-form .demo-form-inline { + width: auto; +} +.demo-form .demo-form-inline .el-input { + width: 150px; +} +.demo-form .demo-form-inline > * { + margin-right: 10px; +} +.demo-form .demo-ruleForm { + width: 460px; +} +.demo-form .demo-ruleForm .el-select .el-input { + width: 360px; +} +.demo-form .demo-dynamic .el-input { + margin-right: 10px; + width: 270px; + vertical-align: top; +} +.demo-form .fr { + float: right; +} +ul.language-list { + color: #5e6d82; + font-size: 14px; + padding-left: 20px; +} +ul.language-list li { + line-height: 1.8; +} +.demo-icon .source > div > i { + color: #606266; + margin: 0 20px; + font-size: 1.5em; + vertical-align: middle; +} +.demo-icon .source button { + margin: 0 20px; +} +.page-component .content > ul.icon-list { + overflow: hidden; + list-style: none; + padding: 0 !important; + border: 1px solid #eaeefb; + border-radius: 4px; +} +.icon-list li { + float: left; + width: 16.66%; + text-align: center; + height: 120px; + line-height: 120px; + color: #666; + font-size: 13px; + border-right: 1px solid #eee; + border-bottom: 1px solid #eee; + margin-right: -1px; + margin-bottom: -1px; +} +.icon-list li:after { + content: ''; + height: 100%; +} +.icon-list li:after, +.icon-list li span { + display: inline-block; + vertical-align: middle; +} +.icon-list li span { + line-height: normal; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, + Microsoft YaHei, SimSun, sans-serif; + color: #99a9bf; + transition: color 0.15s linear; +} +.icon-list li i { + display: block; + font-size: 32px; + margin-bottom: 15px; + color: #606266; + transition: color 0.15s linear; +} +.icon-list li .icon-name { + display: inline-block; + padding: 0 3px; + height: 1em; +} +.icon-list li:hover i, +.icon-list li:hover span { + color: #5cb6ff; +} +.demo-block.demo-input-number .el-input-number + .el-input-number { + margin-left: 10px; +} +.demo-input .el-select .el-input { + width: 130px; +} +.demo-input .el-input { + width: 180px; +} +.demo-input .el-textarea { + width: 414px; +} +.demo-input .el-input-group { + width: 100%; +} +.demo-input .demo-input-size .el-input { + vertical-align: top; + margin: 0 10px 10px 0; +} +.demo-input .input-with-select .el-input-group__prepend { + background-color: #fff; +} +.demo-input .demo-autocomplete { + text-align: center; +} +.demo-input .demo-autocomplete .sub-title { + margin-bottom: 10px; + font-size: 14px; + color: #8492a6; +} +.demo-input .demo-autocomplete .el-col:not(:last-child) { + border-right: 1px solid rgba(224, 230, 237, 0.5); +} +.demo-input .demo-autocomplete .el-autocomplete { + text-align: left; +} +.el-autocomplete-suggestion.my-autocomplete li { + line-height: normal; + padding-top: 7px; + padding-bottom: 7px; +} +.el-autocomplete-suggestion.my-autocomplete li .name { + text-overflow: ellipsis; + overflow: hidden; +} +.el-autocomplete-suggestion.my-autocomplete li .addr { + font-size: 12px; + color: #b4b4b4; +} +.el-autocomplete-suggestion.my-autocomplete li .highlighted .addr { + color: #ddd; +} +.demo-input-suffix { + margin-bottom: 15px; +} +.demo-input-suffix .el-input { + margin-right: 15px; +} +.demo-layout .el-row { + margin-bottom: 20px; +} +.demo-layout .el-row:last-child { + margin-bottom: 0; +} +.demo-layout .el-col { + border-radius: 4px; +} +.demo-layout .bg-purple-dark { + background: #99a9bf; +} +.demo-layout .bg-purple { + background: #d3dce6; +} +.demo-layout .bg-purple-light { + background: #e5e9f2; +} +.demo-layout .grid-content { + border-radius: 4px; + min-height: 36px; +} +.demo-layout .row-bg { + padding: 10px 0; + background-color: #f9fafc; +} +.demo-loading .el-table { + border: none; +} +.demo-block.demo-menu .el-menu-demo { + padding-left: 55px; +} +.demo-block.demo-menu .el-menu-vertical-demo:not(.el-menu--collapse) { + width: 240px; + min-height: 400px; +} +.demo-block.demo-menu .line { + height: 1px; + background-color: #e0e6ed; + margin: 35px -24px; +} +.demo-block.demo-menu h5 { + font-size: 14px; + color: #8492a6; + margin-top: 10px; +} +.demo-block.demo-menu .tac { + text-align: center; +} +.demo-block.demo-menu .tac .el-menu-vertical-demo { + display: inline-block; + text-align: left; +} +.demo-pagination .source.first { + padding: 0; +} +.demo-pagination .first .block { + padding: 30px 0; + text-align: center; + border-right: 1px solid #eff2f6; + display: inline-block; + width: 50%; + box-sizing: border-box; +} +.demo-pagination .first .block:last-child { + border-right: none; +} +.demo-pagination .first .demonstration { + display: block; + color: #8492a6; + font-size: 14px; + margin-bottom: 20px; +} +.demo-pagination .source.last { + padding: 0; +} +.demo-pagination .last .block { + padding: 30px 24px; + border-bottom: 1px solid #eff2f6; +} +.demo-pagination .last .block:last-child { + border-bottom: none; +} +.demo-pagination .last .demonstration { + font-size: 14px; + color: #8492a6; + line-height: 44px; +} +.demo-pagination .last .demonstration + .el-pagination { + width: 70%; + margin: 5px 20px 0 0; +} +.demo-block.demo-popover .el-popover + .el-popover { + margin-left: 10px; +} +.demo-block.demo-popover .el-input { + width: 360px; +} +.demo-block.demo-popover .el-button { + margin-left: 10px; +} +.demo-block.demo-progress .el-progress--line { + margin-bottom: 15px; + width: 350px; +} +.demo-block.demo-progress .el-progress--circle { + margin-right: 15px; +} +.demo-rate .block { + padding: 30px 0; + text-align: center; + border-right: 1px solid #eff2f6; + display: inline-block; + width: 49%; + box-sizing: border-box; +} +.demo-rate .block:last-child { + border-right: none; +} +.demo-rate .demonstration { + display: block; + color: #8492a6; + font-size: 14px; + margin-bottom: 20px; +} +.demo-select .el-select { + width: 240px; +} +.demo-block.demo-slider .source { + padding: 0; +} +.demo-block.demo-slider .block { + padding: 30px 24px; + overflow: hidden; + border-bottom: 1px solid #eff2f6; +} +.demo-block.demo-slider .block:last-child { + border-bottom: none; +} +.demo-block.demo-slider .demonstration { + font-size: 14px; + color: #8492a6; + line-height: 44px; +} +.demo-block.demo-slider .demonstration + .el-slider { + float: right; + width: 70%; + margin-right: 20px; +} +.demo-block.demo-switch .el-switch { + margin: 20px 20px 20px 0; +} +.el-table .warning-row { + background: #fdf5e6; +} +.el-table .success-row { + background: #f0f9eb; +} +.demo-table .name-wrapper { + display: inline-block; +} +.demo-table .demo-table-expand label { + width: 90px; + color: #99a9bf; +} +.demo-table .demo-table-expand .el-form-item { + margin-right: 0; + margin-bottom: 0; + width: 50%; +} +.demo-block.demo-tag .el-tag + .el-tag { + margin-left: 10px; +} +.demo-block.demo-tag .button-new-tag { + margin-left: 10px; + height: 32px; + line-height: 30px; + padding-top: 0; + padding-bottom: 0; +} +.demo-block.demo-tag .input-new-tag { + width: 90px; + margin-left: 10px; + vertical-align: bottom; +} +.demo-block.demo-tag .tag-group { + display: flex; + align-items: center; +} +.demo-block.demo-tag .tag-group__title { + width: 45px; + font-size: 14px; + color: #606266; +} +.demo-block.demo-tag .tag-group + .tag-group { + margin-top: 10px; +} +.demo-block .el-date-editor + .el-date-editor { + margin-left: 10px; +} +.demo-timeline .source .radio { + margin-bottom: 20px; +} +.demo-timeline .source .radio .el-radio-group { + margin-left: 20px; +} +.demo-tooltip .el-tooltip + .el-tooltip { + margin-left: 15px; +} +.demo-tooltip .box { + width: 400px; +} +.demo-tooltip .box .top { + text-align: center; +} +.demo-tooltip .box .left { + float: left; + width: 60px; +} +.demo-tooltip .box .right { + float: right; + width: 60px; +} +.demo-tooltip .box .bottom { + clear: both; + text-align: center; +} +.demo-tooltip .box .item { + margin: 4px; +} +.demo-tooltip .box .left .el-tooltip__popper, +.demo-tooltip .box .right .el-tooltip__popper { + padding: 8px 10px; +} +.demo-tooltip .box .el-tooltip { + margin-left: 0; +} +.demo-transition .transition-box { + margin-bottom: 10px; + width: 200px; + height: 100px; + border-radius: 4px; + background-color: #409eff; + text-align: center; + color: #fff; + padding: 40px 20px; + margin-right: 20px; + box-sizing: border-box; +} +.demo-transfer .transfer-footer { + margin-left: 15px; + padding: 6px 5px; +} +.demo-tree .leaf { + width: 20px; + background: #ddd; +} +.demo-tree .folder { + width: 20px; + background: #888; +} +.demo-tree .buttons, +.demo-tree .filter-tree { + margin-top: 20px; +} +.demo-tree .custom-tree-container { + display: flex; + margin: -24px; +} +.demo-tree .block { + flex: 1; + padding: 8px 24px 24px; +} +.demo-tree .block:first-child { + border-right: 1px solid #eff2f6; +} +.demo-tree .block > p { + text-align: center; + margin: 0; + line-height: 4; +} +.demo-tree .custom-tree-node { + flex: 1; + display: flex; + align-items: center; + justify-content: space-between; + font-size: 14px; + padding-right: 8px; +} +.demo-typo-size .color-dark-light { + color: #99a9bf; +} +.demo-term-box img { + width: 24%; + margin: 0 4% 20px 0; +} +.lineH-left { + display: inline-block; + height: 80px; +} +.lineH-right { + display: inline-block; + list-style: none; + padding: 0 0 0 90px; + margin: 0; + vertical-align: top; +} +.lineH-right li { + font-size: 13px; + color: #666; + height: 20px; + line-height: 20px; +} +.lineH-right li span { + padding-left: 40px; +} +.upload-tip { + color: #8492a6; + font-size: 12px; + margin-top: 7px; +} +.demo-block { + margin-bottom: 24px; +} +.demo-block .upload-demo { + width: 360px; +} +.demo-block .avatar-uploader .el-upload { + border: 1px dashed #d9d9d9; + border-radius: 6px; + cursor: pointer; + position: relative; + overflow: hidden; +} +.demo-block .avatar-uploader .el-upload:focus, +.demo-block .avatar-uploader .el-upload:hover { + border-color: #409eff; +} +.demo-block .avatar-uploader .avatar-uploader-icon { + font-size: 28px; + color: #8c939d; + width: 178px; + height: 178px; + line-height: 178px; + text-align: center; +} +.demo-block .avatar-uploader .avatar { + width: 178px; + height: 178px; + display: block; +} +.demo-divider-container-1 { + display: inline-block; + width: 33%; +} +.demo-divider-container-2 { + display: inline-block; + width: 50%; +} +@keyframes dot { + 0% { + width: 0; + margin-right: 1em; + } + to { + width: 1em; + margin-right: 0; + } +} +.demo-image .block, +.demo-image__error .block, +.demo-image__placeholder .block { + padding: 30px 0; + text-align: center; + border-right: 1px solid #eff2f6; + display: inline-block; + width: 20%; + box-sizing: border-box; + vertical-align: top; +} +.demo-image .block:last-child, +.demo-image__error .block:last-child, +.demo-image__placeholder .block:last-child { + border-right: none; +} +.demo-image .demonstration, +.demo-image__error .demonstration, +.demo-image__placeholder .demonstration { + display: block; + color: #8492a6; + font-size: 14px; + margin-bottom: 20px; +} +.demo-image__error .block, +.demo-image__placeholder .block { + width: 49%; +} +.demo-image__error .el-image, +.demo-image__placeholder .el-image { + width: 300px; + height: 200px; +} +.demo-image__error .image-slot, +.demo-image__placeholder .image-slot { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + background: #f5f7fa; + color: #909399; + font-size: 14px; +} +.demo-image__placeholder .dot { + animation: dot 2s steps(3, start) infinite; + overflow: hidden; +} +.demo-image__error .image-slot { + font-size: 30px; +} +.demo-image__lazy { + height: 400px; + overflow-y: auto; +} +.demo-image__lazy .el-image { + display: block; + min-height: 200px; + margin-bottom: 10px; +} +.demo-image__lazy .el-image:last-child { + margin-bottom: 0; +} +.infinite-list { + height: 300px; + padding: 0; + margin: 0; + list-style: none; +} +.infinite-list .infinite-list-item { + display: flex; + align-items: center; + justify-content: center; + height: 50px; + background: #e8f3fe; + margin: 10px; + color: #7dbcfc; +} +.infinite-list .infinite-list-item + .list-item { + margin-top: 10px; +} +.infinite-list-wrapper { + height: 300px; + text-align: center; +} +.infinite-list-wrapper .list { + padding: 0; + margin: 0; + list-style: none; +} +.infinite-list-wrapper .list-item { + display: flex; + align-items: center; + justify-content: center; + height: 50px; + background: #fff6f6; + color: #ff8484; +} +.infinite-list-wrapper .list-item + .list-item { + margin-top: 10px; +} +.demo-avatar.demo-basic { + text-align: center; +} +.demo-avatar.demo-basic .demo-basic--circle, +.demo-avatar.demo-basic .demo-basic--square { + display: flex; + justify-content: space-between; + align-items: center; +} +.demo-avatar.demo-basic .demo-basic--circle .block, +.demo-avatar.demo-basic .demo-basic--square .block { + flex: 1; +} +.demo-avatar.demo-basic .demo-basic--circle .block:not(:last-child), +.demo-avatar.demo-basic .demo-basic--square .block:not(:last-child) { + border-right: 1px solid rgba(224, 230, 237, 0.5); +} +.demo-avatar .sub-title { + margin-bottom: 10px; + font-size: 14px; + color: #8492a6; +} +.demo-avatar .el-col:not(:last-child) { + border-right: 1px solid rgba(224, 230, 237, 0.5); +} +.demo-avatar .demo-type { + display: flex; +} +.demo-avatar .demo-type > div { + flex: 1; + text-align: center; +} +.demo-avatar .demo-type > div:not(:last-child) { + border-right: 1px solid rgba(224, 230, 237, 0.5); +} +.demo-avatar .demo-fit { + display: flex; + text-align: center; + justify-content: space-between; +} +.demo-avatar .demo-fit .block { + flex: 1; + display: flex; + flex-direction: column; + flex-grow: 0; +} +.demo-avatar .demo-fit .title { + margin-bottom: 10px; + font-size: 14px; + color: #8492a6; +} +.demo-drawer__content { + display: flex; + flex-direction: column; + height: 100%; +} +.demo-drawer__content form { + flex: 1; +} +.demo-drawer__footer { + display: flex; +} +.demo-drawer__footer button { + flex: 1; +} +.el-drawer__body { + padding: 20px; +} +body, +html { + margin: 0; + padding: 0; + height: 100%; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, + Microsoft YaHei, SimSun, sans-serif; + font-weight: 400; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: transparent; +} +body.is-component, +html.is-component { + overflow: hidden; +} +#app { + height: 100%; +} +#app.is-component { + overflow-y: hidden; +} +#app.is-component .main-cnt { + padding: 0; + margin-top: 0; + height: 100%; + min-height: auto; +} +#app.is-component .headerWrapper { + position: fixed; + width: 100%; + left: 0; + top: 0; + z-index: 1500; +} +#app.is-component .headerWrapper .container { + padding: 0; +} +a { + color: #409eff; + text-decoration: none; +} +code { + background-color: #f9fafc; + padding: 0 4px; + border: 1px solid #eaeefb; + border-radius: 4px; +} +button, +input, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; + color: inherit; +} +.hljs { + line-height: 1.8; + font-family: Menlo, Monaco, Consolas, Courier, monospace; + font-size: 12px; + padding: 18px 24px; + background-color: #fafafa; + border: 1px solid #eaeefb; + margin-bottom: 25px; + border-radius: 4px; + -webkit-font-smoothing: auto; +} +.main-cnt { + margin-top: -80px; + padding: 80px 0 340px; + box-sizing: border-box; + min-height: 100%; +} +.container, +.page-container { + width: 1140px; + padding: 0; + margin: 0 auto; +} +.page-container { + padding-top: 55px; +} +.page-container h2 { + font-size: 28px; + color: #1f2d3d; + margin: 0; +} +.page-container h3 { + font-size: 22px; +} +.page-container h2, +.page-container h3, +.page-container h4, +.page-container h5 { + font-weight: 400; + color: #1f2f3d; +} +.page-container h2:hover a, +.page-container h3:hover a, +.page-container h4:hover a, +.page-container h5:hover a { + opacity: 0.4; +} +.page-container h2 a, +.page-container h3 a, +.page-container h4 a, +.page-container h5 a { + float: left; + margin-left: -20px; + opacity: 0; + cursor: pointer; +} +.page-container h2 a:hover, +.page-container h3 a:hover, +.page-container h4 a:hover, +.page-container h5 a:hover { + opacity: 0.4; +} +.page-container p { + font-size: 14px; + color: #5e6d82; + line-height: 1.5em; +} +.page-container .tip { + padding: 8px 16px; + background-color: #ecf8ff; + border-radius: 4px; + border-left: 5px solid #50bfff; + margin: 20px 0; +} +.page-container .tip code { + background-color: hsla(0, 0%, 100%, 0.7); + color: #445368; +} +.page-container .warning { + padding: 8px 16px; + background-color: #fff6f7; + border-radius: 4px; + border-left: 5px solid #fe6c6f; + margin: 20px 0; +} +.page-container .warning code { + background-color: hsla(0, 0%, 100%, 0.7); + color: #445368; +} +.demo { + margin: 20px 0; +} +@media (max-width: 1140px) { + .container, + .page-container { + width: 100%; + } +} +@media (max-width: 768px) { + .container, + .page-container { + padding: 0 20px; + } + #app.is-component .headerWrapper .container { + padding: 0 12px; + } +} +@font-face { + font-family: icomoon; + src: url(data:application/vnd.ms-fontobject;base64,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); + src: url(data:application/vnd.ms-fontobject;base64,SAgAAKQHAAABAAIAAAAAAAAAAAAAAAAAAAABAJABAAAAAExQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAa7522AAAAAAAAAAAAAAAAAAAAAAAAA4AaQBjAG8AbQBvAG8AbgAAAA4AUgBlAGcAdQBsAGEAcgAAABYAVgBlAHIAcwBpAG8AbgAgADEALgAwAAAADgBpAGMAbwBtAG8AbwBuAAAAAAAAAQAAAAsAgAADADBPUy8yDxIFxwAAALwAAABgY21hcBdW0ooAAAEcAAAAVGdhc3AAAAAQAAABcAAAAAhnbHlmx3GYOgAAAXgAAAPUaGVhZArUIjUAAAVMAAAANmhoZWEHwgPJAAAFhAAAACRobXR4FgAAAAAABagAAAAgbG9jYQMUAf4AAAXIAAAAEm1heHAADgBvAAAF3AAAACBuYW1lmUoJ+wAABfwAAAGGcG9zdAADAAAAAAeEAAAAIAADA5oBkAAFAAACmQLMAAAAjwKZAswAAAHrADMBCQAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAEAAAOkDA8D/wABAA8AAQAAAAAEAAAAAAAAAAAAAACAAAAAAAAMAAAADAAAAHAABAAMAAAAcAAMAAQAAABwABAA4AAAACgAIAAIAAgABACDpA//9//8AAAAAACDpAP/9//8AAf/jFwQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAUAAP/ABAADwAATACcANQBDAFEAABM0PgIzMh4CFRQOAiMiLgIlNC4CIyIOAhUUHgIzMj4CJTQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNQEiBhUUFjMhMjY1NCYjAFCLu2pqu4tQUIu7amq7i1ADs0R2n1pan3ZERHafWlqfdkT9cx4WFR4eFRYeAU0eFRYeHhYVHv72ERgYEQEuERgYEQHAaruLUFCLu2pqu4tQUIu7alqfdkREdp9aWp92RER2n+cVHh4VMxYeHhYzFR4eFTMWHh4W/wAZEREZGRERGQAAAAQAAP/ABAADwAATACEALwBPAAABIg4CFRQeAjMyPgI1NC4CATQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNRMnLgEjIgYPAQ4BIyImNTQ2Nyc3PgEzMhYXHgEVFAYnAgBqu4tQUIu7amq7i1BQi7v+vB4WFR4eFRYeAU0eFRYeHhYVHkQEKlovMFsqBAEFAhAVBgYBCjJrNTZpMwkKHBMDwFCLu2pqu4tQUIu7amq7i1D+jRUeHhUzFh4eFjMVHh4VMxYeHhb+mwEVFRUVAQEBGBEIDwYDBRgaGRoFEwwTGgYAAAQAAP/ABAADwAATACEALwA9AAAFIi4CNTQ+AjMyHgIVFA4CARUUFjMyNj0BNCYjIgYFFRQWMzI2PQE0JiMiBgEiBhUUFjMhMjY1NCYjAgBqu4tQUIu7amq7i1BQi7v+vB4WFR4eFRYeAU0eFRYeHhYVHv72ERgYEQEuERgYEUBQi7tqaruLUFCLu2pqu4tQAo0zFh4eFjMVHh4VMxYeHhYzFR4e/rgZEREZGRERGQAABAAA/8AEAAPAABMAUABeAGwAAAEiDgIVFB4CMzI+AjU0LgITFAYVDgEVDgMjOAExOAExIi4CJzQmJzQmNS4BNTQ2Nz4BMzIWFzEeATMyNjcxPgEzMhYXHgEVFAYHAzQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNQIAaruLUFCLu2pqu4tQUIu7xwEBARU/TVsyMltNPxUBAQEBAQICBRUMDBUFIHhLS3ggBRUMDBUFAgIBAb4eFRYeHhYVHv6zHhYVHh4VFh4DwFCLu2pqu4tQUIu7amq7i1D9cgICAQECASlCMBsbMEIpAQIBAQICAgYDBQkECwwMCz1MTD0LDAwLBAkFAwYCARsVHh4VMxYeHhYzFR4eFTMWHh4WAAAAAQAAAAAAANh2vmtfDzz1AAsEAAAAAADT2u7cAAAAANPa7twAAP/ABAADwAAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAAEAAABAAAAAAAAAAAAAAAAAAAACAQAAAAAAAAAAAAAAAIAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAKABQAHgCQAQIBWgHqAAAAAQAAAAgAbQAFAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGljb21vb24AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb21vb24AaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb21vb24AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=#iefix) + format('embedded-opentype'), + url(data:font/ttf;base64,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) + format('truetype'), + url(data:font/woff;base64,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) + format('woff'), + url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxmb250IGlkPSJpY29tb29uIiBob3Jpei1hZHYteD0iMTAyNCI+PGZvbnQtZmFjZSB1bml0cy1wZXItZW09IjEwMjQiIGFzY2VudD0iOTYwIiBkZXNjZW50PSItNjQiLz48Z2x5cGggaG9yaXotYWR2LXg9IjUxMiIvPjxnbHlwaCB1bmljb2RlPSLupIAiIGdseXBoLW5hbWU9InJhdGUtZmFjZS1vZmYiIGQ9Ik0wIDQ0OGMwIDI4Mi43NjYgMjI5LjIzNCA1MTIgNTEyIDUxMnM1MTItMjI5LjIzNCA1MTItNTEyYzAtMjgyLjc2Ni0yMjkuMjM0LTUxMi01MTItNTEyUzAgMTY1LjIzNCAwIDQ0OHptOTQ3LjIgMGMwIDI0MC4zNTEtMTk0Ljg0OSA0MzUuMi00MzUuMiA0MzUuMlM3Ni44IDY4OC4zNTEgNzYuOCA0NDggMjcxLjY0OSAxMi44IDUxMiAxMi44IDk0Ny4yIDIwNy42NDkgOTQ3LjIgNDQ4ek0yOTQuNCA1ODguODUzQzI5NC40IDYxNy4xIDMxNy4xMjYgNjQwIDM0NS42IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3em0zMzIuOCAwQzYyNy4yIDYxNy4xIDY0OS45MjYgNjQwIDY3OC40IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3ek0zNjEuMTQzIDI4MS42QzMzOC40MzIgMjgxLjYgMzIwIDI2Mi45NjMgMzIwIDI0MHMxOC40MzItNDEuNiA0MS4xNDMtNDEuNmgzMDEuNzE0QzY4NS41NjggMTk4LjQgNzA0IDIxNy4wMzcgNzA0IDI0MHMtMTguNDMyIDQxLjYtNDEuMTQzIDQxLjZIMzYxLjE0M3oiLz48Z2x5cGggdW5pY29kZT0i7qSBIiBnbHlwaC1uYW1lPSJyYXRlLWZhY2UtMSIgZD0iTTUxMi4wMDEgOTYwQzIyOS4yMyA5NjAgMCA3MzAuNzcgMCA0NDcuOTk4IDAgMTY1LjIyOCAyMjkuMjMtNjQgNTEyLjAwMS02NCA3OTQuNzctNjQgMTAyNCAxNjUuMjI3IDEwMjQgNDQ3Ljk5OFM3OTQuNzcgOTYwIDUxMi4wMDEgOTYwek0yOTQuNCA1ODguODUzQzI5NC40IDYxNy4xIDMxNy4xMjYgNjQwIDM0NS42IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3em0zMzIuOCAwQzYyNy4yIDYxNy4xIDY0OS45MjYgNjQwIDY3OC40IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3em02Ny4zMjktNDA3LjY1NmwtMy40MjIgMS4yMTZjLTU2LjE1IDI3Ljg3Mi0xMTYuMzg4IDQyLjA0Ny0xNzguODgyIDQyLjA0Ny02NC41NTYgMC0xMjUuNjExLTE0LjMxNi0xODEuNTE1LTQyLjQ1bC0zLjM4Mi0xLjEzMmMtMi4xMDItLjYyOC00Ljk0NS0xLjUyOS04LjQ4OS0xLjUyOS0yMC41NTQgMC0zNy4yMzkgMTguMjktMzcuMjM5IDQwLjczNCAwIDEwLjY1NSA0LjU3MSAyMS4zNjEgMTIuMTE0IDI5LjM5OWwtLjQ1NiAyLjQ4MyA5LjUxNiA0LjY5OGM2Ni43NCAzMy4xMDQgMTM5LjMzNiA1MC41MzcgMjA5LjkwNyA1MC41MzcgNzEuODg5IDAgMTQyLjMzNi0xNi45ODQgMjEwLjMxNC01MC45NDggMTEuOTQzLTcuMTgxIDE5LjQwNS0yMC45NTMgMTkuNDA1LTM1LjkwMyAwLTI2LjMyOC0yMS43MS00Ny45NTgtNDcuODcxLTM5LjE1M3oiLz48Z2x5cGggdW5pY29kZT0i7qSCIiBnbHlwaC1uYW1lPSJyYXRlLWZhY2UtMiIgZD0iTTUxMi02NEMyMjkuMjM0LTY0IDAgMTY1LjIzNCAwIDQ0OHMyMjkuMjM0IDUxMiA1MTIgNTEyYzI4Mi43NjYgMCA1MTItMjI5LjIzNCA1MTItNTEyUzc5NC43NjYtNjQgNTEyLTY0ek0yOTQuNCA1ODguODUzdi01MS4zMDdjMC0yOC40ODIgMjIuOTIzLTUxLjE0NyA1MS4yLTUxLjE0NyAyOC40NzQgMCA1MS4yIDIyLjg5OSA1MS4yIDUxLjE0N3Y1MS4zMDdjMCAyOC40ODItMjIuOTIzIDUxLjE0Ny01MS4yIDUxLjE0Ny0yOC40NzQgMC01MS4yLTIyLjg5OS01MS4yLTUxLjE0N3ptMzMyLjggMHYtNTEuMzA3YzAtMjguNDgyIDIyLjkyMy01MS4xNDcgNTEuMi01MS4xNDcgMjguNDc0IDAgNTEuMiAyMi44OTkgNTEuMiA1MS4xNDd2NTEuMzA3YzAgMjguNDgyLTIyLjkyMyA1MS4xNDctNTEuMiA1MS4xNDctMjguNDc0IDAtNTEuMi0yMi44OTktNTEuMi01MS4xNDd6TTM2MS4xNDMgMjgxLjZDMzM4LjQzMiAyODEuNiAzMjAgMjYyLjk2MyAzMjAgMjQwczE4LjQzMi00MS42IDQxLjE0My00MS42aDMwMS43MTRDNjg1LjU2OCAxOTguNCA3MDQgMjE3LjAzNyA3MDQgMjQwcy0xOC40MzIgNDEuNi00MS4xNDMgNDEuNkgzNjEuMTQzeiIvPjxnbHlwaCB1bmljb2RlPSLupIMiIGdseXBoLW5hbWU9InJhdGUtZmFjZS0zIiBkPSJNNTEyLjAwMSA5NjBDMjI5LjIzMSA5NjAgMCA3MzAuNzcgMCA0NDguMDAxUzIyOS4yMy02NCA1MTIuMDAxLTY0Qzc5NC43NzEtNjQgMTAyNCAxNjUuMjMgMTAyNCA0NDcuOTk5Uzc5NC43NzEgOTYwIDUxMi4wMDEgOTYwem0zMDUuNDk0LTY1NC40MzVhNDAuNDA2IDQwLjQwNiAwIDAgMC0xLjU2OS00LjM1IDQwLjg1IDQwLjg1IDAgMCAwLTIuMzE3LTQuNTU2Qzc1Ny45NzggMTg5LjA0NiA2NDQuMDkxIDExNS4yIDUxMi4yODYgMTE1LjJsLS4yODYuMDAyLS4yODYtLjAwMmMtMTMxLjgwNCAwLTI0NS42OTMgNzMuODQ1LTMwMS4zMjMgMTgxLjQ1OWE0MC44NSA0MC44NSAwIDAgMC0yLjMxNyA0LjU1NiA0MC4zMjggNDAuMzI4IDAgMCAwLTEuNTY5IDQuMzUgNDAuMzE3IDQwLjMxNyAwIDAgMC0xLjcwNSAxMS41OTcgNDAuMzE0IDQwLjMxNCAwIDAgMCA0LjM3MiAxOC4yODJjNi44OTcgMTMuNjAxIDIxLjIzOSAyMi45NTUgMzcuODIyIDIyLjk1NXMzMC45MjctOS4zNTUgMzcuODIzLTIyLjk1NWguNjc2QzMyNi45MDQgMjUzLjk5MSA0MTIuNjI0IDE5Ny45IDUxMiAxOTcuNzkyYzk5LjM3NS4xMDggMTg1LjA5NSA1Ni4yIDIyNi41MDcgMTM3LjY1MmguNjc2YzYuODk3IDEzLjYwMSAyMS4yMzkgMjIuOTU1IDM3LjgyMyAyMi45NTVzMzAuOTI3LTkuMzU1IDM3LjgyMi0yMi45NTVhNDAuMjk4IDQwLjI5OCAwIDAgMCA0LjM3Mi0xOC4yODJjMC00LjAyOS0uNjAyLTcuOTE4LTEuNzA1LTExLjU5N3pNNjI3LjIgNTg4Ljg1M0M2MjcuMiA2MTcuMSA2NDkuOTI2IDY0MCA2NzguNCA2NDBjMjguMjc3IDAgNTEuMi0yMi42NjQgNTEuMi01MS4xNDd2LTUxLjMwN2MwLTI4LjI0Ny0yMi43MjYtNTEuMTQ3LTUxLjItNTEuMTQ3LTI4LjI3NyAwLTUxLjIgMjIuNjY0LTUxLjIgNTEuMTQ3djUxLjMwN3ptLTMzMi44IDBDMjk0LjQgNjE3LjEgMzE3LjEyNiA2NDAgMzQ1LjYgNjQwYzI4LjI3NyAwIDUxLjItMjIuNjY0IDUxLjItNTEuMTQ3di01MS4zMDdjMC0yOC4yNDctMjIuNzI2LTUxLjE0Ny01MS4yLTUxLjE0Ny0yOC4yNzcgMC01MS4yIDIyLjY2NC01MS4yIDUxLjE0N3Y1MS4zMDd6Ii8+PC9mb250PjwvZGVmcz48L3N2Zz4=) + format('svg'); + font-weight: 400; + font-style: normal; +} +[class*=' icon-'], +[class^='icon-'] { + font-family: icomoon !important; + speak: none; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.icon-rate-face-off:before { + content: '\e900'; +} +.icon-rate-face-1:before { + content: '\e901'; +} +.icon-rate-face-2:before { + content: '\e902'; +} +.icon-rate-face-3:before { + content: '\e903'; +} + +.config { + padding: 5px 0; +} +.config-label { + color: #606266; + font-size: 14px; + padding-bottom: 8px; + position: relative; +} +.content-80 { + box-sizing: border-box; + display: inline-block; + width: 80%; +} +.content-20 { + width: 20%; +} +.content-10, +.content-20 { + box-sizing: border-box; + display: inline-block; + vertical-align: bottom; +} +.content-10 { + width: 10%; +} +.content-15 { + box-sizing: border-box; + display: inline-block; + width: 15%; + vertical-align: bottom; +} +input { + cursor: pointer; +} +.colorPicker { + margin-left: 10px; + vertical-align: bottom; +} +.select { + width: 100%; +} +.plus-button[data-v-98c1688e] { + position: absolute; + left: 90%; + margin-top: 4px; +} +.colorPicker[data-v-98c1688e] { + margin-left: 0; +} +.content-20 .el-input__suffix-inner span[data-v-98c1688e] { + line-height: 28px; +} +.content-20[data-v-98c1688e] { + padding: 0 3px; +} +.content-10[data-v-98c1688e] { + vertical-align: top; +} +.content-tip[data-v-98c1688e] { + color: #909399; + font-size: 12px; +} +.config-content[data-v-98c1688e] { + padding: 5px 0; +} +.el-button--mini.is-round[data-v-98c1688e] { + padding: 3px; +} +.editor-main { + padding: 0 18px 15px; + overflow-y: auto; +} +.category-name { + color: #c0c4cc; + font-size: 18px; + display: block; + margin: 13px 0 3px; +} +.configurator-action { + padding: 15px 18px 0; +} +.configurator-action .action-group { + padding: 5px 0; +} +.configurator-action .action-group img { + cursor: not-allowed; + width: 16px; + height: 16px; + padding: 7px 0; + margin-left: 5px; + opacity: 0.5; +} +.configurator-action .action-group img.active { + opacity: 1; + cursor: pointer; +} +.configurator-action .action-group img:last-of-type { + margin-left: 10px; +} +.configurator-action .action-group .button-group { + float: right; +} +.configurator-action .action-group .button-group .el-button { + padding: 6px 15px; +} +.configurator-action .action-group .button-group .el-button.is-disabled { + color: #c0c4cc; + background-color: #fff; + border-color: #ebeef5; +} +.configurator-action .action-group .button-group .reset { + background: #e6f1fc; + color: #1989fa; + border-color: #a2cffc; +} +.configurator-action .action-group .button-group .download { + background: #1989fa; + color: #fff; + border-color: #1989fa; +} +.configurator-action .selector { + width: 100%; +} +.configurator-action .selector input { + background: #f5f7fa; + border: none; + font-size: 18px; + padding-left: 0; + color: #606266; +} +.configurator-action .line { + width: 100%; + height: 0; + border-bottom: 1px solid #dcdfe6; +} +.main-configurator { + height: 100%; + display: flex; + flex-direction: column; +} +.component-preview { + padding-right: 10px; +} +.component-preview:last-of-type { + padding-bottom: 20px; +} +.component-preview h4 { + font-size: 20px; + margin: 40px 0 20px; + color: #909399; +} +.component-preview .demo-item { + margin-top: 10px; + margin-right: 40px; +} +.component-preview .demo-line { + margin: 15px 0; +} +.component-preview .el-carousel__item:nth-child(2n) { + background-color: #99a9bf; +} +.component-preview .el-carousel__item:nth-child(odd) { + background-color: #d3dce6; +} +.component-preview .el-avatar:not(:last-child) { + margin-right: 20px; +} +.component-preview .avatar-demo { + display: flex; + align-items: center; +} +.component-preview .heading > div { + margin-bottom: 15px; +} +.component-preview .title { + font-size: 18px; + font-weight: 400; + padding: 0 20px; +} +.component-preview .paragraph { + padding: 0 20px; +} +.component-preview .demo-color-box { + margin: 0; +} +.component-preview .color { + margin-right: -12%; +} +.theme-card-item { + user-select: none; + border-radius: 4px; + overflow: hidden; + background: #fff; + height: 90%; + margin: 25px 0; + box-shadow: 0 0 1px 0 #666; +} +.theme-card-item.is-hidden { + opacity: 0; + height: 0; +} +.theme-card-item .upload { + cursor: pointer; + background: #f5f7fa; + height: 100%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; +} +.theme-card-item .upload .upload-action { + width: 40%; + margin: 0 auto; + text-align: center; + color: #606266; +} +.theme-card-item .upload .upload-action img { + display: block; + margin: 0 auto; +} +.theme-card-item .upload .upload-action span { + display: block; + font-size: 14px; + margin-top: 8px; +} +.theme-card-item .preview { + position: relative; + height: 70%; + width: 100%; +} +.theme-card-item .preview .line { + height: 50%; +} +.theme-card-item .preview .line-2 { + width: 50%; + height: 100%; + display: inline-block; +} +.theme-card-item .preview .line-4 { + width: 25%; + height: 100%; + display: inline-block; +} +.theme-card-item .preview .action { + transition: all 0.3s; + position: absolute; + opacity: 0; + top: 0; + left: 0; + right: 0; + bottom: 0; +} +.theme-card-item .preview .action .action-mask { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: #000; + opacity: 0.4; +} +.theme-card-item .preview .action .action-block { + position: absolute; + width: 50%; + height: 50%; + left: 25%; + top: 25%; +} +.theme-card-item .preview .action .action-item { + cursor: pointer; + display: inline-block; + height: 100%; + width: 30%; + color: #eee; +} +.theme-card-item .preview .action .action-item:hover { + color: #fff; +} +.theme-card-item .preview .action .action-item:hover .circle { + border-color: #fff; +} +.theme-card-item .preview .action .action-item .icon { + height: 50%; + font-size: 22px; + text-align: center; + display: flex; + justify-content: center; + align-items: center; +} +.theme-card-item .preview .action .action-item .icon img { + width: 130%; +} +.theme-card-item .preview .action .action-item .name { + font-size: 12px; + height: 50%; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + margin-top: 4px; +} +.theme-card-item .preview .action .action-item-right { + margin-left: 40%; +} +.theme-card-item .info { + height: 30%; + line-height: 16px; + display: flex; + align-items: center; +} +.theme-card-item .info .info-center { + width: 100%; +} +.theme-card-item .info .title { + font-weight: 700; + font-size: 16px; + color: #303133; + padding: 0 12px; + justify-content: space-between; +} +.theme-card-item .info .right { + float: right; + font-weight: 400; + font-size: 14px; + color: #909399; +} +.theme-card-item .info .more { + font-size: 16px; + cursor: pointer; +} +.theme-card-item .info .description { + padding: 0 12px; + font-size: 14px; + color: #606266; + margin-top: 10px; +} +.theme-card-item.is-upload { + box-shadow: none; + border: 1px dashed #dcdfe6; +} +.theme-card-item.is-upload:hover { + box-shadow: none; +} +.theme-card-item:hover { + box-shadow: 0 0 10px 0 #999; +} +.theme-card-item:hover .action { + opacity: 1; +} diff --git a/packages/design-system/theme/preview/index.html b/packages/design-system/theme/preview/index.html new file mode 100644 index 0000000000..6a76f97ee1 --- /dev/null +++ b/packages/design-system/theme/preview/index.html @@ -0,0 +1,1525 @@ + + + + + + + Deprecated - Element UI Theme CSS Variable + + + + + + +
+ + + +
+

Color

+
+ + +
+ {{color}} +
{{dataProxy(color)}}
+
+
+
+
+
+
+ + +
+ Primary Text +
{{color_text_primary}}
+
+
+ +
+ Regular Text +
{{color_text_regular}}
+
+
+ +
+ Secondary Text +
{{color_text_secondary}}
+
+
+ +
+ Placeholder +
{{color_text_placeholder}}
+
+
+
+ + + +
+ Border Base +
{{border_color_base}}
+
+
+ +
+ Border Light +
{{border_color_light}}
+
+
+ +
+ Border Lighter +
{{border_color_lighter}}
+
+
+ +
+ Border Extralight +
{{border_color_extra_light}}
+
+
+
+ + + +
+ Background B +
{{color_black}}
+
+
+ +
+ Background W +
{{color_white}}
+
+
+ +
+ Background +
Transparent
+
+
+
+
+ +

Typography

+ + +
+ Heading1 +
+
Heading2
+
Heading3
+
Heading4
+
Heading5
+
+ Heading6 +
+
+ +
Example body text
+

+ With MySpace becoming more popular every day, there is the + constant need to be different. There are millions of users. + If MySpace layouts are chosen well, then you can enhance + your profile a great deal. +

+
+ +
Example small text
+

+ Computers have become ubiquitous in almost every facet of + our lives. At work, desk jockeys spend hours in front of + their desktops, while delivery people scan bar codes with + handhelds and workers in the field stay in touch with the + central office via their notebooks. Computer hardware weaves + itself through the fabric of our lives. +

+
+
+ +

Button

+ + Default + Primary + Success + Info + Warning + Danger + + + Default + Primary + Success + Info + Warning + Danger + + + Plain + Primary + Success + Info + Warning + Danger + + + Plain + Primary + Success + Info + Warning + Danger + + + Round + Primary + Success + Info + Warning + Danger + + + + + + + + + + + Default + Medium + Small + Mini + + + 文字按钮 + 文字按钮 + +

Radio

+ + Option A + Option B + + + + + + + + + + + Option A + Option B + +

Checkbox

+ + Option + + + + {{city}} + + + + + +

Input

+ + + +

InputNumber

+ + + +

Select

+ + + + + + +

Cascader

+ + + +

Switch

+ + + + + +

Slider

+ + + +

DatePicker

+ + + +

Rate

+ + + + + +

Transfer

+ + + Operation + Operation + + +

Table

+ + + + + + + +

Tag

+ + Tag One + Tag Two + Tag Three + Tag Four + Tag Five + +

Progress

+ + + + + +

Tree

+ + + +

Pagination

+ + + +

Badge

+ + + comments + + + replies + + + comments + + + replies + + +

Alert

+ + + + + + + +

Loading

+ + + + + + + +

Message

+ + + + + + +

MessageBox

+ +
+
+
+ Warning +
+ +
+
+
+
+

This will permanently delete the file. Continue?

+
+ +
+
+ +
+
+
+

Notification

+ + + +

Menu

+ + + Processing Center + + + item one + item two + item three + + + item one + item two + item three + + + Info + + Orders + + + + + + + item one + item one + + + item three + + + + item one + + + + + Navigator Two + + + + Navigator Three + + + + Navigator Four + + + +

Tabs

+ + + User + Config + Role + Task + + + User + Config + Role + Task + + +

Dialog

+ + + +

Tooltip

+ + + + +

Popover

+ + + +

Card

+ + +
+ Card name +
+
+
+

Carousel

+ + + +

{{ item }}

+
+
+
+

Collapse

+ + + +
+ Consistent with real life: in line with the process and + logic of real life, and comply with languages and habits + that the users are used to; +
+
+ +
+ Operation feedback: enable the users to clearly perceive + their operations by style updates and interactive effects; +
+
+
+
+

Avatar

+ + + avatar + + large + medium + small + +

Tree

+ + + +
+
+
+ +
+ +
+ Color + 复制变量 +
+ +

color-primary 主题色

+ + + + + + +
+ + +

color-success 成功题色

+ + + + + + +
+ + +

color-warning 警告题色

+ + + + + + +
+ + +

color-danger 危险题色

+ + + + + + +
+ + +

color-info 信息题色

+ + + + + + +
+ + +

color-text-primary 主要文字颜色

+ + + + + + +
+ + +

color-text-regular 常规文字颜色

+ + + + + + +
+ + +

color-text-secondary 次要文字颜色

+ + + + + + +
+ + +

color-text-placeholder 占位文字颜色

+ + + + + + +
+ + +

border-color-base 一级边框颜色

+ + + + + + +
+ + +

border-color-light 二级边框颜色

+ + + + + + +
+ + +

border-color-lighter 三级边框颜色

+ + + + + + +
+ + +

border-color-xlight 四级边框颜色

+ + + + + + +
+
+
+ + +
{{ cssVariables}}
+ 使用方式:将上面的代码通过style属性添加到项目的html标签上 +
+
+
+
+ + + + + + + + diff --git a/packages/design-system/theme/src/_tokens.dark.scss b/packages/design-system/theme/src/_tokens.dark.scss new file mode 100644 index 0000000000..5cf77596b2 --- /dev/null +++ b/packages/design-system/theme/src/_tokens.dark.scss @@ -0,0 +1,260 @@ +@mixin theme { + --color-primary-h: 7; + --color-primary-s: 100%; + --color-primary-l: 68%; + --color-primary: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-l) + ); + + --color-primary-tint-1-l: 18%; + --color-primary-tint-1: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-tint-1-l) + ); + + --color-primary-tint-2-l: 9%; + --color-primary-tint-2: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-tint-2-l) + ); + + --color-primary-tint-3-l: 3%; + --color-primary-tint-3: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-tint-3-l) + ); + + --color-primary-shade-1-l: 89%; + --color-primary-shade-1: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-shade-1-l) + ); + + --color-secondary-h: 247; + --color-secondary-s: 100%; + --color-secondary-l: 35%; + --color-secondary: hsl( + var(--color-secondary-h), + var(--color-secondary-s), + var(--color-secondary-l) + ); + + --color-success-h: 150; + --color-success-s: 74%; + --color-success-l: 60%; + --color-success: hsl( + var(--color-success-h), + var(--color-success-s), + var(--color-success-l) + ); + + --color-success-tint-1-l: 12%; + --color-success-tint-1: hsl( + var(--color-success-h), + var(--color-success-s), + var(--color-success-tint-1-l) + ); + + --color-success-tint-2-l: 3%; + --color-success-tint-2: hsl( + var(--color-success-h), + var(--color-success-s), + var(--color-success-tint-2-l) + ); + + --color-warning-h: 36; + --color-warning-s: 77%; + --color-warning-l: 43%; + --color-warning: hsl( + var(--color-warning-h), + var(--color-warning-s), + var(--color-warning-l) + ); + + --color-warning-tint-1-l: 12%; + --color-warning-tint-1: hsl( + var(--color-warning-h), + var(--color-warning-s), + var(--color-warning-tint-1-l) + ); + + --color-warning-tint-2-l: 4%; + --color-warning-tint-2: hsl( + var(--color-warning-h), + var(--color-warning-s), + var(--color-warning-tint-2-l) + ); + + --color-danger-h: 0; + --color-danger-s: 88%; + --color-danger-l: 35%; + --color-danger: hsl( + var(--color-danger-h), + var(--color-danger-s), + var(--color-danger-l) + ); + + --color-danger-tint-1-l: 8%; + --color-danger-tint-1: hsl( + var(--color-danger-h), + var(--color-danger-s), + var(--color-danger-tint-1-l) + ); + + --color-danger-tint-2-l: 3%; + --color-danger-tint-2: hsl( + var(--color-danger-h), + var(--color-danger-s), + var(--color-danger-tint-2-l) + ); + + --color-info-h: 220; + --color-info-s: 4%; + --color-info-l: 42%; + --color-info: hsl( + var(--color-info-h), + var(--color-info-s), + var(--color-info-l) + ); + + --color-info-tint-1-l: 12%; + --color-info-tint-1: hsl( + var(--color-info-h), + var(--color-info-s), + var(--color-info-tint-1-l) + ); + + --color-info-tint-2-l: 4%; + --color-info-tint-2: hsl( + var(--color-info-h), + var(--color-info-s), + var(--color-info-tint-2-l) + ); + + --color-text-dark-h: 0; + --color-text-dark-s: 0%; + --color-text-dark-l: 100%; + --color-text-dark: hsl( + var(--color-text-dark-h), + var(--color-text-dark-s), + var(--color-text-dark-l) + ); + + --color-text-base-h: 240; + --color-text-base-s: 4%; + --color-text-base-l: 49%; + --color-text-base: hsl( + var(--color-text-base-h), + var(--color-text-base-s), + var(--color-text-base-l) + ); + + --color-text-light-h: 220; + --color-text-light-s: 4%; + --color-text-light-l: 42%; + --color-text-light: hsl( + var(--color-text-light-h), + var(--color-text-light-s), + var(--color-text-light-l) + ); + + --color-text-lighter-h: 222; + --color-text-lighter-s: 17%; + --color-text-lighter-l: 12%; + --color-text-lighter: hsl( + var(--color-text-lighter-h), + var(--color-text-lighter-s), + var(--color-text-lighter-l) + ); + + --color-text-xlight-h: 0; + --color-text-xlight-s: 0%; + --color-text-xlight-l: 100%; + --color-text-xlight: hsl( + var(--color-text-xlight-h), + var(--color-text-xlight-s), + var(--color-text-xlight-l) + ); + + --color-foreground-base-h: 220; + --color-foreground-base-s: 20%; + --color-foreground-base-l: 12%; + --color-foreground-base: hsl( + var(--color-foreground-base-h), + var(--color-foreground-base-s), + var(--color-foreground-base-l) + ); + + --color-foreground-light-h: 0; + --color-foreground-light-s: 0%; + --color-foreground-light-l: 7%; + --color-foreground-light: hsl( + var(--color-foreground-light-h), + var(--color-foreground-light-s), + var(--color-foreground-light-l) + ); + + --color-foreground-xlight-h: 0; + --color-foreground-xlight-s: 0%; + --color-foreground-xlight-l: 0%; + --color-foreground-xlight: hsl( + var(--color-foreground-xlight-h), + var(--color-foreground-xlight-s), + var(--color-foreground-xlight-l) + ); + + --color-background-dark-h: 0; + --color-background-dark-s: 0%; + --color-background-dark-l: 100%; + --color-background-dark: hsl( + var(--color-background-dark-h), + var(--color-background-dark-s), + var(--color-background-dark-l) + ); + + --color-background-base-h: 252; + --color-background-base-s: 71%; + --color-background-base-l: 99%; + --color-background-base: hsl( + var(--color-background-base-h), + var(--color-background-base-s), + var(--color-background-base-l) + ); + + --color-background-light-h: 220; + --color-background-light-s: 27%; + --color-background-light-l: 98%; + --color-background-light: hsl( + var(--color-background-light-h), + var(--color-background-light-s), + var(--color-background-light-l) + ); + + --color-background-lighter-h: 220; + --color-background-lighter-s: 30%; + --color-background-lighter-l: 96%; + --color-background-lighter: hsl( + var(--color-background-lighter-h), + var(--color-background-lighter-s), + var(--color-background-lighter-l) + ); + + --color-background-xlight-h: 240; + --color-background-xlight-s: 4%; + --color-background-xlight-l: 19%; + --color-background-xlight: hsl( + var(--color-background-xlight-h), + var(--color-background-xlight-s), + var(--color-background-xlight-l) + ); +} + +body.theme-dark { + @include theme; +} diff --git a/packages/design-system/theme/src/_tokens.scss b/packages/design-system/theme/src/_tokens.scss new file mode 100644 index 0000000000..8206e42095 --- /dev/null +++ b/packages/design-system/theme/src/_tokens.scss @@ -0,0 +1,307 @@ +@mixin theme { + --color-primary-h: 6.9; + --color-primary-s: 100%; + --color-primary-l: 67.6%; + --color-primary: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-l) + ); + + --color-primary-tint-1-l: 88%; + --color-primary-tint-1: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-tint-1-l) + ); + + --color-primary-tint-2-l: 94.5%; + --color-primary-tint-2: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-tint-2-l) + ); + + --color-primary-tint-3-l: 96.9%; + --color-primary-tint-3: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-tint-3-l) + ); + + --color-primary-shade-1-l: 57.6%; + --color-primary-shade-1: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-shade-1-l) + ); + + --color-primary-shade-2-l: 23%; + --color-primary-shade-2: hsl( + var(--color-primary-h), + var(--color-primary-s), + var(--color-primary-shade-2-l) + ); + + --color-secondary-h: 247; + --color-secondary-s: 49%; + --color-secondary-l: 53%; + --color-secondary: hsl( + var(--color-secondary-h), + var(--color-secondary-s), + var(--color-secondary-l) + ); + + --color-success-h: 150.4; + --color-success-s: 73.8%; + --color-success-l: 40.4%; + --color-success: hsl( + var(--color-success-h), + var(--color-success-s), + var(--color-success-l) + ); + + --color-success-tint-1-l: 90%; + --color-success-tint-1: hsl( + var(--color-success-h), + var(--color-success-s), + var(--color-success-tint-1-l) + ); + + --color-success-tint-2-l: 94.9%; + --color-success-tint-2: hsl( + var(--color-success-h), + var(--color-success-s), + var(--color-success-tint-2-l) + ); + + --color-warning-h: 36; + --color-warning-s: 77%; + --color-warning-l: 57%; + --color-warning: hsl( + var(--color-warning-h), + var(--color-warning-s), + var(--color-warning-l) + ); + + --color-warning-tint-1-l: 88%; + --color-warning-tint-1: hsl( + var(--color-warning-h), + var(--color-warning-s), + var(--color-warning-tint-1-l) + ); + + --color-warning-tint-2-l: 96%; + --color-warning-tint-2: hsl( + var(--color-warning-h), + var(--color-warning-s), + var(--color-warning-tint-2-l) + ); + + --color-danger-h: 0; + --color-danger-s: 87.6%; + --color-danger-l: 65.3%; + --color-danger: hsl( + var(--color-danger-h), + var(--color-danger-s), + var(--color-danger-l) + ); + + --color-danger-tint-1-l: 93.9%; + --color-danger-tint-1: hsl( + var(--color-danger-h), + var(--color-danger-s), + var(--color-danger-tint-1-l) + ); + --color-danger-tint-2-l: 96.9%; + --color-danger-tint-2: hsl( + var(--color-danger-h), + var(--color-danger-s), + var(--color-danger-tint-2-l) + ); + + --color-info-h: 220; + --color-info-s: 4%; + --color-info-l: 58%; + --color-info: hsl( + var(--color-info-h), + var(--color-info-s), + var(--color-info-l) + ); + + --color-info-tint-1-l: 88%; + --color-info-tint-1: hsl( + var(--color-info-h), + var(--color-info-s), + var(--color-info-tint-1-l) + ); + --color-info-tint-2-l: 96%; + --color-info-tint-2: hsl( + var(--color-info-h), + var(--color-info-s), + var(--color-info-tint-2-l) + ); + + --color-text-dark-h: 0; + --color-text-dark-s: 0%; + --color-text-dark-l: 33.3%; + --color-text-dark: hsl( + var(--color-text-dark-h), + var(--color-text-dark-s), + var(--color-text-dark-l) + ); + + --color-text-base-h: 240; + --color-text-base-s: 4%; + --color-text-base-l: 51%; + --color-text-base: hsl( + var(--color-text-base-h), + var(--color-text-base-s), + var(--color-text-base-l) + ); + + --color-text-light-h: 220; + --color-text-light-s: 4.2%; + --color-text-light-l: 58.2%; + --color-text-light: hsl( + var(--color-text-light-h), + var(--color-text-light-s), + var(--color-text-light-l) + ); + + --color-text-lighter-h: 222; + --color-text-lighter-s: 16.7%; + --color-text-lighter-l: 88.2%; + --color-text-lighter: hsl( + var(--color-text-lighter-h), + var(--color-text-lighter-s), + var(--color-text-lighter-l) + ); + + --color-text-xlight-h: 0; + --color-text-xlight-s: 0%; + --color-text-xlight-l: 100%; + --color-text-xlight: hsl( + var(--color-text-xlight-h), + var(--color-text-xlight-s), + var(--color-text-xlight-l) + ); + + --color-foreground-base-h: 220; + --color-foreground-base-s: 20%; + --color-foreground-base-l: 88.2%; + --color-foreground-base: hsl( + var(--color-foreground-base-h), + var(--color-foreground-base-s), + var(--color-foreground-base-l) + ); + + --color-foreground-light-h: 0; + --color-foreground-light-s: 0%; + --color-foreground-light-l: 93.3%; + --color-foreground-light: hsl( + var(--color-foreground-light-h), + var(--color-foreground-light-s), + var(--color-foreground-light-l) + ); + + --color-foreground-xlight-h: 0; + --color-foreground-xlight-s: 0%; + --color-foreground-xlight-l: 100%; + --color-foreground-xlight: hsl( + var(--color-foreground-xlight-h), + var(--color-foreground-xlight-s), + var(--color-foreground-xlight-l) + ); + + --color-background-dark-h: 240; + --color-background-dark-s: 4.2%; + --color-background-dark-l: 18.8%; + --color-background-dark: hsl( + var(--color-background-dark-h), + var(--color-background-dark-s), + var(--color-background-dark-l) + ); + + --color-background-base-h: 220; + --color-background-base-s: 30%; + --color-background-base-l: 96.1%; + --color-background-base: hsl( + var(--color-background-base-h), + var(--color-background-base-s), + var(--color-background-base-l) + ); + + --color-background-light-h: 220; + --color-background-light-s: 27.3%; + --color-background-light-l: 97.8%; + --color-background-light: hsl( + var(--color-background-light-h), + var(--color-background-light-s), + var(--color-background-light-l) + ); + + --color-background-lighter-h: 252; + --color-background-lighter-s: 71.4%; + --color-background-lighter-l: 98.6%; + --color-background-lighter: hsl( + var(--color-background-lighter-h), + var(--color-background-lighter-s), + var(--color-background-lighter-l) + ); + + --color-background-xlight-h: 0; + --color-background-xlight-s: 0%; + --color-background-xlight-l: 100%; + --color-background-xlight: hsl( + var(--color-background-xlight-h), + var(--color-background-xlight-s), + var(--color-background-xlight-l) + ); + + --border-radius-base: 4px; + --border-radius-small: 2px; + --border-color-base: var(--color-foreground-base); + --border-color-light: var(--color-foreground-light); + + --border-style-base: solid; + --border-width-base: 1px; + --border-base: var(--border-width-base) var(--border-style-base) + var(--color-foreground-base); + + --font-size-2xs: 0.75rem; + --font-size-xs: 0.8125rem; + --font-size-s: 0.875rem; + --font-size-m: 1rem; + --font-size-l: 1.125rem; + --font-size-xl: 1.25rem; + --font-size-2xl: 1.75rem; + + --font-line-height-compact: 1.25; + --font-line-height-regular: 1.3; + --font-line-height-loose: 1.35; + --font-line-height-xloose: 1.5; + + --font-weight-regular: 400; + --font-weight-semi-bold: 500; + --font-weight-bold: 600; + --font-family: 'Open Sans', sans-serif; + + --spacing-5xs: 0.125rem; + --spacing-4xs: 0.25rem; + --spacing-3xs: 0.375rem; + --spacing-2xs: 0.5rem; + --spacing-xs: 0.75rem; + --spacing-s: 1rem; + --spacing-m: 1.25rem; + --spacing-l: 1.5rem; + --spacing-xl: 2rem; + --spacing-2xl: 3rem; + --spacing-3xl: 4rem; + --spacing-4xl: 8rem; + --spacing-5xl: 16rem; +} + +:root { + @include theme; +} diff --git a/packages/design-system/theme/src/alert.scss b/packages/design-system/theme/src/alert.scss new file mode 100644 index 0000000000..5ebaf3b9eb --- /dev/null +++ b/packages/design-system/theme/src/alert.scss @@ -0,0 +1,147 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(alert) { + width: 100%; + padding: var.$alert-padding; + margin: 0; + box-sizing: border-box; + border-radius: var.$alert-border-radius; + position: relative; + background-color: var.$color-white; + overflow: hidden; + opacity: 1; + display: flex; + align-items: center; + transition: opacity 0.2s; + + @include mixins.when(light) { + .el-alert__closebtn { + color: var(--color-text-lighter); + } + } + + @include mixins.when(dark) { + .el-alert__closebtn { + color: var.$color-white; + } + .el-alert__description { + color: var.$color-white; + } + } + + @include mixins.when(center) { + justify-content: center; + } + + @include mixins.m(success) { + &.is-light { + background-color: var.$alert-success-color; + color: var(--color-success); + + .el-alert__description { + color: var(--color-success); + } + } + + &.is-dark { + background-color: var(--color-success); + color: var.$color-white; + } + } + + @include mixins.m(info) { + &.is-light { + background-color: var.$alert-info-color; + color: var(--color-info); + } + + &.is-dark { + background-color: var(--color-info); + color: var.$color-white; + } + + .el-alert__description { + color: var(--color-info); + } + } + + @include mixins.m(warning) { + &.is-light { + background-color: var.$alert-warning-color; + color: var(--color-warning); + + .el-alert__description { + color: var(--color-warning); + } + } + + &.is-dark { + background-color: var(--color-warning); + color: var.$color-white; + } + } + + @include mixins.m(error) { + &.is-light { + background-color: var.$alert-danger-color; + color: var(--color-danger); + + .el-alert__description { + color: var(--color-danger); + } + } + + &.is-dark { + background-color: var(--color-danger); + color: var.$color-white; + } + } + + @include mixins.e(content) { + display: table-cell; + padding: 0 8px; + } + + @include mixins.e(icon) { + font-size: var.$alert-icon-size; + width: var.$alert-icon-size; + @include mixins.when(big) { + font-size: var.$alert-icon-large-size; + width: var.$alert-icon-large-size; + } + } + + @include mixins.e(title) { + font-size: var.$alert-title-font-size; + line-height: 18px; + @include mixins.when(bold) { + font-weight: bold; + } + } + + & .el-alert__description { + font-size: var.$alert-description-font-size; + margin: 5px 0 0 0; + } + + @include mixins.e(closebtn) { + font-size: var.$alert-close-font-size; + opacity: 1; + position: absolute; + top: 12px; + right: 15px; + cursor: pointer; + + @include mixins.when(customed) { + font-style: normal; + font-size: var.$alert-close-customed-font-size; + top: 9px; + } + } +} + +.el-alert-fade-enter, +.el-alert-fade-leave-active { + opacity: 0; +} diff --git a/packages/design-system/theme/src/aside.scss b/packages/design-system/theme/src/aside.scss new file mode 100644 index 0000000000..d89d63ff73 --- /dev/null +++ b/packages/design-system/theme/src/aside.scss @@ -0,0 +1,7 @@ +@use "mixins/mixins"; + +@include mixins.b(aside) { + overflow: auto; + box-sizing: border-box; + flex-shrink: 0; +} diff --git a/packages/design-system/theme/src/autocomplete.scss b/packages/design-system/theme/src/autocomplete.scss new file mode 100644 index 0000000000..8918538677 --- /dev/null +++ b/packages/design-system/theme/src/autocomplete.scss @@ -0,0 +1,80 @@ +@use "mixins/mixins"; +@use "mixins/utils"; +@use "./common/var"; +@use "./input.scss"; +@use "./scrollbar.scss"; +@use "./popper"; + +@include mixins.b(autocomplete) { + position: relative; + display: inline-block; +} + +@include mixins.b(autocomplete-suggestion) { + margin: 5px 0; + box-shadow: var.$box-shadow-light; + border-radius: var(--border-radius-base); + border: 1px solid var(--border-color-base); + box-sizing: border-box; + background-color: var.$color-white; + + @include mixins.e(wrap) { + max-height: 280px; + padding: 10px 0; + box-sizing: border-box; + } + + @include mixins.e(list) { + margin: 0; + padding: 0; + } + + & li { + padding: 0 20px; + margin: 0; + line-height: 34px; + cursor: pointer; + color: var(--color-text-dark); + font-size: var.$font-size-base; + list-style: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + &:hover { + background-color: var.$select-option-hover-background; + } + + &.highlighted { + background-color: var.$select-option-hover-background; + } + + &.divider { + margin-top: 6px; + border-top: 1px solid var.$color-black; + } + + &.divider:last-child { + margin-bottom: -6px; + } + } + + @include mixins.when(loading) { + li { + text-align: center; + height: 100px; + line-height: 100px; + font-size: 20px; + color: #999; + @include utils.utils-vertical-center; + + &:hover { + background-color: var.$color-white; + } + } + + & .el-icon-loading { + vertical-align: middle; + } + } +} diff --git a/packages/design-system/theme/src/avatar.scss b/packages/design-system/theme/src/avatar.scss new file mode 100644 index 0000000000..120b0cccb3 --- /dev/null +++ b/packages/design-system/theme/src/avatar.scss @@ -0,0 +1,51 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(avatar) { + display: inline-block; + box-sizing: border-box; + text-align: center; + overflow: hidden; + color: var.$avatar-font-color; + background: var.$avatar-background-color; + width: var.$avatar-large-size; + height: var.$avatar-large-size; + line-height: var.$avatar-large-size; + font-size: var.$avatar-text-font-size; + + > img { + display: block; + height: 100%; + vertical-align: middle; + } + + @include mixins.m(circle) { + border-radius: 50%; + } + + @include mixins.m(square) { + border-radius: var.$avatar-border-radius; + } + + @include mixins.m(icon) { + font-size: var.$avatar-icon-font-size; + } + + @include mixins.m(large) { + width: var.$avatar-large-size; + height: var.$avatar-large-size; + line-height: var.$avatar-large-size; + } + + @include mixins.m(medium) { + width: var.$avatar-medium-size; + height: var.$avatar-medium-size; + line-height: var.$avatar-medium-size; + } + + @include mixins.m(small) { + width: var.$avatar-small-size; + height: var.$avatar-small-size; + line-height: var.$avatar-small-size; + } +} diff --git a/packages/design-system/theme/src/backtop.scss b/packages/design-system/theme/src/backtop.scss new file mode 100644 index 0000000000..9813ef2028 --- /dev/null +++ b/packages/design-system/theme/src/backtop.scss @@ -0,0 +1,22 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(backtop) { + position: fixed; + background-color: var.$backtop-background-color; + width: 40px; + height: 40px; + border-radius: 50%; + color: var.$backtop-font-color; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + box-shadow: 0 0 6px rgba(0, 0, 0, 0.12); + cursor: pointer; + z-index: 5; + + &:hover { + background-color: var.$backtop-hover-background-color; + } +} diff --git a/packages/design-system/theme/src/badge.scss b/packages/design-system/theme/src/badge.scss new file mode 100644 index 0000000000..c1b1f474a0 --- /dev/null +++ b/packages/design-system/theme/src/badge.scss @@ -0,0 +1,58 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(badge) { + position: relative; + vertical-align: middle; + display: inline-block; + + @include mixins.e(content) { + background-color: var.$badge-background-color; + border-radius: var.$badge-radius; + color: var.$color-white; + display: inline-block; + font-size: var.$badge-font-size; + height: var.$badge-size; + line-height: var.$badge-size; + padding: 0 var.$badge-padding; + text-align: center; + white-space: nowrap; + border: 1px solid var.$color-white; + box-sizing: content-box; + + @include mixins.when(fixed) { + position: absolute; + top: 0; + right: #{1 + var.$badge-size * 0.5}; + transform: translateY(-50%) translateX(100%); + + @include mixins.when(dot) { + right: 5px; + } + } + + @include mixins.when(dot) { + height: 8px; + width: 8px; + padding: 0; + right: 0; + border-radius: 50%; + } + + @each $type in (primary, success, warning, info, danger) { + @include mixins.m($type) { + @if $type == primary { + background-color: var(--color-primary); + } @else if $type == success { + background-color: var(--color-success); + } @else if $type == warning { + background-color: var(--color-warning); + } @else if $type == info { + background-color: var(--color-info); + } @else { + background-color: var(--color-danger); + } + } + } + } +} diff --git a/packages/design-system/theme/src/base.scss b/packages/design-system/theme/src/base.scss new file mode 100644 index 0000000000..8557d05fb0 --- /dev/null +++ b/packages/design-system/theme/src/base.scss @@ -0,0 +1,3 @@ +@forward "common/var.scss"; +@use "common/transition.scss"; +@use "icon.scss"; diff --git a/packages/design-system/theme/src/breadcrumb-item.scss b/packages/design-system/theme/src/breadcrumb-item.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/breadcrumb.scss b/packages/design-system/theme/src/breadcrumb.scss new file mode 100644 index 0000000000..b571a6c3b2 --- /dev/null +++ b/packages/design-system/theme/src/breadcrumb.scss @@ -0,0 +1,57 @@ +@use "mixins/mixins"; +@use "mixins/utils"; +@use "./common/var"; + +@include mixins.b(breadcrumb) { + font-size: 14px; + line-height: 1; + @include utils.utils-clearfix; + + @include mixins.e(separator) { + margin: 0 9px; + font-weight: bold; + color: var(--color-text-lighter); + + &[class*='icon'] { + margin: 0 6px; + font-weight: normal; + } + } + + @include mixins.e(item) { + float: left; + + @include mixins.e(inner) { + color: var(--color-text-dark); + + &.is-link, + & a { + font-weight: bold; + text-decoration: none; + transition: var.$color-transition-base; + color: var(--color-text-dark); + + &:hover { + color: var(--color-primary); + cursor: pointer; + } + } + } + + &:last-child { + .el-breadcrumb__inner, + .el-breadcrumb__inner a { + &, + &:hover { + font-weight: normal; + color: var(--color-text-dark); + cursor: text; + } + } + + .el-breadcrumb__separator { + display: none; + } + } + } +} diff --git a/packages/design-system/theme/src/button-group.scss b/packages/design-system/theme/src/button-group.scss new file mode 100644 index 0000000000..25b280a51a --- /dev/null +++ b/packages/design-system/theme/src/button-group.scss @@ -0,0 +1,84 @@ +@charset "UTF-8"; +@use 'common/var'; +@use 'mixins/button'; +@use 'mixins/mixins'; +@use 'mixins/utils'; +@use 'mixins/function'; + +@include mixins.b(button-group) { + @include utils.utils-clearfix; + display: inline-block; + vertical-align: middle; + + & > .el-button { + float: left; + position: relative; + & + .el-button { + margin-left: 0; + } + &.is-disabled { + z-index: 1; + } + &:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + &:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + &:first-child:last-child { + border-top-right-radius: var(--border-radius-base); + border-bottom-right-radius: var(--border-radius-base); + border-top-left-radius: var(--border-radius-base); + border-bottom-left-radius: var(--border-radius-base); + + &.is-round { + border-radius: 20px; + } + + &.is-circle { + border-radius: 50%; + } + } + &:not(:first-child):not(:last-child) { + border-radius: 0; + } + &:not(:last-child) { + margin-right: -1px; + } + + &:hover, + &:focus, + &:active { + z-index: 1; + } + + @include mixins.when(active) { + z-index: 1; + } + } + + & > .el-dropdown { + & > .el-button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left-color: rgba(var.$color-white, 0.5); + } + } + + @each $type in (primary, success, warning, danger, info) { + .el-button--#{$type} { + &:first-child { + border-right-color: rgba(var.$color-white, 0.5); + } + &:last-child { + border-left-color: rgba(var.$color-white, 0.5); + } + &:not(:first-child):not(:last-child) { + border-left-color: rgba(var.$color-white, 0.5); + border-right-color: rgba(var.$color-white, 0.5); + } + } + } +} diff --git a/packages/design-system/theme/src/button.scss b/packages/design-system/theme/src/button.scss new file mode 100644 index 0000000000..c16e720b5d --- /dev/null +++ b/packages/design-system/theme/src/button.scss @@ -0,0 +1,107 @@ +@charset "UTF-8"; +@use 'mixins/mixins'; +@use 'mixins/utils'; +@use 'mixins/function'; +@use 'common/var'; + +$disabled-border-color: var(--color-foreground-base); + +$loading-overlay-background-color: rgba(255, 255, 255, 0.35); + +@include mixins.b(button) { + display: inline-block; + line-height: 1; + white-space: nowrap; + cursor: pointer; + + border: var(--border-width-base) var.$button-border-color + var(--border-style-base); + color: var.$button-font-color; + background-color: var.$button-background-color; + font-weight: var(--font-weight-bold); + border-radius: var.$button-border-radius; + padding: var.$button-padding-vertical var.$button-padding-horizontal; + font-size: var.$button-font-size; + + -webkit-appearance: none; + text-align: center; + box-sizing: border-box; + outline: none; + margin: 0; + transition: 0.1s; + + @include utils.utils-user-select(none); + + &:active { + color: var.$button-active-color; + border-color: var.$button-active-border-color; + background-color: var.$button-active-background-color; + outline: none; + } + + &::-moz-focus-inner { + border: 0; + } + + @include mixins.when(loading) { + position: relative; + pointer-events: none; + + &:before { + pointer-events: none; + content: ''; + position: absolute; + left: -1px; + top: -1px; + right: -1px; + bottom: -1px; + border-radius: inherit; + background-color: $loading-overlay-background-color; + } + } + + @include mixins.when(disabled) { + &, + &:hover, + &:active, + &:focus { + cursor: not-allowed; + background-image: none; + color: var.$button-disabled-font-color; + background-color: var.$button-disabled-background-color; + border-color: var.$button-disabled-border-color; + } + } + + @include mixins.when(round) { + --button-border-radius: 20px; + } + + @include mixins.when(circle) { + --button-padding-vertical: var(--spacing-xs); + --button-padding-horizontal: var(--spacing-xs); + --button-border-radius: 50%; + } + + @include mixins.m(small) { + --button-padding-vertical: var(--spacing-3xs); + --button-padding-horizontal: var(--spacing-xs); + --button-font-size: var(--font-size-2xs); + + @include mixins.when(circle) { + --button-padding-vertical: var(--spacing-3xs); + --button-padding-horizontal: var(--spacing-3xs); + } + } + + @include mixins.m(medium) { + --button-padding-vertical: var(--spacing-2xs); + --button-padding-horizontal: var(--spacing-xs); + --button-font-size: var(--font-size-2xs); + + @include mixins.when(circle) { + --button-padding-vertical: var(--spacing-2xs); + --button-padding-horizontal: var(--spacing-2xs); + } + } +} diff --git a/packages/design-system/theme/src/calendar.scss b/packages/design-system/theme/src/calendar.scss new file mode 100644 index 0000000000..d06e915090 --- /dev/null +++ b/packages/design-system/theme/src/calendar.scss @@ -0,0 +1,79 @@ +@use "mixins/mixins"; +@use "./common/var"; +@use "button"; +@use "button-group"; + +@include mixins.b(calendar) { + background-color: #fff; + + @include mixins.e(header) { + display: flex; + justify-content: space-between; + padding: 12px 20px; + border-bottom: var.$table-border; + } + + @include mixins.e(title) { + color: #000000; + align-self: center; + } + + @include mixins.e(body) { + padding: 12px 20px 35px; + } +} + +@include mixins.b(calendar-table) { + table-layout: fixed; + width: 100%; + + thead th { + padding: 12px 0; + color: var(--color-text-dark); + font-weight: normal; + } + + &:not(.is-range) { + td.prev, + td.next { + color: var(--color-text-lighter); + } + } + + td { + border-bottom: var.$calendar-border; + border-right: var.$calendar-border; + vertical-align: top; + transition: background-color 0.2s ease; + + @include mixins.when(selected) { + background-color: var.$calendar-selected-background-color; + } + + @include mixins.when(today) { + color: var(--color-primary); + } + } + + tr:first-child td { + border-top: var.$calendar-border; + } + + tr td:first-child { + border-left: var.$calendar-border; + } + + tr.el-calendar-table__row--hide-border td { + border-top: none; + } + + @include mixins.b(calendar-day) { + box-sizing: border-box; + padding: 8px; + height: var.$calendar-cell-width; + &:hover { + cursor: pointer; + background-color: var.$calendar-selected-background-color; + } + } +} diff --git a/packages/design-system/theme/src/card.scss b/packages/design-system/theme/src/card.scss new file mode 100644 index 0000000000..8cca8fe2e4 --- /dev/null +++ b/packages/design-system/theme/src/card.scss @@ -0,0 +1,32 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(card) { + border-radius: var.$card-border-radius; + border: 1px solid var.$card-border-color; + background-color: var.$color-white; + overflow: hidden; + color: var(--color-text-dark); + transition: 0.3s; + + @include mixins.when(always-shadow) { + box-shadow: var.$box-shadow-light; + } + + @include mixins.when(hover-shadow) { + &:hover, + &:focus { + box-shadow: var.$box-shadow-light; + } + } + + @include mixins.e(header) { + padding: #{var.$card-padding - 2 var.$card-padding}; + border-bottom: 1px solid var.$card-border-color; + box-sizing: border-box; + } + + @include mixins.e(body) { + padding: var.$card-padding; + } +} diff --git a/packages/design-system/theme/src/carousel-item.scss b/packages/design-system/theme/src/carousel-item.scss new file mode 100644 index 0000000000..5ebd254baf --- /dev/null +++ b/packages/design-system/theme/src/carousel-item.scss @@ -0,0 +1,50 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(carousel) { + @include mixins.e(item) { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: inline-block; + overflow: hidden; + z-index: #{var.$index-normal - 1}; + + @include mixins.when(active) { + z-index: #{var.$index-normal + 1}; + } + + @include mixins.when(animating) { + transition: transform 0.4s ease-in-out; + } + + @include mixins.m(card) { + width: 50%; + transition: transform 0.4s ease-in-out; + &.is-in-stage { + cursor: pointer; + z-index: var.$index-normal; + &:hover .el-carousel__mask, + &.is-hover .el-carousel__mask { + opacity: 0.12; + } + } + &.is-active { + z-index: #{var.$index-normal + 1}; + } + } + } + + @include mixins.e(mask) { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: var.$color-white; + opacity: 0.24; + transition: 0.2s; + } +} diff --git a/packages/design-system/theme/src/carousel.scss b/packages/design-system/theme/src/carousel.scss new file mode 100644 index 0000000000..fa1f93f75a --- /dev/null +++ b/packages/design-system/theme/src/carousel.scss @@ -0,0 +1,164 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(carousel) { + position: relative; + + @include mixins.m(horizontal) { + overflow-x: hidden; + } + + @include mixins.m(vertical) { + overflow-y: hidden; + } + + @include mixins.e(container) { + position: relative; + height: 300px; + } + + @include mixins.e(arrow) { + border: none; + outline: none; + padding: 0; + margin: 0; + height: var.$carousel-arrow-size; + width: var.$carousel-arrow-size; + cursor: pointer; + transition: 0.3s; + border-radius: 50%; + background-color: var.$carousel-arrow-background; + color: var.$color-white; + position: absolute; + top: 50%; + z-index: 10; + transform: translateY(-50%); + text-align: center; + font-size: var.$carousel-arrow-font-size; + + @include mixins.m(left) { + left: 16px; + } + + @include mixins.m(right) { + right: 16px; + } + + &:hover { + background-color: var.$carousel-arrow-hover-background; + } + + & i { + cursor: pointer; + } + } + + @include mixins.e(indicators) { + position: absolute; + list-style: none; + margin: 0; + padding: 0; + z-index: #{var.$index-normal + 1}; + + @include mixins.m(horizontal) { + bottom: 0; + left: 50%; + transform: translateX(-50%); + } + + @include mixins.m(vertical) { + right: 0; + top: 50%; + transform: translateY(-50%); + } + + @include mixins.m(outside) { + bottom: #{var.$carousel-indicator-height + + var.$carousel-indicator-padding-vertical * 2}; + text-align: center; + position: static; + transform: none; + .el-carousel__indicator:hover button { + opacity: 0.64; + } + button { + background-color: var.$carousel-indicator-out-color; + opacity: 0.24; + } + } + + @include mixins.m(labels) { + left: 0; + right: 0; + transform: none; + text-align: center; + + .el-carousel__button { + height: auto; + width: auto; + padding: 2px 18px; + font-size: 12px; + } + + .el-carousel__indicator { + padding: 6px 4px; + } + } + } + + @include mixins.e(indicator) { + background-color: transparent; + cursor: pointer; + + &:hover button { + opacity: 0.72; + } + + @include mixins.m(horizontal) { + display: inline-block; + padding: var.$carousel-indicator-padding-vertical + var.$carousel-indicator-padding-horizontal; + } + + @include mixins.m(vertical) { + padding: var.$carousel-indicator-padding-horizontal + var.$carousel-indicator-padding-vertical; + .el-carousel__button { + width: var.$carousel-indicator-height; + height: #{var.$carousel-indicator-width * 0.5}; + } + } + + @include mixins.when(active) { + button { + opacity: 1; + } + } + } + + @include mixins.e(button) { + display: block; + opacity: 0.48; + width: var.$carousel-indicator-width; + height: var.$carousel-indicator-height; + background-color: var.$color-white; + border: none; + outline: none; + padding: 0; + margin: 0; + cursor: pointer; + transition: 0.3s; + } +} + +.carousel-arrow-left-enter, +.carousel-arrow-left-leave-active { + transform: translateY(-50%) translateX(-10px); + opacity: 0; +} + +.carousel-arrow-right-enter, +.carousel-arrow-right-leave-active { + transform: translateY(-50%) translateX(10px); + opacity: 0; +} diff --git a/packages/design-system/theme/src/cascader-panel.scss b/packages/design-system/theme/src/cascader-panel.scss new file mode 100644 index 0000000000..74a85d47cc --- /dev/null +++ b/packages/design-system/theme/src/cascader-panel.scss @@ -0,0 +1,121 @@ +@use "mixins/mixins"; +@use "./common/var"; +@use "./checkbox"; +@use "./radio"; +@use "./scrollbar"; + +@include mixins.b(cascader-panel) { + display: flex; + border-radius: var.$cascader-menu-radius; + font-size: var.$cascader-menu-font-size; + + @include mixins.when(bordered) { + border: var.$cascader-menu-border; + border-radius: var.$cascader-menu-radius; + } +} + +@include mixins.b(cascader-menu) { + min-width: 180px; + box-sizing: border-box; + color: var.$cascader-menu-font-color; + border-right: var.$cascader-menu-border; + + &:last-child { + border-right: none; + .el-cascader-node { + padding-right: 20px; + } + } + + @include mixins.e(wrap) { + height: 204px; + } + + @include mixins.e(list) { + position: relative; + min-height: 100%; + margin: 0; + padding: 6px 0; + list-style: none; + box-sizing: border-box; + } + + @include mixins.e(hover-zone) { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + } + + @include mixins.e(empty-text) { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + color: var.$cascader-color-empty; + } +} + +@include mixins.b(cascader-node) { + position: relative; + display: flex; + align-items: center; + padding: 0 30px 0 20px; + height: 34px; + line-height: 34px; + outline: none; + + &.is-selectable.in-active-path { + color: var.$cascader-menu-font-color; + } + + &.in-active-path, + &.is-selectable.in-checked-path, + &.is-active { + color: var.$cascader-menu-selected-font-color; + font-weight: bold; + } + + &:not(.is-disabled) { + cursor: pointer; + &:hover, + &:focus { + background: var.$cascader-node-background-hover; + } + } + + @include mixins.when(disabled) { + color: var.$cascader-node-color-disabled; + cursor: not-allowed; + } + + @include mixins.e(prefix) { + position: absolute; + left: 10px; + } + + @include mixins.e(postfix) { + position: absolute; + right: 10px; + } + + @include mixins.e(label) { + flex: 1; + padding: 0 10px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + > .el-radio { + margin-right: 0; + + .el-radio__label { + padding-left: 0; + } + } +} diff --git a/packages/design-system/theme/src/cascader.scss b/packages/design-system/theme/src/cascader.scss new file mode 100644 index 0000000000..7d0aac273e --- /dev/null +++ b/packages/design-system/theme/src/cascader.scss @@ -0,0 +1,183 @@ +@use "mixins/mixins"; +@use "./common/var"; +@use "./input"; +@use "./popper"; +@use "./tag"; +@use "./cascader-panel"; + +@include mixins.b(cascader) { + display: inline-block; + position: relative; + font-size: var.$font-size-base; + line-height: var.$input-height; + + &:not(.is-disabled):hover { + .el-input__inner { + cursor: pointer; + border-color: var.$input-hover-border; + } + } + + .el-input { + cursor: pointer; + + .el-input__inner { + text-overflow: ellipsis; + + &:focus { + border-color: var.$input-focus-border; + } + } + + .el-icon-arrow-down { + transition: transform 0.3s; + font-size: 14px; + + @include mixins.when(reverse) { + transform: rotateZ(180deg); + } + } + + .el-icon-circle-close:hover { + color: var.$input-clear-hover-color; + } + + @include mixins.when(focus) { + .el-input__inner { + border-color: var.$input-focus-border; + } + } + } + + @include mixins.m(medium) { + font-size: var.$input-medium-font-size; + line-height: var.$input-medium-height; + } + + @include mixins.m(small) { + font-size: var.$input-small-font-size; + line-height: var.$input-small-height; + } + + @include mixins.m(mini) { + font-size: var.$input-mini-font-size; + line-height: var.$input-mini-height; + } + + @include mixins.when(disabled) { + .el-cascader__label { + z-index: #{var.$index-normal + 1}; + color: var.$disabled-color-base; + } + } + + @include mixins.e(dropdown) { + margin: 5px 0; + font-size: var.$cascader-menu-font-size; + background: var.$cascader-menu-fill; + border: var.$cascader-menu-border; + border-radius: var.$cascader-menu-radius; + box-shadow: var.$cascader-menu-shadow; + } + + @include mixins.e(tags) { + position: absolute; + left: 0; + right: 30px; + top: 50%; + transform: translateY(-50%); + display: flex; + flex-wrap: wrap; + line-height: normal; + text-align: left; + box-sizing: border-box; + + .el-tag { + display: inline-flex; + align-items: center; + max-width: 100%; + margin: 2px 0 2px 6px; + text-overflow: ellipsis; + background: var.$cascader-tag-background; + + &:not(.is-hit) { + border-color: transparent; + } + + > span { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + } + + .el-icon-close { + flex: none; + background-color: var(--color-text-lighter); + color: var.$color-white; + + &:hover { + background-color: var(--color-text-light); + } + } + } + } + + @include mixins.e(suggestion-panel) { + border-radius: var.$cascader-menu-radius; + } + + @include mixins.e(suggestion-list) { + max-height: 204px; + margin: 0; + padding: 6px 0; + font-size: var.$font-size-base; + color: var.$cascader-menu-font-color; + text-align: center; + } + + @include mixins.e(suggestion-item) { + display: flex; + justify-content: space-between; + align-items: center; + height: 34px; + padding: 0 15px; + text-align: left; + outline: none; + cursor: pointer; + + &:hover, + &:focus { + background: var.$cascader-node-background-hover; + } + + &.is-checked { + color: var.$cascader-menu-selected-font-color; + font-weight: bold; + } + + > span { + margin-right: 10px; + } + } + + @include mixins.e(empty-text) { + margin: 10px 0; + color: var.$cascader-color-empty; + } + + @include mixins.e(search-input) { + flex: 1; + height: 24px; + min-width: 60px; + margin: 2px 0 2px 15px; + padding: 0; + color: var.$cascader-menu-font-color; + border: none; + outline: none; + box-sizing: border-box; + + &::placeholder { + color: var(--color-text-lighter); + } + } +} diff --git a/packages/design-system/theme/src/checkbox-button.scss b/packages/design-system/theme/src/checkbox-button.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/checkbox-group.scss b/packages/design-system/theme/src/checkbox-group.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/checkbox.scss b/packages/design-system/theme/src/checkbox.scss new file mode 100644 index 0000000000..a699b7e39c --- /dev/null +++ b/packages/design-system/theme/src/checkbox.scss @@ -0,0 +1,380 @@ +@use "./common/var"; +@use "mixins/mixins"; +@use "mixins/_button"; +@use "mixins/utils"; + +@include mixins.b(checkbox) { + color: var.$checkbox-font-color; + font-weight: var.$checkbox-font-weight; + font-size: var.$font-size-base; + position: relative; + cursor: pointer; + display: inline-block; + white-space: nowrap; + user-select: none; + margin-right: 30px; + + @include mixins.when(bordered) { + padding: var.$checkbox-bordered-padding; + border-radius: var(--border-radius-base); + border: var(--border-base); + box-sizing: border-box; + line-height: normal; + height: var.$checkbox-bordered-height; + + &.is-checked { + border-color: var(--color-primary); + } + + &.is-disabled { + border-color: var(--border-color-light); + cursor: not-allowed; + } + + & + .el-checkbox.is-bordered { + margin-left: 10px; + } + + &.el-checkbox--medium { + padding: var.$checkbox-bordered-medium-padding; + border-radius: var.$button-medium-border-radius; + height: var.$checkbox-bordered-medium-height; + + .el-checkbox__label { + line-height: 17px; + font-size: var.$button-medium-font-size; + } + + .el-checkbox__inner { + height: var.$checkbox-bordered-medium-input-height; + width: var.$checkbox-bordered-medium-input-width; + } + } + + &.el-checkbox--small { + padding: var.$checkbox-bordered-small-padding; + border-radius: var.$button-small-border-radius; + height: var.$checkbox-bordered-small-height; + + .el-checkbox__label { + line-height: 15px; + font-size: var.$button-small-font-size; + } + + .el-checkbox__inner { + height: var.$checkbox-bordered-small-input-height; + width: var.$checkbox-bordered-small-input-width; + + &::after { + height: 6px; + width: 2px; + } + } + } + + &.el-checkbox--mini { + padding: var.$checkbox-bordered-mini-padding; + border-radius: var.$button-mini-border-radius; + height: var.$checkbox-bordered-mini-height; + + .el-checkbox__label { + line-height: 12px; + font-size: var.$button-mini-font-size; + } + + .el-checkbox__inner { + height: var.$checkbox-bordered-mini-input-height; + width: var.$checkbox-bordered-mini-input-width; + &::after { + height: 6px; + width: 2px; + } + } + } + } + + @include mixins.e(input) { + white-space: nowrap; + cursor: pointer; + outline: none; + display: inline-block; + line-height: 1; + position: relative; + vertical-align: middle; + + @include mixins.when(disabled) { + .el-checkbox__inner { + background-color: var.$checkbox-disabled-input-fill; + border-color: var.$checkbox-disabled-border-color; + cursor: not-allowed; + + &::after { + cursor: not-allowed; + border-color: var.$checkbox-disabled-icon-color; + } + + & + .el-checkbox__label { + cursor: not-allowed; + } + } + + &.is-checked { + .el-checkbox__inner { + background-color: var.$checkbox-disabled-checked-input-fill; + border-color: var.$checkbox-disabled-checked-input-border-color; + + &::after { + border-color: var.$checkbox-disabled-checked-icon-color; + } + } + } + + &.is-indeterminate { + .el-checkbox__inner { + background-color: var.$checkbox-disabled-checked-input-fill; + border-color: var.$checkbox-disabled-checked-input-border-color; + + &::before { + background-color: var.$checkbox-disabled-checked-icon-color; + border-color: var.$checkbox-disabled-checked-icon-color; + } + } + } + + & + span.el-checkbox__label { + color: var.$disabled-color-base; + cursor: not-allowed; + } + } + + @include mixins.when(checked) { + .el-checkbox__inner { + background-color: var.$checkbox-checked-background-color; + border-color: var.$checkbox-checked-input-border-color; + + &::after { + transform: rotate(45deg) scaleY(1); + } + } + + & + .el-checkbox__label { + color: var.$checkbox-checked-font-color; + } + } + @include mixins.when(focus) { + /*focus时 视觉上区分*/ + .el-checkbox__inner { + border-color: var.$checkbox-input-border-color-hover; + } + } + @include mixins.when(indeterminate) { + .el-checkbox__inner { + background-color: var.$checkbox-checked-background-color; + border-color: var.$checkbox-checked-input-border-color; + + &::before { + content: ''; + position: absolute; + display: block; + background-color: var.$checkbox-checked-icon-color; + height: 2px; + transform: scale(0.5); + left: 0; + right: 0; + top: 5px; + } + + &::after { + display: none; + } + } + } + } + @include mixins.e(inner) { + display: inline-block; + position: relative; + border: var.$checkbox-input-border; + border-radius: var.$checkbox-border-radius; + box-sizing: border-box; + width: var.$checkbox-input-width; + height: var.$checkbox-input-height; + background-color: var.$checkbox-background-color; + z-index: var.$index-normal; + transition: border-color 0.25s cubic-bezier(0.71, -0.46, 0.29, 1.46), + background-color 0.25s cubic-bezier(0.71, -0.46, 0.29, 1.46); + + &:hover { + border-color: var.$checkbox-input-border-color-hover; + } + + &::after { + box-sizing: content-box; + content: ''; + border: 1px solid var.$checkbox-checked-icon-color; + border-left: 0; + border-top: 0; + height: 7px; + left: 4px; + position: absolute; + top: 1px; + transform: rotate(45deg) scaleY(0); + width: 3px; + transition: transform 0.15s ease-in 0.05s; + transform-origin: center; + } + } + + @include mixins.e(original) { + opacity: 0; + outline: none; + position: absolute; + margin: 0; + width: 0; + height: 0; + z-index: -1; + } + + @include mixins.e(label) { + display: inline-block; + padding-left: 10px; + line-height: 19px; + font-size: var.$checkbox-font-size; + } + + &:last-of-type { + margin-right: 0; + } +} + +@include mixins.b(checkbox-button) { + position: relative; + display: inline-block; + + @include mixins.e(inner) { + display: inline-block; + line-height: 1; + font-weight: var.$checkbox-font-weight; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + background: var.$button-default-background-color; + border: var(--border-base); + border-left: 0; + color: var.$button-default-font-color; + -webkit-appearance: none; + text-align: center; + box-sizing: border-box; + outline: none; + margin: 0; + position: relative; + transition: var.$all-transition; + border-radius: 0; + @include utils.utils-user-select(none); + + @include button.button-size( + var.$button-padding-vertical, + var.$button-padding-horizontal, + var.$button-font-size + ); + + &:hover { + color: var(--color-primary); + } + + & [class*='el-icon-'] { + line-height: 0.9; + + & + span { + margin-left: 5px; + } + } + } + + @include mixins.e(original) { + opacity: 0; + outline: none; + position: absolute; + margin: 0; + z-index: -1; + } + + &.is-checked { + & .el-checkbox-button__inner { + color: var.$checkbox-button-checked-font-color; + background-color: var.$checkbox-button-checked-background-color; + border-color: var.$checkbox-button-checked-border-color; + box-shadow: -1px 0 0 0 var.$color-primary-light-4; + } + &:first-child .el-checkbox-button__inner { + border-left-color: var.$checkbox-button-checked-border-color; + } + } + + &.is-disabled { + & .el-checkbox-button__inner { + color: var.$button-disabled-font-color; + cursor: not-allowed; + background-image: none; + background-color: var.$button-disabled-background-color; + border-color: var.$button-disabled-border-color; + box-shadow: none; + } + &:first-child .el-checkbox-button__inner { + border-left-color: var.$button-disabled-border-color; + } + } + + &:first-child { + .el-checkbox-button__inner { + border-left: var(--border-base); + border-radius: var(--border-radius-base) 0 0 var(--border-radius-base); + box-shadow: none !important; + } + } + + &.is-focus { + & .el-checkbox-button__inner { + border-color: var.$checkbox-button-checked-border-color; + } + } + + &:last-child { + .el-checkbox-button__inner { + border-radius: 0 var(--border-radius-base) var(--border-radius-base) 0; + } + } + @include mixins.m(medium) { + .el-checkbox-button__inner { + border-radius: 0; + @include button.button-size( + var.$button-medium-padding-vertical, + var.$button-medium-padding-horizontal, + var.$button-medium-font-size + ); + } + } + @include mixins.m(small) { + .el-checkbox-button__inner { + border-radius: 0; + @include button.button-size( + var.$button-small-padding-vertical, + var.$button-small-padding-horizontal, + var.$button-small-font-size + ); + } + } + @include mixins.m(mini) { + .el-checkbox-button__inner { + border-radius: 0; + @include button.button-size( + var.$button-mini-padding-vertical, + var.$button-mini-padding-horizontal, + var.$button-mini-font-size + ); + } + } +} + +@include mixins.b(checkbox-group) { + font-size: 0; +} diff --git a/packages/design-system/theme/src/col.scss b/packages/design-system/theme/src/col.scss new file mode 100644 index 0000000000..85610c14c5 --- /dev/null +++ b/packages/design-system/theme/src/col.scss @@ -0,0 +1,158 @@ +@use "sass:math"; + +@use "./common/var.scss"; +@use "./mixins/mixins.scss"; + +[class*='el-col-'] { + float: left; + box-sizing: border-box; +} + +.el-col-0 { + display: none; +} + +@for $i from 0 through 24 { + .el-col-#{$i} { + width: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-offset-#{$i} { + margin-left: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-pull-#{$i} { + position: relative; + right: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-push-#{$i} { + position: relative; + left: (math.div(1, 24) * $i * 100) * 1%; + } +} + +@include mixins.res(xs) { + .el-col-xs-0 { + display: none; + } + @for $i from 0 through 24 { + .el-col-xs-#{$i} { + width: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-xs-offset-#{$i} { + margin-left: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-xs-pull-#{$i} { + position: relative; + right: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-xs-push-#{$i} { + position: relative; + left: (math.div(1, 24) * $i * 100) * 1%; + } + } +} + +@include mixins.res(sm) { + .el-col-sm-0 { + display: none; + } + @for $i from 0 through 24 { + .el-col-sm-#{$i} { + width: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-sm-offset-#{$i} { + margin-left: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-sm-pull-#{$i} { + position: relative; + right: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-sm-push-#{$i} { + position: relative; + left: (math.div(1, 24) * $i * 100) * 1%; + } + } +} + +@include mixins.res(md) { + .el-col-md-0 { + display: none; + } + @for $i from 0 through 24 { + .el-col-md-#{$i} { + width: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-md-offset-#{$i} { + margin-left: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-md-pull-#{$i} { + position: relative; + right: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-md-push-#{$i} { + position: relative; + left: (math.div(1, 24) * $i * 100) * 1%; + } + } +} + +@include mixins.res(lg) { + .el-col-lg-0 { + display: none; + } + @for $i from 0 through 24 { + .el-col-lg-#{$i} { + width: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-lg-offset-#{$i} { + margin-left: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-lg-pull-#{$i} { + position: relative; + right: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-lg-push-#{$i} { + position: relative; + left: (math.div(1, 24) * $i * 100) * 1%; + } + } +} + +@include mixins.res(xl) { + .el-col-xl-0 { + display: none; + } + @for $i from 0 through 24 { + .el-col-xl-#{$i} { + width: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-xl-offset-#{$i} { + margin-left: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-xl-pull-#{$i} { + position: relative; + right: (math.div(1, 24) * $i * 100) * 1%; + } + + .el-col-xl-push-#{$i} { + position: relative; + left: (math.div(1, 24) * $i * 100) * 1%; + } + } +} diff --git a/packages/design-system/theme/src/collapse-item.scss b/packages/design-system/theme/src/collapse-item.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/collapse.scss b/packages/design-system/theme/src/collapse.scss new file mode 100644 index 0000000000..eded66efd0 --- /dev/null +++ b/packages/design-system/theme/src/collapse.scss @@ -0,0 +1,63 @@ +@use "mixins/mixins"; +@use "./common/var"; +@use "common/transition"; + +@include mixins.b(collapse) { + border-top: 1px solid var.$collapse-border-color; + border-bottom: 1px solid var.$collapse-border-color; +} +@include mixins.b(collapse-item) { + @include mixins.when(disabled) { + .el-collapse-item__header { + color: var.$font-color-disabled-base; + cursor: not-allowed; + } + } + @include mixins.e(header) { + display: flex; + align-items: center; + height: var.$collapse-header-height; + line-height: var.$collapse-header-height; + background-color: var.$collapse-header-background-color; + color: var.$collapse-header-font-color; + cursor: pointer; + border-bottom: 1px solid var.$collapse-border-color; + font-size: var.$collapse-header-font-size; + font-weight: 500; + transition: border-bottom-color 0.3s; + outline: none; + @include mixins.e(arrow) { + margin: 0 8px 0 auto; + transition: transform 0.3s; + font-weight: 300; + @include mixins.when(active) { + transform: rotate(90deg); + } + } + &.focusing:focus:not(:hover) { + color: var(--color-primary); + } + @include mixins.when(active) { + border-bottom-color: transparent; + } + } + + @include mixins.e(wrap) { + will-change: height; + background-color: var.$collapse-content-background-color; + overflow: hidden; + box-sizing: border-box; + border-bottom: 1px solid var.$collapse-border-color; + } + + @include mixins.e(content) { + padding-bottom: 25px; + font-size: var.$collapse-content-font-size; + color: var.$collapse-content-font-color; + line-height: 1.769230769230769; + } + + &:last-child { + margin-bottom: -1px; + } +} diff --git a/packages/design-system/theme/src/color-picker.scss b/packages/design-system/theme/src/color-picker.scss new file mode 100644 index 0000000000..3c4b114f95 --- /dev/null +++ b/packages/design-system/theme/src/color-picker.scss @@ -0,0 +1,382 @@ +@use "mixins/mixins"; +@use "mixins/button"; +@use "./common/var"; + +@include mixins.b(color-predefine) { + display: flex; + font-size: 12px; + margin-top: 8px; + width: 280px; + + @include mixins.e(colors) { + display: flex; + flex: 1; + flex-wrap: wrap; + } + + @include mixins.e(color-selector) { + margin: 0 0 8px 8px; + width: 20px; + height: 20px; + border-radius: 4px; + cursor: pointer; + + &:nth-child(10n + 1) { + margin-left: 0; + } + + &.selected { + box-shadow: 0 0 3px 2px var(--color-primary); + } + + > div { + display: flex; + height: 100%; + border-radius: 3px; + } + + @include mixins.when(alpha) { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); + } + } +} + +@include mixins.b(color-hue-slider) { + position: relative; + box-sizing: border-box; + width: 280px; + height: 12px; + background-color: #f00; + padding: 0 2px; + + @include mixins.e(bar) { + position: relative; + background: linear-gradient( + to right, + #f00 0%, + #ff0 17%, + #0f0 33%, + #0ff 50%, + #00f 67%, + #f0f 83%, + #f00 100% + ); + height: 100%; + } + + @include mixins.e(thumb) { + position: absolute; + cursor: pointer; + box-sizing: border-box; + left: 0; + top: 0; + width: 4px; + height: 100%; + border-radius: 1px; + background: #fff; + border: 1px solid #f0f0f0; + box-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + z-index: 1; + } + + @include mixins.when(vertical) { + width: 12px; + height: 180px; + padding: 2px 0; + + .el-color-hue-slider__bar { + background: linear-gradient( + to bottom, + #f00 0%, + #ff0 17%, + #0f0 33%, + #0ff 50%, + #00f 67%, + #f0f 83%, + #f00 100% + ); + } + + .el-color-hue-slider__thumb { + left: 0; + top: 0; + width: 100%; + height: 4px; + } + } +} + +@include mixins.b(color-svpanel) { + position: relative; + width: 280px; + height: 180px; + + @include mixins.e(('white', 'black')) { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + } + + @include mixins.e('white') { + background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0)); + } + + @include mixins.e('black') { + background: linear-gradient(to top, #000, rgba(0, 0, 0, 0)); + } + + @include mixins.e(cursor) { + position: absolute; + + > div { + cursor: head; + width: 4px; + height: 4px; + box-shadow: 0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0, 0, 0, 0.3), + 0 0 1px 2px rgba(0, 0, 0, 0.4); + border-radius: 50%; + transform: translate(-2px, -2px); + } + } +} + +@include mixins.b(color-alpha-slider) { + position: relative; + box-sizing: border-box; + width: 280px; + height: 12px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); + + @include mixins.e(bar) { + position: relative; + background: linear-gradient( + to right, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, 1) 100% + ); + height: 100%; + } + + @include mixins.e(thumb) { + position: absolute; + cursor: pointer; + box-sizing: border-box; + left: 0; + top: 0; + width: 4px; + height: 100%; + border-radius: 1px; + background: #fff; + border: 1px solid #f0f0f0; + box-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + z-index: 1; + } + + @include mixins.when(vertical) { + width: 20px; + height: 180px; + + .el-color-alpha-slider__bar { + background: linear-gradient( + to bottom, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, 1) 100% + ); + } + + .el-color-alpha-slider__thumb { + left: 0; + top: 0; + width: 100%; + height: 4px; + } + } +} + +@include mixins.b(color-dropdown) { + width: 300px; + + @include mixins.e(main-wrapper) { + margin-bottom: 6px; + + &::after { + content: ''; + display: table; + clear: both; + } + } + + @include mixins.e(btns) { + margin-top: 6px; + text-align: right; + } + + @include mixins.e(value) { + float: left; + line-height: 26px; + font-size: 12px; + color: var.$color-black; + width: 160px; + } + + @include mixins.e(btn) { + @include button.button-round(); + @include button.button-small(); + @include button.button-just-primary(); + } + + @include mixins.e(link-btn) { + @include button.button-round(); + @include button.button-outline(); + @include button.button-small(); + + margin-right: var(--spacing-2xs); + } +} + +@include mixins.b(color-picker) { + display: inline-block; + position: relative; + line-height: normal; + height: 40px; + + @include mixins.when(disabled) { + .el-color-picker__trigger { + cursor: not-allowed; + } + } + + @include mixins.m(medium) { + height: 36px; + + .el-color-picker__trigger { + height: 36px; + width: 36px; + } + + .el-color-picker__mask { + height: 34px; + width: 34px; + } + } + + @include mixins.m(small) { + height: 32px; + + .el-color-picker__trigger { + height: 32px; + width: 32px; + } + + .el-color-picker__mask { + height: 30px; + width: 30px; + } + + .el-color-picker__icon, + .el-color-picker__empty { + transform: translate3d(-50%, -50%, 0) scale(0.8); + } + } + + @include mixins.m(mini) { + height: 28px; + + .el-color-picker__trigger { + height: 28px; + width: 28px; + } + + .el-color-picker__mask { + height: 26px; + width: 26px; + } + + .el-color-picker__icon, + .el-color-picker__empty { + transform: translate3d(-50%, -50%, 0) scale(0.8); + } + } + + @include mixins.e(mask) { + height: 38px; + width: 38px; + border-radius: 4px; + position: absolute; + top: 1px; + left: 1px; + z-index: 1; + cursor: not-allowed; + background-color: rgba(255, 255, 255, 0.7); + } + + @include mixins.e(trigger) { + display: inline-block; + box-sizing: border-box; + height: 40px; + width: 40px; + padding: 4px; + border: 1px solid #e6e6e6; + border-radius: 4px; + font-size: 0; + position: relative; + cursor: pointer; + } + + @include mixins.e(color) { + position: relative; + display: block; + box-sizing: border-box; + border: 1px solid #999; + border-radius: var(--border-radius-small); + width: 100%; + height: 100%; + text-align: center; + + @include mixins.when(alpha) { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); + } + } + + @include mixins.e(color-inner) { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + } + + @include mixins.e(empty) { + font-size: 12px; + color: #999; + position: absolute; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0); + } + + @include mixins.e(icon) { + display: inline-block; + position: absolute; + width: 100%; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0); + color: var.$color-white; + text-align: center; + font-size: 12px; + } + + @include mixins.e(panel) { + position: absolute; + z-index: 10; + padding: 6px; + box-sizing: content-box; + background-color: var.$color-white; + border: 1px solid var(--border-color-light); + border-radius: var(--border-radius-base); + box-shadow: var.$dropdown-menu-box-shadow; + } +} diff --git a/packages/design-system/theme/src/common/popup.scss b/packages/design-system/theme/src/common/popup.scss new file mode 100644 index 0000000000..a26c3eea96 --- /dev/null +++ b/packages/design-system/theme/src/common/popup.scss @@ -0,0 +1,42 @@ +@use "./var.scss"; +@use "../mixins/mixins"; + +.v-modal-enter { + animation: v-modal-in 0.2s ease; +} + +.v-modal-leave { + animation: v-modal-out 0.2s ease forwards; +} + +@keyframes v-modal-in { + 0% { + opacity: 0; + } + 100% { + } +} + +@keyframes v-modal-out { + 0% { + } + 100% { + opacity: 0; + } +} + +.v-modal { + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: var.$popup-modal-opacity; + background: var.$popup-modal-background-color; +} + +@include mixins.b(popup-parent) { + @include mixins.m(hidden) { + overflow: hidden; + } +} diff --git a/packages/design-system/theme/src/common/transition.scss b/packages/design-system/theme/src/common/transition.scss new file mode 100644 index 0000000000..576f8f8339 --- /dev/null +++ b/packages/design-system/theme/src/common/transition.scss @@ -0,0 +1,102 @@ +@use "./var"; + +.fade-in-linear-enter-active, +.fade-in-linear-leave-active { + transition: var.$fade-linear-transition; +} +.fade-in-linear-enter, +.fade-in-linear-leave, +.fade-in-linear-leave-active { + opacity: 0; +} + +.el-fade-in-linear-enter-active, +.el-fade-in-linear-leave-active { + transition: var.$fade-linear-transition; +} +.el-fade-in-linear-enter, +.el-fade-in-linear-leave, +.el-fade-in-linear-leave-active { + opacity: 0; +} + +.el-fade-in-enter-active, +.el-fade-in-leave-active { + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); +} +.el-fade-in-enter, +.el-fade-in-leave-active { + opacity: 0; +} + +.el-zoom-in-center-enter-active, +.el-zoom-in-center-leave-active { + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); +} +.el-zoom-in-center-enter, +.el-zoom-in-center-leave-active { + opacity: 0; + transform: scaleX(0); +} + +.el-zoom-in-top-enter-active, +.el-zoom-in-top-leave-active { + opacity: 1; + transform: scaleY(1); + transition: var.$md-fade-transition; + transform-origin: center top; +} +.el-zoom-in-top-enter, +.el-zoom-in-top-leave-active { + opacity: 0; + transform: scaleY(0); +} + +.el-zoom-in-bottom-enter-active, +.el-zoom-in-bottom-leave-active { + opacity: 1; + transform: scaleY(1); + transition: var.$md-fade-transition; + transform-origin: center bottom; +} +.el-zoom-in-bottom-enter, +.el-zoom-in-bottom-leave-active { + opacity: 0; + transform: scaleY(0); +} + +.el-zoom-in-left-enter-active, +.el-zoom-in-left-leave-active { + opacity: 1; + transform: scale(1, 1); + transition: var.$md-fade-transition; + transform-origin: top left; +} +.el-zoom-in-left-enter, +.el-zoom-in-left-leave-active { + opacity: 0; + transform: scale(0.45, 0.45); +} + +.collapse-transition { + transition: 0.3s height ease-in-out, 0.3s padding-top ease-in-out, + 0.3s padding-bottom ease-in-out; +} +.horizontal-collapse-transition { + transition: 0.3s width ease-in-out, 0.3s padding-left ease-in-out, + 0.3s padding-right ease-in-out; +} + +.el-list-enter-active, +.el-list-leave-active { + transition: all 1s; +} +.el-list-enter, +.el-list-leave-active { + opacity: 0; + transform: translateY(-30px); +} + +.el-opacity-transition { + transition: opacity 0.3s cubic-bezier(0.55, 0, 0.1, 1); +} diff --git a/packages/design-system/theme/src/common/typography.scss b/packages/design-system/theme/src/common/typography.scss new file mode 100644 index 0000000000..db5365d67c --- /dev/null +++ b/packages/design-system/theme/src/common/typography.scss @@ -0,0 +1,66 @@ +%bold { + font-weight: var(--font-weight-bold); +} + +.heading1 { + font-size: var(--font-size-2xl); + line-height: var(--font-line-height-compact); +} + +.heading1-bold { + @extend %bold, .heading1; +} + +.heading2 { + font-size: var(--font-size-xl); + line-height: var(--font-line-height-loose); +} + +.heading2-bold { + @extend %bold, .heading2; +} + +.heading3 { + font-size: var(--font-size-m); + line-height: var(--font-line-height-loose); +} + +.heading3-bold { + @extend %bold, .heading3; +} + +.heading4 { + font-size: var(--font-size-s); + line-height: var(--font-line-height-regular); +} + +.heading4-bold { + @extend %bold, .heading4; +} + +.body-large { + font-size: var(--font-size-m); + line-height: var(--font-line-height-xloose); +} + +.body-large-bold { + @extend %bold, .body-large; +} + +.body-medium { + font-size: var(--font-size-s); + line-height: var(--font-line-height-loose); +} + +.body-medium-bold { + @extend %bold, .body-medium; +} + +.body-small { + font-size: var(--font-size-2xs); + line-height: var(--font-line-height-loose); +} + +.body-small-bold { + @extend %bold, .body-small; +} diff --git a/packages/design-system/theme/src/common/var.scss b/packages/design-system/theme/src/common/var.scss new file mode 100644 index 0000000000..fc009d8af6 --- /dev/null +++ b/packages/design-system/theme/src/common/var.scss @@ -0,0 +1,1191 @@ +@use "sass:math"; +@use "../mixins/function.scss"; + +// Special comment for theme configurator +// type|skipAutoTranslation|Category|Order +// skipAutoTranslation 1 + +/* Transition +-------------------------- */ +$all-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +$fade-transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1); +$fade-linear-transition: opacity 200ms linear; +$md-fade-transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), + opacity 300ms cubic-bezier(0.23, 1, 0.32, 1); +$border-transition-base: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); +$color-transition-base: color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); + +/* Color +-------------------------- */ +$color-white: #ffffff; +$color-black: #000000; + +$color-primary-light-1: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 4% +); +$color-primary-light-2: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 8% +); +$color-primary-light-3: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 12% +); +$color-primary-light-4: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 16% +); +$color-primary-light-5: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 20% +); +$color-primary-light-6: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 24% +); +$color-primary-light-7: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 28% +); +$color-primary-light-8: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 32% +); +$color-primary-light-9: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 36% +); +$color-primary-light: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 30% +); +$color-primary-lighter: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 34% +); + +$color-primary-shade-1: function.lightness( + --color-primary-h, + --color-primary-s, + --color-primary-l, + -(10) +); + +$color-success-light-1: function.lightness( + --color-success-h, + --color-success-s, + --color-success-l, + 4% +); +$color-success-light-3: function.lightness( + --color-success-h, + --color-success-s, + --color-success-l, + 12% +); +$color-success-light-5: function.lightness( + --color-success-h, + --color-success-s, + --color-success-l, + 20% +); +$color-success-light: function.lightness( + --color-success-h, + --color-success-s, + --color-success-l, + 41% +); +$color-success-lighter: function.lightness( + --color-success-h, + --color-success-s, + --color-success-l, + 48% +); + +$color-warning-light-1: function.lightness( + --color-warning-h, + --color-warning-s, + --color-warning-l, + 4% +); +$color-warning-light-3: function.lightness( + --color-warning-h, + --color-warning-s, + --color-warning-l, + 12% +); +$color-warning-light-5: function.lightness( + --color-warning-h, + --color-warning-s, + --color-warning-l, + 20% +); +$color-warning-light: function.lightness( + --color-warning-h, + --color-warning-s, + --color-warning-l, + 34% +); +$color-warning-lighter: function.lightness( + --color-warning-h, + --color-warning-s, + --color-warning-l, + 40% +); + +$color-danger-light-1: function.lightness( + --color-danger-h, + --color-danger-s, + --color-danger-l, + 4% +); +$color-danger-light-3: function.lightness( + --color-danger-h, + --color-danger-s, + --color-danger-l, + 12% +); +$color-danger-light-5: function.lightness( + --color-danger-h, + --color-danger-s, + --color-danger-l, + 20% +); +$color-danger-light: function.lightness( + --color-danger-h, + --color-danger-s, + --color-danger-l, + 24% +); +$color-danger-lighter: var(--color-danger-tint-2); + +$color-info-light-1: function.lightness( + --color-info-h, + --color-info-s, + --color-info-l, + 4% +); +$color-info-light-3: function.lightness( + --color-info-h, + --color-info-s, + --color-info-l, + 12% +); +$color-info-light-5: function.lightness( + --color-info-h, + --color-info-s, + --color-info-l, + 20% +); +$color-info-lighter: function.lightness( + --color-info-h, + --color-info-s, + --color-info-l, + 39% +); + +// Background +/// color|1|Background Color|4 +$background-color-base: var(--color-background-base); + +/* Link +-------------------------- */ +$link-color: $color-primary-light-2; +$link-hover-color: var(--color-primary); + +/* Border +-------------------------- */ +$border-color-hover: var(--color-text-lighter); +/// borderRadius|1|Radius|0 +$border-radius-circle: 100%; + +// Box-shadow +/// boxShadow|1|Shadow|1 +$box-shadow-base: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04); +// boxShadow|1|Shadow|1 +$box-shadow-dark: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.12); +/// boxShadow|1|Shadow|1 +$box-shadow-light: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + +/* Fill +-------------------------- */ +$fill-base: $color-white; + +/* Typography +-------------------------- */ +$font-path: 'fonts' !default; +$font-display: 'auto'; +/// fontSize|1|Font Size|0 +$font-size-extra-large: var(--font-size-xl); +/// fontSize|1|Font Size|0 +$font-size-large: var(--font-size-l); +/// fontSize|1|Font Size|0 +$font-size-medium: var(--font-size-m); +/// fontSize|1|Font Size|0 +$font-size-base: var(--font-size-s); +/// fontSize|1|Font Size|0 +$font-size-small: var(--font-size-xs); +/// fontSize|1|Font Size|0 +$font-size-extra-small: var(--font-size-2xs); +/// fontWeight|1|Font Weight|1 +$font-weight-primary: var(--font-weight-semi-bold); +/// fontLineHeight|1|Line Height|2 +$font-line-height-primary: 24px; +$font-color-disabled-base: #bbb; + +/* z-index +-------------------------- */ +$index-normal: 1; +$index-top: 1000; +$index-popper: 2000; + +/* Disable base +-------------------------- */ +$disabled-fill-base: var(--disabled-fill, var(--color-background-light)); +$disabled-color-base: var(--disabled-color, var(--color-text-base)); +$disabled-border-base: var(--disabled-border, var(--border-color-base)); + +/* Icon +-------------------------- */ +$icon-color: #666; +$icon-color-base: var(--color-info); + +/* Checkbox +-------------------------- */ +/// fontSize||Font|1 +$checkbox-font-size: 14px; +/// fontWeight||Font|1 +$checkbox-font-weight: $font-weight-primary; +/// color||Color|0 +$checkbox-font-color: var(--color-text-dark); +$checkbox-input-height: 14px; +$checkbox-input-width: 14px; +/// borderRadius||Border|2 +$checkbox-border-radius: var(--border-radius-small); +/// color||Color|0 +$checkbox-background-color: $color-white; +$checkbox-input-border: var(--border-base); + +/// color||Color|0 +$checkbox-disabled-border-color: var(--border-color-base); +$checkbox-disabled-input-fill: #edf2fc; +$checkbox-disabled-icon-color: var(--color-text-lighter); + +$checkbox-disabled-checked-input-fill: var(--border-color-light); +$checkbox-disabled-checked-input-border-color: var(--border-color-base); +$checkbox-disabled-checked-icon-color: var(--color-text-lighter); + +/// color||Color|0 +$checkbox-checked-font-color: var(--color-primary); +$checkbox-checked-input-border-color: var(--color-primary); +/// color||Color|0 +$checkbox-checked-background-color: var(--color-primary); +$checkbox-checked-icon-color: $fill-base; + +$checkbox-input-border-color-hover: var(--color-primary); +/// height||Other|4 +$checkbox-bordered-height: 40px; +/// padding||Spacing|3 +$checkbox-bordered-padding: 9px 20px 9px 10px; +/// padding||Spacing|3 +$checkbox-bordered-medium-padding: 7px 20px 7px 10px; +/// padding||Spacing|3 +$checkbox-bordered-small-padding: 5px 15px 5px 10px; +/// padding||Spacing|3 +$checkbox-bordered-mini-padding: 3px 15px 3px 10px; +$checkbox-bordered-medium-input-height: 14px; +$checkbox-bordered-medium-input-width: 14px; +/// height||Other|4 +$checkbox-bordered-medium-height: 36px; +$checkbox-bordered-small-input-height: 12px; +$checkbox-bordered-small-input-width: 12px; +/// height||Other|4 +$checkbox-bordered-small-height: 32px; +$checkbox-bordered-mini-input-height: 12px; +$checkbox-bordered-mini-input-width: 12px; +/// height||Other|4 +$checkbox-bordered-mini-height: 28px; + +/// color||Color|0 +$checkbox-button-checked-background-color: var(--color-primary); +/// color||Color|0 +$checkbox-button-checked-font-color: $color-white; +/// color||Color|0 +$checkbox-button-checked-border-color: var(--color-primary); + +/* Radio +-------------------------- */ +/// fontSize||Font|1 +$radio-font-size: $font-size-base; +/// fontWeight||Font|1 +$radio-font-weight: $font-weight-primary; +/// color||Color|0 +$radio-font-color: var(--color-text-dark); +$radio-input-height: 14px; +$radio-input-width: 14px; +/// borderRadius||Border|2 +$radio-input-border-radius: $border-radius-circle; +/// color||Color|0 +$radio-input-background-color: $color-white; +$radio-input-border: var(--border-base); +/// color||Color|0 +$radio-input-border-color: var(--border-color-base); +/// color||Color|0 +$radio-icon-color: $color-white; + +$radio-disabled-input-border-color: $disabled-border-base; +$radio-disabled-input-fill: $disabled-fill-base; +$radio-disabled-icon-color: $disabled-fill-base; + +$radio-disabled-checked-input-border-color: $disabled-border-base; +$radio-disabled-checked-input-fill: $disabled-fill-base; +$radio-disabled-checked-icon-color: var(--color-text-lighter); + +/// color||Color|0 +$radio-checked-font-color: var(--color-primary); +/// color||Color|0 +$radio-checked-input-border-color: var(--color-primary); +/// color||Color|0 +$radio-checked-input-background-color: $color-white; +/// color||Color|0 +$radio-checked-icon-color: var(--color-primary); + +$radio-input-border-color-hover: var(--color-primary); + +$radio-bordered-height: 40px; +$radio-bordered-padding: 12px 20px 0 10px; +$radio-bordered-medium-padding: 10px 20px 0 10px; +$radio-bordered-small-padding: 8px 15px 0 10px; +$radio-bordered-mini-padding: 6px 15px 0 10px; +$radio-bordered-medium-input-height: 14px; +$radio-bordered-medium-input-width: 14px; +$radio-bordered-medium-height: 36px; +$radio-bordered-small-input-height: 12px; +$radio-bordered-small-input-width: 12px; +$radio-bordered-small-height: 32px; +$radio-bordered-mini-input-height: 12px; +$radio-bordered-mini-input-width: 12px; +$radio-bordered-mini-height: 28px; + +/// fontSize||Font|1 +$radio-button-font-size: $font-size-base; +/// color||Color|0 +$radio-button-checked-background-color: var(--color-primary); +/// color||Color|0 +$radio-button-checked-font-color: $color-white; +/// color||Color|0 +$radio-button-checked-border-color: var(--color-primary); +$radio-button-disabled-checked-fill: var(--border-color-light); + +/* Select +-------------------------- */ +$select-border-color-hover: $border-color-hover; +$select-disabled-border: $disabled-border-base; +/// fontSize||Font|1 +$select-font-size: $font-size-base; +$select-close-hover-color: var(--color-text-light); + +$select-input-color: var(--color-text-lighter); +$select-multiple-input-color: #666; +/// color||Color|0 +$select-input-focus-border-color: var(--color-secondary); +/// fontSize||Font|1 +$select-input-font-size: 14px; + +$select-option-color: var(--color-text-dark); +$select-option-disabled-color: var(--color-text-lighter); +$select-option-disabled-background: $color-white; +/// height||Other|4 +$select-option-height: 34px; +$select-option-hover-background: $background-color-base; +/// color||Color|0 +$select-option-selected-font-color: var(--color-primary); +$select-option-selected-hover: $background-color-base; + +$select-group-color: var(--color-info); +$select-group-height: 30px; +$select-group-font-size: 12px; + +$select-dropdown-background: $color-white; +$select-dropdown-shadow: $box-shadow-light; +$select-dropdown-empty-color: #999; +/// height||Other|4 +$select-dropdown-max-height: 274px; +$select-dropdown-padding: 6px 0; +$select-dropdown-empty-padding: 10px 0; +$select-dropdown-border: solid 1px var(--border-color-base); + +/* Alert +-------------------------- */ +$alert-padding: 8px 16px; +/// borderRadius||Border|2 +$alert-border-radius: var(--border-radius-base); +/// fontSize||Font|1 +$alert-title-font-size: 13px; +/// fontSize||Font|1 +$alert-description-font-size: 12px; +/// fontSize||Font|1 +$alert-close-font-size: 12px; +/// fontSize||Font|1 +$alert-close-customed-font-size: 13px; + +$alert-success-color: $color-success-lighter; +$alert-info-color: $color-info-lighter; +$alert-warning-color: $color-warning-lighter; +$alert-danger-color: $color-danger-lighter; + +/// height||Other|4 +$alert-icon-size: 16px; +/// height||Other|4 +$alert-icon-large-size: 28px; + +/* MessageBox +-------------------------- */ +/// color||Color|0 +$messagebox-title-color: var(--color-text-dark); +$msgbox-width: 420px; +$msgbox-border-radius: 4px; +/// fontSize||Font|1 +$messagebox-font-size: $font-size-large; +/// fontSize||Font|1 +$messagebox-content-font-size: $font-size-base; +/// color||Color|0 +$messagebox-content-color: var(--color-text-dark); +/// fontSize||Font|1 +$messagebox-error-font-size: 12px; +$msgbox-padding-primary: 15px; +/// color||Color|0 +$messagebox-success-color: var(--color-success); +/// color||Color|0 +$messagebox-info-color: var(--color-info); +/// color||Color|0 +$messagebox-warning-color: var(--color-warning); +/// color||Color|0 +$messagebox-danger-color: var(--color-danger); + +/* Message +-------------------------- */ +$message-shadow: $box-shadow-base; +$message-min-width: 380px; +$message-background-color: #edf2fc; +$message-padding: 15px 15px 15px 20px; +/// color||Color|0 +$message-close-icon-color: var(--color-text-lighter); +/// height||Other|4 +$message-close-size: 16px; +/// color||Color|0 +$message-close-hover-color: var(--color-text-light); + +/// color||Color|0 +$message-success-font-color: var(--color-success); +/// color||Color|0 +$message-info-font-color: var(--color-info); +/// color||Color|0 +$message-warning-font-color: var(--color-warning); +/// color||Color|0 +$message-danger-font-color: var(--color-danger); + +/* Notification +-------------------------- */ +$notification-width: 330px; +/// padding||Spacing|3 +$notification-padding: 14px 26px 14px 13px; +$notification-radius: 8px; +$notification-shadow: $box-shadow-light; +/// color||Color|0 +$notification-border-color: var(--border-color-light); +$notification-icon-size: 24px; +$notification-close-font-size: $message-close-size; +$notification-group-margin-left: 13px; +$notification-group-margin-right: 8px; +/// fontSize||Font|1 +$notification-content-font-size: $font-size-base; +/// color||Color|0 +$notification-content-color: var(--color-text-dark); +/// fontSize||Font|1 +$notification-title-font-size: 16px; +/// color||Color|0 +$notification-title-color: var(--color-text-dark); + +/// color||Color|0 +$notification-close-color: var(--color-text-light); +/// color||Color|0 +$notification-close-hover-color: var(--color-text-dark); + +/// color||Color|0 +$notification-success-icon-color: var(--color-success); +/// color||Color|0 +$notification-info-icon-color: var(--color-info); +/// color||Color|0 +$notification-warning-icon-color: var(--color-warning); +/// color||Color|0 +$notification-danger-icon-color: var(--color-danger); + +/* Input +-------------------------- */ +$input-placeholder-color: var(--input-placeholder-color, var(--color-text-light)); +$input-focus-border: var(--input-focus-border-color, var(--color-secondary)); +$input-border-color: var(--input-border-color, var(--border-color-base)); +$input-border-style: var(--input-border-style, var(--border-style-base)); +$input-border-width: var(--border-width-base); +$input-border: $input-border-color $input-border-style $input-border-width; + +$input-font-size: var(--input-font-size, var(--font-size-s)); +/// color||Color|0 +$input-font-color: var(--input-font-color, var(--color-text-dark)); +/// height||Other|4 +$input-width: 140px; +/// height||Other|4 +$input-height: 40px; +/// borderRadius||Border|2 +$input-border-radius: var(--input-border-radius, var(--border-radius-base)); +$input-border-color-hover: $border-color-hover; +/// color||Color|0 +$input-background-color: var(--input-background-color, var(--color-foreground-xlight)); +$input-fill-disabled: $disabled-fill-base; +$input-color-disabled: $font-color-disabled-base; +/// color||Color|0 +$input-icon-color: var(--color-text-lighter); +/// color||Color|0 + +$input-hover-border: $border-color-hover; +$input-clear-color: var(--color-text-light); +$input-clear-hover-color: var(--color-text-base); + +$input-disabled-fill: $disabled-fill-base; +$input-disabled-border: $disabled-border-base; +$input-disabled-color: $disabled-color-base; +$input-disabled-placeholder-color: var(--color-text-lighter); + +/// fontSize||Font|1 +$input-medium-font-size: var(--input-font-size, 14px); +/// height||Other|4 +$input-medium-height: 36px; +/// fontSize||Font|1 +$input-small-font-size: 12px !default; +/// height||Other|4 +$input-small-height: 30px !default; +/// fontSize||Font|1 +$input-mini-font-size: 12px; +/// height||Other|4 +$input-mini-height: 26px !default; + +/* Cascader +-------------------------- */ +/// color||Color|0 +$cascader-menu-font-color: var(--color-text-dark); +/// color||Color|0 +$cascader-menu-selected-font-color: var(--color-primary); +$cascader-menu-fill: $fill-base; +$cascader-menu-font-size: $font-size-base; +$cascader-menu-radius: var(--border-radius-base); +$cascader-menu-border: solid 1px var(--border-color-base); +$cascader-menu-shadow: $box-shadow-light; +$cascader-node-background-hover: $background-color-base; +$cascader-node-color-disabled: var(--color-text-lighter); +$cascader-color-empty: var(--color-text-lighter); +$cascader-tag-background: #f0f2f5; + +/* Group +-------------------------- */ +$group-option-flex: 0 0 (math.div(1, 5)) * 100%; +$group-option-offset-bottom: 12px; +$group-option-fill-hover: rgba($color-black, 0.06); +$group-title-color: $color-black; +$group-title-font-size: $font-size-base; +$group-title-width: 66px; + +/* Tab +-------------------------- */ +$tab-font-size: $font-size-base; +$tab-border-line: 1px solid #e4e4e4; +$tab-header-color-active: var(--color-text-light); +$tab-header-color-hover: var(--color-text-dark); +$tab-header-color: var(--color-text-dark); +$tab-header-fill-active: rgba($color-black, 0.06); +$tab-header-fill-hover: rgba($color-black, 0.06); +$tab-vertical-header-width: 90px; +$tab-vertical-header-count-color: $color-white; +$tab-vertical-header-count-fill: var(--color-text-light); + +/* Button +-------------------------- */ +$button-font-size: var(--button-font-size, var(--font-size-s)); + +$button-padding-vertical: var(--button-padding-vertical, var(--spacing-xs)); +$button-padding-horizontal: var(--button-padding-horizontal, var(--spacing-m)); + +$button-border-radius: var(--button-border-radius, 4px); + +$button-border-color: var(--button-border-color, var(--color-primary)); + +/// fontSize||Font|1 +$button-medium-font-size: $font-size-base; +/// borderRadius||Border|2 +$button-medium-border-radius: var(--border-radius-base); +/// padding||Spacing|3 +$button-medium-padding-vertical: 10px; +/// padding||Spacing|3 +$button-medium-padding-horizontal: 20px; + +/// fontSize||Font|1 +$button-small-font-size: 12px; +$button-small-border-radius: #{var(--border-radius-base) - 1}; +/// padding||Spacing|3 +$button-small-padding-vertical: 9px; +/// padding||Spacing|3 +$button-small-padding-horizontal: 15px; +/// fontSize||Font|1 +$button-mini-font-size: 12px; +$button-mini-border-radius: #{var(--border-radius-base) - 1}; +/// padding||Spacing|3 +$button-mini-padding-vertical: 7px; +/// padding||Spacing|3 +$button-mini-padding-horizontal: 15px; + +$button-font-color: var(--button-color, var(--color-text-xlight)); +$button-background-color: var(--button-background-color, var(--color-primary)); +$button-active-color: var(--button-active-color, var(--color-text-xlight)); +$button-active-border-color: var( + --button-active-border-color, + var(--color-primary-shade-1) +); +$button-active-background-color: var( + --button-active-background-color, + var(--color-primary-shade-1) +); + +/// color||Color|0 +$button-default-font-color: var(--color-text-dark); +/// color||Color|0 +$button-default-background-color: $color-white; +/// color||Color|0 +$button-default-border-color: var(--border-color-base); + +/// color||Color|0 +$button-disabled-font-color: var(--color-text-light); +/// color||Color|0 +$button-disabled-background-color: var( + --button-disabled-background-color, + var(--color-foreground-base) +); +/// color||Color|0 +$button-disabled-border-color: var(--border-color-base); + +/// color||Color|0 +$button-primary-border-color: var(--color-primary); +/// color||Color|0 +$button-primary-font-color: $color-white; +/// color||Color|0 +$button-primary-background-color: var(--color-primary); +/// color||Color|0 +$button-success-border-color: var(--color-success); +/// color||Color|0 +$button-success-font-color: $color-white; +/// color||Color|0 +$button-success-background-color: var(--color-success); +/// color||Color|0 +$button-warning-border-color: var(--color-warning); +/// color||Color|0 +$button-warning-font-color: $color-white; +/// color||Color|0 +$button-warning-background-color: var(--color-warning); +/// color||Color|0 +$button-danger-border-color: var(--color-danger); +/// color||Color|0 +$button-danger-font-color: $color-white; +/// color||Color|0 +$button-danger-background-color: var(--color-danger); +/// color||Color|0 +$button-info-border-color: var(--color-info); +/// color||Color|0 +$button-info-font-color: $color-white; +/// color||Color|0 +$button-info-background-color: var(--color-info); + +$button-hover-tint-percent: 10%; +$button-light-tint-percent: 30%; +$button-active-shade-percent: 10%; + +/* cascader +-------------------------- */ +$cascader-height: 200px; + +/* Switch +-------------------------- */ +/// color||Color|0 +$switch-on-color: var(--color-primary); +/// color||Color|0 +$switch-off-color: var(--color-text-light); +/// fontSize||Font|1 +$switch-font-size: $font-size-base; +$switch-core-border-radius: 10px; +// height||Other|4 TODO: width 代码写死的40px 所以下面这三个属性都没意义 +$switch-width: 40px; +// height||Other|4 +$switch-height: 20px; +// height||Other|4 +$switch-button-size: 16px; + +/* Dialog +-------------------------- */ +$dialog-background-color: $color-white; +$dialog-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +/// fontSize||Font|1 +$dialog-title-font-size: $font-size-large; +/// fontSize||Font|1 +$dialog-content-font-size: 14px; +/// fontLineHeight||LineHeight|2 +$dialog-font-line-height: $font-line-height-primary; +/// padding||Spacing|3 +$dialog-padding-primary: 20px; + +/* Table +-------------------------- */ +/// color||Color|0 +$table-border-color: var(--border-color-light); +$table-border: 1px solid $table-border-color; +/// color||Color|0 +$table-font-color: var(--color-text-dark); +/// color||Color|0 +$table-header-font-color: var(--color-text-light); +/// color||Color|0 +$table-row-hover-background-color: $background-color-base; +$table-current-row-background-color: $color-primary-light-9; +/// color||Color|0 +$table-header-background-color: $color-white; +$table-fixed-box-shadow: 0 0 10px rgba(0, 0, 0, 0.12); + +/* Pagination +-------------------------- */ +/// fontSize||Font|1 +$pagination-font-size: 13px; +/// color||Color|0 +$pagination-background-color: $color-white; +/// color||Color|0 +$pagination-font-color: var(--color-text-dark); +$pagination-border-radius: 3px; +/// color||Color|0 +$pagination-button-color: var(--color-text-dark); +/// height||Other|4 +$pagination-button-width: 35.5px; +/// height||Other|4 +$pagination-button-height: 28px; +/// color||Color|0 +$pagination-button-disabled-color: var(--color-text-lighter); +/// color||Color|0 +$pagination-button-disabled-background-color: $color-white; +/// color||Color|0 +$pagination-hover-color: var(--color-primary); + +/* Popup +-------------------------- */ +/// color||Color|0 +$popup-modal-background-color: $color-black; +/// opacity||Other|1 +$popup-modal-opacity: 0.5; + +/* Popover +-------------------------- */ +/// color||Color|0 +$popover-background-color: $color-white; +/// fontSize||Font|1 +$popover-font-size: $font-size-base; +/// color||Color|0 +$popover-border-color: var(--border-color-light); +$popover-arrow-size: 6px; +/// padding||Spacing|3 +$popover-padding: 12px; +$popover-padding-large: 18px 20px; +/// fontSize||Font|1 +$popover-title-font-size: 16px; +/// color||Color|0 +$popover-title-font-color: var(--color-text-dark); + +/* Tooltip +-------------------------- */ +/// color|1|Color|0 +$tooltip-fill: var(--color-text-dark); +/// color|1|Color|0 +$tooltip-color: $color-white; +/// fontSize||Font|1 +$tooltip-font-size: 12px; +/// color||Color|0 +$tooltip-border-color: var(--color-text-dark); +$tooltip-arrow-size: 6px; +/// padding||Spacing|3 +$tooltip-padding: 10px; + +/* Tag +-------------------------- */ +/// color||Color|0 +$tag-info-color: var(--color-info); +/// color||Color|0 +$tag-primary-color: var(--color-primary); +/// color||Color|0 +$tag-success-color: var(--color-success); +/// color||Color|0 +$tag-warning-color: var(--color-warning); +/// color||Color|0 +$tag-danger-color: var(--color-danger); +/// fontSize||Font|1 +$tag-font-size: 12px; +$tag-border-radius: 4px; +$tag-padding: 0 10px; + +/* Tree +-------------------------- */ +/// color||Color|0 +$tree-node-hover-background-color: $background-color-base; +/// color||Color|0 +$tree-font-color: var(--color-text-dark); +/// color||Color|0 +$tree-expand-icon-color: var(--color-text-lighter); + +/* Dropdown +-------------------------- */ +$dropdown-menu-box-shadow: $box-shadow-light; +$dropdown-menuItem-hover-fill: $color-primary-light-9; +$dropdown-menuItem-hover-color: $link-color; + +/* Badge +-------------------------- */ +/// color||Color|0 +$badge-background-color: var(--color-danger); +$badge-radius: 10px; +/// fontSize||Font|1 +$badge-font-size: 12px; +/// padding||Spacing|3 +$badge-padding: 6px; +/// height||Other|4 +$badge-size: 18px; + +/* Card +--------------------------*/ +/// color||Color|0 +$card-border-color: var(--border-color-light); +$card-border-radius: 4px; +/// padding||Spacing|3 +$card-padding: 20px; + +/* Slider +--------------------------*/ +/// color||Color|0 +$slider-main-background-color: var(--color-primary); +/// color||Color|0 +$slider-runway-background-color: var(--border-color-base); +$slider-button-hover-color: function.saturation( + --color-primary-h, + --color-primary-s, + --color-primary-l, + 8% +); +$slider-stop-background-color: $color-white; +$slider-disable-color: var(--color-text-lighter); +$slider-margin: 16px 0; +$slider-border-radius: 3px; +/// height|1|Other|4 +$slider-height: 6px; +/// height||Other|4 +$slider-button-size: 16px; +$slider-button-wrapper-size: 36px; +$slider-button-wrapper-offset: -15px; + +/* Steps +--------------------------*/ +$steps-border-color: $disabled-border-base; +$steps-border-radius: 4px; +$steps-padding: 20px; + +/* Menu +--------------------------*/ +/// fontSize||Font|1 +$menu-item-font-size: $font-size-base; +/// color||Color|0 +$menu-item-font-color: var(--color-text-dark); +/// color||Color|0 +$menu-background-color: $color-white; +$menu-item-hover-fill: $color-primary-light-9; + +/* Rate +--------------------------*/ +$rate-height: 20px; +/// fontSize||Font|1 +$rate-font-size: $font-size-base; +/// height||Other|3 +$rate-icon-size: 18px; +/// margin||Spacing|2 +$rate-icon-margin: 6px; +$rate-icon-color: var(--color-text-lighter); + +/* DatePicker +--------------------------*/ +$datepicker-font-color: var(--color-text-dark); +/// color|1|Color|0 +$datepicker-off-font-color: var(--color-text-lighter); +/// color||Color|0 +$datepicker-header-font-color: var(--color-text-dark); +$datepicker-icon-color: var(--color-text-dark); +$datepicker-border-color: $disabled-border-base; +$datepicker-inner-border-color: #e4e4e4; +/// color||Color|0 +$datepicker-inrange-background-color: var(--border-color-light); +/// color||Color|0 +$datepicker-inrange-hover-background-color: var(--border-color-light); +/// color||Color|0 +$datepicker-active-color: var(--color-primary); +/// color||Color|0 +$datepicker-hover-font-color: var(--color-primary); +$datepicker-cell-hover-color: #fff; + +/* Loading +--------------------------*/ +/// height||Other|4 +$loading-spinner-size: 42px; +/// height||Other|4 +$loading-fullscreen-spinner-size: 50px; + +/* Scrollbar +--------------------------*/ +$scrollbar-background-color: hsla( + var(#{--color-text-light-h}), + var(#{--color-text-light-s}), + var(#{--color-text-light-l}), + 0.3 +); +$scrollbar-hover-background-color: hsla( + var(#{--color-text-light-h}), + var(#{--color-text-light-s}), + var(#{--color-text-light-l}), + 0.5 +); + +/* Carousel +--------------------------*/ +/// fontSize||Font|1 +$carousel-arrow-font-size: 12px; +$carousel-arrow-size: 36px; +$carousel-arrow-background: rgba(31, 45, 61, 0.11); +$carousel-arrow-hover-background: rgba(31, 45, 61, 0.23); +/// width||Other|4 +$carousel-indicator-width: 30px; +/// height||Other|4 +$carousel-indicator-height: 2px; +$carousel-indicator-padding-horizontal: 4px; +$carousel-indicator-padding-vertical: 12px; +$carousel-indicator-out-color: $border-color-hover; + +/* Collapse +--------------------------*/ +/// color||Color|0 +$collapse-border-color: var(--border-color-light); +/// height||Other|4 +$collapse-header-height: 48px; +/// color||Color|0 +$collapse-header-background-color: $color-white; +/// color||Color|0 +$collapse-header-font-color: var(--color-text-dark); +/// fontSize||Font|1 +$collapse-header-font-size: 13px; +/// color||Color|0 +$collapse-content-background-color: $color-white; +/// fontSize||Font|1 +$collapse-content-font-size: 13px; +/// color||Color|0 +$collapse-content-font-color: var(--color-text-dark); + +/* Transfer +--------------------------*/ +$transfer-border-color: var(--border-color-light); +$transfer-border-radius: var(--border-radius-base); +/// height||Other|4 +$transfer-panel-width: 200px; +/// height||Other|4 +$transfer-panel-header-height: 40px; +/// color||Color|0 +$transfer-panel-header-background-color: $background-color-base; +/// height||Other|4 +$transfer-panel-footer-height: 40px; +/// height||Other|4 +$transfer-panel-body-height: 246px; +/// height||Other|4 +$transfer-item-height: 30px; +/// height||Other|4 +$transfer-filter-height: 32px; + +/* Header + --------------------------*/ +$header-padding: 0 20px; + +/* Footer +--------------------------*/ +$footer-padding: 0 20px; + +/* Main +--------------------------*/ +$main-padding: 20px; + +/* Timeline +--------------------------*/ +$timeline-node-size-normal: 12px; +$timeline-node-size-large: 14px; +$timeline-node-color: var(--border-color-base); + +/* Backtop +--------------------------*/ +/// color||Color|0 +$backtop-background-color: $color-white; +/// color||Color|0 +$backtop-font-color: var(--color-primary); +/// color||Color|0 +$backtop-hover-background-color: var(--border-color-light); + +/* Link +--------------------------*/ +/// fontSize||Font|1 +$link-font-size: $font-size-base; +/// fontWeight||Font|1 +$link-font-weight: $font-weight-primary; +/// color||Color|0 +$link-default-font-color: var(--color-text-dark); +/// color||Color|0 +$link-default-active-color: var(--color-primary); +/// color||Color|0 +$link-disabled-font-color: var(--color-text-lighter); +/// color||Color|0 +$link-primary-font-color: var(--color-primary); +/// color||Color|0 +$link-success-font-color: var(--color-success); +/// color||Color|0 +$link-warning-font-color: var(--color-warning); +/// color||Color|0 +$link-danger-font-color: var(--color-danger); +/// color||Color|0 +$link-info-font-color: var(--color-info); +/* Calendar +--------------------------*/ +/// border||Other|4 +$calendar-border: $table-border; +/// color||Other|4 +$calendar-selected-background-color: #f2f8fe; +$calendar-cell-width: 85px; + +/* Form +-------------------------- */ +/// fontSize||Font|1 +$form-label-font-size: $font-size-base; + +/* Avatar +--------------------------*/ +/// color||Color|0 +$avatar-font-color: #fff; +/// color||Color|0 +$avatar-background-color: #c0c4cc; +/// fontSize||Font Size|1 +$avatar-text-font-size: 14px; +/// fontSize||Font Size|1 +$avatar-icon-font-size: 18px; +/// borderRadius||Border|2 +$avatar-border-radius: var(--border-radius-base); +/// size|1|Avatar Size|3 +$avatar-large-size: 40px; +/// size|1|Avatar Size|3 +$avatar-medium-size: 36px; +/// size|1|Avatar Size|3 +$avatar-small-size: 28px; + +/* Break-point +--------------------------*/ +$sm: 768px; +$md: 992px; +$lg: 1200px; +$xl: 1920px; + +$breakpoints: ( + 'xs': ( + max-width: $sm - 1, + ), + 'sm': ( + min-width: $sm, + ), + 'md': ( + min-width: $md, + ), + 'lg': ( + min-width: $lg, + ), + 'xl': ( + min-width: $xl, + ), +); + +$breakpoints-spec: ( + 'xs-only': ( + max-width: $sm - 1, + ), + 'sm-and-up': ( + min-width: $sm, + ), + 'sm-only': ( + min-width: #{$sm}, + ) + and + ( + max-width: #{$md - 1}, + ), + 'sm-and-down': ( + max-width: $md - 1, + ), + 'md-and-up': ( + min-width: $md, + ), + 'md-only': ( + min-width: #{$md}, + ) + and + ( + max-width: #{$lg - 1}, + ), + 'md-and-down': ( + max-width: $lg - 1, + ), + 'lg-and-up': ( + min-width: $lg, + ), + 'lg-only': ( + min-width: #{$lg}, + ) + and + ( + max-width: #{$xl - 1}, + ), + 'lg-and-down': ( + max-width: $xl - 1, + ), + 'xl-only': ( + min-width: $xl, + ), +); diff --git a/packages/design-system/theme/src/container.scss b/packages/design-system/theme/src/container.scss new file mode 100644 index 0000000000..0565ec8412 --- /dev/null +++ b/packages/design-system/theme/src/container.scss @@ -0,0 +1,14 @@ +@use "mixins/mixins"; + +@include mixins.b(container) { + display: flex; + flex-direction: row; + flex: 1; + flex-basis: auto; + box-sizing: border-box; + min-width: 0; + + @include mixins.when(vertical) { + flex-direction: column; + } +} diff --git a/packages/design-system/theme/src/date-picker.scss b/packages/design-system/theme/src/date-picker.scss new file mode 100644 index 0000000000..6060427914 --- /dev/null +++ b/packages/design-system/theme/src/date-picker.scss @@ -0,0 +1,12 @@ +@use "./date-picker/date-table.scss"; +@use "./date-picker/month-table.scss"; +@use "./date-picker/year-table.scss"; +@use "./date-picker/time-spinner.scss"; +@use "./date-picker/picker.scss"; +@use "./date-picker/date-picker.scss"; +@use "./date-picker/date-range-picker.scss"; +@use "./date-picker/time-range-picker.scss"; +@use "./date-picker/time-picker.scss"; +@use "./input.scss"; +@use "./scrollbar.scss"; +@use "./popper"; diff --git a/packages/design-system/theme/src/date-picker/date-picker.scss b/packages/design-system/theme/src/date-picker/date-picker.scss new file mode 100644 index 0000000000..361758c91b --- /dev/null +++ b/packages/design-system/theme/src/date-picker/date-picker.scss @@ -0,0 +1,97 @@ +@use "../common/var"; +@use "../mixins/mixins"; +@use "./picker-panel.scss"; + +@include mixins.b(date-picker) { + width: 322px; + + &.has-sidebar.has-time { + width: 434px; + } + + &.has-sidebar { + width: 438px; + } + + &.has-time .el-picker-panel__body-wrapper { + position: relative; + } + + .el-picker-panel__content { + width: 292px; + } + + table { + table-layout: fixed; + width: 100%; + } + + @include mixins.e(editor-wrap) { + position: relative; + display: table-cell; + padding: 0 5px; + } + + @include mixins.e(time-header) { + position: relative; + border-bottom: 1px solid var.$datepicker-inner-border-color; + font-size: 12px; + padding: 8px 5px 5px 5px; + display: table; + width: 100%; + box-sizing: border-box; + } + + @include mixins.e(header) { + margin: 12px; + text-align: center; + + @include mixins.m(bordered) { + margin-bottom: 0; + padding-bottom: 12px; + border-bottom: solid 1px var(--border-color-light); + + & + .el-picker-panel__content { + margin-top: 0; + } + } + } + + @include mixins.e(header-label) { + font-size: 16px; + font-weight: 500; + padding: 0 5px; + line-height: 22px; + text-align: center; + cursor: pointer; + color: var(--color-text-dark); + + &:hover { + color: var.$datepicker-hover-font-color; + } + + &.active { + color: var.$datepicker-active-color; + } + } + + @include mixins.e(prev-btn) { + float: left; + } + + @include mixins.e(next-btn) { + float: right; + } + + @include mixins.e(time-wrap) { + padding: 10px; + text-align: center; + } + + @include mixins.e(time-label) { + float: left; + cursor: pointer; + line-height: 30px; + margin-left: 10px; + } +} diff --git a/packages/design-system/theme/src/date-picker/date-range-picker.scss b/packages/design-system/theme/src/date-picker/date-range-picker.scss new file mode 100644 index 0000000000..fc6746b782 --- /dev/null +++ b/packages/design-system/theme/src/date-picker/date-range-picker.scss @@ -0,0 +1,101 @@ +@use "../common/var"; +@use "../mixins/mixins"; + +@include mixins.b(date-range-picker) { + width: 646px; + + &.has-sidebar { + width: 756px; + } + + table { + table-layout: fixed; + width: 100%; + } + + .el-picker-panel__body { + min-width: 513px; + } + + .el-picker-panel__content { + margin: 0; + } + + @include mixins.e(header) { + position: relative; + text-align: center; + height: 28px; + + [class*='arrow-left'] { + float: left; + } + + [class*='arrow-right'] { + float: right; + } + + div { + font-size: 16px; + font-weight: 500; + margin-right: 50px; + } + } + + @include mixins.e(content) { + float: left; + width: 50%; + box-sizing: border-box; + margin: 0; + padding: 16px; + + @include mixins.when(left) { + border-right: 1px solid var.$datepicker-inner-border-color; + } + .el-date-range-picker__header { + div { + margin-left: 50px; + margin-right: 50px; + } + } + } + + @include mixins.e(editors-wrap) { + box-sizing: border-box; + display: table-cell; + + @include mixins.when(right) { + text-align: right; + } + } + + @include mixins.e(time-header) { + position: relative; + border-bottom: 1px solid var.$datepicker-inner-border-color; + font-size: 12px; + padding: 8px 5px 5px 5px; + display: table; + width: 100%; + box-sizing: border-box; + + > .el-icon-arrow-right { + font-size: 20px; + vertical-align: middle; + display: table-cell; + color: var.$datepicker-icon-color; + } + } + + @include mixins.e(time-picker-wrap) { + position: relative; + display: table-cell; + padding: 0 5px; + + .el-picker-panel { + position: absolute; + top: 13px; + right: 0; + z-index: 1; + background: var.$color-white; + } + } +} diff --git a/packages/design-system/theme/src/date-picker/date-table.scss b/packages/design-system/theme/src/date-picker/date-table.scss new file mode 100644 index 0000000000..5e0dc82928 --- /dev/null +++ b/packages/design-system/theme/src/date-picker/date-table.scss @@ -0,0 +1,151 @@ +@use "../common/var"; +@use "../mixins/mixins"; + +@include mixins.b(date-table) { + font-size: 12px; + user-select: none; + + @include mixins.when(week-mode) { + .el-date-table__row { + &:hover { + div { + background-color: var.$datepicker-inrange-background-color; + } + td.available:hover { + color: var.$datepicker-font-color; + } + td:first-child div { + margin-left: 5px; + border-top-left-radius: 15px; + border-bottom-left-radius: 15px; + } + td:last-child div { + margin-right: 5px; + border-top-right-radius: 15px; + border-bottom-right-radius: 15px; + } + } + + &.current div { + background-color: var.$datepicker-inrange-background-color; + } + } + } + + td { + width: 32px; + height: 30px; + padding: 4px 0; + box-sizing: border-box; + text-align: center; + cursor: pointer; + position: relative; + + & div { + height: 30px; + padding: 3px 0; + box-sizing: border-box; + } + + & span { + width: 24px; + height: 24px; + display: block; + margin: 0 auto; + line-height: 24px; + position: absolute; + left: 50%; + transform: translateX(-50%); + border-radius: 50%; + } + + &.next-month, + &.prev-month { + color: var.$datepicker-off-font-color; + } + + &.today { + position: relative; + span { + color: var(--color-primary); + font-weight: bold; + } + &.start-date span, + &.end-date span { + color: var.$color-white; + } + } + + &.available:hover { + color: var.$datepicker-hover-font-color; + } + + &.in-range div { + background-color: var.$datepicker-inrange-background-color; + &:hover { + background-color: var.$datepicker-inrange-hover-background-color; + } + } + + &.current:not(.disabled) span { + color: var.$color-white; + background-color: var.$datepicker-active-color; + } + &.start-date div, + &.end-date div { + color: var.$color-white; + } + + &.start-date span, + &.end-date span { + background-color: var.$datepicker-active-color; + } + + &.start-date div { + margin-left: 5px; + border-top-left-radius: 15px; + border-bottom-left-radius: 15px; + } + + &.end-date div { + margin-right: 5px; + border-top-right-radius: 15px; + border-bottom-right-radius: 15px; + } + + &.disabled div { + background-color: var.$background-color-base; + opacity: 1; + cursor: not-allowed; + color: var(--color-text-lighter); + } + + &.selected div { + margin-left: 5px; + margin-right: 5px; + background-color: var.$datepicker-inrange-background-color; + border-radius: 15px; + &:hover { + background-color: var.$datepicker-inrange-hover-background-color; + } + } + + &.selected span { + background-color: var.$datepicker-active-color; + color: var.$color-white; + border-radius: 15px; + } + + &.week { + font-size: 80%; + color: var.$datepicker-header-font-color; + } + } + + th { + padding: 5px; + color: var.$datepicker-header-font-color; + font-weight: 400; + border-bottom: solid 1px var(--border-color-light); + } +} diff --git a/packages/design-system/theme/src/date-picker/month-table.scss b/packages/design-system/theme/src/date-picker/month-table.scss new file mode 100644 index 0000000000..fba6f41a03 --- /dev/null +++ b/packages/design-system/theme/src/date-picker/month-table.scss @@ -0,0 +1,83 @@ +@use "../common/var"; +@use "../mixins/mixins"; + +@include mixins.b(month-table) { + font-size: 12px; + margin: -1px; + border-collapse: collapse; + + td { + text-align: center; + padding: 8px 0px; + cursor: pointer; + & div { + height: 48px; + padding: 6px 0; + box-sizing: border-box; + } + &.today { + .cell { + color: var(--color-primary); + font-weight: bold; + } + &.start-date .cell, + &.end-date .cell { + color: var.$color-white; + } + } + + &.disabled .cell { + background-color: var.$background-color-base; + cursor: not-allowed; + color: var(--color-text-lighter); + + &:hover { + color: var(--color-text-lighter); + } + } + + .cell { + width: 60px; + height: 36px; + display: block; + line-height: 36px; + color: var.$datepicker-font-color; + margin: 0 auto; + border-radius: 18px; + &:hover { + color: var.$datepicker-hover-font-color; + } + } + + &.in-range div { + background-color: var.$datepicker-inrange-background-color; + &:hover { + background-color: var.$datepicker-inrange-hover-background-color; + } + } + &.start-date div, + &.end-date div { + color: var.$color-white; + } + + &.start-date .cell, + &.end-date .cell { + color: var.$color-white; + background-color: var.$datepicker-active-color; + } + + &.start-date div { + border-top-left-radius: 24px; + border-bottom-left-radius: 24px; + } + + &.end-date div { + border-top-right-radius: 24px; + border-bottom-right-radius: 24px; + } + + &.current:not(.disabled) .cell { + color: var.$datepicker-active-color; + } + } +} diff --git a/packages/design-system/theme/src/date-picker/picker-panel.scss b/packages/design-system/theme/src/date-picker/picker-panel.scss new file mode 100644 index 0000000000..fbf001a78a --- /dev/null +++ b/packages/design-system/theme/src/date-picker/picker-panel.scss @@ -0,0 +1,128 @@ +@use "../common/var"; +@use "../mixins/mixins"; +@use "../mixins/button"; + +@include mixins.b(picker-panel) { + color: var(--color-text-dark); + border: 1px solid var.$datepicker-border-color; + box-shadow: var.$box-shadow-light; + background: var.$color-white; + border-radius: var(--border-radius-base); + line-height: 30px; + margin: 5px 0; + + @include mixins.e((body, body-wrapper)) { + &::after { + content: ''; + display: table; + clear: both; + } + } + + @include mixins.e(content) { + position: relative; + margin: 15px; + } + + @include mixins.e(footer) { + border-top: 1px solid var.$datepicker-inner-border-color; + padding: 4px; + text-align: right; + background-color: var.$color-white; + position: relative; + font-size: 0; + } + + @include mixins.e(shortcut) { + display: block; + width: 100%; + border: 0; + background-color: transparent; + line-height: 28px; + font-size: 14px; + color: var.$datepicker-font-color; + padding-left: 12px; + text-align: left; + outline: none; + cursor: pointer; + + &:hover { + color: var.$datepicker-hover-font-color; + } + + &.active { + background-color: #e6f1fe; + color: var.$datepicker-active-color; + } + } + + @include mixins.e(btn) { + border: 1px solid #dcdcdc; + color: #333; + line-height: 24px; + border-radius: 2px; + padding: 0 20px; + cursor: pointer; + background-color: transparent; + outline: none; + font-size: 12px; + + &[disabled] { + color: #cccccc; + cursor: not-allowed; + } + } + + @include mixins.e(icon-btn) { + font-size: 12px; + color: var.$datepicker-icon-color; + border: 0; + background: transparent; + cursor: pointer; + outline: none; + margin-top: 8px; + + &:hover { + color: var.$datepicker-hover-font-color; + } + + @include mixins.when(disabled) { + color: var.$font-color-disabled-base; + + &:hover { + cursor: not-allowed; + } + } + } + + @include mixins.e(link-btn) { + @include button.button-outline(); + @include button.button-small(); + @include button.button-round(); + + vertical-align: middle; + margin-left: var(--spacing-2xs); + + &.is-plain { + @include button.button-just-primary(); + } + } +} + +.el-picker-panel *[slot='sidebar'], +.el-picker-panel__sidebar { + position: absolute; + top: 0; + bottom: 0; + width: 110px; + border-right: 1px solid var.$datepicker-inner-border-color; + box-sizing: border-box; + padding-top: 6px; + background-color: var.$color-white; + overflow: auto; +} + +.el-picker-panel *[slot='sidebar'] + .el-picker-panel__body, +.el-picker-panel__sidebar + .el-picker-panel__body { + margin-left: 110px; +} diff --git a/packages/design-system/theme/src/date-picker/picker.scss b/packages/design-system/theme/src/date-picker/picker.scss new file mode 100644 index 0000000000..28613ff103 --- /dev/null +++ b/packages/design-system/theme/src/date-picker/picker.scss @@ -0,0 +1,198 @@ +@use "../mixins/mixins"; +@use "../common/var"; +@use "../common/transition"; + +@include mixins.b(date-editor) { + position: relative; + display: inline-block; + text-align: left; + + &.el-input, + &.el-input__inner { + width: 100%; + } + + @include mixins.m((monthrange)) { + &.el-input, + &.el-input__inner { + width: 300px; + } + } + + @include mixins.m((daterange, timerange)) { + &.el-input, + &.el-input__inner { + width: 350px; + } + } + + @include mixins.m(datetimerange) { + &.el-input, + &.el-input__inner { + width: 400px; + } + } + + @include mixins.m(dates) { + .el-input__inner { + text-overflow: ellipsis; + white-space: nowrap; + } + } + + .el-icon-circle-close { + cursor: pointer; + } + + .el-range__icon { + font-size: 14px; + margin-left: -5px; + color: var(--color-text-lighter); + float: left; + line-height: 32px; + } + + .el-range-input { + appearance: none; + border: none; + outline: none; + display: inline-block; + height: 100%; + margin: 0; + padding: 0; + width: 39%; + text-align: center; + font-size: var.$font-size-base; + color: var(--color-text-dark); + + &::placeholder { + color: var(--color-text-lighter); + } + } + + .el-range-separator { + display: inline-block; + height: 100%; + padding: 0 5px; + margin: 0; + text-align: center; + line-height: 32px; + font-size: 14px; + width: 5%; + color: var(--color-text-dark); + } + + .el-range__close-icon { + font-size: 14px; + color: var(--color-text-lighter); + width: 25px; + display: inline-block; + float: right; + line-height: 32px; + } +} + +@include mixins.b(range-editor) { + &.el-input__inner { + display: inline-flex; + align-items: center; + padding: 3px 10px; + } + + .el-range-input { + line-height: 1; + } + + @include mixins.when(active) { + border-color: var(--color-primary); + + &:hover { + border-color: var(--color-primary); + } + } + + @include mixins.m(medium) { + &.el-input__inner { + height: var.$input-medium-height; + } + + .el-range-separator { + line-height: 28px; + font-size: var.$input-medium-font-size; + } + + .el-range-input { + font-size: var.$input-medium-font-size; + } + + .el-range__icon, + .el-range__close-icon { + line-height: 28px; + } + } + + @include mixins.m(small) { + &.el-input__inner { + height: var.$input-small-height; + } + + .el-range-separator { + line-height: 24px; + font-size: var.$input-small-font-size; + } + + .el-range-input { + font-size: var.$input-small-font-size; + } + + .el-range__icon, + .el-range__close-icon { + line-height: 24px; + } + } + + @include mixins.m(mini) { + &.el-input__inner { + height: var.$input-mini-height; + } + + .el-range-separator { + line-height: 20px; + font-size: var.$input-mini-font-size; + } + + .el-range-input { + font-size: var.$input-mini-font-size; + } + + .el-range__icon, + .el-range__close-icon { + line-height: 20px; + } + } + + @include mixins.when(disabled) { + background-color: var.$input-disabled-fill; + border-color: var.$input-disabled-border; + color: var.$input-disabled-color; + cursor: not-allowed; + + &:hover, + &:focus { + border-color: var.$input-disabled-border; + } + + input { + background-color: var.$input-disabled-fill; + color: var.$input-disabled-color; + cursor: not-allowed; + &::placeholder { + color: var.$input-disabled-placeholder-color; + } + } + + .el-range-separator { + color: var.$input-disabled-color; + } + } +} diff --git a/packages/design-system/theme/src/date-picker/time-picker.scss b/packages/design-system/theme/src/date-picker/time-picker.scss new file mode 100644 index 0000000000..5588de5e8b --- /dev/null +++ b/packages/design-system/theme/src/date-picker/time-picker.scss @@ -0,0 +1,87 @@ +@use "../common/var"; +@use "../mixins/mixins"; + +@include mixins.b(time-panel) { + margin: 5px 0; + border: solid 1px var.$datepicker-border-color; + background-color: var.$color-white; + box-shadow: var.$box-shadow-light; + border-radius: 2px; + position: absolute; + width: 180px; + left: 0; + z-index: var.$index-top; + user-select: none; + box-sizing: content-box; + + @include mixins.e(content) { + font-size: 0; + position: relative; + overflow: hidden; + + &::after, + &::before { + content: ''; + top: 50%; + position: absolute; + margin-top: -15px; + height: 32px; + z-index: -1; + left: 0; + right: 0; + box-sizing: border-box; + padding-top: 6px; + text-align: left; + border-top: 1px solid var(--border-color-base); + border-bottom: 1px solid var(--border-color-base); + } + + &::after { + left: 50%; + margin-left: 12%; + margin-right: 12%; + } + + &::before { + padding-left: 50%; + margin-right: 12%; + margin-left: 12%; + } + + &.has-seconds { + &::after { + left: calc(100% / 3 * 2); + } + + &::before { + padding-left: calc(100% / 3); + } + } + } + + @include mixins.e(footer) { + border-top: 1px solid var.$datepicker-inner-border-color; + padding: 4px; + height: 36px; + line-height: 25px; + text-align: right; + box-sizing: border-box; + } + + @include mixins.e(btn) { + border: none; + line-height: 28px; + padding: 0 5px; + margin: 0 5px; + cursor: pointer; + background-color: transparent; + outline: none; + font-size: 12px; + color: var(--color-text-dark); + + &.confirm { + font-weight: 800; + color: var.$datepicker-active-color; + } + } +} diff --git a/packages/design-system/theme/src/date-picker/time-range-picker.scss b/packages/design-system/theme/src/date-picker/time-range-picker.scss new file mode 100644 index 0000000000..7f4a94a6dd --- /dev/null +++ b/packages/design-system/theme/src/date-picker/time-range-picker.scss @@ -0,0 +1,32 @@ +@use "../common/var"; +@use "../mixins/mixins"; + +@include mixins.b(time-range-picker) { + width: 354px; + overflow: visible; + + @include mixins.e(content) { + position: relative; + text-align: center; + padding: 10px; + } + + @include mixins.e(cell) { + box-sizing: border-box; + margin: 0; + padding: 4px 7px 7px; + width: 50%; + display: inline-block; + } + + @include mixins.e(header) { + margin-bottom: 5px; + text-align: center; + font-size: 14px; + } + + @include mixins.e(body) { + border-radius: 2px; + border: 1px solid var.$datepicker-border-color; + } +} diff --git a/packages/design-system/theme/src/date-picker/time-spinner.scss b/packages/design-system/theme/src/date-picker/time-spinner.scss new file mode 100644 index 0000000000..f08660a41a --- /dev/null +++ b/packages/design-system/theme/src/date-picker/time-spinner.scss @@ -0,0 +1,110 @@ +@use "../common/var"; +@use "../mixins/mixins"; + +@include mixins.b(time-spinner) { + &.has-seconds { + .el-time-spinner__wrapper { + width: 33.3%; + } + } + + @include mixins.e(wrapper) { + max-height: 190px; + display: inline-block; + width: 50%; + vertical-align: top; + position: relative; + + & .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) { + padding-bottom: 15px; + } + + @include mixins.when(arrow) { + box-sizing: border-box; + text-align: center; + overflow: hidden; + + .el-time-spinner__list { + transform: translateY(-32px); + } + + .el-time-spinner__item:hover:not(.disabled):not(.active) { + background: var.$color-white; + cursor: default; + } + } + } + + @include mixins.e(arrow) { + font-size: 12px; + color: var(--color-text-light); + position: absolute; + left: 0; + width: 100%; + z-index: var.$index-normal; + text-align: center; + height: 30px; + line-height: 30px; + cursor: pointer; + + &:hover { + color: var(--color-primary); + } + + &.el-icon-arrow-up { + top: 10px; + } + + &.el-icon-arrow-down { + bottom: 10px; + } + } + + @include mixins.e(input) { + &.el-input { + width: 70%; + + .el-input__inner { + padding: 0; + text-align: center; + } + } + } + + @include mixins.e(list) { + padding: 0; + margin: 0; + list-style: none; + text-align: center; + + &::after, + &::before { + content: ''; + display: block; + width: 100%; + height: 80px; + } + } + + @include mixins.e(item) { + height: 32px; + line-height: 32px; + font-size: 12px; + color: var(--color-text-dark); + + &:hover:not(.disabled):not(.active) { + background: var.$background-color-base; + cursor: pointer; + } + + &.active:not(.disabled) { + color: var(--color-text-dark); + font-weight: bold; + } + + &.disabled { + color: var(--color-text-lighter); + cursor: not-allowed; + } + } +} diff --git a/packages/design-system/theme/src/date-picker/year-table.scss b/packages/design-system/theme/src/date-picker/year-table.scss new file mode 100644 index 0000000000..ee81a75220 --- /dev/null +++ b/packages/design-system/theme/src/date-picker/year-table.scss @@ -0,0 +1,52 @@ +@use "../common/var"; +@use "../mixins/mixins"; + +@include mixins.b(year-table) { + font-size: 12px; + margin: -1px; + border-collapse: collapse; + + .el-icon { + color: var.$datepicker-icon-color; + } + + td { + text-align: center; + padding: 20px 3px; + cursor: pointer; + + &.today { + .cell { + color: var(--color-primary); + font-weight: bold; + } + } + + &.disabled .cell { + background-color: var.$background-color-base; + cursor: not-allowed; + color: var(--color-text-lighter); + + &:hover { + color: var(--color-text-lighter); + } + } + + .cell { + width: 48px; + height: 32px; + display: block; + line-height: 32px; + color: var.$datepicker-font-color; + margin: 0 auto; + + &:hover { + color: var.$datepicker-hover-font-color; + } + } + + &.current:not(.disabled) .cell { + color: var.$datepicker-active-color; + } + } +} diff --git a/packages/design-system/theme/src/dialog.scss b/packages/design-system/theme/src/dialog.scss new file mode 100644 index 0000000000..087d35b97a --- /dev/null +++ b/packages/design-system/theme/src/dialog.scss @@ -0,0 +1,124 @@ +@use "mixins/mixins"; +@use "mixins/utils"; +@use "./common/var"; +@use "common/popup"; + +@include mixins.b(dialog) { + position: relative; + margin: 0 auto 50px; + background: var.$dialog-background-color; + border-radius: var(--border-radius-small); + box-shadow: var.$dialog-box-shadow; + box-sizing: border-box; + width: 50%; + + @include mixins.when(fullscreen) { + width: 100%; + margin-top: 0; + margin-bottom: 0; + height: 100%; + overflow: auto; + } + + @include mixins.e(wrapper) { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: auto; + margin: 0; + } + + @include mixins.e(header) { + padding: var.$dialog-padding-primary; + padding-bottom: 10px; + } + + @include mixins.e(headerbtn) { + position: absolute; + top: var.$dialog-padding-primary; + right: var.$dialog-padding-primary; + padding: 0; + background: transparent; + border: none; + outline: none; + cursor: pointer; + font-size: var.$message-close-size; + + .el-dialog__close { + color: var(--color-info); + } + + &:focus, + &:hover { + .el-dialog__close { + color: var(--color-primary); + } + } + } + + @include mixins.e(title) { + line-height: var.$dialog-font-line-height; + font-size: var.$dialog-title-font-size; + color: var(--color-text-dark); + } + + @include mixins.e(body) { + padding: (var.$dialog-padding-primary + 10px) var.$dialog-padding-primary; + color: var(--color-text-dark); + font-size: var.$dialog-content-font-size; + word-break: break-all; + } + + @include mixins.e(footer) { + padding: var.$dialog-padding-primary; + padding-top: 10px; + text-align: right; + box-sizing: border-box; + } + + // 内容居中布局 + @include mixins.m(center) { + text-align: center; + + @include mixins.e(body) { + text-align: initial; + padding: 25px (var.$dialog-padding-primary + 5px) 30px; + } + + @include mixins.e(footer) { + text-align: inherit; + } + } +} + +.dialog-fade-enter-active { + animation: dialog-fade-in 0.3s; +} + +.dialog-fade-leave-active { + animation: dialog-fade-out 0.3s; +} + +@keyframes dialog-fade-in { + 0% { + transform: translate3d(0, -20px, 0); + opacity: 0; + } + 100% { + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes dialog-fade-out { + 0% { + transform: translate3d(0, 0, 0); + opacity: 1; + } + 100% { + transform: translate3d(0, -20px, 0); + opacity: 0; + } +} diff --git a/packages/design-system/theme/src/display.scss b/packages/design-system/theme/src/display.scss new file mode 100644 index 0000000000..5b983376c0 --- /dev/null +++ b/packages/design-system/theme/src/display.scss @@ -0,0 +1,12 @@ +@use "./common/var" as var; +@use "mixins/mixins"; + +.hidden { + @each $break-point-name, $value in var.$breakpoints-spec { + &-#{$break-point-name} { + @include mixins.res($break-point-name, var.$breakpoints-spec) { + display: none !important; + } + } + } +} diff --git a/packages/design-system/theme/src/divider.scss b/packages/design-system/theme/src/divider.scss new file mode 100644 index 0000000000..fbcb831f67 --- /dev/null +++ b/packages/design-system/theme/src/divider.scss @@ -0,0 +1,47 @@ +@use "./common/var"; +@use "mixins/mixins"; + +@include mixins.b(divider) { + background-color: var(--border-color-base); + position: relative; + + @include mixins.m(horizontal) { + display: block; + height: 1px; + width: 100%; + margin: 24px 0; + } + + @include mixins.m(vertical) { + display: inline-block; + width: 1px; + height: 1em; + margin: 0 8px; + vertical-align: middle; + position: relative; + } + + @include mixins.e(text) { + position: absolute; + background-color: var.$color-white; + padding: 0 20px; + font-weight: 500; + color: var(--color-text-dark); + font-size: 14px; + + @include mixins.when(left) { + left: 20px; + transform: translateY(-50%); + } + + @include mixins.when(center) { + left: 50%; + transform: translateX(-50%) translateY(-50%); + } + + @include mixins.when(right) { + right: 20px; + transform: translateY(-50%); + } + } +} diff --git a/packages/design-system/theme/src/drawer.scss b/packages/design-system/theme/src/drawer.scss new file mode 100644 index 0000000000..993ab4ff2d --- /dev/null +++ b/packages/design-system/theme/src/drawer.scss @@ -0,0 +1,217 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@keyframes el-drawer-fade-in { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@mixin drawer-animation($direction) { + @keyframes #{$direction}-drawer-in { + 0% { + @if $direction == ltr { + transform: translate(-100%, 0px); + } + + @if $direction == rtl { + transform: translate(100%, 0px); + } + + @if $direction == ttb { + transform: translate(0px, -100%); + } + + @if $direction == btt { + transform: translate(0px, 100%); + } + } + + 100% { + @if $direction == ltr { + transform: translate(0px, 0px); + } + + @if $direction == rtl { + transform: translate(0px, 0px); + } + + @if $direction == ttb { + transform: translate(0px, 0px); + } + + @if $direction == btt { + transform: translate(0px, 0px); + } + } + } + + @keyframes #{$direction}-drawer-out { + 0% { + @if $direction == ltr { + transform: translate(0px, 0px); + } + + @if $direction == rtl { + transform: translate(0px, 0px); + } + + @if $direction == ttb { + transform: translate(0px, 0px); + } + + @if $direction == btt { + transform: translate(0px, 0); + } + } + + 100% { + @if $direction == ltr { + transform: translate(-100%, 0px); + } + + @if $direction == rtl { + transform: translate(100%, 0px); + } + + @if $direction == ttb { + transform: translate(0px, -100%); + } + + @if $direction == btt { + transform: translate(0px, 100%); + } + } + } +} + +@mixin animation-in($direction) { + .el-drawer__open &.#{$direction} { + animation: #{$direction}-drawer-in 0.3s 1ms; + } +} + +@mixin animation-out($direction) { + &.#{$direction} { + animation: #{$direction}-drawer-out 0.3s; + } +} + +@include drawer-animation(rtl); +@include drawer-animation(ltr); +@include drawer-animation(ttb); +@include drawer-animation(btt); + +$directions: rtl, ltr, ttb, btt; + +@include mixins.b(drawer) { + position: absolute; + box-sizing: border-box; + background-color: var.$dialog-background-color; + display: flex; + flex-direction: column; + box-shadow: 0 8px 10px -5px rgba(0, 0, 0, 0.2), + 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12); + overflow: hidden; + outline: 0; + + @each $direction in $directions { + @include animation-out($direction); + @include animation-in($direction); + } + + &__wrapper { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: hidden; + margin: 0; + } + + &__header { + align-items: center; + color: rgb(114, 118, 123); + display: flex; + margin-bottom: 32px; + padding: var.$dialog-padding-primary; + padding-bottom: 0; + & > :first-child { + flex: 1; + } + } + + &__title { + margin: 0; + flex: 1; + line-height: inherit; + font-size: 1rem; + } + + &__close-btn { + border: none; + cursor: pointer; + font-size: var.$font-size-extra-large; + color: inherit; + background-color: transparent; + } + + &__body { + flex: 1; + & > * { + box-sizing: border-box; + } + } + + &.ltr, + &.rtl { + height: 100%; + top: 0; + bottom: 0; + } + + &.ttb, + &.btt { + width: 100%; + left: 0; + right: 0; + } + + &.ltr { + left: 0; + } + + &.rtl { + right: 0; + } + + &.ttb { + top: 0; + } + + &.btt { + bottom: 0; + } +} + +.el-drawer__container { + position: relative; + left: 0; + right: 0; + top: 0; + bottom: 0; + height: 100%; + width: 100%; +} + +.el-drawer-fade-enter-active { + animation: el-drawer-fade-in 0.3s; +} + +.el-drawer-fade-leave-active { + animation: el-drawer-fade-in 0.3s reverse; +} diff --git a/packages/design-system/theme/src/dropdown-item.scss b/packages/design-system/theme/src/dropdown-item.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/dropdown-menu.scss b/packages/design-system/theme/src/dropdown-menu.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/dropdown.scss b/packages/design-system/theme/src/dropdown.scss new file mode 100644 index 0000000000..b7195809bf --- /dev/null +++ b/packages/design-system/theme/src/dropdown.scss @@ -0,0 +1,185 @@ +@use "mixins/mixins"; +@use "./common/var"; +@use "button"; +@use "./popper"; + +@include mixins.b(dropdown) { + display: inline-block; + position: relative; + color: var(--color-text-dark); + font-size: var.$font-size-base; + + .el-button-group { + display: block; + .el-button { + float: none; + } + } + + & .el-dropdown__caret-button { + padding-left: 5px; + padding-right: 5px; + position: relative; + border-left: none; + + &::before { + $gap: 5px; + + content: ''; + position: absolute; + display: block; + width: 1px; + top: $gap; + bottom: $gap; + left: 0; + background: rgba(var.$color-white, 0.5); + } + + &.el-button--default::before { + background: hsla( + var(#{--button-default-border-color-h}), + var(#{--button-default-border-color-s}), + var(#{--button-default-border-color-l}), + 0.5 + ); + } + + &:hover { + &::before { + top: 0; + bottom: 0; + } + } + + & .el-dropdown__icon { + padding-left: 0; + } + } + @include mixins.e(icon) { + font-size: 12px; + margin: 0 3px; + } + + .el-dropdown-selfdefine { + // 自定义 + &:focus:active, + &:focus:not(.focusing) { + outline-width: 0; + } + } +} + +@include mixins.b(dropdown-menu) { + position: absolute; + top: 0; + left: 0; + z-index: 10; + padding: 10px 0; + margin: 5px 0; + background-color: var.$color-white; + border: 1px solid var(--border-color-light); + border-radius: var(--border-radius-base); + box-shadow: var.$dropdown-menu-box-shadow; + + @include mixins.e(item) { + list-style: none; + line-height: 36px; + padding: 0 20px; + margin: 0; + font-size: var.$font-size-base; + color: var(--color-text-dark); + cursor: pointer; + outline: none; + &:not(.is-disabled):hover, + &:focus { + background-color: var.$dropdown-menuItem-hover-fill; + color: var.$dropdown-menuItem-hover-color; + } + + i { + margin-right: 5px; + } + + @include mixins.m(divided) { + $divided-offset: 6px; + + position: relative; + margin-top: $divided-offset; + border-top: 1px solid var(--border-color-light); + + &:before { + content: ''; + height: $divided-offset; + display: block; + margin: 0 -20px; + background-color: var.$color-white; + } + } + + @include mixins.when(disabled) { + cursor: default; + color: var.$font-color-disabled-base; + pointer-events: none; + } + } + + @include mixins.m(medium) { + padding: 6px 0; + + @include mixins.e(item) { + line-height: 30px; + padding: 0 17px; + font-size: 14px; + + &.el-dropdown-menu__item--divided { + $divided-offset: 6px; + margin-top: $divided-offset; + + &:before { + height: $divided-offset; + margin: 0 -17px; + } + } + } + } + + @include mixins.m(small) { + padding: 6px 0; + + @include mixins.e(item) { + line-height: 27px; + padding: 0 15px; + font-size: 13px; + + &.el-dropdown-menu__item--divided { + $divided-offset: 4px; + margin-top: $divided-offset; + + &:before { + height: $divided-offset; + margin: 0 -15px; + } + } + } + } + + @include mixins.m(mini) { + padding: 3px 0; + + @include mixins.e(item) { + line-height: 24px; + padding: 0 10px; + font-size: 12px; + + &.el-dropdown-menu__item--divided { + $divided-offset: 3px; + margin-top: $divided-offset; + + &:before { + height: $divided-offset; + margin: 0 -10px; + } + } + } + } +} diff --git a/packages/design-system/theme/src/fonts/element-icons.ttf b/packages/design-system/theme/src/fonts/element-icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..91b74de36778b0ff8958d37d07ce70fb3b26f50b GIT binary patch literal 55956 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
%#5t+7yTm^Z{)9pPFdh-)p? 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 .el-form-item__label:before, + & .el-form-item__label-wrap > .el-form-item__label:before { + content: '*'; + color: var(--color-danger); + margin-right: 4px; + } + } + } + + @include mixins.when(error) { + & .el-input__inner, + & .el-textarea__inner { + &, + &:focus { + border-color: var(--color-danger); + } + } + & .el-input-group__append, + & .el-input-group__prepend { + & .el-input__inner { + border-color: transparent; + } + } + .el-input__validateIcon { + color: var(--color-danger); + } + } + + @include mixins.m(feedback) { + .el-input__validateIcon { + display: inline-block; + } + } +} diff --git a/packages/design-system/theme/src/header.scss b/packages/design-system/theme/src/header.scss new file mode 100644 index 0000000000..a37a759f1e --- /dev/null +++ b/packages/design-system/theme/src/header.scss @@ -0,0 +1,8 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(header) { + padding: var.$header-padding; + box-sizing: border-box; + flex-shrink: 0; +} diff --git a/packages/design-system/theme/src/icon.scss b/packages/design-system/theme/src/icon.scss new file mode 100644 index 0000000000..261561d424 --- /dev/null +++ b/packages/design-system/theme/src/icon.scss @@ -0,0 +1,1169 @@ +@use "./common/var"; + +@font-face { + font-family: 'element-icons'; + src: url('#{var.$font-path}/element-icons.woff') format('woff'), + /* chrome, firefox */ url('#{var.$font-path}/element-icons.ttf') + format('truetype'); /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + font-weight: normal; + font-display: var.$font-display; + font-style: normal; +} + +[class^='el-icon-'], +[class*=' el-icon-'] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'element-icons' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: baseline; + display: inline-block; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.el-icon-ice-cream-round:before { + content: '\e6a0'; +} + +.el-icon-ice-cream-square:before { + content: '\e6a3'; +} + +.el-icon-lollipop:before { + content: '\e6a4'; +} + +.el-icon-potato-strips:before { + content: '\e6a5'; +} + +.el-icon-milk-tea:before { + content: '\e6a6'; +} + +.el-icon-ice-drink:before { + content: '\e6a7'; +} + +.el-icon-ice-tea:before { + content: '\e6a9'; +} + +.el-icon-coffee:before { + content: '\e6aa'; +} + +.el-icon-orange:before { + content: '\e6ab'; +} + +.el-icon-pear:before { + content: '\e6ac'; +} + +.el-icon-apple:before { + content: '\e6ad'; +} + +.el-icon-cherry:before { + content: '\e6ae'; +} + +.el-icon-watermelon:before { + content: '\e6af'; +} + +.el-icon-grape:before { + content: '\e6b0'; +} + +.el-icon-refrigerator:before { + content: '\e6b1'; +} + +.el-icon-goblet-square-full:before { + content: '\e6b2'; +} + +.el-icon-goblet-square:before { + content: '\e6b3'; +} + +.el-icon-goblet-full:before { + content: '\e6b4'; +} + +.el-icon-goblet:before { + content: '\e6b5'; +} + +.el-icon-cold-drink:before { + content: '\e6b6'; +} + +.el-icon-coffee-cup:before { + content: '\e6b8'; +} + +.el-icon-water-cup:before { + content: '\e6b9'; +} + +.el-icon-hot-water:before { + content: '\e6ba'; +} + +.el-icon-ice-cream:before { + content: '\e6bb'; +} + +.el-icon-dessert:before { + content: '\e6bc'; +} + +.el-icon-sugar:before { + content: '\e6bd'; +} + +.el-icon-tableware:before { + content: '\e6be'; +} + +.el-icon-burger:before { + content: '\e6bf'; +} + +.el-icon-knife-fork:before { + content: '\e6c1'; +} + +.el-icon-fork-spoon:before { + content: '\e6c2'; +} + +.el-icon-chicken:before { + content: '\e6c3'; +} + +.el-icon-food:before { + content: '\e6c4'; +} + +.el-icon-dish-1:before { + content: '\e6c5'; +} + +.el-icon-dish:before { + content: '\e6c6'; +} + +.el-icon-moon-night:before { + content: '\e6ee'; +} + +.el-icon-moon:before { + content: '\e6f0'; +} + +.el-icon-cloudy-and-sunny:before { + content: '\e6f1'; +} + +.el-icon-partly-cloudy:before { + content: '\e6f2'; +} + +.el-icon-cloudy:before { + content: '\e6f3'; +} + +.el-icon-sunny:before { + content: '\e6f6'; +} + +.el-icon-sunset:before { + content: '\e6f7'; +} + +.el-icon-sunrise-1:before { + content: '\e6f8'; +} + +.el-icon-sunrise:before { + content: '\e6f9'; +} + +.el-icon-heavy-rain:before { + content: '\e6fa'; +} + +.el-icon-lightning:before { + content: '\e6fb'; +} + +.el-icon-light-rain:before { + content: '\e6fc'; +} + +.el-icon-wind-power:before { + content: '\e6fd'; +} + +.el-icon-baseball:before { + content: '\e712'; +} + +.el-icon-soccer:before { + content: '\e713'; +} + +.el-icon-football:before { + content: '\e715'; +} + +.el-icon-basketball:before { + content: '\e716'; +} + +.el-icon-ship:before { + content: '\e73f'; +} + +.el-icon-truck:before { + content: '\e740'; +} + +.el-icon-bicycle:before { + content: '\e741'; +} + +.el-icon-mobile-phone:before { + content: '\e6d3'; +} + +.el-icon-service:before { + content: '\e6d4'; +} + +.el-icon-key:before { + content: '\e6e2'; +} + +.el-icon-unlock:before { + content: '\e6e4'; +} + +.el-icon-lock:before { + content: '\e6e5'; +} + +.el-icon-watch:before { + content: '\e6fe'; +} + +.el-icon-watch-1:before { + content: '\e6ff'; +} + +.el-icon-timer:before { + content: '\e702'; +} + +.el-icon-alarm-clock:before { + content: '\e703'; +} + +.el-icon-map-location:before { + content: '\e704'; +} + +.el-icon-delete-location:before { + content: '\e705'; +} + +.el-icon-add-location:before { + content: '\e706'; +} + +.el-icon-location-information:before { + content: '\e707'; +} + +.el-icon-location-outline:before { + content: '\e708'; +} + +.el-icon-location:before { + content: '\e79e'; +} + +.el-icon-place:before { + content: '\e709'; +} + +.el-icon-discover:before { + content: '\e70a'; +} + +.el-icon-first-aid-kit:before { + content: '\e70b'; +} + +.el-icon-trophy-1:before { + content: '\e70c'; +} + +.el-icon-trophy:before { + content: '\e70d'; +} + +.el-icon-medal:before { + content: '\e70e'; +} + +.el-icon-medal-1:before { + content: '\e70f'; +} + +.el-icon-stopwatch:before { + content: '\e710'; +} + +.el-icon-mic:before { + content: '\e711'; +} + +.el-icon-copy-document:before { + content: '\e718'; +} + +.el-icon-full-screen:before { + content: '\e719'; +} + +.el-icon-switch-button:before { + content: '\e71b'; +} + +.el-icon-aim:before { + content: '\e71c'; +} + +.el-icon-crop:before { + content: '\e71d'; +} + +.el-icon-odometer:before { + content: '\e71e'; +} + +.el-icon-time:before { + content: '\e71f'; +} + +.el-icon-bangzhu:before { + content: '\e724'; +} + +.el-icon-close-notification:before { + content: '\e726'; +} + +.el-icon-microphone:before { + content: '\e727'; +} + +.el-icon-turn-off-microphone:before { + content: '\e728'; +} + +.el-icon-position:before { + content: '\e729'; +} + +.el-icon-postcard:before { + content: '\e72a'; +} + +.el-icon-message:before { + content: '\e72b'; +} + +.el-icon-chat-line-square:before { + content: '\e72d'; +} + +.el-icon-chat-dot-square:before { + content: '\e72e'; +} + +.el-icon-chat-dot-round:before { + content: '\e72f'; +} + +.el-icon-chat-square:before { + content: '\e730'; +} + +.el-icon-chat-line-round:before { + content: '\e731'; +} + +.el-icon-chat-round:before { + content: '\e732'; +} + +.el-icon-set-up:before { + content: '\e733'; +} + +.el-icon-turn-off:before { + content: '\e734'; +} + +.el-icon-open:before { + content: '\e735'; +} + +.el-icon-connection:before { + content: '\e736'; +} + +.el-icon-link:before { + content: '\e737'; +} + +.el-icon-cpu:before { + content: '\e738'; +} + +.el-icon-thumb:before { + content: '\e739'; +} + +.el-icon-female:before { + content: '\e73a'; +} + +.el-icon-male:before { + content: '\e73b'; +} + +.el-icon-guide:before { + content: '\e73c'; +} + +.el-icon-news:before { + content: '\e73e'; +} + +.el-icon-price-tag:before { + content: '\e744'; +} + +.el-icon-discount:before { + content: '\e745'; +} + +.el-icon-wallet:before { + content: '\e747'; +} + +.el-icon-coin:before { + content: '\e748'; +} + +.el-icon-money:before { + content: '\e749'; +} + +.el-icon-bank-card:before { + content: '\e74a'; +} + +.el-icon-box:before { + content: '\e74b'; +} + +.el-icon-present:before { + content: '\e74c'; +} + +.el-icon-sell:before { + content: '\e6d5'; +} + +.el-icon-sold-out:before { + content: '\e6d6'; +} + +.el-icon-shopping-bag-2:before { + content: '\e74d'; +} + +.el-icon-shopping-bag-1:before { + content: '\e74e'; +} + +.el-icon-shopping-cart-2:before { + content: '\e74f'; +} + +.el-icon-shopping-cart-1:before { + content: '\e750'; +} + +.el-icon-shopping-cart-full:before { + content: '\e751'; +} + +.el-icon-smoking:before { + content: '\e752'; +} + +.el-icon-no-smoking:before { + content: '\e753'; +} + +.el-icon-house:before { + content: '\e754'; +} + +.el-icon-table-lamp:before { + content: '\e755'; +} + +.el-icon-school:before { + content: '\e756'; +} + +.el-icon-office-building:before { + content: '\e757'; +} + +.el-icon-toilet-paper:before { + content: '\e758'; +} + +.el-icon-notebook-2:before { + content: '\e759'; +} + +.el-icon-notebook-1:before { + content: '\e75a'; +} + +.el-icon-files:before { + content: '\e75b'; +} + +.el-icon-collection:before { + content: '\e75c'; +} + +.el-icon-receiving:before { + content: '\e75d'; +} + +.el-icon-suitcase-1:before { + content: '\e760'; +} + +.el-icon-suitcase:before { + content: '\e761'; +} + +.el-icon-film:before { + content: '\e763'; +} + +.el-icon-collection-tag:before { + content: '\e765'; +} + +.el-icon-data-analysis:before { + content: '\e766'; +} + +.el-icon-pie-chart:before { + content: '\e767'; +} + +.el-icon-data-board:before { + content: '\e768'; +} + +.el-icon-data-line:before { + content: '\e76d'; +} + +.el-icon-reading:before { + content: '\e769'; +} + +.el-icon-magic-stick:before { + content: '\e76a'; +} + +.el-icon-coordinate:before { + content: '\e76b'; +} + +.el-icon-mouse:before { + content: '\e76c'; +} + +.el-icon-brush:before { + content: '\e76e'; +} + +.el-icon-headset:before { + content: '\e76f'; +} + +.el-icon-umbrella:before { + content: '\e770'; +} + +.el-icon-scissors:before { + content: '\e771'; +} + +.el-icon-mobile:before { + content: '\e773'; +} + +.el-icon-attract:before { + content: '\e774'; +} + +.el-icon-monitor:before { + content: '\e775'; +} + +.el-icon-search:before { + content: '\e778'; +} + +.el-icon-takeaway-box:before { + content: '\e77a'; +} + +.el-icon-paperclip:before { + content: '\e77d'; +} + +.el-icon-printer:before { + content: '\e77e'; +} + +.el-icon-document-add:before { + content: '\e782'; +} + +.el-icon-document:before { + content: '\e785'; +} + +.el-icon-document-checked:before { + content: '\e786'; +} + +.el-icon-document-copy:before { + content: '\e787'; +} + +.el-icon-document-delete:before { + content: '\e788'; +} + +.el-icon-document-remove:before { + content: '\e789'; +} + +.el-icon-tickets:before { + content: '\e78b'; +} + +.el-icon-folder-checked:before { + content: '\e77f'; +} + +.el-icon-folder-delete:before { + content: '\e780'; +} + +.el-icon-folder-remove:before { + content: '\e781'; +} + +.el-icon-folder-add:before { + content: '\e783'; +} + +.el-icon-folder-opened:before { + content: '\e784'; +} + +.el-icon-folder:before { + content: '\e78a'; +} + +.el-icon-edit-outline:before { + content: '\e764'; +} + +.el-icon-edit:before { + content: '\e78c'; +} + +.el-icon-date:before { + content: '\e78e'; +} + +.el-icon-c-scale-to-original:before { + content: '\e7c6'; +} + +.el-icon-view:before { + content: '\e6ce'; +} + +.el-icon-loading:before { + content: '\e6cf'; +} + +.el-icon-rank:before { + content: '\e6d1'; +} + +.el-icon-sort-down:before { + content: '\e7c4'; +} + +.el-icon-sort-up:before { + content: '\e7c5'; +} + +.el-icon-sort:before { + content: '\e6d2'; +} + +.el-icon-finished:before { + content: '\e6cd'; +} + +.el-icon-refresh-left:before { + content: '\e6c7'; +} + +.el-icon-refresh-right:before { + content: '\e6c8'; +} + +.el-icon-refresh:before { + content: '\e6d0'; +} + +.el-icon-video-play:before { + content: '\e7c0'; +} + +.el-icon-video-pause:before { + content: '\e7c1'; +} + +.el-icon-d-arrow-right:before { + content: '\e6dc'; +} + +.el-icon-d-arrow-left:before { + content: '\e6dd'; +} + +.el-icon-arrow-up:before { + content: '\e6e1'; +} + +.el-icon-arrow-down:before { + content: '\e6df'; +} + +.el-icon-arrow-right:before { + content: '\e6e0'; +} + +.el-icon-arrow-left:before { + content: '\e6de'; +} + +.el-icon-top-right:before { + content: '\e6e7'; +} + +.el-icon-top-left:before { + content: '\e6e8'; +} + +.el-icon-top:before { + content: '\e6e6'; +} + +.el-icon-bottom:before { + content: '\e6eb'; +} + +.el-icon-right:before { + content: '\e6e9'; +} + +.el-icon-back:before { + content: '\e6ea'; +} + +.el-icon-bottom-right:before { + content: '\e6ec'; +} + +.el-icon-bottom-left:before { + content: '\e6ed'; +} + +.el-icon-caret-top:before { + content: '\e78f'; +} + +.el-icon-caret-bottom:before { + content: '\e790'; +} + +.el-icon-caret-right:before { + content: '\e791'; +} + +.el-icon-caret-left:before { + content: '\e792'; +} + +.el-icon-d-caret:before { + content: '\e79a'; +} + +.el-icon-share:before { + content: '\e793'; +} + +.el-icon-menu:before { + content: '\e798'; +} + +.el-icon-s-grid:before { + content: '\e7a6'; +} + +.el-icon-s-check:before { + content: '\e7a7'; +} + +.el-icon-s-data:before { + content: '\e7a8'; +} + +.el-icon-s-opportunity:before { + content: '\e7aa'; +} + +.el-icon-s-custom:before { + content: '\e7ab'; +} + +.el-icon-s-claim:before { + content: '\e7ad'; +} + +.el-icon-s-finance:before { + content: '\e7ae'; +} + +.el-icon-s-comment:before { + content: '\e7af'; +} + +.el-icon-s-flag:before { + content: '\e7b0'; +} + +.el-icon-s-marketing:before { + content: '\e7b1'; +} + +.el-icon-s-shop:before { + content: '\e7b4'; +} + +.el-icon-s-open:before { + content: '\e7b5'; +} + +.el-icon-s-management:before { + content: '\e7b6'; +} + +.el-icon-s-ticket:before { + content: '\e7b7'; +} + +.el-icon-s-release:before { + content: '\e7b8'; +} + +.el-icon-s-home:before { + content: '\e7b9'; +} + +.el-icon-s-promotion:before { + content: '\e7ba'; +} + +.el-icon-s-operation:before { + content: '\e7bb'; +} + +.el-icon-s-unfold:before { + content: '\e7bc'; +} + +.el-icon-s-fold:before { + content: '\e7a9'; +} + +.el-icon-s-platform:before { + content: '\e7bd'; +} + +.el-icon-s-order:before { + content: '\e7be'; +} + +.el-icon-s-cooperation:before { + content: '\e7bf'; +} + +.el-icon-bell:before { + content: '\e725'; +} + +.el-icon-message-solid:before { + content: '\e799'; +} + +.el-icon-video-camera:before { + content: '\e772'; +} + +.el-icon-video-camera-solid:before { + content: '\e796'; +} + +.el-icon-camera:before { + content: '\e779'; +} + +.el-icon-camera-solid:before { + content: '\e79b'; +} + +.el-icon-download:before { + content: '\e77c'; +} + +.el-icon-upload2:before { + content: '\e77b'; +} + +.el-icon-upload:before { + content: '\e7c3'; +} + +.el-icon-picture-outline-round:before { + content: '\e75f'; +} + +.el-icon-picture-outline:before { + content: '\e75e'; +} + +.el-icon-picture:before { + content: '\e79f'; +} + +.el-icon-close:before { + content: '\e6db'; +} + +.el-icon-check:before { + content: '\e6da'; +} + +.el-icon-plus:before { + content: '\e6d9'; +} + +.el-icon-minus:before { + content: '\e6d8'; +} + +.el-icon-help:before { + content: '\e73d'; +} + +.el-icon-s-help:before { + content: '\e7b3'; +} + +.el-icon-circle-close:before { + content: '\e78d'; +} + +.el-icon-circle-check:before { + content: '\e720'; +} + +.el-icon-circle-plus-outline:before { + content: '\e723'; +} + +.el-icon-remove-outline:before { + content: '\e722'; +} + +.el-icon-zoom-out:before { + content: '\e776'; +} + +.el-icon-zoom-in:before { + content: '\e777'; +} + +.el-icon-error:before { + content: '\e79d'; +} + +.el-icon-success:before { + content: '\e79c'; +} + +.el-icon-circle-plus:before { + content: '\e7a0'; +} + +.el-icon-remove:before { + content: '\e7a2'; +} + +.el-icon-info:before { + content: '\e7a1'; +} + +.el-icon-question:before { + content: '\e7a4'; +} + +.el-icon-warning-outline:before { + content: '\e6c9'; +} + +.el-icon-warning:before { + content: '\e7a3'; +} + +.el-icon-goods:before { + content: '\e7c2'; +} + +.el-icon-s-goods:before { + content: '\e7b2'; +} + +.el-icon-star-off:before { + content: '\e717'; +} + +.el-icon-star-on:before { + content: '\e797'; +} + +.el-icon-more-outline:before { + content: '\e6cc'; +} + +.el-icon-more:before { + content: '\e794'; +} + +.el-icon-phone-outline:before { + content: '\e6cb'; +} + +.el-icon-phone:before { + content: '\e795'; +} + +.el-icon-user:before { + content: '\e6e3'; +} + +.el-icon-user-solid:before { + content: '\e7a5'; +} + +.el-icon-setting:before { + content: '\e6ca'; +} + +.el-icon-s-tools:before { + content: '\e7ac'; +} + +.el-icon-delete:before { + content: '\e6d7'; +} + +.el-icon-delete-solid:before { + content: '\e7c9'; +} + +.el-icon-eleme:before { + content: '\e7c7'; +} + +.el-icon-platform-eleme:before { + content: '\e7ca'; +} + +.el-icon-loading { + animation: rotating 2s linear infinite; +} + +.el-icon--right { + margin-left: 5px; +} +.el-icon--left { + margin-right: 5px; +} + +@keyframes rotating { + 0% { + transform: rotateZ(0deg); + } + 100% { + transform: rotateZ(360deg); + } +} diff --git a/packages/design-system/theme/src/image.scss b/packages/design-system/theme/src/image.scss new file mode 100644 index 0000000000..a60c853beb --- /dev/null +++ b/packages/design-system/theme/src/image.scss @@ -0,0 +1,176 @@ +@use "mixins/mixins"; +@use "./common/var"; + +%size { + width: 100%; + height: 100%; +} + +@include mixins.b(image) { + position: relative; + display: inline-block; + overflow: hidden; + + @include mixins.e(inner) { + @extend %size; + vertical-align: top; + + @include mixins.m(center) { + position: relative; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + display: block; + } + } + + @include mixins.e(placeholder) { + @extend %size; + background: var.$background-color-base; + } + + @include mixins.e(error) { + @extend %size; + display: flex; + justify-content: center; + align-items: center; + font-size: 14px; + background: var.$background-color-base; + color: var(--color-text-lighter); + vertical-align: middle; + } + + @include mixins.e(preview) { + cursor: pointer; + } +} + +@include mixins.b(image-viewer) { + @include mixins.e(wrapper) { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + } + + @include mixins.e(btn) { + position: absolute; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + opacity: 0.8; + cursor: pointer; + box-sizing: border-box; + user-select: none; + } + + @include mixins.e(close) { + top: 40px; + right: 40px; + width: 40px; + height: 40px; + font-size: 24px; + color: #fff; + background-color: #606266; + } + + @include mixins.e(canvas) { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + } + + @include mixins.e(actions) { + left: 50%; + bottom: 30px; + transform: translateX(-50%); + width: 282px; + height: 44px; + padding: 0 23px; + background-color: #606266; + border-color: #fff; + border-radius: 22px; + + @include mixins.e(actions__inner) { + width: 100%; + height: 100%; + text-align: justify; + cursor: default; + font-size: 23px; + color: #fff; + display: flex; + align-items: center; + justify-content: space-around; + } + } + + @include mixins.e(prev) { + top: 50%; + transform: translateY(-50%); + width: 44px; + height: 44px; + font-size: 24px; + color: #fff; + background-color: #606266; + border-color: #fff; + left: 40px; + } + + @include mixins.e(next) { + top: 50%; + transform: translateY(-50%); + width: 44px; + height: 44px; + font-size: 24px; + color: #fff; + background-color: #606266; + border-color: #fff; + right: 40px; + text-indent: 2px; + } + + @include mixins.e(mask) { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + opacity: 0.5; + background: #000; + } +} + +.viewer-fade-enter-active { + animation: viewer-fade-in 0.3s; +} + +.viewer-fade-leave-active { + animation: viewer-fade-out 0.3s; +} + +@keyframes viewer-fade-in { + 0% { + transform: translate3d(0, -20px, 0); + opacity: 0; + } + 100% { + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes viewer-fade-out { + 0% { + transform: translate3d(0, 0, 0); + opacity: 1; + } + 100% { + transform: translate3d(0, -20px, 0); + opacity: 0; + } +} diff --git a/packages/design-system/theme/src/index.scss b/packages/design-system/theme/src/index.scss new file mode 100644 index 0000000000..353317e1c3 --- /dev/null +++ b/packages/design-system/theme/src/index.scss @@ -0,0 +1,83 @@ +@use "./tokens.scss"; +@use "./tokens.dark.scss" as dark; +@use "./reset.scss"; +@use "./base.scss"; +// @use "./pagination.scss"; +@use "./dialog.scss"; +// @use "./autocomplete.scss"; +@use "./dropdown.scss"; +@use "./dropdown-menu.scss"; +@use "./dropdown-item.scss"; +@use "./menu.scss"; +@use "./submenu.scss"; +@use "./menu-item.scss"; +// @use "./menu-item-group.scss"; +@use "./input.scss"; +@use "./input-number.scss"; +@use "./radio.scss"; +@use "./radio-group.scss"; +@use "./radio-button.scss"; +@use "./checkbox.scss"; +// @use "./checkbox-button.scss"; +// @use "./checkbox-group.scss"; +@use "./switch.scss"; +@use "./select.scss"; +@use "./button.scss"; +// @use "./button-group.scss"; +@use "./table.scss"; +@use "./table-column.scss"; +@use "./date-picker.scss"; +// @use "./time-select.scss"; +// @use "./time-picker.scss"; +@use "./popover.scss"; +@use "./tooltip.scss"; +@use "./message-box.scss"; +// @use "./breadcrumb.scss"; +// @use "./breadcrumb-item.scss"; +@use "./form.scss"; +@use "./form-item.scss"; +@use "./tabs.scss"; +@use "./tab-pane.scss"; +@use "./tag.scss"; +// @use "./tree.scss"; +@use "./alert.scss"; +@use "./notification.scss"; +// @use "./slider.scss"; +@use "./loading.scss"; +@use "./row.scss"; +@use "./col.scss"; +// @use "./upload.scss"; +// @use "./progress.scss"; +// @use "./spinner.scss"; +// @use "./message.scss"; +@use "./badge.scss"; +@use "./card.scss"; +// @use "./rate.scss"; +// @use "./steps.scss"; +// @use "./step.scss"; +// @use "./carousel.scss"; +// @use "./scrollbar.scss"; +// @use "./carousel-item.scss"; +// @use "./collapse.scss"; +// @use "./collapse-item.scss"; +// @use "./cascader.scss"; +@use "./color-picker.scss"; +@use "./transfer.scss"; +@use "./container.scss"; +// @use "./header.scss"; +// @use "./aside.scss"; +// @use "./main.scss"; +// @use "./footer.scss"; +// @use "./timeline.scss"; +// @use "./timeline-item.scss"; +// @use "./link.scss"; +// @use "./divider.scss"; +// @use "./image.scss"; +// @use "./calendar.scss"; +// @use "./backtop.scss"; +// @use "./infinite-scroll.scss"; +// @use "./page-header.scss"; +// @use "./cascader-panel.scss"; +// @use "./avatar.scss"; +@use "./drawer.scss"; +// @use "./popconfirm.scss"; diff --git a/packages/design-system/theme/src/infinite-scroll.scss b/packages/design-system/theme/src/infinite-scroll.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/infiniteScroll.scss b/packages/design-system/theme/src/infiniteScroll.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/input-number.scss b/packages/design-system/theme/src/input-number.scss new file mode 100644 index 0000000000..9509f77681 --- /dev/null +++ b/packages/design-system/theme/src/input-number.scss @@ -0,0 +1,181 @@ +@use "mixins/mixins"; +@use "./common/var"; +@use "input"; + +@include mixins.b(input-number) { + position: relative; + display: inline-block; + line-height: #{var.$input-height - 2}; + width: 100%; + + .el-input { + display: block; + + &__inner { + -webkit-appearance: none; + padding-left: #{var.$input-height + 10}; + padding-right: #{var.$input-height + 10}; + text-align: center; + } + } + + @include mixins.e((increase, decrease)) { + position: absolute; + z-index: 1; + top: 1px; + width: var.$input-height; + height: auto; + text-align: center; + background: var.$background-color-base; + color: var(--color-text-dark); + cursor: pointer; + font-size: 13px; + + &:hover { + color: var(--color-primary); + + &:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled) { + border-color: var.$input-focus-border; + } + } + + &.is-disabled { + color: var.$disabled-color-base; + cursor: not-allowed; + } + } + + @include mixins.e(increase) { + right: 1px; + border-radius: 0 var(--border-radius-base) var(--border-radius-base) 0; + border-left: var(--border-base); + } + + @include mixins.e(decrease) { + left: 1px; + border-radius: var(--border-radius-base) 0 0 var(--border-radius-base); + border-right: var(--border-base); + } + + @include mixins.when(disabled) { + @include mixins.e((increase, decrease)) { + border-color: var.$disabled-border-base; + color: var.$disabled-border-base; + + &:hover { + color: var.$disabled-border-base; + cursor: not-allowed; + } + } + } + + @include mixins.m(medium) { + line-height: #{var.$input-medium-height - 2}; + + @include mixins.e((increase, decrease)) { + width: var.$input-medium-height; + font-size: var.$input-medium-font-size; + } + + .el-input__inner { + padding-left: #{var.$input-medium-height + 7}; + padding-right: #{var.$input-medium-height + 7}; + } + } + + @include mixins.m(small) { + line-height: #{var.$input-small-height - 2}; + + @include mixins.e((increase, decrease)) { + width: var.$input-small-height; + font-size: var.$input-small-font-size; + + [class*='el-icon'] { + transform: scale(0.9); + } + } + + .el-input__inner { + padding-left: #{var.$input-small-height + 7}; + padding-right: #{var.$input-small-height + 7}; + } + } + + @include mixins.m(mini) { + line-height: #{var.$input-mini-height - 2}; + + @include mixins.e((increase, decrease)) { + width: var.$input-mini-height; + font-size: var.$input-mini-font-size; + + [class*='el-icon'] { + transform: scale(0.8); + } + } + + .el-input__inner { + padding-left: #{var.$input-mini-height + 7}; + padding-right: #{var.$input-mini-height + 7}; + } + } + + @include mixins.when(without-controls) { + .el-input__inner { + text-align: left; + padding-left: 12px; + padding-right: 12px; + } + } + + @include mixins.when(controls-right) { + .el-input__inner { + padding-left: 15px; + padding-right: #{var.$input-height + 10}; + } + + @include mixins.e((increase, decrease)) { + height: auto; + line-height: #{(var.$input-height - 2) * 0.5}; + + [class*='el-icon'] { + transform: scale(0.8); + } + } + + @include mixins.e(increase) { + border-radius: 0 var(--border-radius-base) 0 0; + border-bottom: var(--border-base); + } + + @include mixins.e(decrease) { + right: 1px; + bottom: 1px; + top: auto; + left: auto; + border-right: none; + border-left: var(--border-base); + border-radius: 0 0 var(--border-radius-base) 0; + } + + &[class*='medium'] { + [class*='increase'], + [class*='decrease'] { + line-height: #{(var.$input-medium-height - 2) * 0.5}; + } + } + + &[class*='small'] { + [class*='increase'], + [class*='decrease'] { + line-height: #{(var.$input-small-height - 2) * 0.5}; + } + } + + &[class*='mini'] { + [class*='increase'], + [class*='decrease'] { + line-height: #{(var.$input-mini-height - 2) * 0.5}; + } + } + } +} diff --git a/packages/design-system/theme/src/input.scss b/packages/design-system/theme/src/input.scss new file mode 100644 index 0000000000..1264833936 --- /dev/null +++ b/packages/design-system/theme/src/input.scss @@ -0,0 +1,356 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(textarea) { + position: relative; + display: inline-block; + width: 100%; + vertical-align: bottom; + font-size: var.$font-size-base; + + @include mixins.e(inner) { + display: block; + resize: vertical; + padding: 8px 12px 5px 12px; + line-height: 1.5; + box-sizing: border-box; + width: 100%; + font-size: inherit; + color: var.$input-font-color; + background-color: var.$input-background-color; + background-image: none; + border-radius: var.$input-border-radius; + transition: var.$border-transition-base; + + &, + &:hover { + border: var.$input-border; + } + + &::placeholder { + color: var.$input-placeholder-color; + } + + &:focus { + outline: none; + border-color: var.$input-focus-border; + } + } + + & .el-input__count { + color: var(--color-info); + background: var.$color-white; + position: absolute; + font-size: 12px; + bottom: 5px; + right: 10px; + } + + @include mixins.when(disabled) { + .el-textarea__inner { + background-color: var.$input-disabled-fill; + border-color: var.$input-disabled-border; + color: var.$input-disabled-color; + cursor: not-allowed; + + &::placeholder { + color: var.$input-disabled-placeholder-color; + } + } + } + + @include mixins.when(exceed) { + .el-textarea__inner { + border-color: var(--color-danger); + } + + .el-input__count { + color: var(--color-danger); + } + } +} + +@include mixins.b(input) { + position: relative; + font-size: var.$input-font-size; + display: inline-block; + width: 100%; + @include mixins.scroll-bar; + + & .el-input__clear { + color: var.$input-clear-color; + font-size: var.$input-font-size; + cursor: pointer; + transition: var.$color-transition-base; + + &:hover { + color: var.$input-clear-hover-color; + } + } + + & .el-input__count { + height: 100%; + display: inline-flex; + align-items: center; + color: var(--color-info); + font-size: 12px; + + .el-input__count-inner { + background: var.$color-white; + line-height: initial; + display: inline-block; + padding: 0 5px; + } + } + + @include mixins.e(inner) { + -webkit-appearance: none; + background-color: var.$input-background-color; + background-image: none; + border-radius: var.$input-border-radius; + border: var.$input-border; + box-sizing: border-box; + color: var.$input-font-color; + display: inline-block; + font-size: inherit; + height: var.$input-height; + line-height: var.$input-height; + outline: none; + padding: 0 var(--spacing-xs); + transition: var.$border-transition-base; + width: 100%; + + &::placeholder { + color: var.$input-placeholder-color; + } + + &:focus { + outline: none; + border-color: var.$input-focus-border; + } + } + + @include mixins.e(suffix) { + position: absolute; + height: 100%; + right: 10px; + top: 0; + text-align: center; + color: var(--color-text-light); + transition: all 0.3s; + pointer-events: none; + display: flex; + align-items: center; + } + + @include mixins.e(suffix-inner) { + pointer-events: all; + } + + @include mixins.e(prefix) { + position: absolute; + height: 100%; + left: 14px; + top: 0; + text-align: center; + color: var.$input-icon-color; + transition: all 0.3s; + display: flex; + align-items: center; + } + + @include mixins.e(icon) { + height: 100%; + text-align: center; + transition: all 0.3s; + line-height: var.$input-height; + + &:after { + content: ''; + height: 100%; + width: 0; + display: inline-block; + vertical-align: middle; + } + } + + @include mixins.e(validateIcon) { + pointer-events: none; + } + + @include mixins.when(active) { + .el-input__inner { + outline: none; + border-color: var.$input-focus-border; + } + } + + @include mixins.when(disabled) { + .el-input__inner { + background-color: var.$input-disabled-fill; + border-color: var.$input-disabled-border; + color: var.$input-disabled-color; + cursor: not-allowed; + + &::placeholder { + color: var.$input-disabled-placeholder-color; + } + } + + .el-input__icon { + cursor: not-allowed; + } + } + + @include mixins.when(exceed) { + .el-input__inner { + border-color: var(--color-danger); + } + + .el-input__suffix { + .el-input__count { + color: var(--color-danger); + } + } + } + + @include mixins.m(suffix) { + .el-input__inner { + padding-right: 30px; + } + } + + @include mixins.m(prefix) { + .el-input__inner { + padding-left: 37px; + } + } + + @include mixins.m(medium) { + font-size: var.$input-medium-font-size; + + @include mixins.e(inner) { + height: var.$input-medium-height; + line-height: var.$input-medium-height; + } + + .el-input__icon { + line-height: var.$input-medium-height; + } + } + @include mixins.m(small) { + font-size: var.$input-small-font-size; + + @include mixins.e(inner) { + height: var.$input-small-height; + line-height: var.$input-small-height; + } + + .el-input__icon { + line-height: var.$input-small-height; + } + } + @include mixins.m(mini) { + font-size: var.$input-mini-font-size; + + @include mixins.e(inner) { + height: var.$input-mini-height; + line-height: var.$input-mini-height; + } + + .el-input__icon { + line-height: var.$input-mini-height; + } + } +} + +@include mixins.b(input-group) { + line-height: normal; + display: inline-table; + width: 100%; + border-collapse: separate; + border-spacing: 0; + + > .el-input__inner { + vertical-align: middle; + display: table-cell; + } + + @include mixins.e((append, prepend)) { + background-color: var.$background-color-base; + color: var(--color-info); + vertical-align: middle; + display: table-cell; + position: relative; + border: var(--border-base); + border-radius: var.$input-border-radius; + padding: 0 10px; + width: 1px; + white-space: nowrap; + font-weight: var(--font-weight-regular); + + &:focus { + outline: none; + } + + .el-select, + .el-button { + display: inline-block; + margin: -10px -20px; + } + + button.el-button, + div.el-select .el-input__inner, + div.el-select:hover .el-input__inner { + border-color: transparent; + background-color: transparent; + color: inherit; + border-top: 0; + border-bottom: 0; + } + + .el-button, + .el-input { + font-size: inherit; + } + } + + @include mixins.e(prepend) { + border-right: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + @include mixins.e(append) { + border-left: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + @include mixins.m(prepend) { + .el-input__inner { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .el-select .el-input.is-focus .el-input__inner { + border-color: transparent; + } + } + + @include mixins.m(append) { + .el-input__inner { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .el-select .el-input.is-focus .el-input__inner { + border-color: transparent; + } + } +} + +/** disalbe default clear on IE */ +.el-input__inner::-ms-clear { + display: none; + width: 0; + height: 0; +} diff --git a/packages/design-system/theme/src/link.scss b/packages/design-system/theme/src/link.scss new file mode 100644 index 0000000000..44051a781e --- /dev/null +++ b/packages/design-system/theme/src/link.scss @@ -0,0 +1,80 @@ +@use "mixins/mixins"; +@use "./common/var"; + +$typeMap: ( + primary: var.$link-primary-font-color, + danger: var.$link-danger-font-color, + success: var.$link-success-font-color, + warning: var.$link-warning-font-color, + info: var.$link-info-font-color, +); + +@include mixins.b(link) { + display: inline-flex; + flex-direction: row; + align-items: center; + justify-content: center; + vertical-align: middle; + position: relative; + text-decoration: none; + outline: none; + cursor: pointer; + padding: 0; + font-size: var.$link-font-size; + font-weight: var.$link-font-weight; + + @include mixins.when(underline) { + &:hover:after { + content: ''; + position: absolute; + left: 0; + right: 0; + height: 0; + bottom: 0; + border-bottom: 1px solid var.$link-default-active-color; + } + } + + @include mixins.when(disabled) { + cursor: not-allowed; + } + + & [class*='el-icon-'] { + & + span { + margin-left: 5px; + } + } + + &.el-link--default { + color: var.$link-default-font-color; + &:hover { + color: var.$link-default-active-color; + } + &:after { + border-color: var.$link-default-active-color; + } + @include mixins.when(disabled) { + color: var.$link-disabled-font-color; + } + } + + @each $type, $primaryColor in $typeMap { + &.el-link--#{$type} { + color: $primaryColor; + &:hover { + color: var.$color-primary-light-3; + } + &:after { + border-color: $primaryColor; + } + @include mixins.when(disabled) { + color: var.$color-primary-light-6; + } + @include mixins.when(underline) { + &:hover:after { + border-color: $primaryColor; + } + } + } + } +} diff --git a/packages/design-system/theme/src/loading.scss b/packages/design-system/theme/src/loading.scss new file mode 100644 index 0000000000..2bf4e20d78 --- /dev/null +++ b/packages/design-system/theme/src/loading.scss @@ -0,0 +1,96 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(loading-parent) { + @include mixins.m(relative) { + position: relative !important; + } + + @include mixins.m(hidden) { + overflow: hidden !important; + } +} + +@include mixins.b(loading-mask) { + position: absolute; + z-index: 2000; + background-color: rgba(255, 255, 255, 0.9); + margin: 0; + top: 0; + right: 0; + bottom: 0; + left: 0; + transition: opacity 0.3s; + + @include mixins.when(fullscreen) { + position: fixed; + + .el-loading-spinner { + margin-top: #{- var.$loading-fullscreen-spinner-size * 0.5}; + + .circular { + height: var.$loading-fullscreen-spinner-size; + width: var.$loading-fullscreen-spinner-size; + } + } + } +} + +@include mixins.b(loading-spinner) { + top: 50%; + margin-top: #{- var.$loading-spinner-size * 0.5}; + width: 100%; + text-align: center; + position: absolute; + + .el-loading-text { + color: var(--color-primary); + margin: 3px 0; + font-size: 14px; + } + + .circular { + height: var.$loading-spinner-size; + width: var.$loading-spinner-size; + animation: loading-rotate 2s linear infinite; + } + + .path { + animation: loading-dash 1.5s ease-in-out infinite; + stroke-dasharray: 90, 150; + stroke-dashoffset: 0; + stroke-width: 2; + stroke: var(--color-primary); + stroke-linecap: round; + } + + i { + color: var(--color-primary); + } +} + +.el-loading-fade-enter, +.el-loading-fade-leave-active { + opacity: 0; +} + +@keyframes loading-rotate { + 100% { + transform: rotate(360deg); + } +} + +@keyframes loading-dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -40px; + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -120px; + } +} diff --git a/packages/design-system/theme/src/main.scss b/packages/design-system/theme/src/main.scss new file mode 100644 index 0000000000..ad71cd7f03 --- /dev/null +++ b/packages/design-system/theme/src/main.scss @@ -0,0 +1,12 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(main) { + // IE11 supports the
element partially https://caniuse.com/#search=main + display: block; + flex: 1; + flex-basis: auto; + overflow: auto; + box-sizing: border-box; + padding: var.$main-padding; +} diff --git a/packages/design-system/theme/src/menu-item-group.scss b/packages/design-system/theme/src/menu-item-group.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/menu-item.scss b/packages/design-system/theme/src/menu-item.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/menu.scss b/packages/design-system/theme/src/menu.scss new file mode 100644 index 0000000000..24fc102549 --- /dev/null +++ b/packages/design-system/theme/src/menu.scss @@ -0,0 +1,289 @@ +@use "mixins/mixins"; +@use "mixins/utils"; +@use "./common/var"; +@use "common/transition"; + +@mixin menu-item { + height: 56px; + line-height: 56px; + font-size: var.$menu-item-font-size; + color: var.$menu-item-font-color; + padding: 0 20px; + list-style: none; + cursor: pointer; + position: relative; + transition: border-color 0.3s, background-color 0.3s, color 0.3s; + box-sizing: border-box; + white-space: nowrap; + + * { + vertical-align: middle; + } + + i { + color: var(--color-text-light); + } + + &:hover, + &:focus { + outline: none; + background-color: var.$menu-item-hover-fill; + } + + @include mixins.when(disabled) { + opacity: 0.25; + cursor: not-allowed; + background: none !important; + } +} + +@include mixins.b(menu) { + border-right: solid 1px #e6e6e6; + list-style: none; + position: relative; + margin: 0; + padding-left: 0; + background-color: var.$menu-background-color; + @include utils.utils-clearfix; + &.el-menu--horizontal { + border-bottom: solid 1px #e6e6e6; + } + + @include mixins.m(horizontal) { + border-right: none; + & > .el-menu-item { + float: left; + height: 60px; + line-height: 60px; + margin: 0; + border-bottom: 2px solid transparent; + color: var(--color-text-light); + + a, + a:hover { + color: inherit; + } + + &:not(.is-disabled):hover, + &:not(.is-disabled):focus { + background-color: #fff; + } + } + & > .el-submenu { + float: left; + + &:focus, + &:hover { + outline: none; + .el-submenu__title { + color: var(--color-text-dark); + } + } + + &.is-active { + .el-submenu__title { + border-bottom: 2px solid var(--color-primary); + color: var(--color-text-dark); + } + } + + & .el-submenu__title { + height: 60px; + line-height: 60px; + border-bottom: 2px solid transparent; + color: var(--color-text-light); + + &:hover { + background-color: #fff; + } + } + & .el-submenu__icon-arrow { + position: static; + vertical-align: middle; + margin-left: 8px; + margin-top: -3px; + } + } + & .el-menu { + & .el-menu-item, + & .el-submenu__title { + background-color: var.$color-white; + float: none; + height: 36px; + line-height: 36px; + padding: 0 10px; + color: var(--color-text-light); + } + & .el-menu-item.is-active, + & .el-submenu.is-active > .el-submenu__title { + color: var(--color-text-dark); + } + } + & .el-menu-item:not(.is-disabled):hover, + & .el-menu-item:not(.is-disabled):focus { + outline: none; + color: var(--color-text-dark); + } + & > .el-menu-item.is-active { + border-bottom: 2px solid var(--color-primary); + color: var(--color-text-dark); + } + } + @include mixins.m(collapse) { + width: 64px; + + > .el-menu-item, + > .el-submenu > .el-submenu__title { + [class^='el-icon-'] { + margin: 0; + vertical-align: middle; + width: 24px; + text-align: center; + } + .el-submenu__icon-arrow { + display: none; + } + span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + + > .el-menu-item.is-active i { + color: inherit; + } + + .el-menu .el-submenu { + min-width: 200px; + } + + .el-submenu { + position: relative; + & .el-menu { + position: absolute; + margin-left: 5px; + top: 0; + left: 100%; + z-index: 10; + border: 1px solid var(--border-color-base); + border-radius: var(--border-radius-small); + box-shadow: var.$box-shadow-light; + } + + &.is-opened { + > .el-submenu__title .el-submenu__icon-arrow { + transform: none; + } + } + } + } + @include mixins.m(popup) { + z-index: 100; + min-width: 200px; + border: none; + padding: 5px 0; + border-radius: var(--border-radius-small); + box-shadow: var.$box-shadow-light; + + &-bottom-start { + margin-top: 5px; + } + &-right-start { + margin-left: 5px; + margin-right: 5px; + } + } +} +@include mixins.b(menu-item) { + @include menu-item; + + & [class^='el-icon-'] { + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px; + vertical-align: middle; + } + @include mixins.when(active) { + color: var(--color-primary); + i { + color: inherit; + } + } +} + +@include mixins.b(submenu) { + list-style: none; + margin: 0; + padding-left: 0; + + @include mixins.e(title) { + @include menu-item; + + &:hover { + background-color: var.$menu-item-hover-fill; + } + } + & .el-menu { + border: none; + } + & .el-menu-item { + height: 50px; + line-height: 50px; + padding: 0 45px; + min-width: 200px; + } + @include mixins.e(icon-arrow) { + position: absolute; + top: 50%; + right: 20px; + margin-top: -7px; + transition: transform 0.3s; + font-size: 12px; + } + @include mixins.when(active) { + .el-submenu__title { + border-bottom-color: var(--color-primary); + } + } + @include mixins.when(opened) { + > .el-submenu__title .el-submenu__icon-arrow { + transform: rotateZ(180deg); + } + } + @include mixins.when(disabled) { + .el-submenu__title, + .el-menu-item { + opacity: 0.25; + cursor: not-allowed; + background: none !important; + } + } + [class^='el-icon-'] { + vertical-align: middle; + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px; + } +} + +@include mixins.b(menu-item-group) { + > ul { + padding: 0; + } + @include mixins.e(title) { + padding: 7px 0 7px 20px; + line-height: normal; + font-size: 12px; + color: var(--color-text-light); + } +} + +.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow { + transition: 0.2s; + opacity: 0; +} diff --git a/packages/design-system/theme/src/message-box.scss b/packages/design-system/theme/src/message-box.scss new file mode 100644 index 0000000000..06b83ab885 --- /dev/null +++ b/packages/design-system/theme/src/message-box.scss @@ -0,0 +1,237 @@ +@use "mixins/mixins"; +@use "mixins/button"; +@use "./common/var"; +@use "common/popup"; +@use "button" as buttons; +@use "input"; + +@include mixins.b(message-box) { + display: inline-block; + width: var.$msgbox-width; + padding-bottom: 10px; + vertical-align: middle; + background-color: var.$color-white; + border-radius: var.$msgbox-border-radius; + border: 1px solid var(--border-color-light); + font-size: var.$messagebox-font-size; + box-shadow: var.$box-shadow-light; + text-align: left; + overflow: hidden; + backface-visibility: hidden; + + @include mixins.e(wrapper) { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + text-align: center; + + &::after { + content: ''; + display: inline-block; + height: 100%; + width: 0; + vertical-align: middle; + } + } + + @include mixins.e(header) { + position: relative; + padding: var.$msgbox-padding-primary; + padding-bottom: 10px; + } + + @include mixins.e(title) { + padding-left: 0; + margin-bottom: 0; + font-size: var.$messagebox-font-size; + line-height: 1; + color: var.$messagebox-title-color; + } + + @include mixins.e(headerbtn) { + position: absolute; + top: var.$msgbox-padding-primary; + right: var.$msgbox-padding-primary; + padding: 0; + border: none; + outline: none; + background: transparent; + font-size: var.$message-close-size; + cursor: pointer; + + .el-message-box__close { + color: var(--color-info); + } + + &:focus, + &:hover { + .el-message-box__close { + color: var(--color-primary); + } + } + } + + @include mixins.e(content) { + padding: 10px var.$msgbox-padding-primary; + color: var.$messagebox-content-color; + font-size: var.$messagebox-content-font-size; + } + + @include mixins.e(container) { + position: relative; + } + + @include mixins.e(input) { + padding-top: 15px; + + & input.invalid { + border-color: var(--color-danger); + &:focus { + border-color: var(--color-danger); + } + } + } + + @include mixins.e(status) { + position: absolute; + top: 50%; + transform: translateY(-50%); + font-size: 24px !important; + + &::before { + // 防止图标切割 + padding-left: 1px; + } + + + .el-message-box__message { + padding-left: 36px; + padding-right: 12px; + } + + &.el-icon-success { + color: var.$messagebox-success-color; + } + + &.el-icon-info { + color: var.$messagebox-info-color; + } + + &.el-icon-warning { + color: var.$messagebox-warning-color; + } + + &.el-icon-error { + color: var.$messagebox-danger-color; + } + } + + @include mixins.e(message) { + margin: 0; + + & p { + margin: 0; + line-height: 24px; + } + } + + @include mixins.e(errormsg) { + color: var(--color-danger); + font-size: var.$messagebox-error-font-size; + min-height: 18px; + margin-top: 2px; + } + + @include mixins.e(btns) { + padding: 5px 15px 0; + text-align: right; + + & button { + margin-left: 10px; + } + + & .btn--confirm { + @include button.button-just-primary(); + @include button.button-medium(); + } + + & .btn--cancel { + @include button.button-outline(); + @include button.button-medium(); + } + } + + @include mixins.e(btns-reverse) { + flex-direction: row-reverse; + } + + // centerAlign 布局 + @include mixins.m(center) { + padding-bottom: 30px; + + @include mixins.e(header) { + padding-top: 30px; + } + + @include mixins.e(title) { + position: relative; + display: flex; + align-items: center; + justify-content: center; + } + + @include mixins.e(status) { + position: relative; + top: auto; + padding-right: 5px; + text-align: center; + transform: translateY(-1px); + } + + @include mixins.e(message) { + margin-left: 0; + } + + @include mixins.e((btns, content)) { + text-align: center; + } + + @include mixins.e(content) { + $padding-horizontal: var.$msgbox-padding-primary + 12px; + + padding-left: $padding-horizontal; + padding-right: $padding-horizontal; + } + } +} + +.msgbox-fade-enter-active { + animation: msgbox-fade-in 0.3s; +} + +.msgbox-fade-leave-active { + animation: msgbox-fade-out 0.3s; +} + +@keyframes msgbox-fade-in { + 0% { + transform: translate3d(0, -20px, 0); + opacity: 0; + } + 100% { + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes msgbox-fade-out { + 0% { + transform: translate3d(0, 0, 0); + opacity: 1; + } + 100% { + transform: translate3d(0, -20px, 0); + opacity: 0; + } +} diff --git a/packages/design-system/theme/src/message.scss b/packages/design-system/theme/src/message.scss new file mode 100644 index 0000000000..0ecffb84e7 --- /dev/null +++ b/packages/design-system/theme/src/message.scss @@ -0,0 +1,120 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(message) { + min-width: var.$message-min-width; + box-sizing: border-box; + border-radius: var(--border-radius-base); + border-width: var(--border-width-base); + border-style: var(--border-style-base); + border-color: var(--border-color-light); + position: fixed; + left: 50%; + top: 20px; + transform: translateX(-50%); + background-color: var.$message-background-color; + transition: opacity 0.3s, transform 0.4s, top 0.4s; + overflow: hidden; + padding: var.$message-padding; + display: flex; + align-items: center; + + @include mixins.when(center) { + justify-content: center; + } + + @include mixins.when(closable) { + .el-message__content { + padding-right: 16px; + } + } + + p { + margin: 0; + } + + @include mixins.m(info) { + .el-message__content { + color: var.$message-info-font-color; + } + } + + @include mixins.m(success) { + background-color: var.$color-success-lighter; + border-color: var.$color-success-light; + + .el-message__content { + color: var.$message-success-font-color; + } + } + + @include mixins.m(warning) { + background-color: var.$color-warning-lighter; + border-color: var.$color-warning-light; + + .el-message__content { + color: var.$message-warning-font-color; + } + } + + @include mixins.m(error) { + background-color: var.$color-danger-lighter; + border-color: var.$color-danger-light; + + .el-message__content { + color: var.$message-danger-font-color; + } + } + + @include mixins.e(icon) { + margin-right: 10px; + } + + @include mixins.e(content) { + padding: 0; + font-size: 14px; + line-height: 1; + &:focus { + outline-width: 0; + } + } + + @include mixins.e(closeBtn) { + position: absolute; + top: 50%; + right: 15px; + transform: translateY(-50%); + cursor: pointer; + color: var.$message-close-icon-color; + font-size: var.$message-close-size; + + &:focus { + outline-width: 0; + } + &:hover { + color: var.$message-close-hover-color; + } + } + + & .el-icon-success { + color: var.$message-success-font-color; + } + + & .el-icon-error { + color: var.$message-danger-font-color; + } + + & .el-icon-info { + color: var.$message-info-font-color; + } + + & .el-icon-warning { + color: var.$message-warning-font-color; + } +} + +.el-message-fade-enter, +.el-message-fade-leave-active { + opacity: 0; + transform: translate(-50%, -100%); +} diff --git a/packages/design-system/theme/src/mixins/_button.scss b/packages/design-system/theme/src/mixins/_button.scss new file mode 100644 index 0000000000..35e7d8af6c --- /dev/null +++ b/packages/design-system/theme/src/mixins/_button.scss @@ -0,0 +1,170 @@ +@use "../common/var"; +@use './mixins'; +@use "function"; + +@mixin button-plain($color, $h, $s, $l) { + &, + &:focus, + &:hover { + color: hsl(var(#{$h}), var(#{$s}), var(#{$l})); + background-color: var(--color-foreground-xlight); + border-color: hsl(var(#{$h}), var(#{$s}), var(#{$l})); + } + + @include mixins.when(loading) { + color: function.lightness($h, $s, $l, var.$button-hover-tint-percent); + background-color: var(--color-foreground-xlight); + border-color: function.lightness( + $h, + $s, + $l, + var.$button-hover-tint-percent + ); + } + + &:active { + border-color: function.lightness( + $h, + $s, + $l, + -(var.$button-active-shade-percent) + ); + background-color: var(--color-foreground-xlight); + color: function.lightness($h, $s, $l, -(var.$button-active-shade-percent)); + outline: none; + } + + &.is-disabled { + &, + &:hover, + &:focus, + &:active { + color: var(--color-text-light); + background-color: var(--color-foreground-xlight); + border-color: var(--color-foreground-base); + } + } +} + +@mixin button-variant( + $color, + $background-color, + $border-color, + $h, + $s, + $l, + $t, + $plain: true +) { + color: $color; + background-color: hsl(var(#{$h}), var(#{$s}), var(#{$l})); + border-color: hsl(var(#{$h}), var(#{$s}), var(#{$l})); + + &:active { + background: function.lightness( + $h, + $s, + $l, + -(var.$button-active-shade-percent) + ); + border-color: function.lightness( + $h, + $s, + $l, + -(var.$button-active-shade-percent) + ); + color: $color; + outline: none; + } + + &.is-active { + background: function.lightness( + $h, + $s, + $l, + -(var.$button-active-shade-percent) + ); + border-color: function.lightness( + $h, + $s, + $l, + -(var.$button-active-shade-percent) + ); + color: $color; + } + + &.is-light { + color: hsl(var(#{$h}), var(#{$s}), var(#{$l})); + background-color: hsl(var(#{$h}), var(#{$s}), var(#{$t})); + border-color: hsl(var(#{$h}), var(#{$s}), var(#{$t})); + } + + &.is-disabled { + &, + &:hover, + &:focus, + &:active { + color: var(--color-text-light); + background-color: var(--color-foreground-base); + border-color: var(--color-foreground-base); + } + } + + @if $plain { + &.is-plain { + @include button-plain($background-color, $h, $s, $l); + } + } +} + +@mixin button-size($padding-vertical, $padding-horizontal, $font-size) { + padding: $padding-vertical $padding-horizontal; + font-size: $font-size; + + &.is-round { + padding: $padding-vertical $padding-horizontal; + } +} + +@mixin button-round() { + --button-border-radius: 20px; +} + +// ignore plain overrides +@mixin button-just-primary() { + @include button-variant( + var.$button-primary-font-color, + var.$button-primary-background-color, + var.$button-primary-border-color, + --color-primary-h, + --color-primary-s, + --color-primary-l, + --color-primary-tint-2-l, + $plain: false + ); +} + +@mixin button-outline() { + @include button-plain( + var.$button-primary-background-color, + --color-primary-h, + --color-primary-s, + --color-primary-l + ); +} + +@mixin button-small() { + @include button-size( + var(--spacing-3xs), + var(--spacing-xs), + var(--font-size-2xs) + ); +} + +@mixin button-medium() { + @include button-size( + var(--spacing-2xs), + var(--spacing-xs), + var(--font-size-2xs) + ); +} diff --git a/packages/design-system/theme/src/mixins/config.scss b/packages/design-system/theme/src/mixins/config.scss new file mode 100644 index 0000000000..87e29b458c --- /dev/null +++ b/packages/design-system/theme/src/mixins/config.scss @@ -0,0 +1,4 @@ +$namespace: 'el'; +$element-separator: '__'; +$modifier-separator: '--'; +$state-prefix: 'is-'; diff --git a/packages/design-system/theme/src/mixins/function.scss b/packages/design-system/theme/src/mixins/function.scss new file mode 100644 index 0000000000..388f28d1ac --- /dev/null +++ b/packages/design-system/theme/src/mixins/function.scss @@ -0,0 +1,54 @@ +@use "sass:meta"; +@use "sass:string"; +@use "config"; + +/* BEM support Func + -------------------------- */ +@function selectorToString($selector) { + $selector: meta.inspect($selector); + $selector: string.slice($selector, 2, -2); + @return $selector; +} + +@function containsModifier($selector) { + $selector: selectorToString($selector); + + @if string.index($selector, config.$modifier-separator) { + @return true; + } @else { + @return false; + } +} + +@function containWhenFlag($selector) { + $selector: selectorToString($selector); + + @if string.index($selector, '.' + config.$state-prefix) { + @return true; + } @else { + @return false; + } +} + +@function containPseudoClass($selector) { + $selector: selectorToString($selector); + + @if string.index($selector, ':') { + @return true; + } @else { + @return false; + } +} + +@function hitAllSpecialNestRule($selector) { + @return containsModifier($selector) or containWhenFlag($selector) or + containPseudoClass($selector); +} + +@function lightness($h, $s, $l, $lightness) { + @return hsl(var(#{$h}), var(#{$s}), calc(var(#{$l}) + #{$lightness})); +} + +@function saturation($h, $s, $l, $saturation) { + @return hsl(var(#{$h}), calc(var(#{$s}) + #{$saturation}), var(#{$l})); +} diff --git a/packages/design-system/theme/src/mixins/mixins.scss b/packages/design-system/theme/src/mixins/mixins.scss new file mode 100644 index 0000000000..b13964a0bd --- /dev/null +++ b/packages/design-system/theme/src/mixins/mixins.scss @@ -0,0 +1,209 @@ +@use "sass:map"; +@use "sass:meta"; +@use "function"; +@use "../common/var"; +@use "config"; + +/* Break-points + -------------------------- */ +@mixin res($key, $map: var.$breakpoints) { + // 循环断点Map,如果存在则返回 + @if map.has-key($map, $key) { + @media only screen and #{meta.inspect(map.get($map, $key))} { + @content; + } + } @else { + @warn "Undefeined points: `#{$map}`"; + } +} + +/* Scrollbar + -------------------------- */ +@mixin scroll-bar { + $scrollbar-thumb-background: #b4bccc; + $scrollbar-track-background: #fff; + + &::-webkit-scrollbar { + z-index: 11; + width: 6px; + + &:horizontal { + height: 6px; + } + + &-thumb { + border-radius: 5px; + width: 6px; + background: $scrollbar-thumb-background; + } + + &-corner { + background: $scrollbar-track-background; + } + + &-track { + background: $scrollbar-track-background; + + &-piece { + background: $scrollbar-track-background; + width: 6px; + } + } + } +} + +/* Placeholder + -------------------------- */ +@mixin placeholder { + &::-webkit-input-placeholder { + @content; + } + + &::-moz-placeholder { + @content; + } + + &:-ms-input-placeholder { + @content; + } +} + +/* BEM + -------------------------- */ +@mixin b($block) { + $B: config.$namespace + '-' + $block !global; + + .#{$B} { + @content; + } +} + +@mixin e($element) { + $E: $element !global; + $selector: &; + $currentSelector: ''; + @each $unit in $element { + $currentSelector: #{$currentSelector + + '.' + + $B + + config.$element-separator + + $unit + + ','}; + } + + @if function.hitAllSpecialNestRule($selector) { + @at-root { + #{$selector} { + #{$currentSelector} { + @content; + } + } + } + } @else { + @at-root { + #{$currentSelector} { + @content; + } + } + } +} + +@mixin m($modifier) { + $selector: &; + $currentSelector: ''; + @each $unit in $modifier { + $currentSelector: #{$currentSelector + + & + + config.$modifier-separator + + $unit + + ','}; + } + + @at-root { + #{$currentSelector} { + @content; + } + } +} + +@mixin configurable-m($modifier, $E-flag: false) { + $selector: &; + $interpolation: ''; + + @if $E-flag { + $interpolation: config.$element-separator + $E-flag; + } + + @at-root { + #{$selector} { + .#{$B + $interpolation + config.$modifier-separator + $modifier} { + @content; + } + } + } +} + +@mixin spec-selector( + $specSelector: '', + $element: $E, + $modifier: false, + $block: $B +) { + $modifierCombo: ''; + + @if $modifier { + $modifierCombo: config.$modifier-separator + $modifier; + } + + @at-root { + #{&}#{$specSelector}.#{$block + + config.$element-separator + + $element + + $modifierCombo} { + @content; + } + } +} + +@mixin meb($modifier: false, $element: $E, $block: $B) { + $selector: &; + $modifierCombo: ''; + + @if $modifier { + $modifierCombo: config.$modifier-separator + $modifier; + } + + @at-root { + #{$selector} { + .#{$block + config.$element-separator + $element + $modifierCombo} { + @content; + } + } + } +} + +@mixin when($state) { + @at-root { + &.#{config.$state-prefix + $state} { + @content; + } + } +} + +@mixin extend-rule($name) { + @extend #{'%shared-' + $name}; +} + +@mixin share-rule($name) { + $rule-name: '%shared-' + $name; + + @at-root #{$rule-name} { + @content; + } +} + +@mixin pseudo($pseudo) { + @at-root #{&}#{':#{$pseudo}'} { + @content; + } +} diff --git a/packages/design-system/theme/src/mixins/utils.scss b/packages/design-system/theme/src/mixins/utils.scss new file mode 100644 index 0000000000..e86ede1e4a --- /dev/null +++ b/packages/design-system/theme/src/mixins/utils.scss @@ -0,0 +1,39 @@ +@mixin utils-user-select($value) { + -moz-user-select: $value; + -webkit-user-select: $value; + -ms-user-select: $value; +} + +@mixin utils-clearfix { + $selector: &; + + @at-root { + #{$selector}::before, + #{$selector}::after { + display: table; + content: ''; + } + #{$selector}::after { + clear: both; + } + } +} + +@mixin utils-vertical-center { + $selector: &; + + @at-root { + #{$selector}::after { + display: inline-block; + content: ''; + height: 100%; + vertical-align: middle; + } + } +} + +@mixin utils-ellipsis { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/packages/design-system/theme/src/notification.scss b/packages/design-system/theme/src/notification.scss new file mode 100644 index 0000000000..e1d851664b --- /dev/null +++ b/packages/design-system/theme/src/notification.scss @@ -0,0 +1,100 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(notification) { + display: flex; + width: var.$notification-width; + padding: var.$notification-padding; + border-radius: var.$notification-radius; + box-sizing: border-box; + border: 1px solid var.$notification-border-color; + position: fixed; + background-color: var.$color-white; + box-shadow: var.$notification-shadow; + transition: opacity 0.3s, transform 0.3s, left 0.3s, right 0.3s, top 0.4s, + bottom 0.3s; + overflow: hidden; + + &.right { + right: 16px; + } + + &.left { + left: 16px; + } + + @include mixins.e(group) { + margin-left: var.$notification-group-margin-left; + margin-right: var.$notification-group-margin-right; + } + + @include mixins.e(title) { + font-weight: bold; + font-size: var.$notification-title-font-size; + color: var.$notification-title-color; + margin: 0; + } + + @include mixins.e(content) { + font-size: var.$notification-content-font-size; + line-height: 21px; + margin: 6px 0 0 0; + color: var.$notification-content-color; + text-align: justify; + + p { + margin: 0; + } + } + + @include mixins.e(icon) { + height: var.$notification-icon-size; + width: var.$notification-icon-size; + font-size: var.$notification-icon-size; + } + + @include mixins.e(closeBtn) { + position: absolute; + top: 18px; + right: 15px; + cursor: pointer; + color: var.$notification-close-color; + font-size: var.$notification-close-font-size; + + &:hover { + color: var.$notification-close-hover-color; + } + } + + .el-icon-success { + color: var.$notification-success-icon-color; + } + + .el-icon-error { + color: var.$notification-danger-icon-color; + } + + .el-icon-info { + color: var.$notification-info-icon-color; + } + + .el-icon-warning { + color: var.$notification-warning-icon-color; + } +} + +.el-notification-fade-enter { + &.right { + right: 0; + transform: translateX(100%); + } + + &.left { + left: 0; + transform: translateX(-100%); + } +} + +.el-notification-fade-leave-active { + opacity: 0; +} diff --git a/packages/design-system/theme/src/option-group.scss b/packages/design-system/theme/src/option-group.scss new file mode 100644 index 0000000000..84c37badf5 --- /dev/null +++ b/packages/design-system/theme/src/option-group.scss @@ -0,0 +1,42 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(select-group) { + $gap: 20px; + + margin: 0; + padding: 0; + + @include mixins.e(wrap) { + position: relative; + list-style: none; + margin: 0; + padding: 0; + + &:not(:last-of-type) { + padding-bottom: 24px; + + &::after { + content: ''; + position: absolute; + display: block; + left: $gap; + right: $gap; + bottom: 12px; + height: 1px; + background: var(--border-color-base); + } + } + } + + @include mixins.e(title) { + padding-left: $gap; + font-size: var.$select-group-font-size; + color: var.$select-group-color; + line-height: var.$select-group-height; + } + + & .el-select-dropdown__item { + padding-left: $gap; + } +} diff --git a/packages/design-system/theme/src/option.scss b/packages/design-system/theme/src/option.scss new file mode 100644 index 0000000000..97d16f59fc --- /dev/null +++ b/packages/design-system/theme/src/option.scss @@ -0,0 +1,40 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(select-dropdown) { + @include mixins.e(item) { + font-size: var.$select-font-size; + padding: 0 20px; + position: relative; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: var.$select-option-color; + min-height: var.$select-option-height; + height: auto; + line-height: var.$select-option-height; + box-sizing: border-box; + cursor: pointer; + display: flex; + align-items: center; + + @include mixins.when(disabled) { + color: var.$select-option-disabled-color; + cursor: not-allowed; + + &:hover { + background-color: var.$color-white; + } + } + + &.hover, + &:hover { + background-color: var.$select-option-hover-background; + } + + &.selected { + color: var.$select-option-selected-font-color; + font-weight: bold; + } + } +} diff --git a/packages/design-system/theme/src/page-header.scss b/packages/design-system/theme/src/page-header.scss new file mode 100644 index 0000000000..e15c6728fd --- /dev/null +++ b/packages/design-system/theme/src/page-header.scss @@ -0,0 +1,41 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(page-header) { + display: flex; + line-height: 24px; + + @include mixins.e(left) { + display: flex; + cursor: pointer; + margin-right: 40px; + position: relative; + + &::after { + content: ''; + position: absolute; + width: 1px; + height: 16px; + right: -20px; + top: 50%; + transform: translateY(-50%); + background-color: var(--border-color-base); + } + + .el-icon-back { + font-size: 18px; + margin-right: 6px; + align-self: center; + } + + @include mixins.e(title) { + font-size: 14px; + font-weight: 500; + } + } + + @include mixins.e(content) { + font-size: 18px; + color: var(--color-text-dark); + } +} diff --git a/packages/design-system/theme/src/pagination.scss b/packages/design-system/theme/src/pagination.scss new file mode 100644 index 0000000000..0bc3c1352d --- /dev/null +++ b/packages/design-system/theme/src/pagination.scss @@ -0,0 +1,296 @@ +@use "mixins/mixins"; +@use "mixins/utils"; +@use "./common/var"; +@use "select"; + +@include mixins.b(pagination) { + white-space: nowrap; + padding: 2px 5px; + color: var.$pagination-font-color; + font-weight: bold; + @include utils.utils-clearfix; + + span:not([class*='suffix']), + button { + display: inline-block; + font-size: var.$pagination-font-size; + min-width: var.$pagination-button-width; + height: var.$pagination-button-height; + line-height: var.$pagination-button-height; + vertical-align: top; + box-sizing: border-box; + } + + .el-input__inner { + text-align: center; + -moz-appearance: textfield; + line-height: normal; + } + + // pagesize 的下拉 icon + .el-input__suffix { + right: 0; + transform: scale(0.8); + } + + .el-select .el-input { + width: 100px; + margin: 0 5px; + + .el-input__inner { + padding-right: 25px; + border-radius: var.$pagination-border-radius; + } + } + + button { + border: none; + padding: 0 6px; + background: transparent; + + &:focus { + outline: none; + } + + &:hover { + color: var.$pagination-hover-color; + } + + &:disabled { + color: var.$pagination-button-disabled-color; + background-color: var.$pagination-button-disabled-background-color; + cursor: not-allowed; + } + } + + .btn-prev, + .btn-next { + background: center center no-repeat; + background-size: 16px; + background-color: var.$pagination-background-color; + cursor: pointer; + margin: 0; + color: var.$pagination-button-color; + + .el-icon { + display: block; + font-size: 12px; + font-weight: bold; + } + } + + .btn-prev { + padding-right: 12px; + } + + .btn-next { + padding-left: 12px; + } + + .el-pager li.disabled { + color: var(--color-text-lighter); + cursor: not-allowed; + } + + @include mixins.m(small) { + .btn-prev, + .btn-next, + .el-pager li, + .el-pager li.btn-quicknext, + .el-pager li.btn-quickprev, + .el-pager li:last-child { + border-color: transparent; + font-size: 12px; + line-height: 22px; + height: 22px; + min-width: 22px; + } + + .arrow.disabled { + visibility: hidden; + } + + .more::before, + li.more::before { + line-height: 24px; + } + + span:not([class*='suffix']), + button { + height: 22px; + line-height: 22px; + } + + @include mixins.e(editor) { + height: 22px; + &.el-input .el-input__inner { + height: 22px; + } + } + } + + @include mixins.e(sizes) { + margin: 0 10px 0 0; + font-weight: normal; + color: var(--color-text-dark); + + .el-input .el-input__inner { + font-size: var.$pagination-font-size; + padding-left: 8px; + + &:hover { + border-color: var.$pagination-hover-color; + } + } + } + + @include mixins.e(total) { + margin-right: 10px; + font-weight: normal; + color: var(--color-text-dark); + } + + @include mixins.e(jump) { + margin-left: 24px; + font-weight: normal; + color: var(--color-text-dark); + + .el-input__inner { + padding: 0 3px; + } + } + + @include mixins.e(rightwrapper) { + float: right; + } + + @include mixins.e(editor) { + line-height: 18px; + padding: 0 2px; + height: var.$pagination-button-height; + + text-align: center; + margin: 0 2px; + box-sizing: border-box; + border-radius: var.$pagination-border-radius; + + &.el-input { + width: 50px; + } + + &.el-input .el-input__inner { + height: var.$pagination-button-height; + } + + .el-input__inner::-webkit-inner-spin-button, + .el-input__inner::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; + } + } + + @include mixins.when(background) { + .btn-prev, + .btn-next, + .el-pager li { + margin: 0 5px; + background-color: var.$color-info-lighter; + color: var(--color-text-dark); + min-width: 30px; + border-radius: 2px; + + &.disabled { + color: var(--color-text-lighter); + } + } + + .btn-prev, + .btn-next { + padding: 0; + + &:disabled { + color: var(--color-text-lighter); + } + } + + .el-pager li:not(.disabled) { + &:hover { + color: var.$pagination-hover-color; + } + + &.active { + background-color: var(--color-primary); + color: var.$color-white; + } + } + + &.el-pagination--small { + .btn-prev, + .btn-next, + .el-pager li { + margin: 0 3px; + min-width: 22px; + } + } + } +} + +@include mixins.b(pager) { + user-select: none; + list-style: none; + display: inline-block; + vertical-align: top; + font-size: 0; + padding: 0; + margin: 0; + + .more::before { + line-height: 30px; + } + + li { + padding: 0 4px; + background: var.$pagination-background-color; + vertical-align: top; + display: inline-block; + font-size: var.$pagination-font-size; + min-width: var.$pagination-button-width; + height: var.$pagination-button-height; + line-height: var.$pagination-button-height; + cursor: pointer; + box-sizing: border-box; + text-align: center; + margin: 0; + + &.btn-quicknext, + &.btn-quickprev { + line-height: 28px; + color: var.$pagination-button-color; + + &.disabled { + color: var(--color-text-lighter); + } + } + + &.btn-quickprev:hover { + cursor: pointer; + } + + &.btn-quicknext:hover { + cursor: pointer; + } + + &.active + li { + border-left: 0; + } + + &:hover { + color: var.$pagination-hover-color; + } + + &.active { + color: var.$pagination-hover-color; + cursor: default; + } + } +} diff --git a/packages/design-system/theme/src/popconfirm.scss b/packages/design-system/theme/src/popconfirm.scss new file mode 100644 index 0000000000..7f63e94f5f --- /dev/null +++ b/packages/design-system/theme/src/popconfirm.scss @@ -0,0 +1,16 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(popconfirm) { + @include mixins.e(main) { + display: flex; + align-items: center; + } + @include mixins.e(icon) { + margin-right: 5px; + } + @include mixins.e(action) { + text-align: right; + margin: 0; + } +} diff --git a/packages/design-system/theme/src/popover.scss b/packages/design-system/theme/src/popover.scss new file mode 100644 index 0000000000..f8dc582ab3 --- /dev/null +++ b/packages/design-system/theme/src/popover.scss @@ -0,0 +1,42 @@ +@use "mixins/mixins"; +@use "./common/var"; +@use "./popper"; + +@include mixins.b(popover) { + position: absolute; + background: var.$popover-background-color; + min-width: 150px; + border-radius: 4px; + border: 1px solid var.$popover-border-color; + padding: var.$popover-padding; + z-index: var.$index-popper; + color: var(--color-text-dark); + line-height: 1.4; + text-align: justify; + font-size: var.$popover-font-size; + box-shadow: var.$box-shadow-light; + word-break: break-all; + + @include mixins.m(plain) { + padding: var.$popover-padding-large; + } + + @include mixins.e(title) { + color: var.$popover-title-font-color; + font-size: var.$popover-title-font-size; + line-height: 1; + margin-bottom: 12px; + } + + @include mixins.e(reference) { + &:focus:not(.focusing), + &:focus:hover { + outline-width: 0; + } + } + + &:focus:active, + &:focus { + outline-width: 0; + } +} diff --git a/packages/design-system/theme/src/popper.scss b/packages/design-system/theme/src/popper.scss new file mode 100644 index 0000000000..f1e1fc1e88 --- /dev/null +++ b/packages/design-system/theme/src/popper.scss @@ -0,0 +1,101 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(popper) { + .popper__arrow, + .popper__arrow::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } + + .popper__arrow { + border-width: var.$popover-arrow-size; + filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); + } + + .popper__arrow::after { + content: ' '; + border-width: var.$popover-arrow-size; + } + + &[x-placement^='top'] { + margin-bottom: #{var.$popover-arrow-size + 6}; + } + + &[x-placement^='top'] .popper__arrow { + bottom: -(var.$popover-arrow-size); + left: 50%; + margin-right: #{var.$tooltip-arrow-size * 0.5}; + border-top-color: var.$popover-border-color; + border-bottom-width: 0; + + &::after { + bottom: 1px; + margin-left: -(var.$popover-arrow-size); + border-top-color: var.$popover-background-color; + border-bottom-width: 0; + } + } + + &[x-placement^='bottom'] { + margin-top: #{var.$popover-arrow-size + 6}; + } + + &[x-placement^='bottom'] .popper__arrow { + top: -(var.$popover-arrow-size); + left: 50%; + margin-right: #{var.$tooltip-arrow-size * 0.5}; + border-top-width: 0; + border-bottom-color: var.$popover-border-color; + + &::after { + top: 1px; + margin-left: -(var.$popover-arrow-size); + border-top-width: 0; + border-bottom-color: var.$popover-background-color; + } + } + + &[x-placement^='right'] { + margin-left: #{var.$popover-arrow-size + 6}; + } + + &[x-placement^='right'] .popper__arrow { + top: 50%; + left: -(var.$popover-arrow-size); + margin-bottom: #{var.$tooltip-arrow-size * 0.5}; + border-right-color: var.$popover-border-color; + border-left-width: 0; + + &::after { + bottom: -(var.$popover-arrow-size); + left: 1px; + border-right-color: var.$popover-background-color; + border-left-width: 0; + } + } + + &[x-placement^='left'] { + margin-right: #{var.$popover-arrow-size + 6}; + } + + &[x-placement^='left'] .popper__arrow { + top: 50%; + right: -(var.$popover-arrow-size); + margin-bottom: #{var.$tooltip-arrow-size * 0.5}; + border-right-width: 0; + border-left-color: var.$popover-border-color; + + &::after { + right: 1px; + bottom: -(var.$popover-arrow-size); + margin-left: -(var.$popover-arrow-size); + border-right-width: 0; + border-left-color: var.$popover-background-color; + } + } +} diff --git a/packages/design-system/theme/src/progress.scss b/packages/design-system/theme/src/progress.scss new file mode 100644 index 0000000000..94d51eb70d --- /dev/null +++ b/packages/design-system/theme/src/progress.scss @@ -0,0 +1,140 @@ +@use "mixins/mixins"; +@use "mixins/utils"; +@use "./common/var"; + +@include mixins.b(progress) { + position: relative; + line-height: 1; + + @include mixins.e(text) { + font-size: 14px; + color: var(--color-text-dark); + display: inline-block; + vertical-align: middle; + margin-left: 10px; + line-height: 1; + + i { + vertical-align: middle; + display: block; + } + } + + @include mixins.m((circle, dashboard)) { + display: inline-block; + + .el-progress__text { + position: absolute; + top: 50%; + left: 0; + width: 100%; + text-align: center; + margin: 0; + transform: translate(0, -50%); + + i { + vertical-align: middle; + display: inline-block; + } + } + } + + @include mixins.m(without-text) { + .el-progress__text { + display: none; + } + + .el-progress-bar { + padding-right: 0; + margin-right: 0; + display: block; + } + } + + @include mixins.m(text-inside) { + .el-progress-bar { + padding-right: 0; + margin-right: 0; + } + } + + @include mixins.when(success) { + .el-progress-bar__inner { + background-color: var(--color-success); + } + + .el-progress__text { + color: var(--color-success); + } + } + + @include mixins.when(warning) { + .el-progress-bar__inner { + background-color: var(--color-warning); + } + + .el-progress__text { + color: var(--color-warning); + } + } + + @include mixins.when(exception) { + .el-progress-bar__inner { + background-color: var(--color-danger); + } + + .el-progress__text { + color: var(--color-danger); + } + } +} + +@include mixins.b(progress-bar) { + padding-right: 50px; + display: inline-block; + vertical-align: middle; + width: 100%; + margin-right: -55px; + box-sizing: border-box; + + @include mixins.e(outer) { + height: 6px; + border-radius: 100px; + background-color: var(--border-color-light); + overflow: hidden; + position: relative; + vertical-align: middle; + } + @include mixins.e(inner) { + position: absolute; + left: 0; + top: 0; + height: 100%; + background-color: var(--color-primary); + text-align: right; + border-radius: 100px; + line-height: 1; + white-space: nowrap; + transition: width 0.6s ease; + + @include utils.utils-vertical-center; + } + + @include mixins.e(innerText) { + display: inline-block; + vertical-align: middle; + color: var.$color-white; + font-size: 12px; + margin: 0 5px; + } +} + +@keyframes progress { + 0% { + background-position: 0 0; + } + + 100% { + background-position: 32px 0; + } +} diff --git a/packages/design-system/theme/src/radio-button.scss b/packages/design-system/theme/src/radio-button.scss new file mode 100644 index 0000000000..93ff04745d --- /dev/null +++ b/packages/design-system/theme/src/radio-button.scss @@ -0,0 +1,134 @@ +@use "mixins/mixins"; +@use "mixins/_button"; +@use "./common/var"; + +@include mixins.b(radio-button) { + position: relative; + display: inline-block; + outline: none; + + @include mixins.e(inner) { + display: inline-block; + line-height: 1; + white-space: nowrap; + vertical-align: middle; + background: var.$button-default-background-color; + border: var(--border-base); + font-weight: var(--font-weight-bold); + border-left: 0; + color: var.$button-default-font-color; + -webkit-appearance: none; + text-align: center; + box-sizing: border-box; + outline: none; + margin: 0; + position: relative; + cursor: pointer; + transition: var.$all-transition; + border-radius: 0; + + @include button.button-size( + var.$button-padding-vertical, + var.$button-padding-horizontal, + var.$button-font-size + ); + + &:hover { + color: var(--color-primary); + } + + & [class*='el-icon-'] { + line-height: 0.9; + + & + span { + margin-left: 5px; + } + } + } + + &:first-child { + .el-radio-button__inner { + border-left: var(--border-base); + border-radius: var(--border-radius-base) 0 0 var(--border-radius-base); + box-shadow: none !important; + } + } + + @include mixins.e(orig-radio) { + opacity: 0; + outline: none; + position: absolute; + z-index: -1; + + &:checked { + & + .el-radio-button__inner { + color: var.$radio-button-checked-font-color; + background-color: var.$radio-button-checked-background-color; + border-color: var.$radio-button-checked-border-color; + box-shadow: -1px 0 0 0 var.$radio-button-checked-border-color; + } + } + + &:disabled { + & + .el-radio-button__inner { + color: var.$button-disabled-font-color; + cursor: not-allowed; + background-image: none; + background-color: var.$button-disabled-background-color; + border-color: var.$button-disabled-border-color; + box-shadow: none; + } + &:checked + .el-radio-button__inner { + background-color: var.$radio-button-disabled-checked-fill; + } + } + } + + &:last-child { + .el-radio-button__inner { + border-radius: 0 var(--border-radius-base) var(--border-radius-base) 0; + } + } + + &:first-child:last-child { + .el-radio-button__inner { + border-radius: var(--border-radius-base); + } + } + + @include mixins.m(medium) { + & .el-radio-button__inner { + border-radius: 0; + @include button.button-size( + var.$button-medium-padding-vertical, + var.$button-medium-padding-horizontal, + var.$button-medium-font-size + ); + } + } + @include mixins.m(small) { + & .el-radio-button__inner { + border-radius: 0; + @include button.button-size( + var.$button-small-padding-vertical, + var.$button-small-padding-horizontal, + var.$button-small-font-size + ); + } + } + @include mixins.m(mini) { + & .el-radio-button__inner { + border-radius: 0; + @include button.button-size( + var.$button-mini-padding-vertical, + var.$button-mini-padding-horizontal, + var.$button-mini-font-size + ); + } + } + + &:focus:not(.is-focus):not(:active):not(.is-disabled) { + /*获得焦点时 样式提醒*/ + box-shadow: 0 0 2px 2px var.$radio-button-checked-border-color; + } +} diff --git a/packages/design-system/theme/src/radio-group.scss b/packages/design-system/theme/src/radio-group.scss new file mode 100644 index 0000000000..86358b848d --- /dev/null +++ b/packages/design-system/theme/src/radio-group.scss @@ -0,0 +1,9 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(radio-group) { + display: inline-block; + line-height: 1; + vertical-align: middle; + font-size: 0; +} diff --git a/packages/design-system/theme/src/radio.scss b/packages/design-system/theme/src/radio.scss new file mode 100644 index 0000000000..fe173efbbf --- /dev/null +++ b/packages/design-system/theme/src/radio.scss @@ -0,0 +1,200 @@ +@use "mixins/mixins"; +@use "mixins/utils"; +@use 'mixins/button'; +@use "./common/var"; + +@include mixins.b(radio) { + color: var.$radio-font-color; + font-weight: var.$radio-font-weight; + line-height: 1; + position: relative; + cursor: pointer; + display: inline-block; + white-space: nowrap; + outline: none; + font-size: var.$font-size-base; + margin-right: 30px; + @include utils.utils-user-select(none); + + @include mixins.when(bordered) { + padding: var.$radio-bordered-padding; + border-radius: var(--border-radius-base); + border: var(--border-base); + box-sizing: border-box; + height: var.$radio-bordered-height; + + &.is-checked { + border-color: var(--color-primary); + } + + &.is-disabled { + cursor: not-allowed; + border-color: var(--border-color-light); + } + + & + .el-radio.is-bordered { + margin-left: 10px; + } + } + + @include mixins.m(medium) { + &.is-bordered { + padding: var.$radio-bordered-medium-padding; + border-radius: var.$button-medium-border-radius; + height: var.$radio-bordered-medium-height; + .el-radio__label { + font-size: var.$button-medium-font-size; + } + .el-radio__inner { + height: var.$radio-bordered-medium-input-height; + width: var.$radio-bordered-medium-input-width; + } + } + } + @include mixins.m(small) { + &.is-bordered { + padding: var.$radio-bordered-small-padding; + border-radius: var.$button-small-border-radius; + height: var.$radio-bordered-small-height; + .el-radio__label { + font-size: var.$button-small-font-size; + } + .el-radio__inner { + height: var.$radio-bordered-small-input-height; + width: var.$radio-bordered-small-input-width; + } + } + } + @include mixins.m(mini) { + &.is-bordered { + padding: var.$radio-bordered-mini-padding; + border-radius: var.$button-mini-border-radius; + height: var.$radio-bordered-mini-height; + .el-radio__label { + font-size: var.$button-mini-font-size; + } + .el-radio__inner { + height: var.$radio-bordered-mini-input-height; + width: var.$radio-bordered-mini-input-width; + } + } + } + + &:last-child { + margin-right: 0; + } + + @include mixins.e(input) { + white-space: nowrap; + cursor: pointer; + outline: none; + display: inline-block; + line-height: 1; + position: relative; + vertical-align: middle; + + @include mixins.when(disabled) { + .el-radio__inner { + background-color: var.$radio-disabled-input-fill; + border-color: var.$radio-disabled-input-border-color; + cursor: not-allowed; + + &::after { + cursor: not-allowed; + background-color: var.$radio-disabled-icon-color; + } + + & + .el-radio__label { + cursor: not-allowed; + } + } + &.is-checked { + .el-radio__inner { + background-color: var.$radio-disabled-checked-input-fill; + border-color: var.$radio-disabled-checked-input-border-color; + + &::after { + background-color: var.$radio-disabled-checked-icon-color; + } + } + } + & + span.el-radio__label { + color: var(--color-text-lighter); + cursor: not-allowed; + } + } + + @include mixins.when(checked) { + .el-radio__inner { + border-color: var.$radio-checked-input-border-color; + background: var.$radio-checked-icon-color; + + &::after { + transform: translate(-50%, -50%) scale(1); + } + } + + & + .el-radio__label { + color: var.$radio-checked-font-color; + } + } + + @include mixins.when(focus) { + .el-radio__inner { + border-color: var.$radio-input-border-color-hover; + } + } + } + @include mixins.e(inner) { + border: var.$radio-input-border; + border-radius: var.$radio-input-border-radius; + width: var.$radio-input-width; + height: var.$radio-input-height; + background-color: var.$radio-input-background-color; + position: relative; + cursor: pointer; + display: inline-block; + box-sizing: border-box; + + &:hover { + border-color: var.$radio-input-border-color-hover; + } + + &::after { + width: 4px; + height: 4px; + border-radius: var.$radio-input-border-radius; + background-color: var.$color-white; + content: ''; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%) scale(0); + transition: transform 0.15s ease-in; + } + } + + @include mixins.e(original) { + opacity: 0; + outline: none; + position: absolute; + z-index: -1; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: 0; + } + + &:focus:not(.is-focus):not(:active):not(.is-disabled) { + /*获得焦点时 样式提醒*/ + .el-radio__inner { + box-shadow: 0 0 2px 2px var.$radio-input-border-color-hover; + } + } + + @include mixins.e(label) { + font-size: var.$radio-font-size; + padding-left: 10px; + } +} diff --git a/packages/design-system/theme/src/rate.scss b/packages/design-system/theme/src/rate.scss new file mode 100644 index 0000000000..1a37308539 --- /dev/null +++ b/packages/design-system/theme/src/rate.scss @@ -0,0 +1,50 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(rate) { + height: var.$rate-height; + line-height: 1; + + &:focus, + &:active { + outline-width: 0; + } + + @include mixins.e(item) { + display: inline-block; + position: relative; + font-size: 0; + vertical-align: middle; + } + + @include mixins.e(icon) { + position: relative; + display: inline-block; + font-size: var.$rate-icon-size; + margin-right: var.$rate-icon-margin; + color: var.$rate-icon-color; + transition: 0.3s; + &.hover { + transform: scale(1.15); + } + + .path2 { + position: absolute; + left: 0; + top: 0; + } + } + + @include mixins.e(decimal) { + position: absolute; + top: 0; + left: 0; + display: inline-block; + overflow: hidden; + } + + @include mixins.e(text) { + font-size: var.$rate-font-size; + vertical-align: middle; + } +} diff --git a/packages/design-system/theme/src/reset.scss b/packages/design-system/theme/src/reset.scss new file mode 100644 index 0000000000..1a0e69a4c2 --- /dev/null +++ b/packages/design-system/theme/src/reset.scss @@ -0,0 +1,241 @@ +@use "mixins/function"; +@use 'common/var'; + +*, +*::before, +*::after { + box-sizing: border-box; +} + +body { + overscroll-behavior-x: none; + line-height: 1; + font-size: var(--font-size-m); + font-weight: 300; + color: var(--color-text-dark); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body, +button, +input { + font-family: var(--font-family); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +input { + font-weight: var(--font-weight-regular); +} + +button { + font-weight: var(--font-weight-bold); +} + +html, +body, +div, +span, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +abbr, +address, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +samp, +small, +strong, +sub, +sup, +var, +b, +i, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + outline: 0; + vertical-align: baseline; + background: transparent; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} + +nav ul { + list-style: none; +} + +blockquote, +q { + quotes: none; +} + +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ''; + content: none; +} + +a { + margin: 0; + padding: 0; + color: var(--color-primary); + text-decoration: none; + font-size: 100%; + vertical-align: baseline; + background: transparent; + cursor: pointer; + + &:active { + color: function.saturation( + --color-primary-h, + --color-primary-s, + --color-primary-l, + -(var.$button-active-shade-percent) + ); + } +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: var(--color-text-dark); + font-weight: inherit; + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } +} + +h4, +h5, +h6, +p { + font-size: inherit; +} + +p { + line-height: 1.8; + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } +} + +ins { + background-color: var(--color-success); + color: var(--color-text-dark); + text-decoration: none; +} + +mark { + background-color: var(--color-warning); + color: var(--color-text-dark); + font-style: italic; + font-weight: bold; +} + +del { + text-decoration: line-through; +} + +abbr[title], +dfn[title] { + border-bottom: 1px dotted; + cursor: help; +} + +hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid var(--color-foreground-light); + margin: 1em 0; + padding: 0; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +input, +select { + vertical-align: middle; +} diff --git a/packages/design-system/theme/src/row.scss b/packages/design-system/theme/src/row.scss new file mode 100644 index 0000000000..99b3035591 --- /dev/null +++ b/packages/design-system/theme/src/row.scss @@ -0,0 +1,37 @@ +@use "./common/var"; +@use "mixins/mixins"; +@use "mixins/utils"; + +@include mixins.b(row) { + position: relative; + box-sizing: border-box; + @include utils.utils-clearfix; + + @include mixins.m(flex) { + display: flex; + &:before, + &:after { + display: none; + } + + @include mixins.when(justify-center) { + justify-content: center; + } + @include mixins.when(justify-end) { + justify-content: flex-end; + } + @include mixins.when(justify-space-between) { + justify-content: space-between; + } + @include mixins.when(justify-space-around) { + justify-content: space-around; + } + + @include mixins.when(align-middle) { + align-items: center; + } + @include mixins.when(align-bottom) { + align-items: flex-end; + } + } +} diff --git a/packages/design-system/theme/src/scrollbar.scss b/packages/design-system/theme/src/scrollbar.scss new file mode 100644 index 0000000000..bd19aa6868 --- /dev/null +++ b/packages/design-system/theme/src/scrollbar.scss @@ -0,0 +1,72 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(scrollbar) { + overflow: hidden; + position: relative; + + &:hover, + &:active, + &:focus { + > .el-scrollbar__bar { + opacity: 1; + transition: opacity 340ms ease-out; + } + } + + @include mixins.e(wrap) { + overflow: scroll; + height: 100%; + + @include mixins.m(hidden-default) { + scrollbar-width: none; + &::-webkit-scrollbar { + width: 0; + height: 0; + } + } + } + + @include mixins.e(thumb) { + position: relative; + display: block; + width: 0; + height: 0; + cursor: pointer; + border-radius: inherit; + background-color: var.$scrollbar-background-color; + transition: 0.3s background-color; + + &:hover { + background-color: var.$scrollbar-hover-background-color; + } + } + + @include mixins.e(bar) { + position: absolute; + right: 2px; + bottom: 2px; + z-index: 1; + border-radius: 4px; + opacity: 0; + transition: opacity 120ms ease-out; + + @include mixins.when(vertical) { + width: 6px; + top: 2px; + + > div { + width: 100%; + } + } + + @include mixins.when(horizontal) { + height: 6px; + left: 2px; + + > div { + height: 100%; + } + } + } +} diff --git a/packages/design-system/theme/src/select-dropdown.scss b/packages/design-system/theme/src/select-dropdown.scss new file mode 100644 index 0000000000..6d2f370ad8 --- /dev/null +++ b/packages/design-system/theme/src/select-dropdown.scss @@ -0,0 +1,59 @@ +@use "mixins/mixins"; +@use "./common/var"; +@use "./popper"; + +@include mixins.b(select-dropdown) { + position: absolute; + z-index: #{var.$index-top + 1}; + border: var.$select-dropdown-border; + border-radius: var(--border-radius-base); + background-color: var.$select-dropdown-background; + box-shadow: var.$select-dropdown-shadow; + box-sizing: border-box; + margin: 5px 0; + + @include mixins.when(multiple) { + & .el-select-dropdown__item.selected { + color: var.$select-option-selected-font-color; + background-color: var.$select-dropdown-background; + + &.hover { + background-color: var.$select-option-hover-background; + } + + &::after { + position: absolute; + right: 20px; + font-family: 'element-icons'; + content: '\e6da'; + font-size: 12px; + font-weight: bold; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + } + } + + .el-scrollbar.is-empty .el-select-dropdown__list { + padding: 0; + } +} + +@include mixins.b(select-dropdown__empty) { + padding: var.$select-dropdown-empty-padding; + margin: 0; + text-align: center; + color: var.$select-dropdown-empty-color; + font-size: var.$select-font-size; +} + +@include mixins.b(select-dropdown__wrap) { + max-height: var.$select-dropdown-max-height; +} + +@include mixins.b(select-dropdown__list) { + list-style: none; + padding: var.$select-dropdown-padding; + margin: 0; + box-sizing: border-box; +} diff --git a/packages/design-system/theme/src/select.scss b/packages/design-system/theme/src/select.scss new file mode 100644 index 0000000000..b667c7eadc --- /dev/null +++ b/packages/design-system/theme/src/select.scss @@ -0,0 +1,158 @@ +@use "mixins/mixins"; +@use "mixins/utils"; +@use "./common/var"; +@use "select-dropdown"; +@use "input"; +@use "tag"; +@use "option"; +@use "option-group"; +@use "scrollbar"; + +@include mixins.b(select) { + display: inline-block; + position: relative; + width: 100%; + + .el-select__tags { + overflow-x: scroll; + } + + .el-select__tags > span { + display: contents; + } + + .el-select__tags + .el-input { + input { + box-sizing: content-box; + padding: 0; + text-indent: var(--spacing-xs); + width: calc(100% - 2px); + } + } + + .el-input__inner { + cursor: pointer; + padding-right: 35px; + + &:focus { + border-color: var.$select-input-focus-border-color; + } + } + + .el-input { + & .el-select__caret { + font-size: var.$select-input-font-size; + transition: transform 0.3s; + transform: rotateZ(180deg); + cursor: pointer; + + @include mixins.when(reverse) { + transform: rotateZ(0deg); + } + + @include mixins.when(show-close) { + font-size: var.$select-font-size; + text-align: center; + transform: rotateZ(180deg); + border-radius: var.$border-radius-circle; + color: var.$select-input-color; + transition: var.$color-transition-base; + + &:hover { + color: var.$select-close-hover-color; + } + } + } + + &.is-disabled { + & .el-input__inner { + cursor: not-allowed; + + &:hover { + border-color: var.$select-disabled-border; + } + } + } + + &.is-focus .el-input__inner { + border-color: var.$select-input-focus-border-color; + } + } + + > .el-input { + display: block; + } + + @include mixins.e(input) { + border: none; + outline: none; + padding: 0; + margin-left: 15px; + color: var.$select-multiple-input-color; + font-size: var.$select-font-size; + appearance: none; + height: 28px; + background-color: transparent; + @include mixins.when(mini) { + height: 14px; + } + } + + @include mixins.e(close) { + cursor: pointer; + position: absolute; + top: 8px; + z-index: var.$index-top; + right: 25px; + color: var.$select-input-color; + line-height: 18px; + font-size: var.$select-input-font-size; + + &:hover { + color: var.$select-close-hover-color; + } + } + + @include mixins.e(tags) { + position: absolute; + line-height: normal; + white-space: normal; + z-index: var.$index-normal; + top: 50%; + transform: translateY(-50%); + display: flex; + align-items: center; + flex-wrap: wrap; + } + + .el-tag__close { + margin-top: -2px; + } + + .el-tag { + box-sizing: border-box; + margin: 2px 0 2px 6px; + border-color: var(--color-foreground-base); + background-color: var(--color-foreground-base); + color: var(--color-text-dark); + border-radius: 20px; + font-weight: 400; + + &__close.el-icon-close { + background-color: var(--color-text-light); + right: -7px; + top: 0; + color: var.$color-white; + margin-right: 6px; + + &:hover { + background-color: var(--color-text-base); + } + + &::before { + display: block; + transform: translate(0, 0.5px); + } + } + } +} diff --git a/packages/design-system/theme/src/slider.scss b/packages/design-system/theme/src/slider.scss new file mode 100644 index 0000000000..3d1cc5e04d --- /dev/null +++ b/packages/design-system/theme/src/slider.scss @@ -0,0 +1,246 @@ +@use "mixins/mixins"; +@use "mixins/utils"; +@use "input-number"; +@use "tooltip"; +@use "./common/var"; + +@include mixins.b(slider) { + @include utils.utils-clearfix; + + @include mixins.e(runway) { + width: 100%; + height: var.$slider-height; + margin: var.$slider-margin; + background-color: var.$slider-runway-background-color; + border-radius: var.$slider-border-radius; + position: relative; + cursor: pointer; + vertical-align: middle; + + &.show-input { + margin-right: 160px; + width: auto; + } + + &.disabled { + cursor: default; + + .el-slider__bar { + background-color: var.$slider-disable-color; + } + + .el-slider__button { + border-color: var.$slider-disable-color; + } + + .el-slider__button-wrapper { + &:hover, + &.hover { + cursor: not-allowed; + } + + &.dragging { + cursor: not-allowed; + } + } + + .el-slider__button { + &:hover, + &.hover, + &.dragging { + transform: scale(1); + } + + &:hover, + &.hover { + cursor: not-allowed; + } + + &.dragging { + cursor: not-allowed; + } + } + } + } + + @include mixins.e(input) { + float: right; + margin-top: 3px; + width: 130px; + + &.el-input-number--mini { + margin-top: 5px; + } + + &.el-input-number--medium { + margin-top: 0; + } + + &.el-input-number--large { + margin-top: -2px; + } + } + + @include mixins.e(bar) { + height: var.$slider-height; + background-color: var.$slider-main-background-color; + border-top-left-radius: var.$slider-border-radius; + border-bottom-left-radius: var.$slider-border-radius; + position: absolute; + } + + @include mixins.e(button-wrapper) { + height: var.$slider-button-wrapper-size; + width: var.$slider-button-wrapper-size; + position: absolute; + z-index: 1001; + top: var.$slider-button-wrapper-offset; + transform: translateX(-50%); + background-color: transparent; + text-align: center; + user-select: none; + line-height: normal; + @include utils.utils-vertical-center; + + .el-tooltip { + vertical-align: middle; + display: inline-block; + } + + &:hover, + &.hover { + cursor: grab; + } + + &.dragging { + cursor: grabbing; + } + } + + @include mixins.e(button) { + width: var.$slider-button-size; + height: var.$slider-button-size; + border: solid 2px var.$slider-main-background-color; + background-color: var.$color-white; + border-radius: 50%; + transition: 0.2s; + user-select: none; + + &:hover, + &.hover, + &.dragging { + transform: scale(1.2); + } + + &:hover, + &.hover { + cursor: grab; + } + + &.dragging { + cursor: grabbing; + } + } + + @include mixins.e(stop) { + position: absolute; + height: var.$slider-height; + width: var.$slider-height; + border-radius: var.$border-radius-circle; + background-color: var.$slider-stop-background-color; + transform: translateX(-50%); + } + + @include mixins.e(marks) { + top: 0; + left: 12px; + width: 18px; + height: 100%; + + @include mixins.e(marks-text) { + position: absolute; + transform: translateX(-50%); + font-size: 14px; + color: var(--color-info); + margin-top: 15px; + } + } + + @include mixins.when(vertical) { + position: relative; + .el-slider__runway { + width: var.$slider-height; + height: 100%; + margin: 0 16px; + } + .el-slider__bar { + width: var.$slider-height; + height: auto; + border-radius: 0 0 3px 3px; + } + .el-slider__button-wrapper { + top: auto; + left: var.$slider-button-wrapper-offset; + transform: translateY(50%); + } + .el-slider__stop { + transform: translateY(50%); + } + &.el-slider--with-input { + padding-bottom: #{var.$input-medium-height + 22px}; + .el-slider__input { + overflow: visible; + float: none; + position: absolute; + bottom: 22px; + width: 36px; + margin-top: 15px; + .el-input__inner { + text-align: center; + padding-left: 5px; + padding-right: 5px; + } + .el-input-number__decrease, + .el-input-number__increase { + top: var.$input-small-height; + margin-top: -1px; + border: var.$input-border; + line-height: 20px; + box-sizing: border-box; + transition: var.$border-transition-base; + } + .el-input-number__decrease { + width: 18px; + right: 18px; + border-bottom-left-radius: var.$input-border-radius; + } + .el-input-number__increase { + width: 19px; + border-bottom-right-radius: var.$input-border-radius; + & ~ .el-input .el-input__inner { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + } + &:hover { + .el-input-number__decrease, + .el-input-number__increase { + border-color: var.$input-hover-border; + } + } + &:active { + .el-input-number__decrease, + .el-input-number__increase { + border-color: var.$input-focus-border; + } + } + } + } + + @include mixins.e(marks-text) { + margin-top: 0; + left: 15px; + transform: translateY(50%); + } + } +} diff --git a/packages/design-system/theme/src/spinner.scss b/packages/design-system/theme/src/spinner.scss new file mode 100644 index 0000000000..b5b8126805 --- /dev/null +++ b/packages/design-system/theme/src/spinner.scss @@ -0,0 +1,43 @@ +@use "mixins/mixins"; + +@include mixins.b(time-spinner) { + width: 100%; + white-space: nowrap; +} + +@include mixins.b(spinner) { + display: inline-block; + vertical-align: middle; +} +@include mixins.b(spinner-inner) { + animation: rotate 2s linear infinite; + width: 50px; + height: 50px; + + & .path { + stroke: #ececec; + stroke-linecap: round; + animation: dash 1.5s ease-in-out infinite; + } +} + +@keyframes rotate { + 100% { + transform: rotate(360deg); + } +} + +@keyframes dash { + 0% { + stroke-dasharray: 1, 150; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -35; + } + 100% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -124; + } +} diff --git a/packages/design-system/theme/src/step.scss b/packages/design-system/theme/src/step.scss new file mode 100644 index 0000000000..85e45c569b --- /dev/null +++ b/packages/design-system/theme/src/step.scss @@ -0,0 +1,316 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(step) { + position: relative; + flex-shrink: 1; + + @include mixins.pseudo(last-of-type) { + @include mixins.e(line) { + display: none; + } + + // 只有未设置 space 的情况下才自适应宽度 + @include mixins.when(flex) { + flex-basis: auto !important; + flex-shrink: 0; + flex-grow: 0; + } + + @include mixins.e((main, description)) { + padding-right: 0; + } + } + + @include mixins.e(head) { + position: relative; + width: 100%; + + @include mixins.when(process) { + color: var(--color-text-dark); + border-color: var(--color-text-dark); + } + + @include mixins.when(wait) { + color: var(--color-text-lighter); + border-color: var(--color-text-lighter); + } + + @include mixins.when(success) { + color: var(--color-success); + border-color: var(--color-success); + } + + @include mixins.when(error) { + color: var(--color-danger); + border-color: var(--color-danger); + } + + @include mixins.when(finish) { + color: var(--color-primary); + border-color: var(--color-primary); + } + } + + @include mixins.e(icon) { + position: relative; + z-index: 1; + display: inline-flex; + justify-content: center; + align-items: center; + width: 24px; + height: 24px; + font-size: 14px; + box-sizing: border-box; + background: var.$color-white; + transition: 0.15s ease-out; + + @include mixins.when(text) { + border-radius: 50%; + border: 2px solid; + border-color: inherit; + } + + @include mixins.when(icon) { + width: 40px; + } + } + + @include mixins.e(icon-inner) { + display: inline-block; + user-select: none; + text-align: center; + font-weight: bold; + line-height: 1; + color: inherit; + + &[class*='el-icon']:not(.is-status) { + font-size: 25px; + font-weight: normal; + } + + // 组件自身表示状态的图标 + @include mixins.when(status) { + transform: translateY(1px); + } + } + + @include mixins.e(line) { + position: absolute; + border-color: inherit; + background-color: var(--color-text-lighter); + } + + @include mixins.e(line-inner) { + display: block; + border-width: 1px; + border-style: solid; + border-color: inherit; + transition: 0.15s ease-out; + box-sizing: border-box; + width: 0; + height: 0; + } + + @include mixins.e(main) { + white-space: normal; + text-align: left; + } + + @include mixins.e(title) { + font-size: 16px; + line-height: 38px; + + @include mixins.when(process) { + font-weight: bold; + color: var(--color-text-dark); + } + + @include mixins.when(wait) { + color: var(--color-text-lighter); + } + + @include mixins.when(success) { + color: var(--color-success); + } + + @include mixins.when(error) { + color: var(--color-danger); + } + + @include mixins.when(finish) { + color: var(--color-primary); + } + } + + @include mixins.e(description) { + padding-right: 10%; + margin-top: -5px; + font-size: 12px; + line-height: 20px; + font-weight: normal; + + @include mixins.when(process) { + color: var(--color-text-dark); + } + + @include mixins.when(wait) { + color: var(--color-text-lighter); + } + + @include mixins.when(success) { + color: var(--color-success); + } + + @include mixins.when(error) { + color: var(--color-danger); + } + + @include mixins.when(finish) { + color: var(--color-primary); + } + } + + @include mixins.when(horizontal) { + display: inline-block; + + @include mixins.e(line) { + height: 2px; + top: 11px; + left: 0; + right: 0; + } + } + + @include mixins.when(vertical) { + display: flex; + + @include mixins.e(head) { + flex-grow: 0; + width: 24px; + } + + @include mixins.e(main) { + padding-left: 10px; + flex-grow: 1; + } + + @include mixins.e(title) { + line-height: 24px; + padding-bottom: 8px; + } + + @include mixins.e(line) { + width: 2px; + top: 0; + bottom: 0; + left: 11px; + } + + @include mixins.e(icon) { + @include mixins.when(icon) { + width: 24px; + } + } + } + + @include mixins.when(center) { + @include mixins.e(head) { + text-align: center; + } + + @include mixins.e(main) { + text-align: center; + } + + @include mixins.e(description) { + padding-left: 20%; + padding-right: 20%; + } + + @include mixins.e(line) { + left: 50%; + right: -50%; + } + } + + @include mixins.when(simple) { + display: flex; + align-items: center; + + @include mixins.e(head) { + width: auto; + font-size: 0; + padding-right: 10px; + } + + @include mixins.e(icon) { + background: transparent; + width: 16px; + height: 16px; + font-size: 12px; + } + + @include mixins.e(icon-inner) { + &[class*='el-icon']:not(.is-status) { + font-size: 18px; + } + + &.is-status { + transform: scale(0.8) translateY(1px); + } + } + + @include mixins.e(main) { + position: relative; + display: flex; + align-items: stretch; + flex-grow: 1; + } + + @include mixins.e(title) { + font-size: 16px; + line-height: 20px; + } + + @include mixins.pseudo('not(:last-of-type)') { + @include mixins.e(title) { + max-width: 50%; + word-break: break-all; + } + } + + @include mixins.e(arrow) { + flex-grow: 1; + display: flex; + align-items: center; + justify-content: center; + + &::before, + &::after { + content: ''; + display: inline-block; + position: absolute; + height: 15px; + width: 1px; + background: var(--color-text-lighter); + } + + &::before { + transform: rotate(-45deg) translateY(-4px); + transform-origin: 0 0; + } + + &::after { + transform: rotate(45deg) translateY(4px); + transform-origin: 100% 100%; + } + } + + @include mixins.pseudo(last-of-type) { + @include mixins.e(arrow) { + display: none; + } + } + } +} diff --git a/packages/design-system/theme/src/steps.scss b/packages/design-system/theme/src/steps.scss new file mode 100644 index 0000000000..70afd39409 --- /dev/null +++ b/packages/design-system/theme/src/steps.scss @@ -0,0 +1,21 @@ +@use "mixins/mixins"; +@use "common/var"; + +@include mixins.b(steps) { + display: flex; + + @include mixins.m(simple) { + padding: 13px 8%; + border-radius: 4px; + background: var.$background-color-base; + } + + @include mixins.m(horizontal) { + white-space: nowrap; + } + + @include mixins.m(vertical) { + height: 100%; + flex-flow: column; + } +} diff --git a/packages/design-system/theme/src/submenu.scss b/packages/design-system/theme/src/submenu.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/switch.scss b/packages/design-system/theme/src/switch.scss new file mode 100644 index 0000000000..b6d6429317 --- /dev/null +++ b/packages/design-system/theme/src/switch.scss @@ -0,0 +1,116 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(switch) { + display: inline-flex; + align-items: center; + position: relative; + font-size: var.$switch-font-size; + line-height: var.$switch-height; + height: var.$switch-height; + vertical-align: middle; + @include mixins.when(disabled) { + & .el-switch__core, + & .el-switch__label { + cursor: not-allowed; + } + } + + @include mixins.e(label) { + transition: 0.2s; + height: var.$switch-height; + display: inline-block; + font-size: var.$switch-font-size; + font-weight: 500; + cursor: pointer; + vertical-align: middle; + color: var(--color-text-dark); + + @include mixins.when(active) { + color: var(--color-primary); + } + + @include mixins.m(left) { + margin-right: 10px; + } + @include mixins.m(right) { + margin-left: 10px; + } + & * { + line-height: 1; + font-size: var.$switch-font-size; + display: inline-block; + } + } + + @include mixins.e(input) { + position: absolute; + width: 0; + height: 0; + opacity: 0; + margin: 0; + } + + @include mixins.e(core) { + margin: 0; + display: inline-block; + position: relative; + width: var.$switch-width; + height: var.$switch-height; + border: 1px solid var.$switch-off-color; + outline: none; + border-radius: var.$switch-core-border-radius; + box-sizing: border-box; + background: var.$switch-off-color; + cursor: pointer; + transition: border-color 0.1s, background-color 0.1s; + vertical-align: middle; + + &:after { + content: ''; + position: absolute; + top: 1px; + left: 1px; + border-radius: var.$border-radius-circle; + transition: all 0.1s; + width: var.$switch-button-size; + height: var.$switch-button-size; + background-color: var.$color-white; + } + } + + @include mixins.when(checked) { + .el-switch__core { + border-color: var.$switch-on-color; + background-color: var.$switch-on-color; + &::after { + left: 100%; + margin-left: -(var.$switch-button-size) - 1px; + } + } + } + + @include mixins.when(disabled) { + opacity: 0.6; + } + + @include mixins.m(wide) { + .el-switch__label { + &.el-switch__label--left { + span { + left: 10px; + } + } + &.el-switch__label--right { + span { + right: 10px; + } + } + } + } + + & .label-fade-enter, + & .label-fade-leave-active { + opacity: 0; + } +} diff --git a/packages/design-system/theme/src/tab-pane.scss b/packages/design-system/theme/src/tab-pane.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/design-system/theme/src/table-column.scss b/packages/design-system/theme/src/table-column.scss new file mode 100644 index 0000000000..1ca87502ef --- /dev/null +++ b/packages/design-system/theme/src/table-column.scss @@ -0,0 +1,97 @@ +@use "mixins/mixins"; +@use "checkbox"; +@use "tag"; +@use "./common/var"; + +@include mixins.b(table-column) { + @include mixins.m(selection) { + .cell { + padding-left: 14px; + padding-right: 14px; + } + } +} + +@include mixins.b(table-filter) { + border: solid 1px var(--border-color-light); + border-radius: 2px; + background-color: var.$color-white; + box-shadow: var.$dropdown-menu-box-shadow; + box-sizing: border-box; + margin: 2px 0; + + /** used for dropdown mode */ + @include mixins.e(list) { + padding: 5px 0; + margin: 0; + list-style: none; + min-width: 100px; + } + + @include mixins.e(list-item) { + line-height: 36px; + padding: 0 10px; + cursor: pointer; + font-size: var.$font-size-base; + + &:hover { + background-color: var.$dropdown-menuItem-hover-fill; + color: var.$dropdown-menuItem-hover-color; + } + + @include mixins.when(active) { + background-color: var(--color-primary); + color: var.$color-white; + } + } + + @include mixins.e(content) { + min-width: 100px; + } + + @include mixins.e(bottom) { + border-top: 1px solid var(--border-color-light); + padding: 8px; + + button { + background: transparent; + border: none; + color: var(--color-text-dark); + cursor: pointer; + font-size: var.$font-size-small; + padding: 0 3px; + + &:hover { + color: var(--color-primary); + } + + &:focus { + outline: none; + } + + &.is-disabled { + color: var.$disabled-color-base; + cursor: not-allowed; + } + } + } + + @include mixins.e(wrap) { + max-height: 280px; + } + + @include mixins.e(checkbox-group) { + padding: 10px; + + label.el-checkbox { + display: block; + margin-right: 5px; + margin-bottom: 8px; + margin-left: 5px; + } + + .el-checkbox:last-child { + margin-bottom: 0; + } + } +} diff --git a/packages/design-system/theme/src/table.scss b/packages/design-system/theme/src/table.scss new file mode 100644 index 0000000000..55f37a3d8d --- /dev/null +++ b/packages/design-system/theme/src/table.scss @@ -0,0 +1,572 @@ +@use "mixins/mixins"; +@use "checkbox"; +@use "tag"; +@use "tooltip"; +@use "./common/var"; + +@include mixins.b(table) { + position: relative; + overflow: hidden; + box-sizing: border-box; + flex: 1; + width: 100%; + max-width: 100%; + background-color: var.$color-white; + font-size: 14px; + color: var.$table-font-color; + + // 数据为空 + @include mixins.e(empty-block) { + min-height: 60px; + text-align: center; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + } + + @include mixins.e(empty-text) { + // min-height doesn't work in IE10 and IE11 https://github.com/philipwalton/flexbugs#3-min-height-on-a-flex-container-wont-apply-to-its-flex-items + // set empty text line height up to contrainer min-height as workaround. + line-height: 60px; + width: 50%; + color: var(--color-text-light); + } + + // 展开行 + @include mixins.e(expand-column) { + .cell { + padding: 0; + text-align: center; + } + } + + @include mixins.e(expand-icon) { + position: relative; + cursor: pointer; + color: #666; + font-size: 12px; + transition: transform 0.2s ease-in-out; + height: 20px; + + @include mixins.m(expanded) { + transform: rotate(90deg); + } + + > .el-icon { + position: absolute; + left: 50%; + top: 50%; + margin-left: -5px; + margin-top: -5px; + } + } + + @include mixins.e(expanded-cell) { + background-color: var.$color-white; + + // 纯属为了增加权重 + &[class*='cell'] { + padding: 20px 50px; + } + + &:hover { + background-color: transparent !important; + } + } + + @include mixins.e(placeholder) { + display: inline-block; + width: 20px; + } + + @include mixins.e(append-wrapper) { + // 避免外边距重合 https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Box_Model/Mastering_margin_collapsing + overflow: hidden; + } + + @include mixins.m(fit) { + border-right: 0; + border-bottom: 0; + + th.gutter, + td.gutter { + border-right-width: 1px; + } + } + + @include mixins.m(scrollable-x) { + .el-table__body-wrapper { + overflow-x: auto; + } + } + + @include mixins.m(scrollable-y) { + .el-table__body-wrapper { + overflow-y: auto; + } + } + + thead { + color: var.$table-header-font-color; + font-weight: 500; + + &.is-group { + th { + background: var.$background-color-base; + } + } + } + + th, + td { + padding: 12px 0; + min-width: 0; + box-sizing: border-box; + text-overflow: ellipsis; + vertical-align: middle; + position: relative; + text-align: left; + + @include mixins.when(center) { + text-align: center; + } + + @include mixins.when(right) { + text-align: right; + } + + &.gutter { + width: 15px; + border-right-width: 0; + border-bottom-width: 0; + padding: 0; + } + + &.is-hidden { + > * { + visibility: hidden; + } + } + } + + @include mixins.m(medium) { + th, + td { + padding: 10px 0; + } + } + + @include mixins.m(small) { + font-size: 12px; + th, + td { + padding: 8px 0; + } + } + + @include mixins.m(mini) { + font-size: 12px; + th, + td { + padding: 6px 0; + } + } + + tr { + background-color: var.$color-white; + + input[type='checkbox'] { + margin: 0; + } + } + + th.is-leaf, + td { + border-bottom: var.$table-border; + } + + th.is-sortable { + cursor: pointer; + } + + th { + overflow: hidden; + user-select: none; + background-color: var.$table-header-background-color; + + > .cell { + display: inline-block; + box-sizing: border-box; + position: relative; + vertical-align: middle; + padding-left: 10px; + padding-right: 10px; + width: 100%; + + &.highlight { + color: var(--color-primary); + } + } + + &.required > div::before { + display: inline-block; + content: ''; + width: 8px; + height: 8px; + border-radius: 50%; + background: #ff4d51; + margin-right: 5px; + vertical-align: middle; + } + } + + td { + div { + box-sizing: border-box; + } + + &.gutter { + width: 0; + } + } + + .cell { + box-sizing: border-box; + overflow: hidden; + text-overflow: ellipsis; + white-space: normal; + word-break: break-all; + line-height: 23px; + padding-left: 10px; + padding-right: 10px; + + &.el-tooltip { + white-space: nowrap; + min-width: 50px; + } + } + + // 拥有多级表头 + @include mixins.m((group, border)) { + border: var.$table-border; + + @include mixins.share-rule(border-pseudo) { + content: ''; + position: absolute; + background-color: var.$table-border-color; + z-index: 1; + } + + // 表格右部伪 border + &::after { + @include mixins.extend-rule(border-pseudo); + top: 0; + right: 0; + width: 1px; + height: 100%; + } + } + + // 表格底部伪 border,总是有的 + &::before { + @include mixins.extend-rule(border-pseudo); + left: 0; + bottom: 0; + width: 100%; + height: 1px; + } + + // table--border + @include mixins.m(border) { + border-right: none; + border-bottom: none; + + &.el-loading-parent--relative { + border-color: transparent; + } + + th, + td { + border-right: var.$table-border; + + &:first-child .cell { + padding-left: 10px; + } + } + + th.gutter:last-of-type { + border-bottom: var.$table-border; + border-bottom-width: 1px; + } + + & th { + border-bottom: var.$table-border; + } + } + + @include mixins.m(hidden) { + visibility: hidden; + } + + @include mixins.e((fixed, fixed-right)) { + position: absolute; + top: 0; + left: 0; + overflow-x: hidden; + overflow-y: hidden; + box-shadow: var.$table-fixed-box-shadow; + + &::before { + content: ''; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 1px; + background-color: var(--border-color-light); + z-index: 4; + } + } + + @include mixins.e(fixed-right-patch) { + position: absolute; + top: -1px; + right: 0; + background-color: var.$color-white; + border-bottom: var.$table-border; + } + + @include mixins.e(fixed-right) { + top: 0; + left: auto; + right: 0; + + .el-table__fixed-header-wrapper, + .el-table__fixed-body-wrapper, + .el-table__fixed-footer-wrapper { + left: auto; + right: 0; + } + } + + @include mixins.e(fixed-header-wrapper) { + position: absolute; + left: 0; + top: 0; + z-index: 3; + } + + @include mixins.e(fixed-footer-wrapper) { + position: absolute; + left: 0; + bottom: 0; + z-index: 3; + + & tbody td { + border-top: var.$table-border; + background-color: var.$table-row-hover-background-color; + color: var.$table-font-color; + } + } + + @include mixins.e(fixed-body-wrapper) { + position: absolute; + left: 0; + top: 37px; + overflow: hidden; + z-index: 3; + } + + @include mixins.e((header-wrapper, body-wrapper, footer-wrapper)) { + width: 100%; + } + + @include mixins.e(footer-wrapper) { + margin-top: -1px; + td { + border-top: var.$table-border; + } + } + + @include mixins.e((header, body, footer)) { + table-layout: fixed; + border-collapse: separate; + } + + @include mixins.e((header-wrapper, footer-wrapper)) { + overflow: hidden; + + & tbody td { + background-color: var.$table-row-hover-background-color; + color: var.$table-font-color; + } + } + + @include mixins.e(body-wrapper) { + overflow: hidden; + position: relative; + + @include mixins.when(scrolling-none) { + ~ .el-table__fixed, + ~ .el-table__fixed-right { + box-shadow: none; + } + } + + @include mixins.when(scrolling-left) { + ~ .el-table__fixed { + box-shadow: none; + } + } + + @include mixins.when(scrolling-right) { + ~ .el-table__fixed-right { + box-shadow: none; + } + } + + .el-table--border { + @include mixins.when(scrolling-right) { + ~ .el-table__fixed-right { + border-left: var.$table-border; + } + } + + @include mixins.when(scrolling-left) { + ~ .el-table__fixed { + border-right: var.$table-border; + } + } + } + } + + .caret-wrapper { + display: inline-flex; + flex-direction: column; + align-items: center; + height: 34px; + width: 24px; + vertical-align: middle; + cursor: pointer; + overflow: initial; + position: relative; + } + + .sort-caret { + width: 0; + height: 0; + border: solid 5px transparent; + position: absolute; + left: 7px; + + &.ascending { + border-bottom-color: var(--color-text-lighter); + top: 5px; + } + + &.descending { + border-top-color: var(--color-text-lighter); + bottom: 7px; + } + } + + .ascending .sort-caret.ascending { + border-bottom-color: var(--color-primary); + } + + .descending .sort-caret.descending { + border-top-color: var(--color-primary); + } + + .hidden-columns { + visibility: hidden; + position: absolute; + z-index: -1; + } + + @include mixins.m(striped) { + & .el-table__body { + & tr.el-table__row--striped { + td { + background: #fafafa; + } + + &.current-row td { + background-color: var.$table-current-row-background-color; + } + } + } + } + + @include mixins.e(body) { + tr.hover-row { + &, + &.el-table__row--striped { + &, + &.current-row { + > td { + background-color: var.$table-row-hover-background-color; + } + } + } + } + + tr.current-row > td { + background-color: var.$table-current-row-background-color; + } + } + + @include mixins.e(column-resize-proxy) { + position: absolute; + left: 200px; + top: 0; + bottom: 0; + width: 0; + border-left: var.$table-border; + z-index: 10; + } + + @include mixins.e(column-filter-trigger) { + display: inline-block; + line-height: 34px; + cursor: pointer; + + & i { + color: var(--color-info); + font-size: 12px; + transform: scale(0.75); + } + } + + @include mixins.m(enable-row-transition) { + .el-table__body td { + transition: background-color 0.25s ease; + } + } + + @include mixins.m(enable-row-hover) { + .el-table__body tr:hover > td { + background-color: var.$table-row-hover-background-color; + } + } + + @include mixins.m(fluid-height) { + .el-table__fixed, + .el-table__fixed-right { + bottom: 0; + overflow: hidden; + } + } + + [class*='el-table__row--level'] { + .el-table__expand-icon { + display: inline-block; + width: 20px; + line-height: 20px; + height: 20px; + text-align: center; + margin-right: 3px; + } + } +} diff --git a/packages/design-system/theme/src/tabs.scss b/packages/design-system/theme/src/tabs.scss new file mode 100644 index 0000000000..47adcd305b --- /dev/null +++ b/packages/design-system/theme/src/tabs.scss @@ -0,0 +1,606 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(tabs) { + @include mixins.e(header) { + padding: 0; + position: relative; + margin: 0 0 15px; + } + @include mixins.e(active-bar) { + position: absolute; + bottom: 0; + left: 0; + height: 2px; + background-color: var(--color-primary); + z-index: 1; + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + list-style: none; + } + @include mixins.e(new-tab) { + float: right; + border: 1px solid #d3dce6; + height: 18px; + width: 18px; + line-height: 18px; + margin: 12px 0 9px 10px; + border-radius: 3px; + text-align: center; + font-size: 12px; + color: #d3dce6; + cursor: pointer; + transition: all 0.15s; + + .el-icon-plus { + transform: scale(0.8, 0.8); + } + + &:hover { + color: var(--color-primary); + } + } + @include mixins.e(nav-wrap) { + overflow: hidden; + margin-bottom: -1px; + position: relative; + + &::after { + content: ''; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 2px; + background-color: var(--border-color-base); + z-index: var.$index-normal; + } + + @include mixins.when(scrollable) { + padding: 0 20px; + box-sizing: border-box; + } + } + @include mixins.e(nav-scroll) { + overflow: hidden; + } + @include mixins.e((nav-next, nav-prev)) { + position: absolute; + cursor: pointer; + line-height: 44px; + font-size: 12px; + color: var(--color-text-light); + } + @include mixins.e(nav-next) { + right: 0; + } + @include mixins.e(nav-prev) { + left: 0; + } + @include mixins.e(nav) { + white-space: nowrap; + position: relative; + transition: transform 0.3s; + float: left; + z-index: #{var.$index-normal + 1}; + + @include mixins.when(stretch) { + min-width: 100%; + display: flex; + & > * { + flex: 1; + text-align: center; + } + } + } + @include mixins.e(item) { + padding: 0 20px; + height: 40px; + box-sizing: border-box; + line-height: 40px; + display: inline-block; + list-style: none; + font-size: 14px; + font-weight: 500; + color: var(--color-text-dark); + position: relative; + + &:focus, + &:focus:active { + outline: none; + } + + &:focus.is-active.is-focus:not(:active) { + box-shadow: 0 0 2px 2px var(--color-primary) inset; + border-radius: 3px; + } + + & .el-icon-close { + border-radius: 50%; + text-align: center; + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + margin-left: 5px; + &:before { + transform: scale(0.9); + display: inline-block; + } + + &:hover { + background-color: var(--color-text-lighter); + color: var.$color-white; + } + } + + @include mixins.when(active) { + color: var(--color-primary); + } + + &:hover { + color: var(--color-primary); + cursor: pointer; + } + + @include mixins.when(disabled) { + color: var.$disabled-color-base; + cursor: default; + } + } + @include mixins.e(content) { + overflow: hidden; + position: relative; + } + @include mixins.m(card) { + > .el-tabs__header { + border-bottom: 1px solid var(--border-color-base); + } + > .el-tabs__header .el-tabs__nav-wrap::after { + content: none; + } + > .el-tabs__header .el-tabs__nav { + border: 1px solid var(--border-color-base); + border-bottom: none; + border-radius: 4px 4px 0 0; + box-sizing: border-box; + } + > .el-tabs__header .el-tabs__active-bar { + display: none; + } + > .el-tabs__header .el-tabs__item .el-icon-close { + position: relative; + font-size: 12px; + width: 0; + height: 14px; + vertical-align: middle; + line-height: 15px; + overflow: hidden; + top: -1px; + right: -2px; + transform-origin: 100% 50%; + } + > .el-tabs__header .el-tabs__item { + border-bottom: 1px solid transparent; + border-left: 1px solid var(--border-color-base); + transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), + padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + &:first-child { + border-left: none; + } + &.is-closable { + &:hover { + padding-left: 13px; + padding-right: 13px; + + & .el-icon-close { + width: 14px; + } + } + } + &.is-active { + border-bottom-color: var.$color-white; + + &.is-closable { + padding-left: 20px; + padding-right: 20px; + + .el-icon-close { + width: 14px; + } + } + } + } + } + @include mixins.m(border-card) { + background: var.$color-white; + border: 1px solid var(--border-color-base); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04); + + > .el-tabs__content { + padding: 15px; + } + > .el-tabs__header { + background-color: var.$background-color-base; + border-bottom: 1px solid var(--border-color-base); + margin: 0; + } + > .el-tabs__header .el-tabs__nav-wrap::after { + content: none; + } + > .el-tabs__header .el-tabs__item { + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + border: 1px solid transparent; + margin-top: -1px; + color: var(--color-text-light); + + &:first-child { + margin-left: -1px; + } + + & + .el-tabs__item { + margin-left: -1px; + } + + &.is-active { + color: var(--color-primary); + background-color: var.$color-white; + border-right-color: var(--border-color-base); + border-left-color: var(--border-color-base); + } + &:not(.is-disabled):hover { + color: var(--color-primary); + } + &.is-disabled { + color: var.$disabled-color-base; + } + } + + > .el-tabs__header .is-scrollable .el-tabs__item:first-child { + margin-left: 0; + } + } + @include mixins.m((top, bottom)) { + .el-tabs__item.is-top:nth-child(2), + .el-tabs__item.is-bottom:nth-child(2) { + padding-left: 0; + } + .el-tabs__item.is-top:last-child, + .el-tabs__item.is-bottom:last-child { + padding-right: 0; + } + + &.el-tabs--border-card, + &.el-tabs--card, + .el-tabs--left, + .el-tabs--right { + > .el-tabs__header { + .el-tabs__item:nth-child(2) { + padding-left: 20px; + } + .el-tabs__item:last-child { + padding-right: 20px; + } + } + } + } + @include mixins.m(bottom) { + .el-tabs__header.is-bottom { + margin-bottom: 0; + margin-top: 10px; + } + &.el-tabs--border-card { + .el-tabs__header.is-bottom { + border-bottom: 0; + border-top: 1px solid var(--border-color-base); + } + .el-tabs__nav-wrap.is-bottom { + margin-top: -1px; + margin-bottom: 0; + } + .el-tabs__item.is-bottom:not(.is-active) { + border: 1px solid transparent; + } + .el-tabs__item.is-bottom { + margin: 0 -1px -1px -1px; + } + } + } + @include mixins.m((left, right)) { + overflow: hidden; + + .el-tabs__header.is-left, + .el-tabs__header.is-right, + .el-tabs__nav-wrap.is-left, + .el-tabs__nav-wrap.is-right, + .el-tabs__nav-scroll { + height: 100%; + } + + .el-tabs__active-bar.is-left, + .el-tabs__active-bar.is-right { + top: 0; + bottom: auto; + width: 2px; + height: auto; + } + + .el-tabs__nav-wrap.is-left, + .el-tabs__nav-wrap.is-right { + margin-bottom: 0; + + > .el-tabs__nav-prev, + > .el-tabs__nav-next { + height: 30px; + line-height: 30px; + width: 100%; + text-align: center; + cursor: pointer; + + i { + transform: rotateZ(90deg); + } + } + > .el-tabs__nav-prev { + left: auto; + top: 0; + } + > .el-tabs__nav-next { + right: auto; + bottom: 0; + } + + &.is-scrollable { + padding: 30px 0; + } + + &::after { + height: 100%; + width: 2px; + bottom: auto; + top: 0; + } + } + + .el-tabs__nav.is-left, + .el-tabs__nav.is-right { + float: none; + } + .el-tabs__item.is-left, + .el-tabs__item.is-right { + display: block; + } + } + @include mixins.m(left) { + .el-tabs__header.is-left { + float: left; + margin-bottom: 0; + margin-right: 10px; + } + .el-tabs__nav-wrap.is-left { + margin-right: -1px; + &::after { + left: auto; + right: 0; + } + } + .el-tabs__active-bar.is-left { + right: 0; + left: auto; + } + .el-tabs__item.is-left { + text-align: right; + } + + &.el-tabs--card { + .el-tabs__active-bar.is-left { + display: none; + } + .el-tabs__item.is-left { + border-left: none; + border-right: 1px solid var(--border-color-base); + border-bottom: none; + border-top: 1px solid var(--border-color-base); + text-align: left; + } + .el-tabs__item.is-left:first-child { + border-right: 1px solid var(--border-color-base); + border-top: none; + } + .el-tabs__item.is-left.is-active { + border: 1px solid var(--border-color-base); + border-right-color: #fff; + border-left: none; + border-bottom: none; + + &:first-child { + border-top: none; + } + &:last-child { + border-bottom: none; + } + } + + .el-tabs__nav { + border-radius: 4px 0 0 4px; + border-bottom: 1px solid var(--border-color-base); + border-right: none; + } + + .el-tabs__new-tab { + float: none; + } + } + + &.el-tabs--border-card { + .el-tabs__header.is-left { + border-right: 1px solid #dfe4ed; + } + .el-tabs__item.is-left { + border: 1px solid transparent; + margin: -1px 0 -1px -1px; + + &.is-active { + border-color: transparent; + border-top-color: rgb(209, 219, 229); + border-bottom-color: rgb(209, 219, 229); + } + } + } + } + @include mixins.m(right) { + .el-tabs__header.is-right { + float: right; + margin-bottom: 0; + margin-left: 10px; + } + + .el-tabs__nav-wrap.is-right { + margin-left: -1px; + &::after { + left: 0; + right: auto; + } + } + + .el-tabs__active-bar.is-right { + left: 0; + } + + &.el-tabs--card { + .el-tabs__active-bar.is-right { + display: none; + } + .el-tabs__item.is-right { + border-bottom: none; + border-top: 1px solid var(--border-color-base); + } + .el-tabs__item.is-right:first-child { + border-left: 1px solid var(--border-color-base); + border-top: none; + } + .el-tabs__item.is-right.is-active { + border: 1px solid var(--border-color-base); + border-left-color: #fff; + border-right: none; + border-bottom: none; + + &:first-child { + border-top: none; + } + &:last-child { + border-bottom: none; + } + } + + .el-tabs__nav { + border-radius: 0 4px 4px 0; + border-bottom: 1px solid var(--border-color-base); + border-left: none; + } + } + &.el-tabs--border-card { + .el-tabs__header.is-right { + border-left: 1px solid #dfe4ed; + } + .el-tabs__item.is-right { + border: 1px solid transparent; + margin: -1px -1px -1px 0; + + &.is-active { + border-color: transparent; + border-top-color: rgb(209, 219, 229); + border-bottom-color: rgb(209, 219, 229); + } + } + } + } +} + +.slideInRight-transition, +.slideInLeft-transition { + display: inline-block; +} +.slideInRight-enter { + animation: slideInRight-enter 0.3s; +} +.slideInRight-leave { + position: absolute; + left: 0; + right: 0; + animation: slideInRight-leave 0.3s; +} +.slideInLeft-enter { + animation: slideInLeft-enter 0.3s; +} +.slideInLeft-leave { + position: absolute; + left: 0; + right: 0; + animation: slideInLeft-leave 0.3s; +} + +@keyframes slideInRight-enter { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } + + to { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes slideInRight-leave { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + opacity: 0; + } +} +@keyframes slideInLeft-enter { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + } + + to { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes slideInLeft-leave { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + opacity: 0; + } +} diff --git a/packages/design-system/theme/src/tag.scss b/packages/design-system/theme/src/tag.scss new file mode 100644 index 0000000000..2a2a81893e --- /dev/null +++ b/packages/design-system/theme/src/tag.scss @@ -0,0 +1,163 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@mixin genTheme() { + background-color: var.$color-primary-lighter; + border-color: var.$color-primary-light-5; + color: var.$color-primary-light-1; + + @include mixins.when(hit) { + border-color: var.$tag-primary-color; + } + + .el-tag__close { + color: var.$color-primary-light-1; + &:hover { + color: var.$color-white; + background-color: var.$color-primary-light-1; + } + } + + &.el-tag--info { + background-color: var.$color-info-lighter; + border-color: var.$color-info-light-5; + color: var.$color-info-light-3; + + @include mixins.when(hit) { + border-color: var.$tag-info-color; + } + + .el-tag__close { + color: var.$color-info-light-1; + &:hover { + color: var.$color-white; + background-color: var.$color-info-light-1; + } + } + } + + &.el-tag--success { + background-color: var.$color-success-lighter; + border-color: var.$color-success-light-5; + color: var.$color-success-light-3; + + @include mixins.when(hit) { + border-color: var.$tag-success-color; + } + + .el-tag__close { + color: var.$color-success-light-1; + &:hover { + color: var.$color-white; + background-color: var.$color-success-light-1; + } + } + } + + &.el-tag--warning { + background-color: var.$color-warning-lighter; + border-color: var.$color-warning-light-5; + color: var.$color-warning-light-3; + + @include mixins.when(hit) { + border-color: var.$tag-warning-color; + } + + .el-tag__close { + color: var.$color-warning-light-1; + &:hover { + color: var.$color-white; + background-color: var.$color-warning-light-1; + } + } + } + + &.el-tag--danger { + background-color: var.$color-danger-lighter; + border-color: var.$color-danger-light-5; + color: var.$color-danger-light-3; + + @include mixins.when(hit) { + border-color: var.$tag-danger-color; + } + + .el-tag__close { + color: var.$color-danger-light-1; + &:hover { + color: var.$color-white; + background-color: var.$color-danger-light-1; + } + } + } +} + +@include mixins.b(tag) { + @include genTheme(); + display: inline-block; + height: 32px; + padding: var.$tag-padding; + line-height: 30px; + font-size: var.$tag-font-size; + color: var.$tag-primary-color; + border-width: 1px; + border-style: solid; + border-radius: var.$tag-border-radius; + box-sizing: border-box; + white-space: nowrap; + + .el-icon-close { + border-radius: 50%; + text-align: center; + position: relative; + cursor: pointer; + font-size: 12px; + height: 16px; + width: 16px; + line-height: 16px; + vertical-align: middle; + top: -1px; + right: -5px; + + &::before { + display: block; + } + } + + @include mixins.m(dark) { + @include genTheme(); + } + + @include mixins.m(plain) { + @include genTheme(); + } + + @include mixins.m(medium) { + height: 28px; + line-height: 26px; + + .el-icon-close { + transform: scale(0.8); + } + } + + @include mixins.m(small) { + height: 24px; + padding: 0 8px; + line-height: 22px; + + .el-icon-close { + transform: scale(0.8); + } + } + + @include mixins.m(mini) { + height: 20px; + padding: 0 5px; + line-height: 18px; + + .el-icon-close { + margin-left: -3px; + transform: scale(0.7); + } + } +} diff --git a/packages/design-system/theme/src/time-picker.scss b/packages/design-system/theme/src/time-picker.scss new file mode 100644 index 0000000000..de273215de --- /dev/null +++ b/packages/design-system/theme/src/time-picker.scss @@ -0,0 +1,8 @@ +@use "./date-picker/picker.scss"; +@use "./date-picker/picker-panel.scss"; +@use "./date-picker/time-spinner.scss"; +@use "./date-picker/time-picker.scss"; +@use "./date-picker/time-range-picker.scss"; +@use "./input.scss"; +@use "./scrollbar.scss"; +@use "./popper"; diff --git a/packages/design-system/theme/src/time-select.scss b/packages/design-system/theme/src/time-select.scss new file mode 100644 index 0000000000..8f4f239218 --- /dev/null +++ b/packages/design-system/theme/src/time-select.scss @@ -0,0 +1,37 @@ +@use "./common/var"; +@use "./date-picker/picker.scss"; +@use "./date-picker/date-picker.scss"; +@use "./scrollbar.scss"; +@use "./popper"; + +.time-select { + margin: 5px 0; + min-width: 0; +} + +.time-select .el-picker-panel__content { + max-height: 200px; + margin: 0; +} + +.time-select-item { + padding: 8px 10px; + font-size: 14px; + line-height: 20px; +} + +.time-select-item.selected:not(.disabled) { + color: var(--color-primary); + font-weight: bold; +} + +.time-select-item.disabled { + color: var.$datepicker-border-color; + cursor: not-allowed; +} + +.time-select-item:hover { + background-color: var.$background-color-base; + font-weight: bold; + cursor: pointer; +} diff --git a/packages/design-system/theme/src/timeline-item.scss b/packages/design-system/theme/src/timeline-item.scss new file mode 100644 index 0000000000..3e83bf6361 --- /dev/null +++ b/packages/design-system/theme/src/timeline-item.scss @@ -0,0 +1,86 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(timeline-item) { + position: relative; + padding-bottom: 20px; + + @include mixins.e(wrapper) { + position: relative; + padding-left: 28px; + top: -3px; + } + + @include mixins.e(tail) { + position: absolute; + left: 4px; + height: 100%; + border-left: 2px solid var.$timeline-node-color; + } + + @include mixins.e(icon) { + color: var.$color-white; + font-size: var.$font-size-small; + } + + @include mixins.e(node) { + position: absolute; + background-color: var.$timeline-node-color; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + + @include mixins.m(normal) { + left: -1px; + width: var.$timeline-node-size-normal; + height: var.$timeline-node-size-normal; + } + @include mixins.m(large) { + left: -2px; + width: var.$timeline-node-size-large; + height: var.$timeline-node-size-large; + } + + @include mixins.m(primary) { + background-color: var(--color-primary); + } + @include mixins.m(success) { + background-color: var(--color-success); + } + @include mixins.m(warning) { + background-color: var(--color-warning); + } + @include mixins.m(danger) { + background-color: var(--color-danger); + } + @include mixins.m(info) { + background-color: var(--color-info); + } + } + + @include mixins.e(dot) { + position: absolute; + display: flex; + justify-content: center; + align-items: center; + } + + @include mixins.e(content) { + color: var(--color-text-dark); + } + + @include mixins.e(timestamp) { + color: var(--color-text-light); + line-height: 1; + font-size: var.$font-size-small; + + @include mixins.when(top) { + margin-bottom: 8px; + padding-top: 4px; + } + @include mixins.when(bottom) { + margin-top: 8px; + } + } +} diff --git a/packages/design-system/theme/src/timeline.scss b/packages/design-system/theme/src/timeline.scss new file mode 100644 index 0000000000..635d7038da --- /dev/null +++ b/packages/design-system/theme/src/timeline.scss @@ -0,0 +1,14 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(timeline) { + margin: 0; + font-size: var.$font-size-base; + list-style: none; + + & .el-timeline-item:last-child { + & .el-timeline-item__tail { + display: none; + } + } +} diff --git a/packages/design-system/theme/src/tooltip.scss b/packages/design-system/theme/src/tooltip.scss new file mode 100644 index 0000000000..cbcc3c7c08 --- /dev/null +++ b/packages/design-system/theme/src/tooltip.scss @@ -0,0 +1,147 @@ +@use "mixins/mixins"; +@use "./common/var"; + +@include mixins.b(tooltip) { + &:focus:not(.focusing), + &:focus:hover { + outline-width: 0; + } + + a { + font-weight: var(--font-weight-bold); + } + + @include mixins.e(popper) { + position: absolute; + border-radius: 4px; + padding: var.$tooltip-padding; + z-index: var.$index-popper; + font-size: var.$tooltip-font-size; + line-height: 1.2; + min-width: 10px; + word-wrap: break-word; + + .popper__arrow, + .popper__arrow::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } + + .popper__arrow { + border-width: var.$tooltip-arrow-size; + } + + .popper__arrow::after { + content: ' '; + border-width: 5px; + } + + &[x-placement^='top'] { + margin-bottom: #{var.$tooltip-arrow-size + 6px}; + } + + &[x-placement^='top'] .popper__arrow { + bottom: -(var.$tooltip-arrow-size); + border-top-color: var.$tooltip-border-color; + border-bottom-width: 0; + + &::after { + bottom: 1px; + margin-left: -5px; + border-top-color: var.$tooltip-fill; + border-bottom-width: 0; + } + } + + &[x-placement^='bottom'] { + margin-top: #{var.$tooltip-arrow-size + 6px}; + } + + &[x-placement^='bottom'] .popper__arrow { + top: -(var.$tooltip-arrow-size); + border-top-width: 0; + border-bottom-color: var.$tooltip-border-color; + + &::after { + top: 1px; + margin-left: -5px; + border-top-width: 0; + border-bottom-color: var.$tooltip-fill; + } + } + + &[x-placement^='right'] { + margin-left: #{var.$tooltip-arrow-size + 6px}; + } + + &[x-placement^='right'] .popper__arrow { + left: -(var.$tooltip-arrow-size); + border-right-color: var.$tooltip-border-color; + border-left-width: 0; + + &::after { + bottom: -5px; + left: 1px; + border-right-color: var.$tooltip-fill; + border-left-width: 0; + } + } + + &[x-placement^='left'] { + margin-right: #{var.$tooltip-arrow-size + 6px}; + } + + &[x-placement^='left'] .popper__arrow { + right: -(var.$tooltip-arrow-size); + border-right-width: 0; + border-left-color: var.$tooltip-border-color; + + &::after { + right: 1px; + bottom: -5px; + margin-left: -5px; + border-right-width: 0; + border-left-color: var.$tooltip-fill; + } + } + + @include mixins.when(dark) { + background: var.$tooltip-fill; + color: var.$tooltip-color; + } + + @include mixins.when(light) { + background: var.$tooltip-color; + border: 1px solid var.$tooltip-fill; + + &[x-placement^='top'] .popper__arrow { + border-top-color: var.$tooltip-fill; + &::after { + border-top-color: var.$tooltip-color; + } + } + &[x-placement^='bottom'] .popper__arrow { + border-bottom-color: var.$tooltip-fill; + &::after { + border-bottom-color: var.$tooltip-color; + } + } + &[x-placement^='left'] .popper__arrow { + border-left-color: var.$tooltip-fill; + &::after { + border-left-color: var.$tooltip-color; + } + } + &[x-placement^='right'] .popper__arrow { + border-right-color: var.$tooltip-fill; + &::after { + border-right-color: var.$tooltip-color; + } + } + } + } +} diff --git a/packages/design-system/theme/src/transfer.scss b/packages/design-system/theme/src/transfer.scss new file mode 100644 index 0000000000..28d6037953 --- /dev/null +++ b/packages/design-system/theme/src/transfer.scss @@ -0,0 +1,229 @@ +@use "mixins/mixins"; +@use "mixins/utils"; +@use "./common/var"; +@use "input"; +@use "button"; +@use "checkbox"; +@use "checkbox-group"; + +@include mixins.b(transfer) { + font-size: var.$font-size-base; + + @include mixins.e(buttons) { + display: inline-block; + vertical-align: middle; + padding: 0 30px; + } + + @include mixins.e(button) { + display: block; + margin: 0 auto; + padding: 10px; + border-radius: 50%; + color: var.$color-white; + background-color: var(--color-primary); + font-size: 0; + + @include mixins.when(with-texts) { + border-radius: var(--border-radius-base); + } + + @include mixins.when(disabled) { + border: var(--border-base); + background-color: var.$background-color-base; + color: var(--color-text-lighter); + + &:hover { + border: var(--border-base); + background-color: var.$background-color-base; + color: var(--color-text-lighter); + } + } + + &:first-child { + margin-bottom: 10px; + } + + &:nth-child(2) { + margin: 0; + } + + i, + span { + font-size: 14px; + } + + & [class*='el-icon-'] + span { + margin-left: 0; + } + } +} + +@include mixins.b(transfer-panel) { + border: 1px solid var.$transfer-border-color; + border-radius: var.$transfer-border-radius; + overflow: hidden; + background: var.$color-white; + display: inline-block; + vertical-align: middle; + width: var.$transfer-panel-width; + max-height: 100%; + box-sizing: border-box; + position: relative; + + @include mixins.e(body) { + height: var.$transfer-panel-body-height; + + @include mixins.when(with-footer) { + padding-bottom: var.$transfer-panel-footer-height; + } + } + + @include mixins.e(list) { + margin: 0; + padding: 6px 0; + list-style: none; + height: var.$transfer-panel-body-height; + overflow: auto; + box-sizing: border-box; + + @include mixins.when(filterable) { + height: #{var.$transfer-panel-body-height - var.$transfer-filter-height - + 20px}; + padding-top: 0; + } + } + + @include mixins.e(item) { + height: var.$transfer-item-height; + line-height: var.$transfer-item-height; + padding-left: 15px; + display: block !important; + + & + .el-transfer-panel__item { + margin-left: 0; + } + + &.el-checkbox { + color: var(--color-text-dark); + } + + &:hover { + color: var(--color-primary); + } + + &.el-checkbox .el-checkbox__label { + width: 100%; + @include utils.utils-ellipsis; + display: block; + box-sizing: border-box; + padding-left: 24px; + line-height: var.$transfer-item-height; + } + + .el-checkbox__input { + position: absolute; + top: 8px; + } + } + + @include mixins.e(filter) { + text-align: center; + margin: 15px; + box-sizing: border-box; + display: block; + width: auto; + + .el-input__inner { + height: var.$transfer-filter-height; + width: 100%; + font-size: 12px; + display: inline-block; + box-sizing: border-box; + border-radius: #{var.$transfer-filter-height * 0.5}; + padding-right: 10px; + padding-left: 30px; + } + + .el-input__icon { + margin-left: 5px; + } + + .el-icon-circle-close { + cursor: pointer; + } + } + + .el-transfer-panel__header { + height: var.$transfer-panel-header-height; + line-height: var.$transfer-panel-header-height; + background: var.$transfer-panel-header-background-color; + margin: 0; + padding-left: 15px; + border-bottom: 1px solid var.$transfer-border-color; + box-sizing: border-box; + color: var.$color-black; + + .el-checkbox { + display: block; + line-height: 40px; + + .el-checkbox__label { + font-size: 16px; + color: var(--color-text-dark); + font-weight: normal; + + span { + position: absolute; + right: 15px; + color: var(--color-text-light); + font-size: 12px; + font-weight: normal; + } + } + } + } + + .el-transfer-panel__footer { + height: var.$transfer-panel-footer-height; + background: var.$color-white; + margin: 0; + padding: 0; + border-top: 1px solid var.$transfer-border-color; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + z-index: var.$index-normal; + @include utils.utils-vertical-center; + + .el-checkbox { + padding-left: 20px; + color: var(--color-text-dark); + } + } + + .el-transfer-panel__empty { + margin: 0; + height: var.$transfer-item-height; + line-height: var.$transfer-item-height; + padding: 6px 15px 0; + color: var(--color-text-light); + text-align: center; + } + + .el-checkbox__label { + padding-left: 8px; + } + + .el-checkbox__inner { + height: 14px; + width: 14px; + border-radius: 3px; + &::after { + height: 6px; + width: 3px; + left: 4px; + } + } +} diff --git a/packages/design-system/theme/src/tree.scss b/packages/design-system/theme/src/tree.scss new file mode 100644 index 0000000000..eea1c38453 --- /dev/null +++ b/packages/design-system/theme/src/tree.scss @@ -0,0 +1,124 @@ +@use "mixins/mixins"; +@use "./common/var"; +@use "common/transition"; +@use "checkbox"; + +@include mixins.b(tree) { + position: relative; + cursor: default; + background: var.$color-white; + color: var.$tree-font-color; + + @include mixins.e(empty-block) { + position: relative; + min-height: 60px; + text-align: center; + width: 100%; + height: 100%; + } + + @include mixins.e(empty-text) { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + color: var(--color-text-light); + font-size: var.$font-size-base; + } + + @include mixins.e(drop-indicator) { + position: absolute; + left: 0; + right: 0; + height: 1px; + background-color: var(--color-primary); + } +} + +@include mixins.b(tree-node) { + white-space: nowrap; + outline: none; + &:focus { + /* focus */ + > .el-tree-node__content { + background-color: var.$tree-node-hover-background-color; + } + } + + @include mixins.when(drop-inner) { + > .el-tree-node__content .el-tree-node__label { + background-color: var(--color-primary); + color: #fff; + } + } + + @include mixins.e(content) { + display: flex; + align-items: center; + height: 26px; + cursor: pointer; + + & > .el-tree-node__expand-icon { + padding: 6px; + } + & > label.el-checkbox { + margin-right: 8px; + } + &:hover { + background-color: var.$tree-node-hover-background-color; + } + + .el-tree.is-dragging & { + cursor: move; + + & * { + pointer-events: none; + } + } + + .el-tree.is-dragging.is-drop-not-allow & { + cursor: not-allowed; + } + } + + @include mixins.e(expand-icon) { + cursor: pointer; + color: var.$tree-expand-icon-color; + font-size: 12px; + + transform: rotate(0deg); + transition: transform 0.3s ease-in-out; + + &.expanded { + transform: rotate(90deg); + } + + &.is-leaf { + color: transparent; + cursor: default; + } + } + + @include mixins.e(label) { + font-size: var.$font-size-base; + } + + @include mixins.e(loading-icon) { + margin-right: 8px; + font-size: var.$font-size-base; + color: var.$tree-expand-icon-color; + } + + & > .el-tree-node__children { + overflow: hidden; + background-color: transparent; + } + + &.is-expanded > .el-tree-node__children { + display: block; + } +} + +.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content { + background-color: var.$color-primary-lighter; +} diff --git a/packages/design-system/theme/src/upload.scss b/packages/design-system/theme/src/upload.scss new file mode 100644 index 0000000000..8f5ee22656 --- /dev/null +++ b/packages/design-system/theme/src/upload.scss @@ -0,0 +1,609 @@ +@use "mixins/mixins"; +@use "progress"; +@use "./common/var"; +@use "mixins/utils"; + +@include mixins.b(upload) { + display: inline-block; + text-align: center; + cursor: pointer; + outline: none; + @include mixins.e(input) { + display: none; + } + + @include mixins.e(tip) { + font-size: 12px; + color: var(--color-text-dark); + margin-top: 7px; + } + + iframe { + position: absolute; + z-index: -1; + top: 0; + left: 0; + opacity: 0; + filter: alpha(opacity=0); + } + + /* 照片墙模式 */ + @include mixins.m(picture-card) { + background-color: #fbfdff; + border: 1px dashed #c0ccda; + border-radius: 6px; + box-sizing: border-box; + width: 148px; + height: 148px; + cursor: pointer; + line-height: 146px; + vertical-align: top; + + i { + font-size: 28px; + color: #8c939d; + } + + &:hover { + border-color: var(--color-primary); + color: var(--color-primary); + } + } + &:focus { + border-color: var(--color-primary); + color: var(--color-primary); + + .el-upload-dragger { + border-color: var(--color-primary); + } + } +} + +@include mixins.b(upload-dragger) { + background-color: #fff; + border: 1px dashed #d9d9d9; + border-radius: 6px; + box-sizing: border-box; + width: 360px; + height: 180px; + text-align: center; + cursor: pointer; + position: relative; + overflow: hidden; + + .el-icon-upload { + font-size: 67px; + color: var(--color-text-lighter); + margin: 40px 0 16px; + line-height: 50px; + } + + + .el-upload__tip { + text-align: center; + } + + ~ .el-upload__files { + border-top: var(--border-base); + margin-top: 7px; + padding-top: 5px; + } + + .el-upload__text { + color: var(--color-text-dark); + font-size: 14px; + text-align: center; + + em { + color: var(--color-primary); + font-style: normal; + } + } + + &:hover { + border-color: var(--color-primary); + } + + @include mixins.when(dragover) { + background-color: rgba(32, 159, 255, 0.06); + border: 2px dashed var(--color-primary); + } +} + +@include mixins.b(upload-list) { + margin: 0; + padding: 0; + list-style: none; + + @include mixins.e(item) { + transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1); + font-size: 14px; + color: var(--color-text-dark); + line-height: 1.8; + margin-top: 5px; + position: relative; + box-sizing: border-box; + border-radius: 4px; + width: 100%; + + .el-progress { + position: absolute; + top: 20px; + width: 100%; + } + + .el-progress__text { + position: absolute; + right: 0; + top: -13px; + } + + .el-progress-bar { + margin-right: 0; + padding-right: 0; + } + + &:first-child { + margin-top: 10px; + } + + & .el-icon-upload-success { + color: var(--color-success); + } + + .el-icon-close { + display: none; + position: absolute; + top: 5px; + right: 5px; + cursor: pointer; + opacity: 0.75; + color: var(--color-text-dark); + //transform: scale(.7); + + &:hover { + opacity: 1; + } + } + + & .el-icon-close-tip { + display: none; + position: absolute; + top: 5px; + right: 5px; + font-size: 12px; + cursor: pointer; + opacity: 1; + color: var(--color-primary); + } + + &:hover { + background-color: var.$background-color-base; + + .el-icon-close { + display: inline-block; + } + + .el-progress__text { + display: none; + } + } + + @include mixins.when(success) { + .el-upload-list__item-status-label { + display: block; + } + + .el-upload-list__item-name:hover, + .el-upload-list__item-name:focus { + color: var.$link-hover-color; + cursor: pointer; + } + + &:focus:not(:hover) { + /* 键盘focus */ + .el-icon-close-tip { + display: inline-block; + } + } + + &:not(.focusing):focus, + &:active { + /* click时 */ + outline-width: 0; + .el-icon-close-tip { + display: none; + } + } + + &:hover, + &:focus { + .el-upload-list__item-status-label { + display: none; + } + } + } + } + + @include mixins.when(disabled) { + .el-upload-list__item:hover .el-upload-list__item-status-label { + display: block; + } + } + + @include mixins.e(item-name) { + color: var(--color-text-dark); + display: block; + margin-right: 40px; + overflow: hidden; + padding-left: 4px; + text-overflow: ellipsis; + transition: color 0.3s; + white-space: nowrap; + + [class^='el-icon'] { + height: 100%; + margin-right: 7px; + color: var(--color-text-light); + line-height: inherit; + } + } + + @include mixins.e(item-status-label) { + position: absolute; + right: 5px; + top: 0; + line-height: inherit; + display: none; + } + + @include mixins.e(item-delete) { + position: absolute; + right: 10px; + top: 0; + font-size: 12px; + color: var(--color-text-dark); + display: none; + + &:hover { + color: var(--color-primary); + } + } + + @include mixins.m(picture-card) { + margin: 0; + display: inline; + vertical-align: top; + + .el-upload-list__item { + overflow: hidden; + background-color: #fff; + border: 1px solid #c0ccda; + border-radius: 6px; + box-sizing: border-box; + width: 148px; + height: 148px; + margin: 0 8px 8px 0; + display: inline-block; + + .el-icon-check, + .el-icon-circle-check { + color: var.$color-white; + } + + .el-icon-close { + display: none; + } + &:hover { + .el-upload-list__item-status-label { + display: none; + } + + .el-progress__text { + display: block; + } + } + } + + .el-upload-list__item-name { + display: none; + } + + .el-upload-list__item-thumbnail { + width: 100%; + height: 100%; + } + + .el-upload-list__item-status-label { + position: absolute; + right: -15px; + top: -6px; + width: 40px; + height: 24px; + background: #13ce66; + text-align: center; + transform: rotate(45deg); + box-shadow: 0 0 1pc 1px rgba(0, 0, 0, 0.2); + + i { + font-size: 12px; + margin-top: 11px; + transform: rotate(-45deg); + } + } + + .el-upload-list__item-actions { + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + cursor: default; + text-align: center; + color: #fff; + opacity: 0; + font-size: 20px; + background-color: rgba(0, 0, 0, 0.5); + transition: opacity 0.3s; + &::after { + display: inline-block; + content: ''; + height: 100%; + vertical-align: middle; + } + + span { + display: none; + cursor: pointer; + } + + span + span { + margin-left: 15px; + } + + .el-upload-list__item-delete { + position: static; + font-size: inherit; + color: inherit; + } + + &:hover { + opacity: 1; + span { + display: inline-block; + } + } + } + + .el-progress { + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + bottom: auto; + width: 126px; + + .el-progress__text { + top: 50%; + } + } + } + + @include mixins.m(picture) { + .el-upload-list__item { + overflow: hidden; + z-index: 0; + background-color: #fff; + border: 1px solid #c0ccda; + border-radius: 6px; + box-sizing: border-box; + margin-top: 10px; + padding: 10px 10px 10px 90px; + height: 92px; + + .el-icon-check, + .el-icon-circle-check { + color: var.$color-white; + } + + &:hover { + .el-upload-list__item-status-label { + background: transparent; + box-shadow: none; + top: -2px; + right: -12px; + } + + .el-progress__text { + display: block; + } + } + + &.is-success { + .el-upload-list__item-name { + line-height: 70px; + margin-top: 0; + i { + display: none; + } + } + } + } + + .el-upload-list__item-thumbnail { + vertical-align: middle; + display: inline-block; + width: 70px; + height: 70px; + float: left; + position: relative; + z-index: 1; + margin-left: -80px; + background-color: var.$color-white; + } + + .el-upload-list__item-name { + display: block; + margin-top: 20px; + + i { + font-size: 70px; + line-height: 1; + position: absolute; + left: 9px; + top: 10px; + } + } + + .el-upload-list__item-status-label { + position: absolute; + right: -17px; + top: -7px; + width: 46px; + height: 26px; + background: #13ce66; + text-align: center; + transform: rotate(45deg); + box-shadow: 0 1px 1px #ccc; + + i { + font-size: 12px; + margin-top: 12px; + transform: rotate(-45deg); + } + } + + .el-progress { + position: relative; + top: -7px; + } + } +} + +@include mixins.b(upload-cover) { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: hidden; + z-index: 10; + cursor: default; + @include utils.utils-vertical-center; + + img { + display: block; + width: 100%; + height: 100%; + } + + @include mixins.e(label) { + position: absolute; + right: -15px; + top: -6px; + width: 40px; + height: 24px; + background: #13ce66; + text-align: center; + transform: rotate(45deg); + box-shadow: 0 0 1pc 1px rgba(0, 0, 0, 0.2); + + i { + font-size: 12px; + margin-top: 11px; + transform: rotate(-45deg); + color: #fff; + } + } + + @include mixins.e(progress) { + display: inline-block; + vertical-align: middle; + position: static; + width: 243px; + + + .el-upload__inner { + opacity: 0; + } + } + + @include mixins.e(content) { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + @include mixins.e(interact) { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(#000, 0.72); + text-align: center; + + .btn { + display: inline-block; + color: var.$color-white; + font-size: 14px; + cursor: pointer; + vertical-align: middle; + transition: var.$md-fade-transition; + margin-top: 60px; + + i { + margin-top: 0; + } + + span { + opacity: 0; + transition: opacity 0.15s linear; + } + + &:not(:first-child) { + margin-left: 35px; + } + + &:hover { + transform: translateY(-13px); + + span { + opacity: 1; + } + } + + i { + color: var.$color-white; + display: block; + font-size: 24px; + line-height: inherit; + margin: 0 auto 5px; + } + } + } + + @include mixins.e(title) { + position: absolute; + bottom: 0; + left: 0; + background-color: var.$color-white; + height: 36px; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-weight: normal; + text-align: left; + padding: 0 10px; + margin: 0; + line-height: 36px; + font-size: 14px; + color: var(--color-text-dark); + } + + + .el-upload__inner { + opacity: 0; + position: relative; + z-index: 1; + } +} diff --git a/packages/design-system/tsconfig.json b/packages/design-system/tsconfig.json new file mode 100644 index 0000000000..91298452c5 --- /dev/null +++ b/packages/design-system/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "strict": true, + "jsx": "preserve", + "importHelpers": true, + "moduleResolution": "node", + "experimentalDecorators": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true, + "baseUrl": ".", + "types": ["webpack-env", "jest"], + "paths": { + "@/*": ["src/*"] + }, + "lib": ["esnext", "dom", "dom.iterable", "scripthost"] + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.vue", + "tests/**/*.ts", + "tests/**/*.tsx" + ], + "exclude": ["node_modules"] +} diff --git a/packages/design-system/tslint.json b/packages/design-system/tslint.json new file mode 100644 index 0000000000..0442c6446e --- /dev/null +++ b/packages/design-system/tslint.json @@ -0,0 +1,80 @@ +{ + "linterOptions": { + "exclude": ["node_modules/**/*", "../../node_modules/**/*"] + }, + "defaultSeverity": "error", + "jsRules": {}, + "rules": { + "array-type": [true, "array-simple"], + "arrow-return-shorthand": true, + "ban": [ + true, + { + "name": "Array", + "message": "tsstyle#array-constructor" + } + ], + "ban-types": [ + true, + ["Object", "Use {} instead."], + ["String", "Use 'string' instead."], + ["Number", "Use 'number' instead."], + ["Boolean", "Use 'boolean' instead."] + ], + "class-name": true, + "curly": [true, "ignore-same-line"], + "forin": true, + "jsdoc-format": true, + "label-position": true, + "indent": [true, "tabs", 2], + "member-access": [true, "no-public"], + "new-parens": true, + "no-angle-bracket-type-assertion": true, + "no-any": true, + "no-arg": true, + "no-conditional-assignment": true, + "no-construct": true, + "no-debugger": true, + // "no-default-export": true, + "no-duplicate-variable": true, + "no-inferrable-types": true, + "no-namespace": [true, "allow-declarations"], + "no-reference": true, + "no-string-throw": true, + "no-unused-expression": true, + "no-var-keyword": true, + "object-literal-shorthand": true, + "only-arrow-functions": [ + true, + "allow-declarations", + "allow-named-functions" + ], + "prefer-const": true, + "radix": true, + "semicolon": [true, "always", "ignore-bound-class-methods"], + "switch-default": true, + "trailing-comma": [ + true, + { + "multiline": { + "objects": "always", + "arrays": "always", + "functions": "always", + "typeLiterals": "ignore" + }, + "esSpecCompliant": true + } + ], + "triple-equals": [true, "allow-null-check"], + "use-isnan": true, + "quotes": ["error", "single"], + "variable-name": [ + true, + "check-format", + "ban-keywords", + "allow-leading-underscore", + "allow-trailing-underscore" + ] + }, + "rulesDirectory": [] +} diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json index 7757447075..1b4f190d98 100644 --- a/packages/editor-ui/package.json +++ b/packages/editor-ui/package.json @@ -25,15 +25,16 @@ "test:unit": "vue-cli-service test:unit" }, "dependencies": { + "n8n-design-system": "~0.1.0", "timeago.js": "^4.0.2", "v-click-outside": "^3.1.2", "vue-fragment": "^1.5.2" }, "devDependencies": { "@beyonk/google-fonts-webpack-plugin": "^1.5.0", - "@fortawesome/fontawesome-svg-core": "^1.2.19", - "@fortawesome/free-solid-svg-icons": "^5.9.0", - "@fortawesome/vue-fontawesome": "^0.1.6", + "@fortawesome/fontawesome-svg-core": "^1.2.35", + "@fortawesome/free-solid-svg-icons": "^5.15.3", + "@fortawesome/vue-fontawesome": "^2.0.2", "@types/dateformat": "^3.0.0", "@types/express": "^4.17.6", "@types/file-saver": "^2.0.1", @@ -43,16 +44,16 @@ "@types/node": "^14.14.40", "@types/quill": "^2.0.1", "@types/uuid": "^8.3.0", - "@typescript-eslint/eslint-plugin": "^2.13.0", - "@typescript-eslint/parser": "^2.13.0", - "@vue/cli-plugin-babel": "^4.1.2", - "@vue/cli-plugin-eslint": "^4.1.2", - "@vue/cli-plugin-typescript": "~4.5.6", - "@vue/cli-plugin-unit-jest": "^4.1.2", - "@vue/cli-service": "^3.11.0", + "@typescript-eslint/eslint-plugin": "^4.18.0", + "@typescript-eslint/parser": "^4.18.0", + "@vue/cli-plugin-babel": "~4.5.0", + "@vue/cli-plugin-eslint": "~4.5.0", + "@vue/cli-plugin-typescript": "~4.5.0", + "@vue/cli-plugin-unit-jest": "~4.5.0", + "@vue/cli-service": "~4.5.0", "@vue/eslint-config-standard": "^5.0.1", - "@vue/eslint-config-typescript": "~5.0.1", - "@vue/test-utils": "^1.0.0-beta.24", + "@vue/eslint-config-typescript": "^7.0.0", + "@vue/test-utils": "^1.0.3", "axios": "^0.21.1", "babel-core": "7.0.0-bridge.0", "babel-eslint": "^10.0.1", @@ -61,7 +62,7 @@ "element-ui": "~2.13.0", "eslint": "^6.8.0", "eslint-plugin-import": "^2.19.1", - "eslint-plugin-vue": "^6.1.1", + "eslint-plugin-vue": "^6.2.2", "file-saver": "^2.0.2", "flatted": "^2.0.0", "jquery": "^3.4.1", @@ -71,23 +72,23 @@ "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", "n8n-workflow": "~0.65.0", - "node-sass": "^4.12.0", + "sass": "^1.26.5", "normalize-wheel": "^1.0.1", "prismjs": "^1.17.1", "quill": "^2.0.0-dev.3", "quill-autoformat": "^0.1.1", - "sass-loader": "^8.0.0", + "sass-loader": "^8.0.2", "string-template-parser": "^1.2.6", "ts-jest": "^26.3.0", "tslint": "^6.1.2", "typescript": "~3.9.7", "uuid": "^8.3.0", - "vue": "^2.6.9", + "vue": "^2.6.11", "vue-cli-plugin-webpack-bundle-analyzer": "^2.0.0", "vue-json-pretty": "1.7.1", "vue-prism-editor": "^0.3.0", "vue-router": "^3.0.6", - "vue-template-compiler": "^2.5.17", + "vue-template-compiler": "^2.6.11", "vue-typed-mixins": "^0.2.0", "vue2-touch-events": "^3.2.1", "vuex": "^3.1.1" diff --git a/packages/editor-ui/src/components/About.vue b/packages/editor-ui/src/components/About.vue index 8b2e901f81..a9bb49f323 100644 --- a/packages/editor-ui/src/components/About.vue +++ b/packages/editor-ui/src/components/About.vue @@ -28,9 +28,7 @@
- - Close - +
diff --git a/packages/editor-ui/src/components/BinaryDataDisplay.vue b/packages/editor-ui/src/components/BinaryDataDisplay.vue index 3a737c1f0f..3945a356ba 100644 --- a/packages/editor-ui/src/components/BinaryDataDisplay.vue +++ b/packages/editor-ui/src/components/BinaryDataDisplay.vue @@ -1,14 +1,13 @@ @@ -123,3 +125,11 @@ export default mixins(showMessage, workflowHelpers).extend({ }, }); + + diff --git a/packages/editor-ui/src/components/Error/NodeViewError.vue b/packages/editor-ui/src/components/Error/NodeViewError.vue index 4c86eb2571..2f0243f3d9 100644 --- a/packages/editor-ui/src/components/Error/NodeViewError.vue +++ b/packages/editor-ui/src/components/Error/NodeViewError.vue @@ -37,9 +37,9 @@ Data below may contain sensitive information. Proceed with caution when sharing.
- - - +
+ +
- + Filters: - - - + + - - + + -   - - - - + + - - + + -   - - + Auto refresh @@ -39,7 +35,7 @@
Selected: {{numSelected}} / ~{{finishedExecutionsCount}} - +
@@ -76,10 +72,10 @@ - + diff --git a/packages/editor-ui/src/components/MainHeader/MainHeader.vue b/packages/editor-ui/src/components/MainHeader/MainHeader.vue index 42b25b29bd..db3aaa6629 100644 --- a/packages/editor-ui/src/components/MainHeader/MainHeader.vue +++ b/packages/editor-ui/src/components/MainHeader/MainHeader.vue @@ -77,10 +77,6 @@ export default mixins( &.expanded { padding-left: $--sidebar-expanded-width; } - - * { - box-sizing: border-box; - } } .top-menu { diff --git a/packages/editor-ui/src/components/MainSidebar.vue b/packages/editor-ui/src/components/MainSidebar.vue index f214802765..4ca6233512 100644 --- a/packages/editor-ui/src/components/MainSidebar.vue +++ b/packages/editor-ui/src/components/MainSidebar.vue @@ -492,7 +492,7 @@ export default mixins( diff --git a/packages/editor-ui/src/components/MultipleParameter.vue b/packages/editor-ui/src/components/MultipleParameter.vue index 2aeef6df26..36f2570d04 100644 --- a/packages/editor-ui/src/components/MultipleParameter.vue +++ b/packages/editor-ui/src/components/MultipleParameter.vue @@ -3,10 +3,10 @@
{{parameter.displayName}}: - -
+ +
-
+
@@ -21,7 +21,7 @@
- +
@@ -29,7 +29,7 @@
Currently no items exist
- {{ addButtonText }} +
@@ -141,10 +141,6 @@ export default mixins(genericHelpers) margin: 0.5em 0 0em 2em; } -.add-item { - width: 100%; -} - .delete-item { display: none; position: absolute; diff --git a/packages/editor-ui/src/components/Node.vue b/packages/editor-ui/src/components/Node.vue index 99a53d15e7..4955b5c13b 100644 --- a/packages/editor-ui/src/components/Node.vue +++ b/packages/editor-ui/src/components/Node.vue @@ -2,18 +2,18 @@
- +
-
+
- +
-
+
@@ -218,6 +218,7 @@ export default mixins(externalHooks, nodeBase, nodeHelpers, workflowHelpers).ext height: 100px; .node-description { + line-height: 1.5; position: absolute; bottom: -55px; left: -50px; @@ -307,7 +308,7 @@ export default mixins(externalHooks, nodeBase, nodeHelpers, workflowHelpers).ext .node-info-icon { position: absolute; - top: -18px; + top: -14px; right: 12px; z-index: 11; @@ -350,9 +351,8 @@ export default mixins(externalHooks, nodeBase, nodeHelpers, workflowHelpers).ext text-align: center; .option { - width: 20px; + width: 28px; display: inline-block; - padding: 0 0.3em; &.touch { display: none; diff --git a/packages/editor-ui/src/components/NodeCreator/MainPanel.vue b/packages/editor-ui/src/components/NodeCreator/MainPanel.vue index bd7f665dbd..c6475d3695 100644 --- a/packages/editor-ui/src/components/NodeCreator/MainPanel.vue +++ b/packages/editor-ui/src/components/NodeCreator/MainPanel.vue @@ -279,15 +279,15 @@ export default mixins(externalHooks).extend({ diff --git a/packages/editor-ui/src/components/ParameterInputFull.vue b/packages/editor-ui/src/components/ParameterInputFull.vue index b15c002674..f1779dd1ba 100644 --- a/packages/editor-ui/src/components/ParameterInputFull.vue +++ b/packages/editor-ui/src/components/ParameterInputFull.vue @@ -1,14 +1,14 @@ @@ -74,7 +74,12 @@ export default Vue \ No newline at end of file + +.saved { + color: $--custom-font-very-light; + font-size: 12px; + font-weight: 600; + line-height: 12px; + text-align: center; + padding: var(--spacing-2xs) var(--spacing-xs); +} + diff --git a/packages/editor-ui/src/components/TagsDropdown.vue b/packages/editor-ui/src/components/TagsDropdown.vue index 98b673f054..26e5674e3a 100644 --- a/packages/editor-ui/src/components/TagsDropdown.vue +++ b/packages/editor-ui/src/components/TagsDropdown.vue @@ -1,6 +1,6 @@ @@ -235,31 +236,12 @@ export default mixins(showMessage).extend({ \ No newline at end of file + diff --git a/packages/editor-ui/src/components/TagsManager/TagsManager.vue b/packages/editor-ui/src/components/TagsManager/TagsManager.vue index 8bb3fead02..1ba310a3db 100644 --- a/packages/editor-ui/src/components/TagsManager/TagsManager.vue +++ b/packages/editor-ui/src/components/TagsManager/TagsManager.vue @@ -24,7 +24,7 @@ diff --git a/packages/editor-ui/src/components/TagsManager/TagsView/TagsTable.vue b/packages/editor-ui/src/components/TagsManager/TagsView/TagsTable.vue index 6afb3b6e0d..b47df283ba 100644 --- a/packages/editor-ui/src/components/TagsManager/TagsView/TagsTable.vue +++ b/packages/editor-ui/src/components/TagsManager/TagsView/TagsTable.vue @@ -13,13 +13,13 @@ diff --git a/packages/editor-ui/src/components/WorkflowSettings.vue b/packages/editor-ui/src/components/WorkflowSettings.vue index e92322d2a1..2014108221 100644 --- a/packages/editor-ui/src/components/WorkflowSettings.vue +++ b/packages/editor-ui/src/components/WorkflowSettings.vue @@ -1,133 +1,132 @@