@appscode/design-system 1.0.43-alpha.129 → 1.0.43-alpha.131

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.
@@ -551,6 +551,32 @@
551
551
  }
552
552
  }
553
553
 
554
+ .ac-menu-item {
555
+ li {
556
+ &.is-close {
557
+ ul {
558
+ max-height: 0;
559
+ visibility: hidden;
560
+ transition: max-height 0.25s ease-out;
561
+ }
562
+ }
563
+ &.is-open {
564
+ ul {
565
+ max-height: 200px;
566
+ visibility: visible;
567
+ transition: max-height 0.25s ease-out;
568
+ }
569
+ }
570
+ }
571
+ .is-fullwidth {
572
+ width: 100%;
573
+ }
574
+ .navbar-dropdown-wrapper {
575
+ width: 300px;
576
+ transition: width 0.9s ease-in-out;
577
+ }
578
+ }
579
+
554
580
  // start dark theme
555
581
  .is-dark-theme {
556
582
  body {
@@ -0,0 +1,261 @@
1
+ .sidebar-appear-enter-active,
2
+ .sidebar-appear-leave-active {
3
+ position: absolute;
4
+ width: 270px;
5
+ transition: all 0.2s ease;
6
+ }
7
+ .sidebar-appear-enter-from {
8
+ left: -100%;
9
+ opacity: 0;
10
+ }
11
+ .sidebar-appear-enter-to {
12
+ left: 0px;
13
+ opacity: 1;
14
+ }
15
+ .sidebar-appear-leave-from {
16
+ left: 0px;
17
+ opacity: 1;
18
+ }
19
+ .sidebar-appear-leave-to {
20
+ left: 100%;
21
+ opacity: 0;
22
+ }
23
+
24
+ .navbar-appear-enter-active,
25
+ .navbar-appear-leave-active {
26
+ position: absolute;
27
+ height: 50px;
28
+ transition: all 0.2s ease;
29
+ }
30
+ .navbar-appear-enter-from {
31
+ top: -100%;
32
+ opacity: 0;
33
+ }
34
+ .navbar-appear-enter-to {
35
+ top: 0px;
36
+ opacity: 1;
37
+ }
38
+ .navbar-appear-leave-from {
39
+ top: 0px;
40
+ opacity: 1;
41
+ }
42
+ .navbar-appear-leave-to {
43
+ top: 100%;
44
+ opacity: 0;
45
+ }
46
+
47
+ .nested-enter-active .inner,
48
+ .nested-leave-active .inner {
49
+ transition: all 0.2s ease-in-out;
50
+ }
51
+
52
+ .nested-enter-from .inner,
53
+ .nested-leave-to .inner {
54
+ transform: translateX(20px);
55
+ opacity: 0;
56
+ }
57
+
58
+ .slide-left-enter-active,
59
+ .slide-left-leave-active {
60
+ transition: all 0.3s ease-in-out;
61
+ }
62
+ .slide-left-enter-from {
63
+ transform: translateX(20px);
64
+ opacity: 0;
65
+ }
66
+ .slide-left-enter-to {
67
+ transform: translateX(0px);
68
+ opacity: 1;
69
+ }
70
+ .slide-left-leave-from {
71
+ transform: translateX(0px);
72
+ opacity: 1;
73
+ }
74
+ .slide-left-leave-to {
75
+ transform: translateX(-20px);
76
+ opacity: 0;
77
+ }
78
+
79
+ .slide-right-enter-active,
80
+ .slide-right-leave-active {
81
+ transition: all 0.2s ease-in-out;
82
+ }
83
+ .slide-right-enter-from {
84
+ transform: translateX(-20px);
85
+ opacity: 0;
86
+ }
87
+ .slide-right-enter-to {
88
+ transform: translateX(0px);
89
+ opacity: 1;
90
+ }
91
+ .slide-right-leave-from {
92
+ transform: translateX(0px);
93
+ opacity: 1;
94
+ }
95
+ .slide-right-leave-to {
96
+ transform: translateX(20px);
97
+ opacity: 0;
98
+ }
99
+
100
+ .slide-down-enter-active,
101
+ .slide-down-leave-active {
102
+ transition: all 0.2s ease-in-out;
103
+ }
104
+ .slide-down-enter-from {
105
+ transform: translateY(-10px);
106
+ opacity: 0;
107
+ }
108
+ .slide-down-enter-to {
109
+ transform: translateY(0px);
110
+ opacity: 1;
111
+ }
112
+ .slide-down-leave-from {
113
+ transform: translateY(0px);
114
+ opacity: 1;
115
+ }
116
+ .slide-down-leave-to {
117
+ transform: translateY(-10px);
118
+ opacity: 0;
119
+ }
120
+
121
+ .fade-enter-active,
122
+ .fade-leave-active {
123
+ transition: all 0.2s ease-in-out;
124
+ }
125
+ .fade-enter-from {
126
+ opacity: 0;
127
+ }
128
+ .fade-enter-to {
129
+ opacity: 1;
130
+ }
131
+ .fade-leave-from {
132
+ opacity: 1;
133
+ }
134
+ .fade-leave-to {
135
+ opacity: 0;
136
+ }
137
+
138
+ .list-move, /* apply transition to moving elements */
139
+ .list-enter-active,
140
+ .list-leave-active {
141
+ transition: all 0.5s ease;
142
+ }
143
+
144
+ .list-enter-from,
145
+ .list-leave-to {
146
+ opacity: 0;
147
+ transform: translateX(35px);
148
+ }
149
+
150
+ .list-leave-active {
151
+ position: absolute;
152
+ }
153
+
154
+ .overview-card-enter-active {
155
+ transition: all 0.2s ease-in-out;
156
+ }
157
+ .overview-card-leave-active {
158
+ transition: all 0.2s ease-in-out;
159
+ position: absolute;
160
+ }
161
+ .overview-card-enter-from {
162
+ transform: translateY(-20px);
163
+ opacity: 0;
164
+ }
165
+ .overview-card-enter-to {
166
+ transform: translateY(0px);
167
+ opacity: 1;
168
+ }
169
+ .overview-card-leave-from {
170
+ transform: translateY(0px);
171
+ opacity: 1;
172
+ }
173
+ .overview-card-leave-to {
174
+ transform: translateY(-10px);
175
+ opacity: 0;
176
+ }
177
+
178
+ .cluster-card-enter-active {
179
+ transition: all 0.2s ease-in-out;
180
+ }
181
+ .cluster-card-leave-active {
182
+ transition: all 0s;
183
+ position: absolute;
184
+ }
185
+ .cluster-card-enter-from {
186
+ transform: translateX(-20px);
187
+ opacity: 0;
188
+ }
189
+ .cluster-card-enter-to {
190
+ transform: translateX(0px);
191
+ opacity: 1;
192
+ }
193
+ .cluster-card-leave-from {
194
+ transform: translateX(0px);
195
+ opacity: 1;
196
+ }
197
+ .cluster-card-leave-to {
198
+ opacity: 0;
199
+ }
200
+
201
+ .dropdown-animate.dropdown-show-animation .dropdown-content {
202
+ animation: dropdownAnim 0.2s ease-in-out;
203
+ }
204
+ .dropdown-animate.dropdown-hide-animation .dropdown-content {
205
+ animation: dropdownAnim reverse 0.2s ease-in-out;
206
+ }
207
+
208
+ @keyframes dropdownAnim {
209
+ 0% {
210
+ opacity: 0;
211
+ transform: translateY(-10px);
212
+ }
213
+ 100% {
214
+ opacity: 1;
215
+ transform: translateY(0px);
216
+ }
217
+ }
218
+
219
+ .accordion-enter-active,
220
+ .accordion-leave-active {
221
+ transition: all 0.3s ease-in-out;
222
+ position: relative;
223
+ }
224
+ .accordion-enter-from {
225
+ top: -10px;
226
+ opacity: 0;
227
+ }
228
+ .accordion-enter-to {
229
+ top: 0px;
230
+ opacity: 1;
231
+ }
232
+ .accordion-leave-from {
233
+ top: 0px;
234
+ opacity: 1;
235
+ }
236
+ .accordion-leave-to {
237
+ top: -10px;
238
+ opacity: 0;
239
+ }
240
+
241
+ .fa.fa-spinner.spin {
242
+ -webkit-animation: spin 1s linear infinite;
243
+ -moz-animation: spinAnim 1s linear infinite;
244
+ animation: spinAnim 1s linear infinite;
245
+ }
246
+ @-moz-keyframes spinAnim {
247
+ 100% {
248
+ -moz-transform: rotate(360deg);
249
+ }
250
+ }
251
+ @-webkit-keyframes spinAnim {
252
+ 100% {
253
+ -webkit-transform: rotate(360deg);
254
+ }
255
+ }
256
+ @keyframes spinAnim {
257
+ 100% {
258
+ -webkit-transform: rotate(360deg);
259
+ transform: rotate(360deg);
260
+ }
261
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appscode/design-system",
3
- "version": "1.0.43-alpha.129",
3
+ "version": "1.0.43-alpha.131",
4
4
  "description": "A design system for Appscode websites and dashboards made using Bulma",
5
5
  "main": "main.scss",
6
6
  "scripts": {
@@ -4,6 +4,7 @@
4
4
  :class="`${modifierClasses}${isLoaderActive ? ' is-loading' : ''}`"
5
5
  :disabled="disabled"
6
6
  @click="handleClick"
7
+ :title="tooltip"
7
8
  >
8
9
  <span v-if="iconClass || iconImage" class="icon is-small">
9
10
  <img
@@ -27,6 +28,10 @@ export default {
27
28
  type: String,
28
29
  default: "",
29
30
  },
31
+ tooltip: {
32
+ type: String,
33
+ defualt: undefined
34
+ },
30
35
  // for loader
31
36
  isLoaderActive: {
32
37
  type: Boolean,
@@ -7,7 +7,7 @@
7
7
  <img :src="user.avatar_url" alt="User Photo" />
8
8
  </div>
9
9
  </button>
10
- <navbar-item-content>
10
+ <navbar-item-content class="navbar-dropdown-wrapper">
11
11
  <div v-if="user.username" class="user-profile-wrapper">
12
12
  <div class="profile-area">
13
13
  <div class="profile-photo">
@@ -19,22 +19,94 @@
19
19
  <a :href="`mailto:${user.email}`"> {{ user.email }}</a>
20
20
  </div>
21
21
  </div>
22
- <ul>
23
- <li>
22
+ <transition-group name="list" tag="ul">
23
+ <li key="settings">
24
24
  <a :href="`${serverDomain}/user/settings/`">Settings</a>
25
25
  </li>
26
- <template v-if="user.is_admin">
27
- <li>
28
- <a :href="`${serverDomain}/admin`"> Site Administration </a>
29
- </li>
30
- </template>
31
- <li>
26
+ <li v-if="user.is_admin" key="site-admin">
27
+ <a :href="`${serverDomain}/admin`">Site Administration</a>
28
+ </li>
29
+ <li v-if="showAccountSwithcer" :class="`is-${dropDownStatus}`" key="switcher">
30
+ <a class="
31
+ ac-dropdown-button
32
+ is-fullwidth
33
+ is-flex
34
+ is-justify-content-space-between
35
+ is-align-items-center
36
+ "
37
+ @click="toggleList()"
38
+ >
39
+ <span>Switch Account</span>
40
+ <span
41
+ ><i
42
+ :class="`fa fa-angle-${
43
+ dropDownStatus === 'open' ? 'up' : 'down'
44
+ }`"
45
+ ></i
46
+ ></span>
47
+ </a>
48
+ <transition-group name="list" tag="ul"
49
+ class="ac-vscrollbar"
50
+ ref="dropdownItems"
51
+ :style="{ maxHeight: dropDownSectionHeight }"
52
+ >
53
+ <li
54
+ v-for="(org, idx) in formattedOrganizations"
55
+ :key="org.username"
56
+ >
57
+ <a
58
+ class="is-flex is-align-items-center"
59
+ @click="onOrganizationClick(org.username)"
60
+ >
61
+ <div class="width-30 height-30 image">
62
+ <img
63
+ :src="org.avatar_url"
64
+ class="ac-user-profile is-rounded"
65
+ alt="icon"
66
+ />
67
+ </div>
68
+ <div
69
+ class="
70
+ is-flex
71
+ is-align-items-center
72
+ is-justify-content-space-between
73
+ is-fullwidth
74
+ ml-10
75
+ "
76
+ >
77
+ <div class="org-info">
78
+ <strong>{{ org.username }}</strong>
79
+ <p>
80
+ {{
81
+ org.isPersonalAccount
82
+ ? "Personal Account"
83
+ : "Organization"
84
+ }}
85
+ </p>
86
+ </div>
87
+ <span
88
+ v-if="idx === 0"
89
+ class="
90
+ material-icons-outlined
91
+ font-size-18
92
+ ml-10
93
+ is-pulled-right
94
+ "
95
+ >
96
+ check
97
+ </span>
98
+ </div>
99
+ </a>
100
+ </li>
101
+ </transition-group>
102
+ </li>
103
+ <li key="dashboard">
32
104
  <a :href="`${serverDomain}/dashboard`"> Dashboard </a>
33
105
  </li>
34
- <li>
106
+ <li key="signout">
35
107
  <a :href="`${serverDomain}/user/logout`"> Sign out </a>
36
108
  </li>
37
- </ul>
109
+ </transition-group>
38
110
  </div>
39
111
  </navbar-item-content>
40
112
  </navbar-item>
@@ -43,6 +115,7 @@
43
115
  <script>
44
116
  export default {
45
117
  props: {
118
+ // active user info
46
119
  user: {
47
120
  type: Object,
48
121
  default: () => ({}),
@@ -51,11 +124,77 @@ export default {
51
124
  type: String,
52
125
  default: "",
53
126
  },
127
+ showAccountSwithcer: {
128
+ type: Boolean,
129
+ default: false,
130
+ },
131
+ // all available organization list including personal account
132
+ organizations: {
133
+ type: Array,
134
+ default: () => [],
135
+ },
54
136
  },
55
137
 
56
138
  components: {
57
139
  NavbarItem: () => import("./NavbarItem.vue"),
58
140
  NavbarItemContent: () => import("./NavbarItemContent.vue"),
59
141
  },
142
+
143
+ computed: {
144
+ formattedOrganizations() {
145
+ let activeUser;
146
+ const filteredList = this.organizations.filter((item) => {
147
+ if (item.username === this.user.username) {
148
+ activeUser = item;
149
+ } else {
150
+ return true;
151
+ }
152
+ return false;
153
+ });
154
+
155
+ filteredList.unshift(activeUser);
156
+
157
+ return filteredList || [];
158
+ },
159
+ },
160
+
161
+ data() {
162
+ return {
163
+ dropDownStatus: "close",
164
+ dropDownSectionHeight: null,
165
+ };
166
+ },
167
+
168
+ methods: {
169
+ toggleList() {
170
+ this.dropDownStatus = this.dropDownStatus === "open" ? "close" : "open";
171
+ },
172
+ onOrganizationClick(orgName) {
173
+ this.$refs["dropdownItems"].$el.scrollTo(0, 0);
174
+ this.$emit("activeorg$set", orgName);
175
+ },
176
+ },
177
+
178
+ watch: {
179
+ dropDownStatus: {
180
+ immediate: true,
181
+ handler(n) {
182
+ if (n === "open") {
183
+ this.$nextTick(() => {
184
+ const dropDownUl = this.$refs["dropdownItems"];
185
+ if (dropDownUl)
186
+ this.dropDownSectionHeight = `${dropDownUl.scrollHeight}px`;
187
+ });
188
+ } else {
189
+ this.dropDownSectionHeight = null;
190
+ }
191
+ },
192
+ },
193
+ },
60
194
  };
61
- </script>
195
+ </script>
196
+ <style lang="scss" scoped>
197
+ .ac-vscrollbar {
198
+ overflow: auto !important;
199
+ }
200
+ </style>
@@ -4,6 +4,7 @@
4
4
  :class="`${modifierClasses}${isLoaderActive ? ' is-loading' : ''}`"
5
5
  :disabled="disabled ? true : null"
6
6
  @click="handleClick"
7
+ :title="tooltip"
7
8
  >
8
9
  <span v-if="iconClass || iconImage" class="icon is-small">
9
10
  <img
@@ -28,6 +29,10 @@ export default defineComponent({
28
29
  type: String,
29
30
  default: "",
30
31
  },
32
+ tooltip: {
33
+ type: String,
34
+ defualt: undefined
35
+ },
31
36
  // for loader
32
37
  isLoaderActive: {
33
38
  type: Boolean,