PluginProbe
The Innovative Form Builder – IvyForms / 0.2
The Innovative Form Builder – IvyForms v0.2
1.5.1 1.5 1.4.1 1.4 trunk 0.1.2 0.2 0.2.1 0.3 0.3.1 0.4 0.5 0.6 0.6.1 0.6.1-backup 0.6.1.1 0.7 0.8 0.8.1 0.8.2 0.9 0.9.1 1.0 1.1 1.1.1 All 27 releases
ivyforms / frontend / src / views / _components / dropdown / IvyDropdownItem.vue

IvyDropdownItem.vue in The Innovative Form Builder – IvyForms 0.2, at frontend/src/views/_components/dropdown/IvyDropdownItem.vue

177 lines 3.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <template>
2 <!-- Dropdown Item -->
3 <div class="ivyforms-dropdown-item-wrapper">
4 <ElDropdownItem
5 class="ivyforms-dropdown-item"
6 :command="props.command"
7 :disabled="props.disabled"
8 :divided="props.divided"
9 :class="[
10 {
11 'is-danger': props.danger,
12 },
13 ]"
14 >
15 <div
16 class="ivyforms-dropdown-item__wrapper"
17 :class="[
18 {
19 'is-disabled': props.disabled,
20 'is-with-icon': Boolean(props.icon),
21 },
22 ]"
23 >
24 <IvyIcon
25 v-if="props.icon"
26 :name="props.icon"
27 :category="props.iconCategory"
28 size="d"
29 class="ivyforms-dropdown-item__icon"
30 />
31 <span class="ivyforms-dropdown-item__label regular-14">
32 <slot />
33 </span>
34 </div>
35 </ElDropdownItem>
36 </div>
37 <!-- /Dropdown Item -->
38 </template>
39
40 <script setup lang="ts">
41 import type { IconCategory } from '@/types/icons/icon-category'
42
43 interface Props {
44 command: string | number | object
45 icon?: string
46 iconCategory?: IconCategory
47 disabled?: boolean
48 danger?: boolean
49 divided?: boolean
50 }
51
52 const props = withDefaults(defineProps<Props>(), {
53 command: undefined,
54 danger: false,
55 iconCategory: 'global',
56 icon: undefined,
57 })
58 </script>
59
60 <style lang="scss">
61 @use 'sass:list' as *;
62 @use 'sass:meta' as *;
63 // Dropdown Item Wrapper
64 .ivyforms-dropdown-item-wrapper {
65 // Dropdown Item
66 .ivyforms-dropdown-item {
67 // Not Divider
68 &:not(.el-dropdown-menu__item--divided) {
69 padding: 0 8px;
70 height: 36px;
71 overflow: hidden;
72 border-radius: 0;
73 cursor: pointer;
74 -webkit-tap-highlight-color: transparent;
75 color: var(--map-base-yankees-text-0);
76 }
77
78 // Divided
79 &.el-dropdown-menu__item--divided {
80 border-top: 1px solid var(--theme-divider);
81 margin: 2px 4px;
82 }
83
84 // Hover & Focus
85 &:hover:not(.is-disabled),
86 &:focus {
87 background: var(--theme-hover);
88 color: initial;
89 }
90
91 // Active
92 &:active:not(.is-disabled) {
93 background: var(--theme-main-brand-o10);
94
95 // Label
96 .ivyforms-dropdown-item__label {
97 color: var(--theme-main-brand-0);
98 }
99
100 // Icon
101 .ivyforms-dropdown-item__icon {
102 fill: var(--theme-main-brand-0);
103 }
104 }
105
106 // Disabled
107 &.is-disabled {
108 cursor: not-allowed;
109 }
110
111 // Danger
112 &.is-danger {
113 // Text
114 span {
115 color: var(--map-status-error-symbol-2);
116 }
117
118 // Hover
119 &:hover:not(.is-disabled) {
120 background: var(--theme-accent-error-o5);
121 }
122
123 // Active
124 &:active:not(.is-disabled) {
125 background: var(--theme-accent-error-o10);
126
127 // Text
128 span {
129 color: var(--map-status-error-symbol-1);
130 }
131
132 // Icon
133 .ivyforms-dropdown-item__icon {
134 fill: var(--map-status-error-symbol-2);
135 }
136 }
137
138 // Icon
139 .ivyforms-dropdown-item__icon {
140 fill: var(--map-status-error-symbol-2);
141 }
142 }
143
144 // Wrapper
145 &__wrapper {
146 width: 100%;
147 height: 100%;
148 border-radius: 5px;
149 cursor: pointer;
150 display: flex;
151 align-items: center;
152 gap: 4px;
153
154 // Disabled
155 &.is-disabled {
156 color: var(--map-base-yankees-text-0);
157 pointer-events: none;
158 opacity: 0.5;
159 }
160 }
161
162 // Icon
163 &__icon {
164 fill: var(--map-base-danube-symbol-2);
165 @include flipProperty('margin-left', 'margin-right', -4px);
166 }
167
168 // Label
169 &__label {
170 display: inline-flex;
171 align-items: center;
172 flex-grow: 1;
173 }
174 }
175 }
176 </style>
177