@dataloop-ai/components 0.16.44 → 0.16.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/.eslintrc.js +2 -2
  2. package/package.json +10 -9
  3. package/src/App.vue +116 -57
  4. package/src/assets/globals.scss +2 -0
  5. package/src/components/basic/DlAlert/DlAlert.vue +1 -1
  6. package/src/components/basic/DlButton/DlButton.vue +22 -10
  7. package/src/components/basic/DlCard/DlCard.vue +217 -0
  8. package/src/components/basic/DlCard/index.ts +3 -0
  9. package/src/components/basic/DlCard/types.ts +20 -0
  10. package/src/components/basic/DlChip/DlChip.vue +1 -0
  11. package/src/components/basic/DlEllipsis/DlEllipsis.vue +90 -0
  12. package/src/components/basic/DlEllipsis/index.ts +2 -0
  13. package/src/components/basic/DlListItem/DlListItem.vue +11 -5
  14. package/src/components/basic/index.ts +2 -0
  15. package/src/components/compound/DlCharts/charts/DlBarChart/DlBarChart.vue +8 -1
  16. package/src/components/compound/DlCharts/charts/DlColumnChart/DlColumnChart.vue +22 -6
  17. package/src/components/compound/DlCharts/charts/DlConfusionMatrix/DlConfusionMatrix.vue +526 -0
  18. package/src/components/compound/DlCharts/charts/DlConfusionMatrix/index.ts +2 -0
  19. package/src/components/compound/DlCharts/charts/DlConfusionMatrix/utils.ts +96 -0
  20. package/src/components/compound/DlCharts/charts/DlDoughnutChart/DlDoughnutChart.vue +2 -2
  21. package/src/components/compound/DlCharts/charts/DlLineChart/DlLineChart.vue +22 -6
  22. package/src/components/compound/DlCharts/charts/index.ts +1 -0
  23. package/src/components/compound/DlCharts/components/DlBrush.vue +8 -1
  24. package/src/components/compound/DlCharts/components/DlChartScrollBar.vue +34 -21
  25. package/src/components/compound/DlCharts/types/DlConfusionMatrix.types.ts +19 -0
  26. package/src/components/compound/DlCharts/types/index.ts +2 -1
  27. package/src/components/compound/DlCharts/types/props.ts +14 -0
  28. package/src/components/compound/DlDialogBox/DlDialogBox.vue +1 -1
  29. package/src/components/compound/DlDialogBox/components/DlDialogBoxFooter.vue +1 -0
  30. package/src/components/compound/DlDropdownButton/DlDropdownButton.vue +58 -12
  31. package/src/components/compound/DlInput/DlInput.vue +45 -23
  32. package/src/components/compound/DlJsonEditor/DlJsonEditor.vue +13 -29
  33. package/src/components/compound/DlPagination/DlPagination.vue +14 -4
  34. package/src/components/compound/DlPagination/components/PageNavigation.vue +24 -25
  35. package/src/components/compound/DlPagination/components/PaginationLegend.vue +2 -1
  36. package/src/components/compound/DlPagination/components/QuickNavigation.vue +1 -0
  37. package/src/components/compound/DlSearches/DlSmartSearch/DlSmartSearch.vue +86 -49
  38. package/src/components/compound/DlSearches/DlSmartSearch/components/DlSmartSearchInput.vue +20 -13
  39. package/src/components/compound/DlSearches/DlSmartSearch/components/DlSuggestionsDropdown.vue +43 -4
  40. package/src/components/compound/DlSearches/DlSmartSearch/utils/highlightSyntax.ts +1 -55
  41. package/src/components/compound/DlSearches/DlSmartSearch/utils/index.ts +42 -10
  42. package/src/components/compound/DlSearches/DlSmartSearch/utils/utils.ts +107 -0
  43. package/src/components/compound/DlSelect/DlSelect.vue +41 -8
  44. package/src/components/compound/DlTable/DlTable.vue +13 -10
  45. package/src/components/compound/DlTable/styles/dl-table-styles.scss +16 -4
  46. package/src/components/compound/DlToggleButton/DlToggleButton.vue +109 -0
  47. package/src/components/compound/DlToggleButton/config.ts +27 -0
  48. package/src/components/compound/DlToggleButton/index.ts +3 -0
  49. package/src/components/compound/DlToggleButton/types.ts +4 -0
  50. package/src/components/compound/index.ts +1 -0
  51. package/src/components/compound/types.ts +1 -0
  52. package/src/components/essential/DlColorPicker/DlColorPicker.vue +4 -1
  53. package/src/components/essential/DlColorPicker/components/DlColors.vue +2 -6
  54. package/src/components/essential/DlIcon/DlIcon.vue +5 -1
  55. package/src/components/essential/DlMenu/DlMenu.vue +30 -2
  56. package/src/components/essential/DlSeparator/DlSeparator.vue +62 -0
  57. package/src/components/essential/DlSeparator/index.ts +2 -0
  58. package/src/components/essential/DlSpinner/DlSpinner.vue +53 -217
  59. package/src/components/essential/DlSpinner/components/DlSpinnerCircle.vue +44 -0
  60. package/src/components/essential/DlSpinner/components/DlSpinnerClock.vue +79 -0
  61. package/src/components/essential/DlSpinner/components/DlSpinnerDots.vue +113 -0
  62. package/src/components/essential/DlSpinner/components/DlSpinnerGrid.vue +166 -0
  63. package/src/components/essential/DlSpinner/components/DlSpinnerLogo.vue +152 -0
  64. package/src/components/essential/DlSpinner/index.ts +14 -1
  65. package/src/components/essential/DlSpinner/styles/spinnerStyles.scss +111 -0
  66. package/src/components/essential/DlSpinner/types.ts +7 -0
  67. package/src/components/essential/index.ts +1 -0
  68. package/src/components/essential/types.ts +1 -0
  69. package/src/components/shared/DlItemSection/DlItemSection.vue +21 -15
  70. package/src/components/shared/DlVirtualScroll/DlVirtualScroll.vue +36 -21
  71. package/src/components/shared/DlVirtualScroll/useVirtualScroll.ts +8 -10
  72. package/src/{demo → demos}/DlButtonDemo.vue +36 -1
  73. package/src/demos/DlCardDemo.vue +47 -0
  74. package/src/{demo → demos}/DlColorPickerDemo.vue +16 -1
  75. package/src/demos/DlConfusionMatrixDemo.vue +53 -0
  76. package/src/{demo → demos}/DlDialogBoxDemo.vue +4 -1
  77. package/src/demos/DlDropdownButtonDemo.vue +386 -0
  78. package/src/demos/DlEllipsisDemo.vue +30 -0
  79. package/src/{demo → demos}/DlLineChartDemo.vue +8 -8
  80. package/src/{demo → demos}/DlMenuDemo.vue +61 -2
  81. package/src/{demo → demos}/DlSearchDemo.vue +3 -2
  82. package/src/demos/DlSeparatorDemo.vue +44 -0
  83. package/src/demos/DlSpinnerDemo.vue +59 -0
  84. package/src/{demo → demos}/DlTableDemo.vue +117 -29
  85. package/src/demos/DlToggleButtonDemo.vue +57 -0
  86. package/src/{demo → demos}/DlTooltipDemo.vue +43 -2
  87. package/src/{demo → demos}/DlWidgetDemo.vue +34 -19
  88. package/src/{demo → demos}/SmartSearchDemo/DlSmartSearchDemo.vue +2 -50
  89. package/src/{demo → demos}/index.ts +14 -56
  90. package/src/hooks/use-arrow-navigation.ts +58 -0
  91. package/src/hooks/use-suggestions.ts +97 -74
  92. package/src/utils/colors.ts +1 -1
  93. package/src/utils/draggable-table.ts +2 -2
  94. package/src/utils/index.ts +1 -0
  95. package/src/utils/parse-smart-query.ts +87 -0
  96. package/src/components/compound/DlCharts/types.ts +0 -1
  97. package/src/demo/DlDropdownButtonDemo.vue +0 -260
  98. package/src/demo/DlSpinnerDemo.vue +0 -20
  99. /package/src/{demo → demos}/BarChartDemo.vue +0 -0
  100. /package/src/{demo → demos}/ColumnChartDemo.vue +0 -0
  101. /package/src/{demo → demos}/DlAccordionDemo.vue +0 -0
  102. /package/src/{demo → demos}/DlAlertDemo.vue +0 -0
  103. /package/src/{demo → demos}/DlAvatarDemo.vue +0 -0
  104. /package/src/{demo → demos}/DlBadgeDemo.vue +0 -0
  105. /package/src/{demo → demos}/DlChartDoughnutDemo.vue +0 -0
  106. /package/src/{demo → demos}/DlCheckboxDemo.vue +0 -0
  107. /package/src/{demo → demos}/DlChipDemo.vue +0 -0
  108. /package/src/{demo → demos}/DlCounterDemo.vue +0 -0
  109. /package/src/{demo → demos}/DlDateTimeRangeDemo.vue +0 -0
  110. /package/src/{demo → demos}/DlIconDemo.vue +0 -0
  111. /package/src/{demo → demos}/DlInputDemo.vue +0 -0
  112. /package/src/{demo → demos}/DlKpiDemo.vue +0 -0
  113. /package/src/{demo → demos}/DlLinkDemo.vue +0 -0
  114. /package/src/{demo → demos}/DlListDemo.vue +0 -0
  115. /package/src/{demo → demos}/DlOptionGroupDemo.vue +0 -0
  116. /package/src/{demo → demos}/DlPaginationDemo.vue +0 -0
  117. /package/src/{demo → demos}/DlPanelContainerDemo.vue +0 -0
  118. /package/src/{demo → demos}/DlPopupDemo.vue +0 -0
  119. /package/src/{demo → demos}/DlProgressBarDemo.vue +0 -0
  120. /package/src/{demo → demos}/DlProgressChartDemo.vue +0 -0
  121. /package/src/{demo → demos}/DlRadioDemo.vue +0 -0
  122. /package/src/{demo → demos}/DlRangeDemo.vue +0 -0
  123. /package/src/{demo → demos}/DlSelectDemo.vue +0 -0
  124. /package/src/{demo → demos}/DlSkeletonDemo.vue +0 -0
  125. /package/src/{demo → demos}/DlSliderDemo.vue +0 -0
  126. /package/src/{demo → demos}/DlStepperDemo/CenteredStepperInDialogBox.vue +0 -0
  127. /package/src/{demo → demos}/DlStepperDemo/DlStepperDemo.vue +0 -0
  128. /package/src/{demo → demos}/DlStepperDemo/SimpleStepper.vue +0 -0
  129. /package/src/{demo → demos}/DlStepperDemo/StepperInDialogBox.vue +0 -0
  130. /package/src/{demo → demos}/DlStepperDemo/index.ts +0 -0
  131. /package/src/{demo → demos}/DlStepperDemo/steps/AssignmentsStep.vue +0 -0
  132. /package/src/{demo → demos}/DlStepperDemo/steps/DataStep.vue +0 -0
  133. /package/src/{demo → demos}/DlStepperDemo/steps/GeneralStep.vue +0 -0
  134. /package/src/{demo → demos}/DlStepperDemo/steps/InstructionStep.vue +0 -0
  135. /package/src/{demo → demos}/DlStepperDemo/steps/QualityStep.vue +0 -0
  136. /package/src/{demo → demos}/DlSwitchDemo.vue +0 -0
  137. /package/src/{demo → demos}/DlTabsDemo.vue +0 -0
  138. /package/src/{demo → demos}/DlTdDemo.vue +0 -0
  139. /package/src/{demo → demos}/DlTextAreaDemo.vue +0 -0
  140. /package/src/{demo → demos}/DlTextHolderDemo.vue +0 -0
  141. /package/src/{demo → demos}/DlThDemo.vue +0 -0
  142. /package/src/{demo → demos}/DlToastDemo.vue +0 -0
  143. /package/src/{demo → demos}/DlTrDemo.vue +0 -0
  144. /package/src/{demo → demos}/DlTrendDemo.vue +0 -0
  145. /package/src/{demo → demos}/DlTypographyDemo.vue +0 -0
  146. /package/src/{demo → demos}/SmartSearchDemo/schema.ts +0 -0
