@saasmakers/ui 1.5.1 → 1.5.2

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.
@@ -6,7 +6,6 @@ const props = withDefaults(defineProps<BaseDivider>(), {
6
6
  color: 'black',
7
7
  hideNext: false,
8
8
  hidePrevious: false,
9
- light: false,
10
9
  loading: false,
11
10
  navigable: false,
12
11
  pill: false,
@@ -14,34 +13,6 @@ const props = withDefaults(defineProps<BaseDivider>(), {
14
13
  title: '',
15
14
  })
16
15
 
17
- const pillLineBorderClasses = computed(() => {
18
- if (!props.pill) {
19
- return 'border-gray-300 dark:border-gray-700'
20
- }
21
-
22
- if (props.color === 'indigo' && !props.light) {
23
- return 'border-indigo-700 dark:border-indigo-300'
24
- }
25
-
26
- if (props.color === 'gray' && props.light) {
27
- return 'border-gray-300 dark:border-gray-700'
28
- }
29
-
30
- return 'border-gray-900 dark:border-gray-300'
31
- })
32
-
33
- const pillClasses = computed(() => {
34
- if (props.color === 'indigo' && !props.light) {
35
- return 'bg-indigo-800 dark:bg-indigo-200 text-white dark:text-black'
36
- }
37
-
38
- if (props.color === 'gray' && props.light) {
39
- return 'bg-gray-100 dark:bg-gray-900 text-gray-600 dark:text-gray-400'
40
- }
41
-
42
- return 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'
43
- })
44
-
45
16
  const emit = defineEmits<{
46
17
  navigate: [event: MouseEvent, direction: BaseDividerNavigateDirection]
47
18
  }>()
@@ -94,13 +65,18 @@ function onNavigate(event: MouseEvent, direction: BaseDividerNavigateDirection)
94
65
 
95
66
  <div
96
67
  class="flex-1 border-t"
97
- :class="[
98
- pillLineBorderClasses,
99
- {
100
- 'border-dashed': borderStyle === 'dashed',
101
- 'border-dotted': borderStyle === 'dotted',
102
- },
103
- ]"
68
+ :class="{
69
+ 'border-dashed': borderStyle === 'dashed',
70
+ 'border-dotted': borderStyle === 'dotted',
71
+ 'border-gray-300 dark:border-gray-700': !pill,
72
+ 'border-gray-900 dark:border-gray-100': pill && color === 'black',
73
+ 'border-gray-700 dark:border-gray-300': pill && color === 'gray',
74
+ 'border-green-700 dark:border-green-300': pill && color === 'green',
75
+ 'border-indigo-700 dark:border-indigo-300': pill && color === 'indigo',
76
+ 'border-orange-700 dark:border-orange-300': pill && color === 'orange',
77
+ 'border-red-700 dark:border-red-300': pill && color === 'red',
78
+ 'border-white dark:border-gray-900': pill && color === 'white',
79
+ }"
104
80
  style="height: 1px"
105
81
  />
106
82
  </div>
@@ -108,7 +84,15 @@ function onNavigate(event: MouseEvent, direction: BaseDividerNavigateDirection)
108
84
  <span
109
85
  v-if="pill && title && !loading"
110
86
  class="mx-3 rounded-full px-3 py-1 text-xs font-medium tracking-wide"
111
- :class="pillClasses"
87
+ :class="{
88
+ 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900': color === 'black',
89
+ 'bg-gray-700 text-white dark:bg-gray-300 dark:text-gray-800': color === 'gray',
90
+ 'bg-green-700 text-white dark:bg-green-300 dark:text-black': color === 'green',
91
+ 'bg-indigo-700 text-white dark:bg-indigo-300 dark:text-black': color === 'indigo',
92
+ 'bg-orange-700 text-white dark:bg-orange-300 dark:text-black': color === 'orange',
93
+ 'bg-red-700 text-white dark:bg-red-300 dark:text-black': color === 'red',
94
+ 'bg-white text-gray-900 dark:bg-gray-900 dark:text-gray-100': color === 'white',
95
+ }"
112
96
  >{{ title }}</span>
113
97
 
114
98
  <BaseText
@@ -121,13 +105,18 @@ function onNavigate(event: MouseEvent, direction: BaseDividerNavigateDirection)
121
105
  <div class="flex items-center">
122
106
  <div
123
107
  class="flex-1 border-t"
124
- :class="[
125
- pillLineBorderClasses,
126
- {
127
- 'border-dashed': borderStyle === 'dashed',
128
- 'border-dotted': borderStyle === 'dotted',
129
- },
130
- ]"
108
+ :class="{
109
+ 'border-dashed': borderStyle === 'dashed',
110
+ 'border-dotted': borderStyle === 'dotted',
111
+ 'border-gray-300 dark:border-gray-700': !pill,
112
+ 'border-gray-900 dark:border-gray-100': pill && color === 'black',
113
+ 'border-gray-700 dark:border-gray-300': pill && color === 'gray',
114
+ 'border-green-700 dark:border-green-300': pill && color === 'green',
115
+ 'border-indigo-700 dark:border-indigo-300': pill && color === 'indigo',
116
+ 'border-orange-700 dark:border-orange-300': pill && color === 'orange',
117
+ 'border-red-700 dark:border-red-300': pill && color === 'red',
118
+ 'border-white dark:border-gray-900': pill && color === 'white',
119
+ }"
131
120
  style="height: 1px"
132
121
  />
