@xen-orchestra/web-core 0.13.0 → 0.14.0

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 (41) hide show
  1. package/lib/assets/css/_colors.pcss +8 -8
  2. package/lib/assets/css/base.pcss +2 -2
  3. package/lib/components/cell-object/VtsCellObject.vue +1 -1
  4. package/lib/components/console/VtsActionsConsole.vue +3 -3
  5. package/lib/components/console/VtsClipboardConsole.vue +2 -2
  6. package/lib/components/dropdown/DropdownItem.vue +1 -1
  7. package/lib/components/icon/VtsIcon.vue +2 -2
  8. package/lib/components/layout/VtsLayoutSidebar.vue +1 -1
  9. package/lib/components/resources/VtsResource.vue +43 -0
  10. package/lib/components/resources/VtsResources.vue +13 -0
  11. package/lib/components/task/VtsQuickTaskButton.vue +1 -1
  12. package/lib/components/task/VtsQuickTaskTabBar.vue +7 -1
  13. package/lib/components/tree/VtsTreeLine.vue +2 -2
  14. package/lib/components/tree/VtsTreeLoadingItem.vue +1 -1
  15. package/lib/components/ui/account-menu-button/UiAccountMenuButton.vue +3 -3
  16. package/lib/components/ui/button/UiButton.vue +46 -155
  17. package/lib/components/ui/button-icon/UiButtonIcon.vue +56 -55
  18. package/lib/components/ui/card-subtitle/UiCardSubtitle.vue +2 -2
  19. package/lib/components/ui/card-title/UiCardTitle.vue +1 -1
  20. package/lib/components/ui/checkbox/UiCheckbox.vue +35 -137
  21. package/lib/components/ui/checkbox-group/UiCheckboxGroup.vue +4 -4
  22. package/lib/components/ui/chip/ChipRemoveIcon.vue +7 -3
  23. package/lib/components/ui/counter/UiCounter.vue +17 -7
  24. package/lib/components/ui/dropdown-button/UiDropdownButton.vue +12 -12
  25. package/lib/components/ui/input/UiInput.vue +1 -1
  26. package/lib/components/ui/legend/UiLegend.vue +2 -2
  27. package/lib/components/ui/link/UiLink.vue +7 -12
  28. package/lib/components/ui/object-link/UiObjectLink.vue +3 -3
  29. package/lib/components/ui/query-search-bar/UiQuerySearchBar.vue +4 -4
  30. package/lib/components/ui/quick-task-item/UiQuickTaskItem.vue +1 -1
  31. package/lib/components/ui/radio-button/UiRadioButton.vue +30 -61
  32. package/lib/components/ui/radio-button-group/UiRadioButtonGroup.vue +4 -4
  33. package/lib/components/ui/table-pagination/PaginationButton.vue +8 -5
  34. package/lib/components/ui/table-pagination/UiTablePagination.vue +16 -16
  35. package/lib/components/ui/toaster/UiToaster.vue +1 -1
  36. package/lib/components/ui/toggle/UiToggle.vue +1 -1
  37. package/lib/components/ui/top-bottom-table/UiTopBottomTable.vue +2 -2
  38. package/lib/components/ui/tree-item-label/UiTreeItemLabel.vue +8 -8
  39. package/lib/components/ui/user-logo/UiUserLogo.vue +1 -1
  40. package/lib/layouts/CoreLayout.vue +1 -1
  41. package/package.json +1 -1
@@ -1,14 +1,9 @@
1
- <!-- v2 -->
1
+ <!-- v3 -->
2
2
  <template>
3
3
  <component :is="component" :class="classes" class="ui-link" v-bind="attributes">
4
4
  <VtsIcon :icon accent="current" />
5
5
  <slot />
6
- <VtsIcon
7
- v-if="attributes.target === '_blank'"
8
- :icon="faArrowUpRightFromSquare"
9
- accent="current"
10
- class="external-icon"
11
- />
6
+ <VtsIcon v-if="attributes.target === '_blank'" :icon="faUpRightFromSquare" accent="current" class="external-icon" />
12
7
  </component>
13
8
  </template>
14
9
 
@@ -16,7 +11,7 @@
16
11
  import VtsIcon from '@core/components/icon/VtsIcon.vue'