package/.eslintrc.js CHANGED
@@ -7,7 +7,8 @@ module.exports = {
7
7
  'eslint:recommended',
8
8
  'plugin:@typescript-eslint/recommended',
9
9
  'plugin:vue/recommended',
10
- '@vue/typescript'
10
+ '@vue/typescript',
11
+ 'plugin:storybook/recommended'
11
12
  ],
12
13
  plugins: ['eslint-plugin-member-order'],
13
14
  rules: {
@@ -130,7 +131,6 @@ module.exports = {
130
131
  'use-isnan': 'warn',
131
132
  'valid-typeof': 'off',
132
133
  'no-useless-escape': 'off',
133
-
134
134
  // New Rules
135
135
  '@typescript-eslint/ban-ts-comment': 'off',
136
136
  '@typescript-eslint/explicit-function-return-type': 'off',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dataloop-ai/components",
3
- "version": "0.16.44",
3
+ "version": "0.16.46",
4
4
  "exports": {
5
5
  ".": "./index.ts",
6
6
  "./models": "./models.ts",
@@ -38,13 +38,13 @@
38
38
  "devDependencies": {
39
39
  "@babel/core": "^7.17.9",
40
40
  "@mdx-js/react": "^2.1.1",
41
- "@storybook/addon-actions": "^7.0.0-rc.5",
42
- "@storybook/addon-essentials": "^7.0.0-rc.5",
43
- "@storybook/addon-links": "^7.0.0-rc.5",
44
- "@storybook/addon-mdx-gfm": "^7.0.0-rc.5",
45
- "@storybook/client-api": "^7.0.0-rc.5",
46
- "@storybook/vue3": "^7.0.0-rc.5",
47
- "@storybook/vue3-vite": "^7.0.0-rc.5",
41
+ "@storybook/addon-actions": "^7.0.4",
42
+ "@storybook/addon-essentials": "^7.0.4",
43
+ "@storybook/addon-links": "^7.0.4",
44
+ "@storybook/addon-mdx-gfm": "^7.0.4",
45
+ "@storybook/client-api": "^7.0.4",
46
+ "@storybook/vue3": "^7.0.4",
47
+ "@storybook/vue3-vite": "^7.0.4",
48
48
  "@types/jsdom": "^16.2.14",
49
49
  "@types/node": "^18.7.18",
50
50
  "@types/resize-observer-browser": "^0.1.7",
@@ -61,6 +61,7 @@
61
61
  "eslint-config-prettier": "^8.5.0",
62
62
  "eslint-plugin-member-order": "^0.0.3",
63
63
  "eslint-plugin-prettier": "^4.0.0",
64
+ "eslint-plugin-storybook": "^0.6.11",
64
65
  "eslint-plugin-vue": "^8.6.0",
65
66
  "html-webpack-plugin": "^5.5.0",
66
67
  "jsdom": "^21.1.0",
@@ -69,7 +70,7 @@
69
70
  "prettier": "^2.6.2",
70
71
  "react": "^18.1.0",
71
72
  "react-dom": "^18.2.0",
72
- "storybook": "^7.0.0-rc.5",
73
+ "storybook": "^7.0.4",
73
74
  "storybook-addon-themes": "^6.1.0",
74
75
  "typescript": "^4.5.4",
75
76
  "vite": "^4.1.4",
package/src/App.vue CHANGED
@@ -1,52 +1,81 @@
1
1
  <template>
2
- <DlThemeProvider :is-dark="isDarkMode">
3
- <div style="display: flex">
4
- <dl-typography
5
- color="dl-color-medium"
6
- size="h1"
7
- variant="h1"
2
+ <DlThemeProvider :is-dark="darkMode">
3
+ <div
4
+ style="display: flex; width: 100%; align-items: center; align-content; center;"
5
+ >
6
+ <dl-typography
7
+ color="dl-color-medium"
8
+ variant="p"
9
+ style="margin: 10px 0px 20px 0px; width: 90%"
8
10
  >
9
- Dataloop AI UI Library
11
+ <div
12
+ style="
13
+ background-image: url(https://dataloop.ai/wp-content/uploads/2020/03/logo.svg);
14
+ width: 160px;
15
+ height: 28px;
16
+ display: inline-block;
17
+ "
18
+ />
19
+ Components library
10
20
  </dl-typography>
11
- <dl-button
12
- v-if="!hasProps"
13
- style="margin: 0 20px"
14
- @click="toggleColorMode"
15
- >
16
- {{ (isDarkMode ? 'Light' : 'Dark') + ' theme' }}
17
- </dl-button>
21
+ <div style="display: flex; align-items: center">
22
+ <dl-icon
23
+ icon="icon-dl-light-theme"
24
+ size="24px"
25
+ :color="
26
+ !darkMode ? 'dl-color-secondary' : 'dl-color-darker'
27
+ "
28
+ />
29
+ <dl-switch
30
+ v-model="darkMode"
31
+ style="margin: 0 20px"
32
+ />
33
+ <dl-icon
34
+ icon="icon-dl-dark-theme"
35
+ size="20px"
36
+ :color="darkMode ? 'dl-color-secondary' : 'dl-color-darker'"
37
+ />
38
+ </div>
18
39
  </div>
19
40
  <div class="layout-wrapper">
20
41
  <div class="sidebar">
21
42
  <dl-search
22
- v-model="activeDemo"
43
+ v-model="filterTerm"
23
44
  style="margin-bottom: 5px"
24
45
  />
46
+
47
+ <dl-button
48
+ v-if="activeDemo"
49
+ outlined
50
+ >
51
+ <span style="text-transform: capitalize">
52
+ Selected: {{ computeDemoName(activeDemo.name) }}
53
+ </span>
54
+ </dl-button>
25
55
  <dl-list
26
56
  bordered
27
57
  clickable
28
58
  style="
59
+ margin-top: 15px;
29
60
  min-width: 200px;
30
61
  height: 100%;
31
- height: calc(100vh - 60px);
62
+ height: calc(100vh - 18vh);
32
63
  overflow: auto;
33
64
  "
34
65
  >
35
66
  <template #default="{ clickable }">
36
67
  <dl-list-item
37
- v-for="(componentName, index) in Object.keys(
38
- demoState
39
- )"
40
- :key="componentName"
68
+ v-for="(demo, index) in filteredDemos"
69
+ :key="demo.name"
41
70
  :bordered="index !== 0"
42
71
  :clickable="clickable"
43
72
  :class="
44
- componentName === activeDemo ? 'selected' : ''
73
+ demo.name === activeDemo?.name ? 'selected' : ''
45
74
  "
46
75
  style="text-transform: capitalize"
47
- @click="setActiveDemo(componentName)"
76
+ @click="setActiveDemo(demo)"
48
77
  >
49
- {{ parseName(componentName) }}
78
+ {{ computeDemoName(demo.name) }}
50
79
  </dl-list-item>
51
80
  </template>
52
81
  </dl-list>
@@ -58,12 +87,18 @@
58
87
  variant="h2"
59
88
  style="text-transform: capitalize"
60
89
  >
61
- {{ parseName(activeDemo) }} component
90
+ {{
91
+ activeDemo
92
+ ? computeDemoName(activeDemo.name)
93
+ : 'No selected'
94
+ }}
95
+ component
62
96
  </dl-typography>
63
97
  </div>
64
- <component
65
- :is="demoState[activeDemo]"
66
- class="data-container"
98
+ <component
99
+ :is="activeDemo.component"
100
+ v-if="activeDemo"
101
+ class="data-container"
67
102
  />
68
103
  </div>
69
104
  </div>
@@ -71,17 +106,18 @@
71
106
  </template>
72
107
 
73
108
  <script lang="ts">
74
- import { defineComponent, ref, computed } from 'vue-demi'
109
+ import { defineComponent, ref, computed, shallowRef } from 'vue-demi'
75
110
  import {
76
111
  DlThemeProvider,
77
112
  DlButton,
78
113
  DlListItem,
79
114
  DlList,
80
115
  DlTypography,
81
- DlSearch
116
+ DlSearch,
117
+ DlSwitch,
118
+ DlIcon
82
119
  } from './components'
83
- import { demoState } from './demo'
84
- import { parseName } from './utils'
120
+ import Demos from './demos'
85
121
 
86
122
  export default defineComponent({
87
123
  name: 'DlComponentsDemo',
@@ -91,44 +127,67 @@ export default defineComponent({
91
127
  DlListItem,
92
128
  DlList,
93
129
  DlTypography,
94
- DlSearch
130
+ DlSearch,
131
+ DlSwitch,
132
+ DlIcon
95
133
  },
96
134
  props: {
97
- isDark: { required: false, default: null, type: Boolean }
135
+ isDark: { required: false, default: false, type: Boolean }
98
136
  },
99
137
  setup(props) {
100
- const hasProps = computed(() => props.isDark !== null)
101
- const darkMode = ref(false)
102
- const demos = Object.keys(demoState)
103
- const activeDemo = ref(
104
- window.localStorage.getItem('dl-active-demo') ?? demos[0] ?? ''
105
- )
106
- const setActiveDemo = (demo: string) => {
107
- activeDemo.value = demo
138
+ const darkMode = ref(props.isDark)
139
+ const filterTerm = ref('')
140
+ const names = Object.keys(Demos)
141
+ const demos: {
142
+ name: string
143
+ component: any
144
+ }[] = names.map((n: string) => ({
145
+ name: n,
146
+ // @ts-ignore
147
+ component: Demos[n]
148
+ }))
108
149
 
109
- if (demos.includes(demo)) {
110
- window.localStorage.setItem('dl-active-demo', demo)
150
+ const filteredDemos = computed(() => {
151
+ if (!filterTerm.value || !filterTerm.value.length) {
152
+ return demos
111
153
  }
112
- }
113
- const toggleColorMode = () => {
114
- darkMode.value = !darkMode.value
115
- }
116
154
 
117
- const isDarkMode = computed(() => {
118
- if (hasProps.value) {
119
- return props.isDark
120
- }
121
- return darkMode.value
155
+ return demos.filter((demo: { name: string; component: any }) => {
156
+ return demo.name
157
+ .toLowerCase()
158
+ .includes(filterTerm.value.toLowerCase())
159
+ })
122
160
  })
123
161
 
162
+ const activeDemo = shallowRef(
163
+ window.localStorage.getItem('dl-active-demo')
164
+ ? demos.find(
165
+ (d) =>
166
+ d.name ===
167
+ window.localStorage.getItem('dl-active-demo')
168
+ ) ?? null
169
+ : null
170
+ )
171
+
172
+ const setActiveDemo = (demo: { name: string; component: any }) => {
173
+ activeDemo.value = demo
174
+ filterTerm.value = ''
175
+ window.localStorage.setItem('dl-active-demo', demo.name)
176
+ }
177
+
178
+ const computeDemoName = (name: string) => {
179
+ return name.includes('Dl')
180
+ ? name.split('Demo')[0]
181
+ : 'Dl' + name.split('Demo')[0]
182
+ }
183
+
124
184
  return {
125
- hasProps,
126
- isDarkMode,
185
+ darkMode,
127
186
  activeDemo,
128
187
  setActiveDemo,
129
- toggleColorMode,
130
- demoState,
131
- parseName
188
+ filterTerm,
189
+ filteredDemos,
190
+ computeDemoName
132
191
  }
133
192
  }
134
193
  })
@@ -140,6 +140,7 @@ body {
140
140
  --dl-color-tooltip-background: #171723d9;
141
141
  --dl-color-text-darker-buttons: #171723;
142
142
  --dl-color-secondary: #3452FF;
143
+ --dl-color-secondary-opaque: #3452FF10;
143
144
  --dl-color-text-buttons: #FFFFFF;
144
145
  --dl-color-darker: #171723;
145
146
  --dl-color-medium: #767676;
@@ -189,6 +190,7 @@ body {
189
190
  --dl-color-tooltip-background: #ffffffd9;
190
191
  --dl-color-text-darker-buttons: #171723;
191
192
  --dl-color-secondary: #7C8CFF;
193
+ --dl-color-secondary-opaque: #7C8CFF10;
192
194
  --dl-color-text-buttons: #FFFFFF;
193
195
  --dl-color-darker: #ffffffcc;
194
196
  --dl-color-medium: #ffffff99;
@@ -93,7 +93,7 @@ export default defineComponent({
93
93
  },
94
94
  type: {
95
95
  type: String,
96
- default: 'success',
96
+ required: true,
97
97
  validator: (value: string) =>
98
98
  includes(['info', 'success', 'warning', 'error'], value)
99
99
  },
@@ -3,13 +3,14 @@
3
3
  :id="uuid"
4
4
  class="dl-button-container"
5
5
  style="pointer-events: none"
6
- :style="cssButtonVars"
6
+ :style="[cssButtonVars, containerStyles]"
7
7
  >
8
8
  <button
9
9
  v-if="hasContent || hasIcon"
10
10
  :tabindex="tabIndex"
11
11
  :aria-disabled="disabled ? 'true' : 'false'"
12
12
  :disabled="disabled"
13
+ :style="[cssButtonVars, styles]"
13
14
  style="pointer-events: auto"
14
15
  class="dl-button"
15
16
  @click="onClick"
@@ -20,12 +21,11 @@
20
21
  >
21
22
  {{ buttonLabel }}
22
23
  </dl-tooltip>
23
- <span class="dl-button-content dl-anchor--skip">
24
+ <div class="dl-button-content dl-anchor--skip">
24
25
  <dl-icon
25
26
  v-if="hasIcon"
26
27
  :size="iconSizePX"
27
28
  :color="iconColor || textColor"
28
- :class="{ 'dl-button-icon': hasContent }"
29
29
  :icon="icon"
30
30
  :style="cssButtonVars"
31
31
  />
@@ -33,12 +33,14 @@
33
33
  v-if="hasLabel"
34
34
  ref="buttonLabelRef"
35
35
  class="dl-button-label"
36
- :class="{ 'dl-button-no-wrap': noWrap }"
36
+ :class="{
37
+ 'dl-button-no-wrap': noWrap
38
+ }"
37
39
  >
38
40
  {{ buttonLabel }}
39
41
  </span>
40
42
  <slot />
41
- </span>
43
+ </div>
42
44
  </button>
43
45
  <dl-tooltip
44
46
  v-if="tooltip"
@@ -94,6 +96,7 @@ export default defineComponent({
94
96
  },
95
97
  iconColor: { type: String!, default: '' },
96
98
  padding: { type: String, default: '' },
99
+ margin: { type: String, default: '0 auto' },
97
100
  size: { type: String! as PropType<ButtonSizes>, default: 'm' },
98
101
  filled: { type: Boolean, default: true },
99
102
  round: { type: Boolean, default: false },
@@ -104,7 +107,8 @@ export default defineComponent({
104
107
  noWrap: Boolean,
105
108
  icon: { type: String, default: '' },
106
109
  overflow: { type: Boolean, default: false, required: false },
107
- tooltip: { type: String, default: null, required: false }
110
+ tooltip: { type: String, default: null, required: false },
111
+ styles: { type: [Object, String, Array], default: null }
108
112
  },
109
113
  emits: ['click', 'mousedown'],
110
114
  setup() {
@@ -140,6 +144,9 @@ export default defineComponent({
140
144
  hasIcon(): boolean {
141
145
  return typeof this.icon === 'string' && this.icon !== ''
142
146
  },
147
+ containerStyles(): object {
148
+ return this.fluid ? { width: '100%' } : {}
149
+ },
143
150
  hasContent(): boolean {
144
151
  return !!this.$slots.default || this.hasLabel
145
152
  },
@@ -240,6 +247,7 @@ export default defineComponent({
240
247
  : this.hasIcon && !this.hasContent
241
248
  ? setIconPadding(this.size)
242
249
  : setPadding(this.size),
250
+ '--dl-button-margin': this.margin,
243
251
  '--dl-button-font-size': setFontSize(this.size),
244
252
  '--dl-button-text-transform': this.uppercase
245
253
  ? 'uppercase'
@@ -293,8 +301,10 @@ export default defineComponent({
293
301
  overflow: hidden;
294
302
  text-overflow: ellipsis;
295
303
  }
304
+
296
305
  .dl-button {
297
306
  padding: var(--dl-button-padding);
307
+ margin: var(--dl-button-margin);
298
308
  border-radius: var(--dl-button-border-radius);
299
309
  text-transform: var(--dl-button-text-transform);
300
310
  font-family: 'Roboto', sans-serif;
@@ -313,25 +323,30 @@ export default defineComponent({
313
323
  vertical-align: middle;
314
324
  transition: all ease-in 0.15s;
315
325
  justify-content: center;
326
+
316
327
  &:active {
317
328
  transition: all ease-in 0.15s;
318
329
  color: var(--dl-button-text-color-pressed) !important;
319
330
  background-color: var(--dl-button-bg-pressed) !important;
320
331
  border-color: var(--dl-button-border-pressed) !important;
332
+
321
333
  & > span > i {
322
334
  transition: all ease-in 0.15s;
323
335
  }
324
336
  }
337
+
325
338
  &:hover:enabled:not(:active) {
326
339
  color: var(--dl-button-text-color-hover);
327
340
  background-color: var(--dl-button-bg-hover);
328
341
  border-color: var(--dl-button-border-hover);
342
+
329
343
  & .dl-button-label {
330
344
  transition: all ease-in 0.15s;
331
345
  color: var(--dl-button-color-hover);
332
346
  }
333
347
  }
334
348
  }
349
+
335
350
  .dl-button-content {
336
351
  display: flex;
337
352
  text-align: center;
@@ -344,10 +359,7 @@ export default defineComponent({
344
359
  z-index: 0;
345
360
  user-select: none !important;
346
361
  min-width: 1.5em;
347
- }
348
-
349
- .dl-button-icon {
350
- margin: var(--dl-button-icon-margin, 0px 7px 0px 0px);
362
+ gap: var(--dl-button-gap, 7px);
351
363
  }
352
364
 
353
365
  .dl-button-container {
@@ -0,0 +1,217 @@
1
+ <template>
2
+ <div
3
+ class="card"
4
+ :style="[{ width, height }, styles]"
5
+ >
6
+ <div
7
+ v-if="icon"
8
+ class="card--icon"
9
+ >
10
+ <dl-icon
11
+ :icon="icon.src"
12
+ :styles="icon?.styles"
13
+ :size="icon?.size || '50px'"
14
+ :color="icon?.color || 'var(--dl-color-darker)'"
15
+ />
16
+ </div>
17
+ <div
18
+ v-else-if="image"
19
+ class="card--image"
20
+ >
21
+ <img
22
+ :src="image.src"
23
+ :style="image?.styles"
24
+ :alt="image?.alt"
25
+ >
26
+ </div>
27
+ <div class="card--content">
28
+ <div>
29
+ <slot
30
+ v-if="!!$slots.header"
31
+ name="header"
32
+ />
33
+ <div
34
+ v-else
35
+ class="card--header"
36
+ >
37
+ <span class="card--header_title">{{ title }}</span>
38
+ <span class="card--header_shortcut">{{
39
+ keyboardShortcut
40
+ }}</span>
41
+ </div>
42
+ <slot
43
+ v-if="!!$slots.content"
44
+ name="content"
45
+ />
46
+ <span
47
+ v-else
48
+ class="card--content_text"
49
+ >{{ text }}</span>
50
+ </div>
51
+ <slot
52
+ v-if="!!$slots.footer"
53
+ name="footer"
54
+ />
55
+ <div
56
+ v-else
57
+ class="card--links"
58
+ >
59
+ <div
60
+ v-for="(link, idx) in links"
61
+ :key="idx"
62
+ class="card--links_linkItem"
63
+ >
64
+ <div class="card--links_linkItem_icon">
65
+ <dl-icon
66
+ v-if="link.icon"
67
+ :icon="link.icon"
68
+ size="12px"
69
+ />
70
+ </div>
71
+ <div class="card--links_linkItem_link">
72
+ <dl-link
73
+ :external="!!link.external"
74
+ :href="link.href"
75
+ :newtab="!!link.newtab"
76
+ >
77
+ {{ link.title }}
78
+ </dl-link>
79
+ </div>
80
+ </div>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </template>
85
+
86
+ <script lang="ts">
87
+ import { defineComponent, PropType } from 'vue-demi'
88
+ import { DlIcon } from '../../essential/DlIcon'
89
+ import { DlLink } from '../../essential/DlLink'
90
+ import { IconItem, ImageItem, LinkItem } from './types'
91
+
92
+ export default defineComponent({
93
+ name: 'DlCard',
94
+ components: { DlLink, DlIcon },
95
+ props: {
96
+ image: {
97
+ type: Object as PropType<ImageItem>,
98
+ default: null
99
+ },
100
+ icon: {
101
+ type: Object as PropType<IconItem>,
102
+ default: null
103
+ },
104
+ title: {
105
+ type: String,
106
+ default: ''
107
+ },
108
+ text: {
109
+ type: String,
110
+ default: ''
111
+ },
112
+ keyboardShortcut: {
113
+ type: String,
114
+ default: ''
115
+ },
116
+ links: {
117
+ type: Array as PropType<LinkItem[]>,
118
+ default: () => Array as PropType<LinkItem[]>
119
+ },
120
+ height: {
121
+ type: String,
122
+ default: 'auto'
123
+ },
124
+ width: {
125
+ type: String,
126
+ default: '200px'
127
+ },
128
+ styles: {
129
+ type: [Object, String, Array],
130
+ default: null
131
+ }
132
+ }
133
+ })
134
+ </script>
135
+
136
+ <style lang="scss" scoped>
137
+ .card {
138
+ color: var(--dl-color-darker);
139
+ background-color: var(--dl-color-panel-background);
140
+ border: 1px solid var(--dl-color-separator);
141
+ border-radius: 2px;
142
+ pointer-events: auto;
143
+ box-shadow: 0px 5px 15px 0px var(--dl-color-shadow);
144
+
145
+ &--content {
146
+ padding: 16px 10px;
147
+ &_text {
148
+ font-size: 12px;
149
+ color: var(--dl-color-medium);
150
+ }
151
+ }
152
+
153
+ &--header {
154
+ display: flex;
155
+ align-items: center;
156
+ flex-wrap: wrap;
157
+
158
+ &_title {
159
+ color: var(--dl-color-darker);
160
+ font-size: 14px;
161
+ line-height: 16px;
162
+ font-weight: 700;
163
+ margin-right: 10px;
164
+ margin-bottom: 10px;
165
+ }
166
+ &_shortcut {
167
+ color: #767676;
168
+ font-size: 10px;
169
+ line-height: 10px;
170
+ border-radius: 2px;
171
+ border: 1px solid #767676;
172
+ padding: 4px;
173
+ text-align: center;
174
+ margin-bottom: 10px;
175
+ }
176
+ }
177
+ &--links {
178
+ margin-top: 16px;
179
+ display: flex;
180
+ align-items: center;
181
+ flex-wrap: wrap;
182
+
183
+ &_linkItem {
184
+ margin-right: 15px;
185
+ color: var(--dl-color-secondary);
186
+ font-size: 10px;
187
+ display: flex;
188
+ align-items: center;
189
+
190
+ &_icon {
191
+ margin-right: 7px;
192
+ vertical-align: middle;
193
+ }
194
+
195
+ &_link {
196
+ vertical-align: middle;
197
+ }
198
+ }
199
+ }
200
+ &--image {
201
+ width: 200px;
202
+ height: 100px;
203
+ overflow: hidden;
204
+ img {
205
+ width: 100%;
206
+ }
207
+ }
208
+ &--icon {
209
+ display: flex;
210
+ justify-content: center;
211
+ align-items: center;
212
+ padding-top: 34px;
213
+ padding-bottom: 16px;
214
+ color: var(--dl-color-darker);
215
+ }
216
+ }
217
+ </style>