133
122
 
@@ -0,0 +1,50 @@
1
+ <script lang="ts" setup>
2
+ import type { BaseProgress } from '../../types/bases'
3
+
4
+ const props = withDefaults(defineProps<BaseProgress>(), {
5
+ max: 100,
6
+ showLabel: false,
7
+ value: 0,
8
+ })
9
+
10
+ const percent = computed(() => {
11
+ if (props.max <= 0) {
12
+ return 0
13
+ }
14
+
15
+ return Math.min(100, Math.max(0, (props.value / props.max) * 100))
16
+ })
17
+
18
+ const label = computed(() => {
19
+ if (props.max === 100) {
20
+ return `${Math.round(percent.value)} %`
21
+ }
22
+
23
+ return `${props.value}/${props.max}`
24
+ })
25
+ </script>
26
+
27
+ <template>
28
+ <div class="w-full flex items-center gap-2">
29
+ <div
30
+ role="progressbar"
31
+ class="h-1 min-w-0 flex-1 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-800"
32
+ :aria-label="label"
33
+ :aria-valuemax="max"
34
+ :aria-valuemin="0"
35
+ :aria-valuenow="value"
36
+ >
37
+ <div
38
+ class="h-full rounded-full bg-indigo-700 transition-[width] duration-300 dark:bg-indigo-300"
39
+ :style="{ width: `${percent}%` }"
40
+ />
41
+ </div>
42
+
43
+ <BaseText
44
+ v-if="showLabel"
45
+ class="shrink-0 text-indigo-700 dark:text-indigo-300"
46
+ size="2xs"
47
+ :text="label"
48
+ />
49
+ </div>
50
+ </template>
@@ -75,7 +75,7 @@ function onOpenFilePicker() {
75
75
 
76
76
  <div
77
77
  :aria-label="loading ? t('actionLoading') : (typeof action === 'string' ? action : (action?.base || t('action')))"
78
- class="w-full flex items-center gap-2 px-3 normal-case outline-none"
78
+ class="w-full flex items-center gap-2 px-3 uppercase outline-none"
79
79
  :class="{
80
80
  'cursor-pointer': !disabled && !loading,
81
81
  'field-disabled': disabled,
@@ -178,7 +178,7 @@ defineExpose({ focus })
178
178
  :id="id"
179
179
  ref="input"
180
180
  :autocomplete="autocomplete ? 'on' : 'off'"
181
- class="h-full w-full appearance-none items-center rounded-lg font-medium tracking-tight normal-case outline-none placeholder-gray-600 dark:placeholder-gray-400"
181
+ class="h-full w-full appearance-none items-center rounded-lg font-medium tracking-tight uppercase outline-none placeholder-gray-600 dark:placeholder-gray-400"
182
182
  :class="{
183
183
  'field-disabled': disabled,
184
184
  'focus:placeholder-gray-900 hover:placeholder-gray-900 dark:focus:placeholder-gray-100 dark:hover:placeholder-gray-100': !disabled,
@@ -67,7 +67,7 @@ function onFieldClick(event: MouseEvent) {
67
67
  ref="textarea"
68
68
  v-model="modelValue"
69
69
  v-bind="{ 'data-enable-grammarly': 'false' }"
70
- class="w-full flex-1 appearance-none rounded-lg text-gray-900 font-medium tracking-tight normal-case outline-none dark:text-gray-100 placeholder-gray-600 dark:placeholder-gray-400"
70
+ class="w-full flex-1 appearance-none rounded-lg text-gray-900 font-medium tracking-tight uppercase outline-none dark:text-gray-100 placeholder-gray-600 dark:placeholder-gray-400"
71
71
  :class="{
72
72
  'field-disabled': disabled,
73
73
  'focus:placeholder-gray-900 hover:placeholder-gray-900 dark:focus:placeholder-gray-100 dark:hover:placeholder-gray-100': !disabled,
@@ -134,7 +134,6 @@ export interface BaseDivider {
134
134
  color?: BaseColor
135
135
  hideNext?: boolean
136
136
  hidePrevious?: boolean
137
- light?: boolean
138
137
  loading?: boolean
139
138
  navigable?: boolean
140
139
  pill?: boolean
@@ -282,6 +281,12 @@ export type BasePowerPower
282
281
 
283
282
  export type BasePowerSize = 'base' | 'lg' | 'sm' | 'xs'
284
283
 
284
+ export interface BaseProgress {
285
+ max?: number
286
+ showLabel?: boolean
287
+ value?: number
288
+ }
289
+
285
290
  export interface BaseQuote {
286
291
  background?: BaseQuoteBackground
287
292
  character?: BaseCharacterCharacter
@@ -45,6 +45,7 @@ declare global {
45
45
  type BasePower = import('./bases').BasePower
46
46
  type BasePowerPower = import('./bases').BasePowerPower
47
47
  type BasePowerSize = import('./bases').BasePowerSize
48
+ type BaseProgress = import('./bases').BaseProgress
48
49
  type BaseQuote = import('./bases').BaseQuote
49
50
  type BaseQuoteBackground = import('./bases').BaseQuoteBackground
50
51
  type BaseQuoteSize = import('./bases').BaseQuoteSize
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saasmakers/ui",
3
- "version": "1.5.1",
3
+ "version": "1.5.2",
4
4
  "private": false,
5
5
  "description": "Reusable Nuxt UI components for SaaS Makers projects",
6
6
  "license": "MIT",