17
12
  import { type LinkOptions, useLinkComponent } from '@core/composables/link-component.composable'
18
13
  import type { IconDefinition } from '@fortawesome/fontawesome-common-types'
19
- import { faArrowUpRightFromSquare } from '@fortawesome/free-solid-svg-icons'
14
+ import { faUpRightFromSquare } from '@fortawesome/free-solid-svg-icons'
20
15
  import { computed } from 'vue'
21
16
 
22
17
  const props = defineProps<
@@ -41,14 +36,14 @@ const classes = computed(() => [typoClasses[props.size], { disabled: isDisabled.
41
36
  display: inline-flex;
42
37
  align-items: center;
43
38
  gap: 0.8rem;
44
- color: var(--color-info-txt-base);
39
+ color: var(--color-brand-txt-base);
45
40
 
46
41
  &:hover {
47
- color: var(--color-info-txt-hover);
42
+ color: var(--color-brand-txt-hover);
48
43
  }
49
44
 
50
45
  &:active {
51
- color: var(--color-info-txt-active);
46
+ color: var(--color-brand-txt-active);
52
47
  }
53
48
 
54
49
  &:focus-visible {
@@ -57,7 +52,7 @@ const classes = computed(() => [typoClasses[props.size], { disabled: isDisabled.
57
52
  &::before {
58
53
  content: '';
59
54
  position: absolute;
60
- inset: -0.6rem;
55
+ inset: -0.4rem;
61
56
  border: 0.2rem solid var(--color-info-txt-base);
62
57
  border-radius: 0.4rem;
63
58
  }
@@ -3,7 +3,7 @@
3
3
  <RouterLink v-if="route && !disabled" :to="route" class="ui-object-link is-link typo p3-regular-underline">
4
4
  <span class="icon">
5
5
  <slot name="icon">
6
- <UiIcon :icon accent="current" />
6
+ <VtsIcon :icon accent="current" />
7
7
  </slot>
8
8
  </span>
9
9
  <span v-tooltip class="content text-ellipsis">
@@ -13,7 +13,7 @@
13
13
  <span v-else :class="{ disabled }" class="ui-object-link typo p3-regular-underline">
14
14
  <span class="icon">
15
15
  <slot name="icon">
16
- <UiIcon :icon accent="current" />
16
+ <VtsIcon :icon accent="current" />
17
17
  </slot>
18
18
  </span>
19
19
  <slot />
@@ -21,7 +21,7 @@
21
21
  </template>
22
22
 
23
23
  <script lang="ts" setup>
24
- import UiIcon from '@core/components/icon/VtsIcon.vue'
24
+ import VtsIcon from '@core/components/icon/VtsIcon.vue'
25
25
  import { vTooltip } from '@core/directives/tooltip.directive'
26
26
  import type { IconDefinition } from '@fortawesome/fontawesome-common-types'
27
27
  import { type RouteLocationRaw } from 'vue-router'
@@ -14,12 +14,12 @@
14
14
  :placeholder="$t('core.query-search-bar.placeholder')"
15
15
  />
16
16
  <template v-if="uiStore.isDesktop">
17
- <UiButton size="medium" accent="info" variant="primary" type="submit">{{ $t('core.search') }}</UiButton>
17
+ <UiButton size="medium" accent="brand" variant="primary" type="submit">{{ $t('core.search') }}</UiButton>
18
18
  <VtsDivider type="stretch" />
19
19
  <UiButton
20
20
  v-tooltip="$t('coming-soon')"
21
21
  size="medium"
22
- accent="info"
22
+ accent="brand"
23
23
  variant="secondary"
24
24
  :left-icon="faFilter"
25
25
  disabled
@@ -28,8 +28,8 @@
28
28
  </UiButton>
29
29
  </template>
30
30
  <template v-else>
31
- <UiButtonIcon accent="info" size="medium" type="submit" :icon="faMagnifyingGlass" />
32
- <UiButtonIcon accent="info" size="medium" disabled :icon="faFilter" />
31
+ <UiButtonIcon accent="brand" size="medium" type="submit" :icon="faMagnifyingGlass" />
32
+ <UiButtonIcon accent="brand" size="medium" disabled :icon="faFilter" />
33
33
  </template>
34
34
  </form>
35
35
  </template>
@@ -2,7 +2,7 @@
2
2
  <template>
3
3
  <li class="ui-quick-task-item">
4
4
  <div v-if="hasSubTasks" class="toggle" @click="toggleExpand()">
5
- <UiButtonIcon accent="info" :icon="isExpanded ? faAngleDown : faAngleRight" size="small" />
5
+ <UiButtonIcon accent="brand" :icon="isExpanded ? faAngleDown : faAngleRight" size="small" />
6
6
  </div>
7
7
  <div class="content">
8
8
  <div class="typo p1-medium">
@@ -17,7 +17,7 @@ import { faCircle } from '@fortawesome/free-solid-svg-icons'
17
17
  import { computed } from 'vue'
18
18
 
19
19
  const { accent, value, disabled } = defineProps<{
20
- accent: 'info' | 'success' | 'warning' | 'danger'
20
+ accent: 'brand' | 'warning' | 'danger'
21
21
  value: any
22
22
  disabled?: boolean
23
23
  }>()
@@ -65,19 +65,6 @@ const isDisabled = useDisabled(() => disabled)
65
65
  }
66
66
  }
67
67
 
68
- &:has(.input:disabled) {
69
- cursor: not-allowed;
70
-
71
- /*
72
- TODO: To be removed or kept after a decision has been taken
73
- See https://www.figma.com/design/l2O2VvzJRnOCvqxhM7d124?node-id=8-1940#1021964394
74
- */
75
-
76
- &:not(:has(.input:checked)) {
77
- --accent-color: var(--color-neutral-txt-secondary);
78
- }
79
- }
80
-
81
68
  &:has(.input:checked) {
82
69
  background-color: var(--accent-color);
83
70
  }
@@ -95,58 +82,37 @@ const isDisabled = useDisabled(() => disabled)
95
82
  .radio-icon {
96
83
  font-size: 0.8rem;
97
84
  position: absolute;
98
- opacity: 0;
99
- transition: opacity 0.125s ease-in-out;
85
+ transition: font-size 0.125s ease-in-out;
86
+ color: var(--radio-icon-color);
87
+ --radio-icon-color: var(--color-neutral-background-primary);
100
88
  }
101
89
 
102
- .input:disabled + .radio-icon {
103
- color: var(--color-neutral-txt-secondary);
90
+ .input:not(:checked) + .radio-icon {
91
+ font-size: 1.2rem;
104
92
  }
105
93
 
106
- .input:checked + .radio-icon {
107
- opacity: 1;
94
+ .input:disabled + .radio-icon {
95
+ --radio-icon-color: var(--color-neutral-background-disabled);
108
96
  }
109
97
  }
110
98
 
111
99
  /* ACCENT */
112
100
 
113
- &.accent--info {
114
- --accent-color: var(--color-info-item-base);
115
-
116
- &:hover {
117
- --accent-color: var(--color-info-item-hover);
118
- }
119
-
120
- &:active {
121
- --accent-color: var(--color-info-item-active);
122
- }
123
-
124
- &:has(.input:disabled) {
125
- --accent-color: var(--color-info-item-disabled);
126
- }
127
-
128
- .radio-icon {
129
- color: var(--color-info-txt-item);
130
- }
131
- }
132
-
133
- &.accent--success {
134
- --accent-color: var(--color-success-item-base);
101
+ &.accent--brand {
102
+ --accent-color: var(--color-brand-item-base);
135
103
 
136
104
  &:hover {
137
- --accent-color: var(--color-success-item-hover);
105
+ --accent-color: var(--color-brand-item-hover);
138
106
  }
139
107
 
140
108
  &:active {
141
- --accent-color: var(--color-success-item-active);
109
+ --accent-color: var(--color-brand-item-active);
142
110
  }
143
111
 
144
- &:has(.input:disabled) {
145
- --accent-color: var(--color-success-item-disabled);
146
- }
147
-
148
- .radio-icon {
149
- color: var(--color-success-txt-item);
112
+ &:has(.input:checked:not(:disabled)) {
113
+ .radio-icon {
114
+ --radio-icon-color: var(--color-brand-txt-item);
115
+ }
150
116
  }
151
117
  }
152
118
 
@@ -161,12 +127,10 @@ const isDisabled = useDisabled(() => disabled)
161
127
  --accent-color: var(--color-warning-item-active);
162
128
  }
163
129
 
164
- &:has(.input:disabled) {
165
- --accent-color: var(--color-warning-item-disabled);
166
- }
167
-
168
- .radio-icon {
169
- color: var(--color-warning-txt-item);
130
+ &:has(.input:checked:not(:disabled)) {
131
+ .radio-icon {
132
+ --radio-icon-color: var(--color-warning-txt-item);
133
+ }
170
134
  }
171
135
  }
172
136
 
@@ -181,13 +145,18 @@ const isDisabled = useDisabled(() => disabled)
181
145
  --accent-color: var(--color-danger-item-active);
182
146
  }
183
147
 
184
- &:has(.input:disabled) {
185
- --accent-color: var(--color-danger-item-disabled);
148
+ &:has(.input:checked:not(:disabled)) {
149
+ .radio-icon {
150
+ --radio-icon-color: var(--color-danger-txt-item);
151
+ }
186
152
  }
153
+ }
187
154
 
188
- .radio-icon {
189
- color: var(--color-danger-txt-item);
190
- }
155
+ /* DISABLED */
156
+
157
+ &:has(.input:disabled) {
158
+ cursor: not-allowed;
159
+ --accent-color: var(--color-neutral-txt-secondary);
191
160
  }
192
161
  }
193
162
  </style>
@@ -10,7 +10,7 @@
10
10
  <slot />
11
11
  </div>
12
12
  <slot v-if="slots.info || info !== undefined" name="info">
13
- <UiInfo :accent>
13
+ <UiInfo :accent="accent === 'brand' ? 'info' : accent">
14
14
  {{ info }}
15
15
  </UiInfo>
16
16
  </slot>
@@ -22,8 +22,8 @@ import UiInfo from '@core/components/ui/info/UiInfo.vue'
22
22
  import UiLabel from '@core/components/ui/label/UiLabel.vue'
23
23
  import { computed } from 'vue'
24
24
 
25
- const props = defineProps<{
26
- accent: 'info' | 'warning' | 'danger'
25
+ const { accent } = defineProps<{
26
+ accent: 'brand' | 'warning' | 'danger'
27
27
  label?: string
28
28
  info?: string
29
29
  vertical?: boolean
@@ -34,7 +34,7 @@ const slots = defineSlots<{
34
34
  label?(): any
35
35
  info?(): any
36
36
  }>()
37
- const labelAccent = computed(() => (props.accent === 'info' ? 'neutral' : props.accent))
37
+ const labelAccent = computed(() => (accent === 'brand' ? 'neutral' : accent))
38
38
  </script>
39
39
 
40
40
  <style scoped lang="postcss">
@@ -1,28 +1,31 @@
1
1
  <template>
2
- <UiButtonIcon :disabled accent="info" class="pagination-button" size="small" :icon />
2
+ <UiButtonIcon :disabled accent="brand" class="pagination-button" size="medium" :icon />
3
3
  </template>
4
4
 
5
5
  <script setup lang="ts">
6
6
  import UiButtonIcon from '@core/components/ui/button-icon/UiButtonIcon.vue'
7
7
  import type { IconDefinition } from '@fortawesome/fontawesome-common-types'
8
8
 
9
- const { disabled, icon } = defineProps<{
9
+ defineProps<{
10
10
  disabled: boolean
11
11
  icon: IconDefinition
12
12
  }>()
13
13
  </script>
14
14
 
15
15
  <style scoped lang="postcss">
16
- .pagination-button.accent--info {
16
+ .pagination-button.accent--brand {
17
17
  border: 0.1rem solid var(--color-neutral-border);
18
18
  font-size: 1rem;
19
+ /* Override UiButtonIcon size to match DS */
20
+ width: 3rem;
21
+ height: 3rem;
19
22
 
20
23
  &:hover {
21
- border-color: var(--color-info-item-hover);
24
+ border-color: var(--color-brand-item-hover);
22
25
  }
23
26
 
24
27
  &:active {
25
- border-color: var(--color-info-item-active);
28
+ border-color: var(--color-brand-item-active);
26
29
  }
27
30
 
28
31
  &:disabled {
@@ -1,4 +1,4 @@
1
- <!-- v2 -->
1
+ <!-- v3 -->
2
2
  <template>
3
3
  <div class="ui-table-pagination">
4
4
  <div class="buttons-container">
@@ -111,21 +111,21 @@ watch([currentPage, currentPageSize], ([newPage, newPageSize]) => {
111
111
  .dropdown {
112
112
  cursor: pointer;
113
113
  padding: 0.2rem 0.6rem;
114
- height: 2.6rem;
115
- width: 4.8rem;
114
+ height: 3rem;
115
+ width: 5rem;
116
116
  appearance: none;
117
117
  border-radius: 0.4rem;
118
- color: var(--color-info-txt-base);
118
+ color: var(--color-brand-txt-base);
119
119
  border: 0.1rem solid var(--color-neutral-border);
120
120
  background-color: var(--color-neutral-background-primary);
121
121
 
122
122
  &:hover {
123
- border-color: var(--color-info-item-hover);
124
- background-color: var(--color-info-background-hover);
125
- color: var(--color-info-txt-hover);
123
+ border-color: var(--color-brand-item-hover);
124
+ background-color: var(--color-brand-background-hover);
125
+ color: var(--color-brand-txt-hover);
126
126
 
127
127
  + .icon {
128
- color: var(--color-info-txt-hover);
128
+ color: var(--color-brand-txt-hover);
129
129
  }
130
130
  }
131
131
 
@@ -141,18 +141,18 @@ watch([currentPage, currentPageSize], ([newPage, newPageSize]) => {
141
141
  }
142
142
 
143
143
  &:active {
144
- background-color: var(--color-info-background-active);
145
- border-color: var(--color-info-item-active);
144
+ background-color: var(--color-brand-background-active);
145
+ border-color: var(--color-brand-item-active);
146
146
  }
147
147
 
148
148
  &:focus-visible {
149
- outline: 0.1rem solid var(--color-info-item-base);
150
- border: 0.1rem solid var(--color-info-item-base);
151
- color: var(--color-info-txt-base);
152
- background-color: var(--color-info-background-selected);
149
+ outline: 0.1rem solid var(--color-brand-item-base);
150
+ border: 0.1rem solid var(--color-brand-item-base);
151
+ color: var(--color-brand-txt-base);
152
+ background-color: var(--color-brand-background-selected);
153
153
 
154
154
  + .icon {
155
- color: var(--color-info-txt-base);
155
+ color: var(--color-brand-txt-base);
156
156
  }
157
157
  }
158
158
 
@@ -171,7 +171,7 @@ watch([currentPage, currentPageSize], ([newPage, newPageSize]) => {
171
171
  transform: translateY(-50%);
172
172
  pointer-events: none;
173
173
  font-size: 1rem;
174
- color: var(--color-info-txt-base);
174
+ color: var(--color-brand-txt-base);
175
175
  }
176
176
  }
177
177
  }
@@ -11,7 +11,7 @@
11
11
  <slot name="description" />
12
12
  </div>
13
13
  </div>
14
- <UiButtonIcon class="close-icon" :icon="faXmark" :accent size="medium" />
14
+ <UiButtonIcon class="close-icon" :icon="faXmark" accent="brand" size="medium" />
15
15
  </div>
16
16
  <div v-if="slots.actions" class="actions">
17
17
  <slot name="actions" />
@@ -68,7 +68,7 @@ const isDisabled = useDisabled(() => disabled)
68
68
  position: absolute;
69
69
  content: '';
70
70
  inset: -0.5rem;
71
- border: 0.2rem solid var(--color-normal-txt-base);
71
+ border: 0.2rem solid var(--color-info-txt-base);
72
72
  border-radius: 0.4rem;
73
73
  }
74
74
  }
@@ -8,7 +8,7 @@
8
8
 
9
9
  <UiButton
10
10
  :disabled="selectedItems === totalItems"
11
- accent="info"
11
+ accent="brand"
12
12
  size="small"
13
13
  variant="tertiary"
14
14
  @click="emit('toggleSelectAll', true)"
@@ -17,7 +17,7 @@
17
17
  </UiButton>
18
18
  <UiButton
19
19
  :disabled="selectedItems === 0"
20
- accent="info"
20
+ accent="brand"
21
21
  size="small"
22
22
  variant="tertiary"
23
23
  @click="emit('toggleSelectAll', false)"
@@ -1,4 +1,4 @@
1
- <!-- v2 -->
1
+ <!-- v3 -->
2
2
  <template>
3
3
  <RouterLink v-slot="{ isExactActive, isActive, href, navigate }" :to="route" custom>
4
4
  <div
@@ -18,7 +18,7 @@
18
18
  v-if="hasToggle"
19
19
  v-tooltip="isExpanded ? $t('core.close') : $t('core.open')"
20
20
  class="toggle"
21
- accent="info"
21
+ accent="brand"
22
22
  :icon="isExpanded ? faAngleDown : faAngleRight"
23
23
  size="small"
24
24
  :target-scale="{ x: 1.5, y: 2 }"
@@ -27,7 +27,7 @@
27
27
  <div v-else class="h-line" />
28
28
  <a v-tooltip="{ selector: '.text' }" :href class="link typo p2-medium" @click="navigate">
29
29
  <slot name="icon">
30
- <UiIcon :icon accent="current" class="icon" />
30
+ <VtsIcon :icon accent="current" class="icon" />
31
31
  </slot>
32
32
  <div class="text text-ellipsis">
33
33
  <slot />
@@ -39,7 +39,7 @@
39
39
  </template>
40
40
 
41
41
  <script lang="ts" setup>
42
- import UiIcon from '@core/components/icon/VtsIcon.vue'
42
+ import VtsIcon from '@core/components/icon/VtsIcon.vue'
43
43
  import VtsTreeLine from '@core/components/tree/VtsTreeLine.vue'
44
44
  import UiButtonIcon from '@core/components/ui/button-icon/UiButtonIcon.vue'
45
45
  import { vTooltip } from '@core/directives/tooltip.directive'
@@ -114,22 +114,22 @@ const depth = inject(IK_TREE_LIST_DEPTH, 0)
114
114
 
115
115
  .h-line {
116
116
  width: 2rem;
117
- border-bottom: 0.1rem solid var(--color-info-txt-base);
117
+ border-bottom: 0.1rem solid var(--color-brand-txt-base);
118
118
  margin-left: -0.4rem;
119
119
  }
120
120
 
121
121
  /* INTERACTION VARIANTS */
122
122
 
123
123
  &:is(.exact-active, .active) {
124
- background-color: var(--color-info-background-selected);
124
+ background-color: var(--color-brand-background-selected);
125
125
  }
126
126
 
127
127
  &:hover {
128
- background-color: var(--color-info-background-hover);
128
+ background-color: var(--color-brand-background-hover);
129
129
  }
130
130
 
131
131
  &:active {
132
- background-color: var(--color-info-background-active);
132
+ background-color: var(--color-brand-background-active);
133
133
  }
134
134
  }
135
135
  </style>
@@ -18,7 +18,7 @@ defineProps<{
18
18
  display: block;
19
19
  background: var(--color-neutral-txt-primary) url('../../../assets/user.png') no-repeat;
20
20
  border-style: solid;
21
- border-color: var(--color-info-item-base);
21
+ border-color: var(--color-brand-item-base);
22
22
  border-radius: 20rem;
23
23
 
24
24
  /* SIZE VARIANTS */
@@ -7,7 +7,7 @@
7
7
  content: sidebarStore.isExpanded ? $t('core.sidebar.close') : $t('core.sidebar.open'),
8
8
  placement: 'right',
9
9
  }"
10
- accent="info"
10
+ accent="brand"
11
11
  size="medium"
12
12
  :icon="sidebarStore.isExpanded ? faAngleDoubleLeft : faBars"
13
13
  class="sidebar-toggle"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xen-orchestra/web-core",
3
3
  "type": "module",
4
- "version": "0.13.0",
4
+ "version": "0.14.0",
5
5
  "private": false,
6
6
  "exports": {
7
7
  "./*": {