qdadm 0.55.0 → 0.57.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.
- package/package.json +2 -2
- package/src/components/InfoBanner.vue +96 -0
- package/src/components/display/BannerZone.vue +61 -0
- package/src/components/index.js +3 -0
- package/src/components/layout/AppLayout.vue +463 -143
- package/src/components/layout/BaseLayout.vue +2 -2
- package/src/components/layout/SidebarBox.vue +91 -0
- package/src/composables/index.js +1 -0
- package/src/composables/useInfoBanner.js +167 -0
- package/src/modules/debug/components/DebugBar.vue +48 -31
- package/src/modules/debug/styles.scss +81 -0
- package/src/styles/_alerts.scss +75 -0
- package/src/styles/_code.scss +35 -0
- package/src/styles/_dialogs.scss +19 -0
- package/src/styles/_filter-bar.scss +55 -0
- package/src/styles/_forms.scss +357 -0
- package/src/styles/_helpers.scss +153 -0
- package/src/styles/_lists.scss +144 -0
- package/src/styles/_main.scss +295 -0
- package/src/styles/_markdown.scss +88 -0
- package/src/styles/_responsive.scss +15 -11
- package/src/styles/_show-pages.scss +80 -0
- package/src/styles/_sidebar.scss +254 -0
- package/src/styles/_states.scss +74 -0
- package/src/styles/_stats.scss +47 -0
- package/src/styles/_variables.scss +224 -0
- package/src/styles/index.scss +27 -10
- package/src/styles/theme/_components.scss +331 -0
- package/src/styles/theme/{index.css → _index.scss} +3 -3
- package/src/styles/theme/_tokens.scss +147 -0
- package/src/styles/theme/_utilities.scss +175 -0
- package/src/styles/_alerts.css +0 -48
- package/src/styles/_breakpoints.scss +0 -65
- package/src/styles/_code.css +0 -33
- package/src/styles/_dialogs.css +0 -17
- package/src/styles/_markdown.css +0 -82
- package/src/styles/_show-pages.css +0 -84
- package/src/styles/main.css +0 -949
- package/src/styles/theme/components.css +0 -329
- package/src/styles/theme/tokens.css +0 -125
- package/src/styles/theme/utilities.css +0 -172
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "qdadm",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.57.0",
|
|
4
4
|
"description": "Vue 3 framework for admin dashboards with PrimeVue",
|
|
5
5
|
"author": "quazardous",
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"./utils": "./src/utils/index.js",
|
|
30
30
|
"./modules/debug": "./src/modules/debug/index.js",
|
|
31
31
|
"./styles": "./src/styles/index.scss",
|
|
32
|
-
"./styles/
|
|
32
|
+
"./styles/variables": "./src/styles/_variables.scss",
|
|
33
33
|
"./gen": "./src/gen/index.js",
|
|
34
34
|
"./gen/vite-plugin": "./src/gen/vite-plugin.js"
|
|
35
35
|
},
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
/**
|
|
3
|
+
* InfoBanner - Consistent message banner component
|
|
4
|
+
*
|
|
5
|
+
* Wraps PrimeVue Message with standardized styling and icon support.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* // Simple usage
|
|
9
|
+
* <InfoBanner severity="warn">
|
|
10
|
+
* Settings will be lost on refresh.
|
|
11
|
+
* </InfoBanner>
|
|
12
|
+
*
|
|
13
|
+
* // With custom icon
|
|
14
|
+
* <InfoBanner severity="success" icon="pi-check-circle">
|
|
15
|
+
* Operation completed successfully.
|
|
16
|
+
* </InfoBanner>
|
|
17
|
+
*
|
|
18
|
+
* // Without icon
|
|
19
|
+
* <InfoBanner severity="info" :icon="false">
|
|
20
|
+
* Just some information.
|
|
21
|
+
* </InfoBanner>
|
|
22
|
+
*/
|
|
23
|
+
import Message from 'primevue/message'
|
|
24
|
+
import { computed } from 'vue'
|
|
25
|
+
|
|
26
|
+
const props = defineProps({
|
|
27
|
+
// Severity level: info, success, warn, error, secondary, contrast
|
|
28
|
+
severity: {
|
|
29
|
+
type: String,
|
|
30
|
+
default: 'info',
|
|
31
|
+
validator: (v) => ['info', 'success', 'warn', 'error', 'secondary', 'contrast'].includes(v)
|
|
32
|
+
},
|
|
33
|
+
// Custom icon class (e.g., 'pi-user'). Set to false to hide icon.
|
|
34
|
+
icon: {
|
|
35
|
+
type: [String, Boolean],
|
|
36
|
+
default: null
|
|
37
|
+
},
|
|
38
|
+
// Allow closing the banner
|
|
39
|
+
closable: {
|
|
40
|
+
type: Boolean,
|
|
41
|
+
default: false
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
// Default icons per severity
|
|
46
|
+
const defaultIcons = {
|
|
47
|
+
info: 'pi-info-circle',
|
|
48
|
+
success: 'pi-check-circle',
|
|
49
|
+
warn: 'pi-exclamation-triangle',
|
|
50
|
+
error: 'pi-times-circle',
|
|
51
|
+
secondary: 'pi-info-circle',
|
|
52
|
+
contrast: 'pi-info-circle'
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const iconClass = computed(() => {
|
|
56
|
+
if (props.icon === false) return null
|
|
57
|
+
if (props.icon) return `pi ${props.icon}`
|
|
58
|
+
return `pi ${defaultIcons[props.severity]}`
|
|
59
|
+
})
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<template>
|
|
63
|
+
<Message
|
|
64
|
+
:severity="severity"
|
|
65
|
+
:closable="closable"
|
|
66
|
+
class="info-banner"
|
|
67
|
+
>
|
|
68
|
+
<div class="info-banner-content">
|
|
69
|
+
<i v-if="iconClass" :class="iconClass" class="info-banner-icon"></i>
|
|
70
|
+
<span class="info-banner-text">
|
|
71
|
+
<slot />
|
|
72
|
+
</span>
|
|
73
|
+
</div>
|
|
74
|
+
</Message>
|
|
75
|
+
</template>
|
|
76
|
+
|
|
77
|
+
<style scoped>
|
|
78
|
+
.info-banner-content {
|
|
79
|
+
display: flex;
|
|
80
|
+
align-items: center;
|
|
81
|
+
gap: 0.625rem;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.info-banner-icon {
|
|
85
|
+
font-size: 1.125rem;
|
|
86
|
+
flex-shrink: 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.info-banner-text {
|
|
90
|
+
flex: 1;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.info-banner-text :deep(strong) {
|
|
94
|
+
font-weight: 600;
|
|
95
|
+
}
|
|
96
|
+
</style>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
/**
|
|
3
|
+
* BannerZone - Renders programmatic banners from useInfoBanner
|
|
4
|
+
*
|
|
5
|
+
* Place this component where you want banners to appear (typically
|
|
6
|
+
* at the top of page content).
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* <template>
|
|
10
|
+
* <div class="page-content">
|
|
11
|
+
* <BannerZone />
|
|
12
|
+
* <!-- rest of page content -->
|
|
13
|
+
* </div>
|
|
14
|
+
* </template>
|
|
15
|
+
*/
|
|
16
|
+
import { useInfoBanner } from '../../composables/useInfoBanner.js'
|
|
17
|
+
import InfoBanner from '../InfoBanner.vue'
|
|
18
|
+
|
|
19
|
+
const { banners, hideBanner } = useInfoBanner()
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<template>
|
|
23
|
+
<TransitionGroup name="banner" tag="div" class="banner-zone">
|
|
24
|
+
<InfoBanner
|
|
25
|
+
v-for="banner in banners"
|
|
26
|
+
:key="banner.id"
|
|
27
|
+
:severity="banner.severity"
|
|
28
|
+
:icon="banner.icon"
|
|
29
|
+
:closable="banner.closable"
|
|
30
|
+
@close="hideBanner(banner.id)"
|
|
31
|
+
>
|
|
32
|
+
<span v-html="banner.message"></span>
|
|
33
|
+
</InfoBanner>
|
|
34
|
+
</TransitionGroup>
|
|
35
|
+
</template>
|
|
36
|
+
|
|
37
|
+
<style scoped>
|
|
38
|
+
.banner-zone {
|
|
39
|
+
position: relative;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Transition animations */
|
|
43
|
+
.banner-enter-active,
|
|
44
|
+
.banner-leave-active {
|
|
45
|
+
transition: all 0.3s ease;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.banner-enter-from {
|
|
49
|
+
opacity: 0;
|
|
50
|
+
transform: translateY(-10px);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.banner-leave-to {
|
|
54
|
+
opacity: 0;
|
|
55
|
+
transform: translateY(-10px);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.banner-move {
|
|
59
|
+
transition: transform 0.3s ease;
|
|
60
|
+
}
|
|
61
|
+
</style>
|
package/src/components/index.js
CHANGED
|
@@ -10,6 +10,7 @@ export { default as PageHeader } from './layout/PageHeader.vue'
|
|
|
10
10
|
export { default as Breadcrumb } from './layout/Breadcrumb.vue'
|
|
11
11
|
export { default as PageNav } from './layout/PageNav.vue'
|
|
12
12
|
export { default as Zone } from './layout/Zone.vue'
|
|
13
|
+
export { default as SidebarBox } from './layout/SidebarBox.vue'
|
|
13
14
|
|
|
14
15
|
// Default zone components
|
|
15
16
|
export { default as DefaultHeader } from './layout/defaults/DefaultHeader.vue'
|
|
@@ -59,6 +60,8 @@ export { default as EmptyState } from './display/EmptyState.vue'
|
|
|
59
60
|
export { default as IntensityBar } from './display/IntensityBar.vue'
|
|
60
61
|
export { default as BoolCell } from './BoolCell.vue'
|
|
61
62
|
export { default as SeverityTag } from './SeverityTag.vue'
|
|
63
|
+
export { default as InfoBanner } from './InfoBanner.vue'
|
|
64
|
+
export { default as BannerZone } from './display/BannerZone.vue'
|
|
62
65
|
|
|
63
66
|
// Pages
|
|
64
67
|
export { default as LoginPage } from './pages/LoginPage.vue'
|