@tekkare/auriga 0.2.194 → 0.2.199
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.
- package/dist/module.json +1 -1
- package/dist/runtime/components/argAccordionMenu.vue +154 -0
- package/dist/runtime/components/argAccordionMenu.vue.d.ts +48 -0
- package/dist/runtime/components/argDashboardSection.vue +74 -0
- package/dist/runtime/components/argDrawer.vue +53 -0
- package/dist/runtime/components/argDrawer.vue.d.ts +38 -0
- package/dist/runtime/components/argFooter.vue +1 -1
- package/dist/runtime/components/argLoginPage.vue +107 -0
- package/dist/runtime/components/argModal.vue +17 -7
- package/dist/runtime/components/argModal.vue.d.ts +4 -2
- package/dist/runtime/components/argNoLicense.vue +75 -0
- package/dist/runtime/components/argProfilePage.vue +360 -0
- package/dist/runtime/components/argProjectDashboard.vue +631 -0
- package/dist/runtime/components/argResourceCard.vue +109 -0
- package/dist/runtime/components/argResourceTable.vue +302 -0
- package/dist/runtime/components/argToolbarContent.vue +44 -70
- package/dist/runtime/components/argToolbarContent.vue.d.ts +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="arg_profile_page">
|
|
3
|
+
<div class="arg_profile_container">
|
|
4
|
+
<!-- Loading -->
|
|
5
|
+
<div v-if="loading" class="arg_profile_loading">
|
|
6
|
+
<div class="arg_profile_spinner"></div>
|
|
7
|
+
<p>Loading your profile...</p>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<!-- Error -->
|
|
11
|
+
<div v-else-if="error" class="arg_profile_error">
|
|
12
|
+
<div class="arg_profile_error_icon">!</div>
|
|
13
|
+
<p>{{ error }}</p>
|
|
14
|
+
<button class="arg_profile_btn arg_profile_btn_primary" @click="$emit('onRetry')">Retry</button>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<!-- Content -->
|
|
18
|
+
<div v-else class="arg_profile_content">
|
|
19
|
+
<!-- Profile Header -->
|
|
20
|
+
<div class="arg_profile_header">
|
|
21
|
+
<div class="arg_profile_avatar">
|
|
22
|
+
<img
|
|
23
|
+
v-if="userImage"
|
|
24
|
+
:src="userImage"
|
|
25
|
+
:alt="userName || 'Profile'"
|
|
26
|
+
/>
|
|
27
|
+
<div v-else class="arg_profile_avatar_placeholder">
|
|
28
|
+
{{ (userName || userEmail || "U").charAt(0).toUpperCase() }}
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<div class="arg_profile_info">
|
|
32
|
+
<h1>{{ userName || "User Profile" }}</h1>
|
|
33
|
+
<p class="arg_profile_email">{{ userEmail }}</p>
|
|
34
|
+
<div class="arg_profile_badge">
|
|
35
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
|
|
36
|
+
<path d="M9 12L11 14L15 10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
37
|
+
<circle cx="12" cy="12" r="9" stroke="currentColor" stroke-width="2"/>
|
|
38
|
+
</svg>
|
|
39
|
+
Verified Account
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="arg_profile_actions">
|
|
43
|
+
<slot name="header-actions">
|
|
44
|
+
<button @click="navigateHome" class="arg_profile_btn arg_profile_btn_secondary">
|
|
45
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
|
|
46
|
+
<path d="M3 9L12 2L21 9V20C21 20.5304 20.7893 21.0391 20.4142 21.4142C20.0391 21.7893 19.5304 22 19 22H5C4.46957 22 3.96086 21.7893 3.58579 21.4142C3.21071 21.0391 3 20.5304 3 20V9Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
47
|
+
</svg>
|
|
48
|
+
Home
|
|
49
|
+
</button>
|
|
50
|
+
<button @click="$emit('onSignOut')" class="arg_profile_btn arg_profile_btn_outline">
|
|
51
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
|
|
52
|
+
<path d="M9 21H5C4.46957 21 3.96086 20.7893 3.58579 20.4142C3.21071 20.0391 3 19.5304 3 19V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
53
|
+
<polyline points="16,17 21,12 16,7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
54
|
+
<line x1="21" y1="12" x2="9" y2="12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
55
|
+
</svg>
|
|
56
|
+
Sign Out
|
|
57
|
+
</button>
|
|
58
|
+
</slot>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<!-- Navigation Tabs -->
|
|
63
|
+
<div class="arg_profile_tabs">
|
|
64
|
+
<button
|
|
65
|
+
@click="activeSection = 'account'"
|
|
66
|
+
class="arg_profile_tab"
|
|
67
|
+
:class="{ active: activeSection === 'account' }"
|
|
68
|
+
>
|
|
69
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
|
|
70
|
+
<path d="M20 21V19C20 17.9391 19.5786 16.9217 18.8284 16.1716C18.0783 15.4214 17.0609 15 16 15H8C6.93913 15 5.92172 15.4214 5.17157 16.1716C4.42143 16.9217 4 17.9391 4 19V21" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
71
|
+
<circle cx="12" cy="7" r="4" stroke="currentColor" stroke-width="2"/>
|
|
72
|
+
</svg>
|
|
73
|
+
Account
|
|
74
|
+
</button>
|
|
75
|
+
<button
|
|
76
|
+
@click="activeSection = 'workspace'"
|
|
77
|
+
class="arg_profile_tab"
|
|
78
|
+
:class="{ active: activeSection === 'workspace' }"
|
|
79
|
+
>
|
|
80
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
|
|
81
|
+
<path d="M3 9L12 2L21 9V20C21 20.5304 20.7893 21.0391 20.4142 21.4142C20.0391 21.7893 19.5304 22 19 22H5C4.46957 22 3.96086 21.7893 3.58579 21.4142C3.21071 21.0391 3 20.5304 3 20V9Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
82
|
+
</svg>
|
|
83
|
+
Workspace
|
|
84
|
+
</button>
|
|
85
|
+
<button
|
|
86
|
+
@click="activeSection = 'licenses'"
|
|
87
|
+
class="arg_profile_tab"
|
|
88
|
+
:class="{ active: activeSection === 'licenses' }"
|
|
89
|
+
>
|
|
90
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
|
|
91
|
+
<path d="M9 12L11 14L15 10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
92
|
+
<rect x="3" y="4" width="18" height="16" rx="2" stroke="currentColor" stroke-width="2"/>
|
|
93
|
+
</svg>
|
|
94
|
+
Licenses
|
|
95
|
+
</button>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<!-- Account Section -->
|
|
99
|
+
<div v-show="activeSection === 'account'" class="arg_profile_section_content">
|
|
100
|
+
<div class="arg_profile_cards_grid">
|
|
101
|
+
<div class="arg_profile_card">
|
|
102
|
+
<div class="arg_profile_card_header">
|
|
103
|
+
<div class="arg_profile_card_icon">
|
|
104
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none">
|
|
105
|
+
<path d="M20 21V19C20 17.9391 19.5786 16.9217 18.8284 16.1716C18.0783 15.4214 17.0609 15 16 15H8C6.93913 15 5.92172 15.4214 5.17157 16.1716C4.42143 16.9217 4 17.9391 4 19V21" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
106
|
+
<circle cx="12" cy="7" r="4" stroke="currentColor" stroke-width="2"/>
|
|
107
|
+
</svg>
|
|
108
|
+
</div>
|
|
109
|
+
<h2>Account Information</h2>
|
|
110
|
+
</div>
|
|
111
|
+
<div class="arg_profile_card_content">
|
|
112
|
+
<div class="arg_profile_info_row">
|
|
113
|
+
<span class="arg_profile_info_label">Email Address</span>
|
|
114
|
+
<span class="arg_profile_info_value">{{ userEmail || "Not provided" }}</span>
|
|
115
|
+
</div>
|
|
116
|
+
<div class="arg_profile_info_row">
|
|
117
|
+
<span class="arg_profile_info_label">Display Name</span>
|
|
118
|
+
<span class="arg_profile_info_value">{{ userName || "Not provided" }}</span>
|
|
119
|
+
</div>
|
|
120
|
+
<div class="arg_profile_info_row">
|
|
121
|
+
<span class="arg_profile_info_label">Account Status</span>
|
|
122
|
+
<span class="arg_profile_info_value arg_profile_status_active">
|
|
123
|
+
<span class="arg_profile_status_dot"></span>
|
|
124
|
+
Active
|
|
125
|
+
</span>
|
|
126
|
+
</div>
|
|
127
|
+
<div class="arg_profile_info_row">
|
|
128
|
+
<span class="arg_profile_info_label">Platform Admin</span>
|
|
129
|
+
<span class="arg_profile_info_value">{{ isPlatformAdmin ? 'Yes' : 'No' }}</span>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
<slot name="account-extra" />
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<!-- Workspace Section -->
|
|
138
|
+
<div v-show="activeSection === 'workspace'" class="arg_profile_section_content">
|
|
139
|
+
<div class="arg_profile_card">
|
|
140
|
+
<div class="arg_profile_card_header">
|
|
141
|
+
<div class="arg_profile_card_icon arg_profile_workspace_icon">
|
|
142
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none">
|
|
143
|
+
<path d="M3 9L12 2L21 9V20C21 20.5304 20.7893 21.0391 20.4142 21.4142C20.0391 21.7893 19.5304 22 19 22H5C4.46957 22 3.96086 21.7893 3.58579 21.4142C3.21071 21.0391 3 20.5304 3 20V9Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
144
|
+
</svg>
|
|
145
|
+
</div>
|
|
146
|
+
<h2>Current Workspace</h2>
|
|
147
|
+
</div>
|
|
148
|
+
<div class="arg_profile_card_content">
|
|
149
|
+
<div v-if="currentWorkspace" class="arg_profile_current_workspace">
|
|
150
|
+
<div class="arg_profile_cw_row">
|
|
151
|
+
<div class="arg_profile_cw_avatar" :class="currentWorkspace.isPersonal ? 'personal' : 'team'">
|
|
152
|
+
{{ currentWorkspace.name.charAt(0).toUpperCase() }}
|
|
153
|
+
</div>
|
|
154
|
+
<div class="arg_profile_cw_details">
|
|
155
|
+
<div class="arg_profile_cw_name">{{ currentWorkspace.name }}</div>
|
|
156
|
+
<div class="arg_profile_cw_meta">
|
|
157
|
+
<span class="arg_profile_cw_tag">{{ currentWorkspace.role }}</span>
|
|
158
|
+
<span v-if="currentWorkspace.isPersonal" class="arg_profile_cw_tag arg_profile_personal_tag">Personal</span>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
<span class="arg_profile_cw_active">Active</span>
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
<div v-else class="arg_profile_no_workspace">
|
|
165
|
+
<p>No workspace selected</p>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
<!-- Switch Workspace -->
|
|
171
|
+
<div v-if="workspaces.length > 1" class="arg_profile_card">
|
|
172
|
+
<div class="arg_profile_card_header">
|
|
173
|
+
<div class="arg_profile_card_icon arg_profile_switch_icon">
|
|
174
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none">
|
|
175
|
+
<path d="M8 3L4 7L8 11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
176
|
+
<path d="M4 7H16C17.0609 7 18.0783 7.42143 18.8284 8.17157C19.5786 8.92172 20 9.93913 20 11V13" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
177
|
+
<path d="M16 21L20 17L16 13" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
178
|
+
<path d="M20 17H8C6.93913 17 5.92172 16.5786 5.17157 15.8284C4.42143 15.0783 4 14.0609 4 13V11" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
179
|
+
</svg>
|
|
180
|
+
</div>
|
|
181
|
+
<h2>Switch Workspace</h2>
|
|
182
|
+
</div>
|
|
183
|
+
<div class="arg_profile_card_content">
|
|
184
|
+
<div class="arg_profile_workspace_list">
|
|
185
|
+
<button
|
|
186
|
+
v-for="ws in workspaces"
|
|
187
|
+
:key="ws.workspaceId"
|
|
188
|
+
class="arg_profile_workspace_option"
|
|
189
|
+
:class="{ selected: ws.workspaceId === currentWorkspaceId }"
|
|
190
|
+
@click="handleSwitchWorkspace(ws)"
|
|
191
|
+
:disabled="ws.workspaceId === currentWorkspaceId"
|
|
192
|
+
>
|
|
193
|
+
<div class="arg_profile_ws_avatar" :class="ws.isPersonal ? 'personal' : 'team'">
|
|
194
|
+
{{ ws.name.charAt(0).toUpperCase() }}
|
|
195
|
+
</div>
|
|
196
|
+
<div class="arg_profile_ws_info">
|
|
197
|
+
<span class="arg_profile_ws_name">{{ ws.name }}</span>
|
|
198
|
+
<span class="arg_profile_ws_meta">{{ ws.role }}</span>
|
|
199
|
+
</div>
|
|
200
|
+
<span v-if="ws.workspaceId === currentWorkspaceId" class="arg_profile_ws_check">
|
|
201
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
|
|
202
|
+
<path d="M20 6L9 17L4 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
203
|
+
</svg>
|
|
204
|
+
</span>
|
|
205
|
+
</button>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
<slot name="workspace-extra" />
|
|
210
|
+
</div>
|
|
211
|
+
|
|
212
|
+
<!-- Licenses Section -->
|
|
213
|
+
<div v-show="activeSection === 'licenses'" class="arg_profile_section_content">
|
|
214
|
+
<div class="arg_profile_card">
|
|
215
|
+
<div class="arg_profile_card_header">
|
|
216
|
+
<div class="arg_profile_card_icon arg_profile_licenses_icon">
|
|
217
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none">
|
|
218
|
+
<path d="M9 12L11 14L15 10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
219
|
+
<rect x="3" y="4" width="18" height="16" rx="2" stroke="currentColor" stroke-width="2"/>
|
|
220
|
+
</svg>
|
|
221
|
+
</div>
|
|
222
|
+
<h2>My Product Licenses</h2>
|
|
223
|
+
</div>
|
|
224
|
+
<div class="arg_profile_card_content">
|
|
225
|
+
<div v-if="licenses.length > 0" class="arg_profile_licenses_list">
|
|
226
|
+
<div v-for="license in licenses" :key="license.licenseId" class="arg_profile_license_item">
|
|
227
|
+
<div class="arg_profile_license_product">
|
|
228
|
+
<div class="arg_profile_product_icon arg_profile_product_default">
|
|
229
|
+
{{ (license.product?.name || license.product?.slug || 'L').charAt(0).toUpperCase() }}
|
|
230
|
+
</div>
|
|
231
|
+
<div class="arg_profile_product_info">
|
|
232
|
+
<span class="arg_profile_product_name">{{ productDisplayNames[license.product?.slug] || license.product?.name || license.product?.slug }}</span>
|
|
233
|
+
<span class="arg_profile_license_status" :class="license.status">{{ license.status }}</span>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
<div class="arg_profile_license_dates">
|
|
237
|
+
<span class="arg_profile_date_label">Assigned:</span>
|
|
238
|
+
<span class="arg_profile_date_value">{{ formatDate(license.assignedAt) }}</span>
|
|
239
|
+
</div>
|
|
240
|
+
<div v-if="license.expiresAt" class="arg_profile_license_expiry">
|
|
241
|
+
<span class="arg_profile_expiry_badge" :class="{ expired: new Date(license.expiresAt) < new Date() }">
|
|
242
|
+
{{ new Date(license.expiresAt) < new Date() ? 'Expired' : `Expires ${formatDate(license.expiresAt)}` }}
|
|
243
|
+
</span>
|
|
244
|
+
</div>
|
|
245
|
+
<div v-else class="arg_profile_license_expiry">
|
|
246
|
+
<span class="arg_profile_expiry_badge arg_profile_no_expiry">No expiration</span>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
<div v-else class="arg_profile_no_licenses">
|
|
251
|
+
<svg width="48" height="48" viewBox="0 0 24 24" fill="none">
|
|
252
|
+
<rect x="3" y="4" width="18" height="16" rx="2" stroke="currentColor" stroke-width="2" opacity="0.5"/>
|
|
253
|
+
<path d="M9 10H15M9 14H12" stroke="currentColor" stroke-width="2" stroke-linecap="round" opacity="0.5"/>
|
|
254
|
+
</svg>
|
|
255
|
+
<p>No licenses assigned</p>
|
|
256
|
+
<span class="arg_profile_hint">Contact your workspace administrator to request access to products.</span>
|
|
257
|
+
</div>
|
|
258
|
+
</div>
|
|
259
|
+
</div>
|
|
260
|
+
<slot name="licenses-extra" />
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
</div>
|
|
265
|
+
</template>
|
|
266
|
+
|
|
267
|
+
<script setup lang="ts">
|
|
268
|
+
import { ref, computed, watch } from "vue";
|
|
269
|
+
|
|
270
|
+
interface Workspace {
|
|
271
|
+
workspaceId: string;
|
|
272
|
+
name: string;
|
|
273
|
+
role: string;
|
|
274
|
+
isPersonal: boolean;
|
|
275
|
+
isCurrent?: boolean;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
interface License {
|
|
279
|
+
licenseId: string;
|
|
280
|
+
product: { slug: string; name: string };
|
|
281
|
+
status: string;
|
|
282
|
+
assignedAt: string;
|
|
283
|
+
expiresAt?: string;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const props = withDefaults(
|
|
287
|
+
defineProps<{
|
|
288
|
+
userName?: string;
|
|
289
|
+
userEmail?: string;
|
|
290
|
+
userImage?: string;
|
|
291
|
+
isPlatformAdmin?: boolean;
|
|
292
|
+
loading?: boolean;
|
|
293
|
+
error?: string;
|
|
294
|
+
workspaces?: Workspace[];
|
|
295
|
+
currentWorkspaceId?: string;
|
|
296
|
+
licenses?: License[];
|
|
297
|
+
productDisplayNames?: Record<string, string>;
|
|
298
|
+
initialTab?: "account" | "workspace" | "licenses";
|
|
299
|
+
}>(),
|
|
300
|
+
{
|
|
301
|
+
userName: "",
|
|
302
|
+
userEmail: "",
|
|
303
|
+
userImage: "",
|
|
304
|
+
isPlatformAdmin: false,
|
|
305
|
+
loading: false,
|
|
306
|
+
error: "",
|
|
307
|
+
workspaces: () => [],
|
|
308
|
+
currentWorkspaceId: "",
|
|
309
|
+
licenses: () => [],
|
|
310
|
+
productDisplayNames: () => ({}),
|
|
311
|
+
initialTab: "account",
|
|
312
|
+
}
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
const emit = defineEmits<{
|
|
316
|
+
onSignOut: [];
|
|
317
|
+
onSwitchWorkspace: [workspace: Workspace];
|
|
318
|
+
onRetry: [];
|
|
319
|
+
}>();
|
|
320
|
+
|
|
321
|
+
const activeSection = ref<"account" | "workspace" | "licenses">(props.initialTab);
|
|
322
|
+
|
|
323
|
+
watch(
|
|
324
|
+
() => props.initialTab,
|
|
325
|
+
(tab) => {
|
|
326
|
+
activeSection.value = tab;
|
|
327
|
+
}
|
|
328
|
+
);
|
|
329
|
+
|
|
330
|
+
const currentWorkspace = computed(() => {
|
|
331
|
+
if (!props.currentWorkspaceId || !props.workspaces.length) return null;
|
|
332
|
+
return (
|
|
333
|
+
props.workspaces.find((w) => w.workspaceId === props.currentWorkspaceId) ||
|
|
334
|
+
props.workspaces[0]
|
|
335
|
+
);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
const formatDate = (dateString: string): string => {
|
|
339
|
+
return new Date(dateString).toLocaleDateString("en-US", {
|
|
340
|
+
year: "numeric",
|
|
341
|
+
month: "short",
|
|
342
|
+
day: "numeric",
|
|
343
|
+
});
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
const handleSwitchWorkspace = (workspace: Workspace) => {
|
|
347
|
+
if (workspace.workspaceId === props.currentWorkspaceId) return;
|
|
348
|
+
emit("onSwitchWorkspace", workspace);
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
const navigateHome = () => {
|
|
352
|
+
if (typeof window !== "undefined") {
|
|
353
|
+
window.location.href = "/";
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
</script>
|
|
357
|
+
|
|
358
|
+
<style scoped>
|
|
359
|
+
.arg_profile_page{background:var(--Main-Lightest,#f8fafc);min-height:100vh;padding:40px 20px 80px}.arg_profile_container{margin:0 auto;max-width:900px}.arg_profile_error,.arg_profile_loading{align-items:center;color:var(--medium,#5a6c7d);display:flex;flex-direction:column;gap:16px;justify-content:center;padding:80px 20px}.arg_profile_spinner{animation:arg_profile_spin 1s linear infinite;border:3px solid var(--Main-Lightest,#f0f0f0);border-radius:50%;border-top-color:var(--primary,#6366f1);height:40px;width:40px}@keyframes arg_profile_spin{to{transform:rotate(1turn)}}.arg_profile_error{color:#dc2626}.arg_profile_error_icon{align-items:center;background:#fee2e2;border-radius:50%;color:#dc2626;display:flex;font-size:24px;font-weight:700;height:48px;justify-content:center;width:48px}.arg_profile_header{align-items:center;background:#fff;border:1px solid var(--dividers,#e4e7ec);border-radius:16px;display:grid;gap:24px;grid-template-columns:auto 1fr auto;margin-bottom:24px;padding:24px}.arg_profile_avatar{align-items:center;background:linear-gradient(135deg,var(--primary,#6366f1),#8b5cf6);border-radius:16px;display:flex;height:80px;justify-content:center;overflow:hidden;width:80px}.arg_profile_avatar img{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.arg_profile_avatar_placeholder{color:#fff;font-size:32px;font-weight:700}.arg_profile_info h1{color:var(--Main-Darkest,#21243d);font-size:1.75rem;font-weight:700;margin:0 0 8px}.arg_profile_email{color:var(--medium,#5a6c7d);font-size:1rem;margin:0 0 12px}.arg_profile_badge{align-items:center;background:#e0e7ff;border-radius:20px;color:#4338ca;display:inline-flex;font-size:.85rem;font-weight:500;gap:6px;padding:6px 12px}.arg_profile_actions{display:flex;gap:12px}.arg_profile_btn{align-items:center;border:none;border-radius:8px;cursor:pointer;display:inline-flex;font-size:.9rem;font-weight:500;gap:8px;padding:10px 16px;text-decoration:none;transition:all .2s ease}.arg_profile_btn_primary{background:var(--primary,#6366f1);color:#fff}.arg_profile_btn_primary:hover{background:var(--primary-hover,#4f46e5)}.arg_profile_btn_secondary{background:var(--Main-Lightest,#f3f4f6);color:var(--Main-Darkest,#374151)}.arg_profile_btn_secondary:hover{background:#e5e7eb}.arg_profile_btn_outline{background:#fff;border:1px solid var(--dividers,#e4e7ec);color:var(--Main-Darkest,#374151)}.arg_profile_btn_outline:hover{background:var(--Main-Lightest,#f3f4f6)}.arg_profile_tabs{border-bottom:2px solid var(--dividers,#e4e7ec);display:flex;gap:8px;margin-bottom:24px;overflow-x:auto}.arg_profile_tab{align-items:center;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--medium,#5a6c7d);cursor:pointer;display:flex;font-size:.95rem;font-weight:500;gap:8px;margin-bottom:-2px;padding:12px 20px;transition:all .2s ease;white-space:nowrap}.arg_profile_tab:hover{background:rgba(99,102,241,.05);color:var(--Main-Darkest,#21243d)}.arg_profile_tab.active{border-bottom-color:var(--primary,#6366f1);color:var(--primary,#6366f1)}.arg_profile_cards_grid{display:grid;gap:24px;grid-template-columns:repeat(auto-fit,minmax(350px,1fr))}.arg_profile_card{background:#fff;border:1px solid var(--dividers,#e4e7ec);border-radius:16px;margin-bottom:24px;overflow:hidden;transition:all .2s ease}.arg_profile_card:hover{box-shadow:0 4px 16px rgba(99,102,241,.1)}.arg_profile_card_header{align-items:center;background:var(--Main-Lightest,#fafbfc);border-bottom:1px solid var(--dividers,#e4e7ec);display:flex;gap:12px;padding:20px 24px}.arg_profile_card_icon{align-items:center;background:linear-gradient(135deg,var(--primary,#6366f1),#8b5cf6);border-radius:8px;color:#fff;display:flex;height:40px;justify-content:center;width:40px}.arg_profile_card_icon.arg_profile_workspace_icon{background:linear-gradient(135deg,#10b981,#059669)}.arg_profile_card_icon.arg_profile_switch_icon{background:linear-gradient(135deg,#3b82f6,#2563eb)}.arg_profile_card_icon.arg_profile_licenses_icon{background:linear-gradient(135deg,#8b5cf6,#7c3aed)}.arg_profile_card_header h2{color:var(--Main-Darkest,#21243d);font-size:1.15rem;font-weight:600;margin:0}.arg_profile_card_content{padding:24px}.arg_profile_info_row{align-items:center;border-bottom:1px solid #f1f3f4;display:flex;justify-content:space-between;padding:14px 0}.arg_profile_info_row:last-child{border-bottom:none}.arg_profile_info_label{color:var(--medium,#5a6c7d);font-weight:500}.arg_profile_info_value{color:var(--Main-Darkest,#21243d);font-weight:500}.arg_profile_status_active{align-items:center;color:#059669!important;display:flex;gap:6px}.arg_profile_status_dot{animation:arg_profile_pulse 2s infinite;background:#10b981;border-radius:50%;height:8px;width:8px}@keyframes arg_profile_pulse{0%,to{opacity:1}50%{opacity:.5}}.arg_profile_current_workspace{background:var(--Main-Lightest,#f8fafc);border-radius:10px;padding:16px}.arg_profile_cw_row{align-items:center;display:flex;gap:14px}.arg_profile_cw_avatar{align-items:center;border-radius:10px;color:#fff;display:flex;font-size:18px;font-weight:600;height:48px;justify-content:center;width:48px}.arg_profile_cw_avatar.personal{background:linear-gradient(135deg,#10b981,#059669)}.arg_profile_cw_avatar.team{background:linear-gradient(135deg,var(--primary,#6366f1),#4f46e5)}.arg_profile_cw_details{flex:1}.arg_profile_cw_name{color:var(--Main-Darkest,#21243d);font-size:16px;font-weight:600;margin-bottom:6px}.arg_profile_cw_meta{display:flex;gap:8px}.arg_profile_cw_tag{background:#e5e7eb;border-radius:4px;color:#374151;font-size:11px;font-weight:500;padding:3px 10px;text-transform:uppercase}.arg_profile_cw_tag.arg_profile_personal_tag{background:#d1fae5;color:#065f46}.arg_profile_cw_active{background:#dcfce7;border-radius:16px;color:#15803d;font-size:12px;font-weight:500;padding:6px 12px}.arg_profile_no_workspace{color:var(--medium,#5a6c7d);padding:24px;text-align:center}.arg_profile_workspace_list{display:flex;flex-direction:column;gap:10px}.arg_profile_workspace_option{align-items:center;background:#fff;border:1px solid #e5e7eb;border-radius:10px;cursor:pointer;display:flex;gap:12px;padding:14px;text-align:left;transition:all .15s ease;width:100%}.arg_profile_workspace_option:hover:not(:disabled){background:#fafafa;border-color:var(--primary,#6366f1)}.arg_profile_workspace_option.selected{background:#f5f3ff;border-color:var(--primary,#6366f1)}.arg_profile_workspace_option:disabled{cursor:default}.arg_profile_ws_avatar{align-items:center;border-radius:8px;color:#fff;display:flex;font-size:14px;font-weight:600;height:36px;justify-content:center;width:36px}.arg_profile_ws_avatar.personal{background:linear-gradient(135deg,#10b981,#059669)}.arg_profile_ws_avatar.team{background:linear-gradient(135deg,var(--primary,#6366f1),#4f46e5)}.arg_profile_ws_info{display:flex;flex:1;flex-direction:column;gap:3px}.arg_profile_ws_name{color:var(--Main-Darkest,#21243d);font-size:14px;font-weight:500}.arg_profile_ws_meta{color:var(--medium,#5a6c7d);font-size:12px;text-transform:capitalize}.arg_profile_ws_check{color:var(--primary,#6366f1);font-size:16px;font-weight:600}.arg_profile_licenses_list{display:flex;flex-direction:column;gap:14px}.arg_profile_license_item{background:var(--Main-Lightest,#f8f9fa);border:1px solid var(--dividers,#e4e7ec);border-radius:12px;display:flex;flex-direction:column;gap:10px;padding:16px}.arg_profile_license_product{align-items:center;display:flex;gap:12px}.arg_profile_product_icon{align-items:center;border-radius:8px;color:#fff;display:flex;font-size:16px;font-weight:700;height:40px;justify-content:center;width:40px}.arg_profile_product_icon.arg_profile_product_default{background:linear-gradient(135deg,#8b5cf6,#7c3aed)}.arg_profile_product_info{display:flex;flex-direction:column;gap:4px}.arg_profile_product_name{color:var(--Main-Darkest,#21243d);font-weight:600}.arg_profile_license_status{font-size:12px;font-weight:500;letter-spacing:.5px;text-transform:uppercase}.arg_profile_license_status.active{color:#059669}.arg_profile_license_status.cancelled{color:#dc2626}.arg_profile_license_status.expired{color:#9ca3af}.arg_profile_license_dates{display:flex;font-size:13px;gap:6px}.arg_profile_date_label{color:var(--medium,#5a6c7d)}.arg_profile_date_value{color:var(--Main-Darkest,#21243d);font-weight:500}.arg_profile_license_expiry{margin-top:4px}.arg_profile_expiry_badge{background:#dcfce7;border-radius:12px;color:#166534;font-size:12px;padding:4px 10px}.arg_profile_expiry_badge.expired{background:#fee2e2;color:#991b1b}.arg_profile_expiry_badge.arg_profile_no_expiry{background:#e0e7ff;color:#4338ca}.arg_profile_no_licenses{color:var(--medium,#5a6c7d);padding:40px 20px;text-align:center}.arg_profile_no_licenses svg{margin-bottom:16px}.arg_profile_no_licenses p{color:var(--Main-Darkest,#21243d);font-weight:600;margin:0 0 8px}.arg_profile_hint{font-size:14px;line-height:1.5}@media (max-width:768px){.arg_profile_header{gap:16px;grid-template-columns:1fr;text-align:center}.arg_profile_avatar{margin:0 auto}.arg_profile_actions{flex-wrap:wrap;justify-content:center}.arg_profile_cards_grid{grid-template-columns:1fr}.arg_profile_tabs{justify-content:center}}
|
|
360
|
+
</style>
|