design-system-dashboard-devmunity 0.1.0 → 0.2.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/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ # [0.2.0](https://github.com/vicventum/design-system-dashboard-devmunity/compare/v0.1.0...v0.2.0) (2025-11-14)
2
+
3
+
4
+ ### Features
5
+
6
+ * **components:** :sparkles: Crea componente BModal ([6218f3a](https://github.com/vicventum/design-system-dashboard-devmunity/commit/6218f3aeeeb0695b05c00c64da6c3212b07afa08))
7
+ * **components:** :sparkles: Crea componente CModalDanger ([1e3f7bb](https://github.com/vicventum/design-system-dashboard-devmunity/commit/1e3f7bb8778f970268b08043d70fef0fb0e7b10e))
8
+ * **components:** :sparkles: Crea componente DActionButtons ([f7725cb](https://github.com/vicventum/design-system-dashboard-devmunity/commit/f7725cb5812b77628981abfb351b64e086e190c4))
9
+
1
10
  # [0.1.0](https://github.com/vicventum/design-system-dashboard-devmunity/compare/v0.0.6...v0.1.0) (2025-11-12)
2
11
 
3
12
 
@@ -0,0 +1,14 @@
1
+ export default /* ui */ {
2
+ slots: {
3
+ header: 'min-h-auto',
4
+ title: 'text-xl',
5
+ close: 'text-primary',
6
+ },
7
+ variants: {
8
+ fullscreen: {
9
+ false: {
10
+ content: 'max-w-auto',
11
+ },
12
+ },
13
+ },
14
+ }
@@ -1,2 +1,3 @@
1
1
  export { default as card } from './components/card.js'
2
2
  export { default as button } from './components/button.js'
3
+ export { default as modal } from './components/modal.js'
@@ -10,10 +10,10 @@ const props = defineProps({
10
10
  default: '',
11
11
  required: false,
12
12
  },
13
- isBackAction: {
13
+ hasBackAction: {
14
14
  type: Boolean,
15
15
  default: false,
16
- required: true,
16
+ required: false,
17
17
  },
18
18
  })
19
19
 
@@ -22,7 +22,7 @@ const router = useRouter()
22
22
 
23
23
  function handleClickLeftButtonIcon() {
24
24
  emit('on-click')
25
- if (props.isBackAction && !props.to && props.icon.includes('arrow-left')) {
25
+ if (props.hasBackAction && !props.to && props.icon.includes('arrow-left')) {
26
26
  router.back()
27
27
  }
28
28
  }
@@ -12,21 +12,11 @@ const props = defineProps({
12
12
  default: '',
13
13
  required: false,
14
14
  },
15
- hasBorder: {
16
- type: Boolean,
17
- default: false,
18
- required: false,
19
- },
20
15
  variant: {
21
16
  type: String,
22
17
  default: 'main', // main, secondary
23
18
  required: false,
24
19
  },
25
- variantSubtitle: {
26
- type: String,
27
- default: 'main',
28
- required: false,
29
- },
30
20
  hasLeftButtonIcon: {
31
21
  type: Boolean,
32
22
  default: false,
@@ -68,8 +58,7 @@ function handleClickLeftButtonIcon() {
68
58
  <BCardInner
69
59
  :class="[
70
60
  'flex items-center justify-between',
71
- { 'bg-neutral-50': variant === 'secondary' },
72
- { 'border-y border-neutral-200': hasBorder && variant === 'secondary' },
61
+ { 'bg-muted border-y border-neutral-200': variant === 'secondary' },
73
62
  ]"
74
63
  >
75
64
  <div class="space-y-1">
@@ -99,7 +88,7 @@ function handleClickLeftButtonIcon() {
99
88
  v-if="subtitle"
100
89
  class="text-sm font-medium"
101
90
  :class="{
102
- 'text-neutral-400': variant === 'secondary',
91
+ 'text-dimmed': variant === 'secondary',
103
92
  }"
104
93
  >
105
94
  {{ subtitle }}
@@ -1,4 +1,4 @@
1
- <script lang="ts" setup>
1
+ <script lang="jsx" setup>
2
2
  import { resolveComponent } from 'vue'
3
3
  import { twMerge } from 'tailwind-merge'
4
4
 
@@ -20,6 +20,11 @@ const props = defineProps({
20
20
  default: '',
21
21
  required: true,
22
22
  },
23
+ description: {
24
+ type: String,
25
+ default: '',
26
+ required: true,
27
+ },
23
28
  text: {
24
29
  type: String,
25
30
  default: '',
@@ -32,7 +37,7 @@ const props = defineProps({
32
37
  },
33
38
  primaryButtonColor: {
34
39
  type: String,
35
- default: 'color-primary',
40
+ default: 'primary',
36
41
  required: true,
37
42
  },
38
43
  secondaryButtonText: {
@@ -45,34 +50,19 @@ const props = defineProps({
45
50
  default: true,
46
51
  required: false,
47
52
  },
48
- width: {
49
- type: String,
50
- default: '',
51
- required: false,
52
- },
53
- widthButtons: {
54
- type: String,
55
- default: 'w-40',
56
- required: false,
57
- },
58
53
  isPrimaryButtonDisabled: {
59
54
  type: Boolean,
60
55
  default: false,
61
56
  required: false,
62
57
  },
63
- isBlockButtons: {
58
+ hasButtonsBlock: {
64
59
  type: Boolean,
65
60
  default: false,
66
61
  required: false,
67
62
  },
68
- classButton: {
63
+ classButtons: {
69
64
  type: String,
70
- default: 'form',
71
- required: false,
72
- },
73
- hasBodyExpanded: {
74
- type: Boolean,
75
- default: false,
65
+ default: '',
76
66
  required: false,
77
67
  },
78
68
  })
@@ -92,11 +82,18 @@ const formRef = defineModel('formRef', {
92
82
  required: false,
93
83
  })
94
84
 
95
- // Data
85
+ // Computed
96
86
 
97
- const uiStyles = reactive({})
87
+ // const uiStyles = computed(() => {
88
+ // const baseStyles = {}
98
89
 
99
- // Computed
90
+ // // Apply width styles
91
+ // if (props.width) {
92
+ // baseStyles.width = `${props.width}`
93
+ // }
94
+
95
+ // return baseStyles
96
+ // })
100
97
 
101
98
  const formProps = computed(() => {
102
99
  // return props.data ? { ref: 'form', state: props.data, onSubmit: handleSubmit } : {}
@@ -115,55 +112,37 @@ function handleClickSecondaryButton() {
115
112
  isOpen.value = false
116
113
  emit('on-click-secondary-button')
117
114
  }
118
-
119
- // Watch
120
-
121
- watch(
122
- () => props.width,
123
- (width) => {
124
- if (!width) return null
125
-
126
- Object.assign(uiStyles, { width: `${props.width}` })
127
- },
128
- { immediate: true }
129
- )
130
115
  </script>
131
116
 
132
117
  <template>
133
- <UModal v-model="isOpen" :ui="uiStyles">
134
- <component :is="state ? UForm : 'section'" v-bind="formProps" @submit="handleSubmit">
135
- <BCard :ui="{ footer: { padding: 'p-0 sm:p-0' } }" :has-body-expanded="hasBodyExpanded">
136
- <template #header>
137
- <slot v-if="$slots.header" name="header" />
138
- <BCardHeader v-else :title="title" size="sm">
139
- <template #actions>
140
- <UButton icon="heroicons:x-mark" variant="icon" @click="isOpen = false" />
141
- </template>
142
- </BCardHeader>
143
- </template>
144
-
145
- <BCardInner v-if="text" class="p-6">
118
+ <UModal v-model:open="isOpen" :title="title" :description="description">
119
+ <template #header>
120
+ <slot v-if="$slots.header" name="header" />
121
+ </template>
122
+
123
+ <template #body>
124
+ <component :is="state ? UForm : 'section'" v-bind="formProps" @submit="handleSubmit">
125
+ <p v-if="text">
146
126
  {{ text }}
147
- </BCardInner>
127
+ </p>
148
128
  <slot v-else />
149
-
150
- <template v-if="hasFooter" #footer>
151
- <slot v-if="$slots.footer" name="footer" />
152
- <BCardInner v-else>
153
- <ABlockActionButtons
154
- :class="twMerge('flex justify-start gap-x-2', classButton)"
155
- :primary-button-color="primaryButtonColor"
156
- :primary-button-text="primaryButtonText"
157
- :secondary-button-text="secondaryButtonText"
158
- :width-buttons="widthButtons"
159
- :is-block-buttons="isBlockButtons"
160
- :is-primary-button-disabled="isPrimaryButtonDisabled"
161
- @on-click-primary-button="handleClickPrimaryButton"
162
- @on-click-secondary-button="handleClickSecondaryButton"
163
- />
164
- </BCardInner>
165
- </template>
166
- </BCard>
167
- </component>
129
+ </component>
130
+ </template>
131
+
132
+ <template v-if="hasFooter" #footer>
133
+ <slot v-if="$slots.footer" name="footer" />
134
+ <DActionButtons
135
+ v-else
136
+ :primary-button-color="primaryButtonColor"
137
+ :primary-button-text="primaryButtonText"
138
+ :secondary-button-text="secondaryButtonText"
139
+ :is-buttons-block="hasButtonsBlock"
140
+ :is-primary-button-disabled="isPrimaryButtonDisabled"
141
+ :class="twMerge('flex w-full justify-end gap-x-2', classButtons)"
142
+ class-buttons="w-40"
143
+ @on-click-primary-button="handleClickPrimaryButton"
144
+ @on-click-secondary-button="handleClickSecondaryButton"
145
+ />
146
+ </template>
168
147
  </UModal>
169
148
  </template>
@@ -0,0 +1,67 @@
1
+ <script lang="jsx" setup>
2
+ const props = defineProps({
3
+ state: {
4
+ type: Object,
5
+ default: null,
6
+ required: false,
7
+ },
8
+ schema: {
9
+ type: Object,
10
+ default: null,
11
+ required: false,
12
+ },
13
+ title: {
14
+ type: String,
15
+ default: '',
16
+ required: true,
17
+ },
18
+ description: {
19
+ type: String,
20
+ default: '',
21
+ required: true,
22
+ },
23
+ text: {
24
+ type: String,
25
+ default: '',
26
+ required: false,
27
+ },
28
+ primaryButtonText: {
29
+ type: String,
30
+ default: 'Eliminar',
31
+ required: false,
32
+ },
33
+ secondaryButtonText: {
34
+ type: String,
35
+ default: 'Cancelar',
36
+ required: false,
37
+ },
38
+ })
39
+
40
+ const emit = defineEmits(['on-click-primary-button', 'on-click-secondary-button'])
41
+
42
+ // Model
43
+
44
+ const isOpen = defineModel({
45
+ type: Boolean,
46
+ default: false,
47
+ required: true,
48
+ })
49
+ </script>
50
+
51
+ <template>
52
+ <BModal
53
+ v-model="isOpen"
54
+ :title="title"
55
+ :text="text"
56
+ :primary-button-text="primaryButtonText"
57
+ :secondary-button-text="secondaryButtonText"
58
+ :state="state"
59
+ :schema="schema"
60
+ primary-button-color="error"
61
+ is-block-buttons
62
+ @on-click-primary-button="emit('on-click-primary-button')"
63
+ @on-click-secondary-button="emit('on-click-secondary-button')"
64
+ >
65
+ <slot v-if="!text" />
66
+ </BModal>
67
+ </template>
@@ -0,0 +1,99 @@
1
+ <script lang="jsx" setup>
2
+ import { twMerge } from 'tailwind-merge'
3
+
4
+ const props = defineProps({
5
+ class: {
6
+ type: [String, Object, Array],
7
+ default: () => '',
8
+ required: false,
9
+ },
10
+ classButtons: {
11
+ type: [String, Object, Array],
12
+ default: () => '',
13
+ required: false,
14
+ },
15
+ primaryButtonText: {
16
+ type: String,
17
+ default: '',
18
+ required: false,
19
+ },
20
+ primaryButtonIcon: {
21
+ type: String,
22
+ default: '',
23
+ required: false,
24
+ },
25
+ primaryButtonTo: {
26
+ type: String,
27
+ default: '',
28
+ required: false,
29
+ },
30
+ primaryButtonColor: {
31
+ type: String,
32
+ default: 'primary',
33
+ required: false,
34
+ },
35
+ secondaryButtonText: {
36
+ type: String,
37
+ default: '',
38
+ required: false,
39
+ },
40
+ secondaryButtonTo: {
41
+ type: String,
42
+ default: '',
43
+ required: false,
44
+ },
45
+ hasButtonsBlock: {
46
+ type: Boolean,
47
+ default: false,
48
+ required: false,
49
+ },
50
+ isReverse: {
51
+ type: Boolean,
52
+ default: false,
53
+ required: false,
54
+ },
55
+ isPrimaryButtonDisabled: {
56
+ type: Boolean,
57
+ default: false,
58
+ required: false,
59
+ },
60
+ isSecondaryButtonDisabled: {
61
+ type: Boolean,
62
+ default: false,
63
+ required: false,
64
+ },
65
+ })
66
+ const emit = defineEmits(['on-click-primary-button', 'on-click-secondary-button'])
67
+
68
+ const classCard = computed(() => twMerge('flex gap-x-4', props.class, props.isReverse && 'flex-row-reverse'))
69
+ const classButtonsComputed = computed(() =>
70
+ twMerge('justify-center w-[150px]', props.hasButtonsBlock && 'flex-auto', props.classButtons)
71
+ )
72
+ </script>
73
+
74
+ <template>
75
+ <footer :class="classCard">
76
+ <UButton
77
+ v-if="secondaryButtonText"
78
+ :to="secondaryButtonTo"
79
+ :label="secondaryButtonText"
80
+ :disabled="isSecondaryButtonDisabled"
81
+ :class="classButtonsComputed"
82
+ variant="outline"
83
+ color="neutral"
84
+ @click="$emit('on-click-secondary-button')"
85
+ />
86
+ <UButton
87
+ v-if="primaryButtonText"
88
+ :label="primaryButtonText"
89
+ :to="primaryButtonTo"
90
+ :icon="primaryButtonIcon"
91
+ :color="primaryButtonColor"
92
+ :disabled="isPrimaryButtonDisabled"
93
+ :class="classButtonsComputed"
94
+ type="submit"
95
+ trailing
96
+ @click="$emit('on-click-primary-button')"
97
+ />
98
+ </footer>
99
+ </template>
@@ -1,4 +1,12 @@
1
- <script lang="ts" setup></script>
1
+ <script lang="jsx" setup>
2
+ import { CModalDanger } from '#components'
3
+
4
+ const modelIsOpenModal = ref(false)
5
+ const overlay = useOverlay()
6
+
7
+ // Abriendo modal de forma programática (mientras no sea necesario pasar slots)
8
+ const modalDanger = overlay.create(CModalDanger)
9
+ </script>
2
10
 
3
11
  <template>
4
12
  <div class="h-screen">
@@ -23,7 +31,12 @@
23
31
  <template #header>
24
32
  <BCardHeader title="Crear una nueva actividad" subtitle="Subtitle" has-left-button-icon>
25
33
  <template #actions>
26
- <UButton label="Action" />
34
+ <DActionButtons
35
+ primary-button-text="Guardar"
36
+ secondary-button-text="Cancelar"
37
+ secondary-button-icon="heroicons:pencil"
38
+ is-block-buttons
39
+ />
27
40
  </template>
28
41
  </BCardHeader>
29
42
  </template>
@@ -38,22 +51,65 @@
38
51
  title="Crear una nueva actividad"
39
52
  subtitle="Subtitle"
40
53
  variant="secondary"
41
- variant-subtitle="secondary"
42
54
  class="my-6"
43
55
  class-title=""
44
- has-border
45
56
  >
46
57
  <template #actions>
47
58
  <UButton label="Action" />
48
59
  </template>
49
60
  </BCardHeader>
50
61
 
51
- <BCardInner>
52
- Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci eos perspiciatis
53
- asperiores suscipit voluptate magni excepturi. Doloribus in fugit quam voluptatibus,
54
- molestiae maxime illum explicabo ut corrupti, distinctio atque dolor.
62
+ <BCardInner class="space-y-2">
63
+ <p>
64
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci eos perspiciatis
65
+ asperiores suscipit voluptate magni excepturi. Doloribus in fugit quam voluptatibus,
66
+ molestiae maxime illum explicabo ut corrupti, distinctio atque dolor.
67
+ </p>
68
+
69
+ <DActionButtons
70
+ primary-button-text="Guardar"
71
+ secondary-button-text="Cancelar"
72
+ secondary-button-icon="heroicons:pencil"
73
+ class-buttons="w-[200px]"
74
+ has-buttons-block
75
+ />
55
76
  </BCardInner>
56
77
  </BCard>
78
+
79
+ <hr class="my-6" />
80
+
81
+ <UButton label="Open modal" @click="modelIsOpenModal = !modelIsOpenModal" />
82
+ <!-- <UButton label="Open modal danger" @click="modelIsOpenModalDanger = !modelIsOpenModalDanger" /> -->
83
+ <UButton
84
+ label="Open modal danger"
85
+ color="error"
86
+ @click="
87
+ modalDanger.open({
88
+ title: 'Title Danger',
89
+ text: 'Lorem ipsum, dolor sit amet consectetur adipisicing elit. Qui aut exercitationem necessitatibus, perspiciatis vel suscipit nam. Facilis, placeat! Dicta quo eveniet rerum officiis quibusdam laborum error necessitatibus sequi itaque praesentium.',
90
+ onOnClickSecondaryButton: () => {
91
+ modalDanger.close()
92
+ },
93
+ })
94
+ "
95
+ />
96
+
97
+ <BModal
98
+ v-model="modelIsOpenModal"
99
+ title="Marcar como completada"
100
+ class-button="justify-end"
101
+ class="w-[700px]"
102
+ >
103
+ <!-- <template #header> header </template> -->
104
+
105
+ <p class="h-screen">
106
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam pariatur, suscipit
107
+ veritatis delectus architecto hic non quidem ducimus, cum ex alias obcaecati enim maiores
108
+ animi nesciunt, perferendis commodi in quae.
109
+ </p>
110
+
111
+ <!-- <template #footer> footer </template> -->
112
+ </BModal>
57
113
  </UContainer>
58
114
  </div>
59
115
  </template>
@@ -1 +1,8 @@
1
- export default { extends: ['@commitlint/config-conventional'] };
1
+ export default {
2
+ extends: ['@commitlint/config-conventional'],
3
+ rules: {
4
+ // 'body-max-line-length': [0],
5
+ 'body-max-line-length': [2, 'always', 500],
6
+ 'header-max-length': [2, 'always', 120],
7
+ },
8
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "design-system-dashboard-devmunity",
3
3
  "type": "module",
4
- "version": "0.1.0",
4
+ "version": "0.2.0",
5
5
  "scripts": {
6
6
  "build": "nuxt build",
7
7
  "dev": "nuxt dev",