@dolanske/vui 0.3.4 → 0.5.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.
Files changed (114) hide show
  1. package/LICENSE +673 -673
  2. package/README.md +41 -40
  3. package/dist/components/Dropdown/DropdownItem.vue.d.ts +1 -0
  4. package/dist/components/Flex/Flex.vue.d.ts +3 -1
  5. package/dist/components/Grid/Grid.vue.d.ts +3 -1
  6. package/dist/components/Tabs/Tabs.vue.d.ts +4 -0
  7. package/dist/style.css +1 -1
  8. package/dist/vui.js +1547 -1534
  9. package/package.json +68 -68
  10. package/src/App.vue +176 -175
  11. package/src/components/Accordion/Accordion.vue +91 -91
  12. package/src/components/Accordion/AccordionGroup.vue +43 -43
  13. package/src/components/Accordion/accordion.scss +81 -80
  14. package/src/components/Alert/Alert.vue +53 -53
  15. package/src/components/Alert/alert.scss +80 -80
  16. package/src/components/Avatar/Avatar.vue +50 -50
  17. package/src/components/Avatar/avatar.scss +52 -52
  18. package/src/components/Badge/Badge.vue +21 -21
  19. package/src/components/Badge/badge.scss +89 -89
  20. package/src/components/Breadcrumbs/BreadcrumbItem.vue +26 -26
  21. package/src/components/Breadcrumbs/Breadcrumbs.vue +33 -33
  22. package/src/components/Breadcrumbs/breadcrumbs.scss +30 -30
  23. package/src/components/Button/Button.vue +90 -90
  24. package/src/components/Button/button.scss +178 -176
  25. package/src/components/ButtonGroup/ButtonGroup.vue +25 -25
  26. package/src/components/ButtonGroup/button-group.scss +51 -51
  27. package/src/components/Calendar/Calendar.vue +63 -60
  28. package/src/components/Calendar/calendar.scss +60 -56
  29. package/src/components/Card/Card.vue +48 -48
  30. package/src/components/Card/card.scss +53 -53
  31. package/src/components/Checkbox/Checkbox.vue +51 -52
  32. package/src/components/Checkbox/checkbox.scss +75 -66
  33. package/src/components/CopyClipboard/CopyClipboard.vue +82 -82
  34. package/src/components/CopyClipboard/copy-clipboard.scss +17 -17
  35. package/src/components/Divider/Divider.vue +44 -44
  36. package/src/components/Divider/divider.scss +35 -35
  37. package/src/components/Drawer/Drawer.vue +97 -97
  38. package/src/components/Drawer/drawer.scss +36 -36
  39. package/src/components/Dropdown/Dropdown.vue +111 -111
  40. package/src/components/Dropdown/DropdownItem.vue +33 -29
  41. package/src/components/Dropdown/DropdownTitle.vue +8 -8
  42. package/src/components/Dropdown/dropdown-item.scss +77 -0
  43. package/src/components/Dropdown/dropdown.scss +39 -117
  44. package/src/components/Flex/Flex.vue +113 -106
  45. package/src/components/Grid/Grid.vue +60 -54
  46. package/src/components/Input/Counter.vue +70 -70
  47. package/src/components/Input/Dropzone.vue +65 -65
  48. package/src/components/Input/File.vue +15 -15
  49. package/src/components/Input/Input.vue +121 -121
  50. package/src/components/Input/Password.vue +47 -47
  51. package/src/components/Input/Textarea.vue +76 -76
  52. package/src/components/Input/input.scss +208 -208
  53. package/src/components/Kbd/Kbd.vue +48 -48
  54. package/src/components/Kbd/KbdGroup.vue +31 -31
  55. package/src/components/Kbd/kbd.scss +18 -18
  56. package/src/components/Modal/Confirm.vue +56 -56
  57. package/src/components/Modal/Modal.vue +91 -91
  58. package/src/components/Modal/modal.scss +49 -49
  59. package/src/components/OTP/OTP.vue +133 -133
  60. package/src/components/OTP/OTPItem.vue +37 -37
  61. package/src/components/OTP/otp.scss +83 -83
  62. package/src/components/Pagination/Pagination.vue +74 -74
  63. package/src/components/Pagination/pagination.ts +78 -78
  64. package/src/components/Popout/Popout.vue +42 -42
  65. package/src/components/Popout/popout.scss +8 -8
  66. package/src/components/Progress/Progress.vue +90 -90
  67. package/src/components/Progress/progress.scss +41 -41
  68. package/src/components/Radio/Radio.vue +36 -36
  69. package/src/components/Radio/RadioGroup.vue +40 -40
  70. package/src/components/Radio/radio.scss +68 -59
  71. package/src/components/Select/Select.vue +180 -180
  72. package/src/components/Select/select.scss +44 -44
  73. package/src/components/Sheet/Sheet.vue +92 -92
  74. package/src/components/Sheet/sheet.scss +60 -60
  75. package/src/components/Sidebar/Sidebar.vue +102 -0
  76. package/src/components/Sidebar/sidebar.scss +123 -0
  77. package/src/components/Skeleton/Skeleton.vue +43 -43
  78. package/src/components/Skeleton/skeleton.scss +14 -14
  79. package/src/components/Spinner/Spinner.vue +42 -42
  80. package/src/components/Spinner/spinner.scss +46 -46
  81. package/src/components/Switch/Switch.vue +30 -30
  82. package/src/components/Switch/switch.scss +60 -52
  83. package/src/components/Table/Cell.vue +23 -23
  84. package/src/components/Table/Header.vue +59 -59
  85. package/src/components/Table/Row.vue +9 -9
  86. package/src/components/Table/SelectAll.vue +23 -23
  87. package/src/components/Table/SelectRow.vue +29 -29
  88. package/src/components/Table/Table.vue +66 -66
  89. package/src/components/Table/table.scss +134 -134
  90. package/src/components/Table/table.ts +244 -244
  91. package/src/components/Tabs/Tab.vue +27 -27
  92. package/src/components/Tabs/Tabs.vue +89 -82
  93. package/src/components/Tabs/tabs.scss +80 -79
  94. package/src/components/Toast/Toasts.vue +47 -47
  95. package/src/components/Toast/toast.scss +41 -41
  96. package/src/components/Toast/toast.ts +68 -68
  97. package/src/components/Tooltip/Tooltip.vue +86 -86
  98. package/src/components/Tooltip/tooltip.scss +4 -4
  99. package/src/index.scss +1 -1
  100. package/src/index.ts +119 -119
  101. package/src/internal/Backdrop/Backdrop.vue +22 -22
  102. package/src/internal/Backdrop/backdrop.scss +28 -28
  103. package/src/main.ts +5 -5
  104. package/src/shared/helpers.ts +74 -74
  105. package/src/shared/types.ts +29 -29
  106. package/src/style/animation.scss +21 -21
  107. package/src/style/core.scss +150 -148
  108. package/src/style/layout.scss +168 -136
  109. package/src/style/media-query.scss +29 -29
  110. package/src/style/reset.scss +135 -135
  111. package/src/style/{fonts.scss → text.scss} +74 -53
  112. package/src/style/tooltip.scss +128 -128
  113. package/src/style/typography.scss +338 -338
  114. package/src/style/utils.scss +36 -36
@@ -1,244 +1,244 @@
1
- import type { ComputedRef, InjectionKey, MaybeRefOrGetter, Ref } from 'vue'
2
- import type { DeepRequired } from '../../shared/types'
3
- import { computed, provide, readonly, ref, toValue } from 'vue'
4
- import { searchString } from '../../shared/helpers'
5
- import { paginate } from '../Pagination/pagination'
6
-
7
- export type BaseRow = Record<string, string | number>
8
-
9
- export interface TableSelectionProvide {
10
- selectedRows: Ref<Set<BaseRow>>
11
- selectRow: (row: BaseRow) => void
12
- selectAllRows: () => void
13
- enabled: ComputedRef<boolean>
14
- isSelectedAll: ComputedRef<boolean>
15
- }
16
-
17
- export const TableSelectionProvideSymbol = Symbol('select-row-provide') as InjectionKey<TableSelectionProvide>
18
-
19
- interface Sorting<K> {
20
- key?: K
21
- type: 'asc' | 'desc'
22
- }
23
-
24
- export interface Header {
25
- label: string
26
- sortToggle: () => void
27
- sortKey?: 'asc' | 'desc'
28
-
29
- }
30
-
31
- interface TableOptionsInput {
32
- pagination?: {
33
- enabled?: boolean
34
- perPage?: number
35
- maxPages?: number
36
- }
37
- select?: boolean
38
- }
39
-
40
- // eslint-disable-next-line ts/explicit-function-return-type
41
- export function defineTable<const Dataset extends Array<BaseRow>>(
42
- computedDataset: MaybeRefOrGetter<Dataset>,
43
- tableOptions?: TableOptionsInput,
44
- ) {
45
- const $data = computed(() => toValue(computedDataset))
46
-
47
- //
48
- // Reactive options + defaults
49
- const options = ref(Object.assign({
50
- pagination: {
51
- enabled: false,
52
- perPage: 10,
53
- maxPages: 3,
54
- },
55
- select: false,
56
- }, tableOptions) as DeepRequired<TableOptionsInput>)
57
-
58
- //
59
- // Pagination
60
- const currentPage = ref(1)
61
-
62
- const pagination = computed(() => paginate(
63
- $data.value.length,
64
- currentPage.value,
65
- options.value.pagination?.perPage,
66
- options.value.pagination?.maxPages,
67
- ))
68
-
69
- const canNextPage = computed(() => pagination.value.currentPage < pagination.value.endPage)
70
- const canPrevPage = computed(() => pagination.value.currentPage > pagination.value.startPage)
71
-
72
- /**
73
- * Sets the currently active data page. Please note that you provide the page
74
- * number, no its index. So this is 1-indexed input
75
- *
76
- * @param page Page number
77
- */
78
- const setPage = (page: number): void => {
79
- if ((page > currentPage.value && canNextPage.value)
80
- || (page < currentPage.value && canPrevPage.value)) {
81
- currentPage.value = page
82
- }
83
- }
84
-
85
- //
86
- // Sorting
87
-
88
- const sorting = ref<Sorting<Ref<keyof Dataset[number]>>>({
89
- key: undefined,
90
- type: 'asc',
91
- })
92
-
93
- const setSort = (key: keyof Dataset[number], type: 'asc' | 'desc' | 'toggle' = 'asc'): void => {
94
- sorting.value.key = key
95
- sorting.value.type = type === 'toggle'
96
- // Toggle between descending & ascending whenever the set sort fn is called
97
- ? sorting.value.type === 'asc' ? 'desc' : 'asc'
98
- : type
99
- }
100
-
101
- const clearSort = (): void => {
102
- sorting.value.key = undefined
103
- sorting.value.type = 'asc'
104
- }
105
-
106
- //
107
- // Searching
108
- const search = ref<string>()
109
-
110
- //
111
- // Dataset formatting
112
- const filteredRows = computed(() => {
113
- const searchValue = search.value
114
- let final = $data.value
115
-
116
- if (searchValue) {
117
- final = final.filter((row: Dataset[number]) => {
118
- const matches = Object
119
- .values(row)
120
- .map(row => `${row}`)
121
- return searchString(matches, searchValue)
122
- }) as Dataset
123
- }
124
-
125
- const key = sorting.value.key
126
-
127
- if (key) {
128
- // FIXME: change to `toSorted` when typescript is ok
129
- final = [...final].sort((a: Dataset[number], b: Dataset[number]) => {
130
- const aValue = a[key]
131
- const bValue = b[key]
132
- return sorting.value.type === 'asc'
133
- ? aValue > bValue ? 1 : -1
134
- : aValue > bValue ? -1 : 1
135
- }) as Dataset
136
- }
137
-
138
- return final
139
- })
140
-
141
- const headers = computed(() => Object
142
- .keys($data.value[0])
143
- .map((key) => {
144
- return {
145
- label: key,
146
- sortKey: sorting.value.key === key && sorting.value.type,
147
- sortToggle: () => {
148
- // 3-way toggle asc -> desc -> turn off (reset to undefined)
149
- if (sorting.value.key === key) {
150
- switch (sorting.value.type) {
151
- case 'asc': {
152
- sorting.value.type = 'desc'
153
- break
154
- }
155
- case 'desc': {
156
- sorting.value.key = undefined
157
- sorting.value.key = 'asc'
158
- break
159
- }
160
- default: {
161
- sorting.value.key = key
162
- sorting.value.type = 'asc'
163
- break
164
- }
165
- }
166
- }
167
- else {
168
- setSort(key)
169
- }
170
- },
171
- } as Header
172
- }),
173
- )
174
-
175
- const rows = computed(() => {
176
- if (options.value.pagination?.enabled === true) {
177
- return filteredRows.value.slice(
178
- pagination.value.startIndex,
179
- pagination.value.endIndex + 1,
180
- ) as Dataset
181
- }
182
- return filteredRows.value as Dataset
183
- })
184
-
185
- //
186
- // Row selecting
187
- const selectedRows = ref<Set<BaseRow>>(new Set() as Set<BaseRow>)
188
- const selectingEnabled = computed(() => options.value.select)
189
-
190
- /**
191
- * Accepts either an existing index of a row within the dataset or the dataset
192
- * row itself. If the item is already selected, it will be deselected.
193
- *
194
- * @param row {Number | RowObject}
195
- */
196
- function selectRow(row: Dataset[number]): void {
197
- if (selectedRows.value.has(row)) {
198
- selectedRows.value.delete(row)
199
- }
200
- else {
201
- selectedRows.value.add(row)
202
- }
203
- }
204
-
205
- const isSelectedAll = computed(() => $data.value.length === selectedRows.value.size)
206
-
207
- function selectAllRows(): void {
208
- if (isSelectedAll.value) {
209
- // If the selected indexes have the same length as the data array, we can
210
- // assume all of them are selected. Therefore we toggle it by deselecting
211
- // all of them
212
- selectedRows.value = new Set()
213
- }
214
- else {
215
- selectedRows.value = new Set($data.value.map(row => row))
216
- }
217
- }
218
-
219
- provide(TableSelectionProvideSymbol, {
220
- selectedRows,
221
- selectRow,
222
- selectAllRows,
223
- enabled: selectingEnabled,
224
- isSelectedAll,
225
- })
226
-
227
- return {
228
- setSort,
229
- clearSort,
230
- search,
231
- rows: readonly(rows),
232
- allRows: readonly(filteredRows),
233
- selectedRows: readonly(selectedRows),
234
- headers: readonly(headers),
235
- pagination,
236
- canPrevPage,
237
- canNextPage,
238
- setPage,
239
- options,
240
- selectRow,
241
- selectAllRows,
242
- isSelectedAll,
243
- }
244
- }
1
+ import type { ComputedRef, InjectionKey, MaybeRefOrGetter, Ref } from 'vue'
2
+ import type { DeepRequired } from '../../shared/types'
3
+ import { computed, provide, readonly, ref, toValue } from 'vue'
4
+ import { searchString } from '../../shared/helpers'
5
+ import { paginate } from '../Pagination/pagination'
6
+
7
+ export type BaseRow = Record<string, string | number>
8
+
9
+ export interface TableSelectionProvide {
10
+ selectedRows: Ref<Set<BaseRow>>
11
+ selectRow: (row: BaseRow) => void
12
+ selectAllRows: () => void
13
+ enabled: ComputedRef<boolean>
14
+ isSelectedAll: ComputedRef<boolean>
15
+ }
16
+
17
+ export const TableSelectionProvideSymbol = Symbol('select-row-provide') as InjectionKey<TableSelectionProvide>
18
+
19
+ interface Sorting<K> {
20
+ key?: K
21
+ type: 'asc' | 'desc'
22
+ }
23
+
24
+ export interface Header {
25
+ label: string
26
+ sortToggle: () => void
27
+ sortKey?: 'asc' | 'desc'
28
+
29
+ }
30
+
31
+ interface TableOptionsInput {
32
+ pagination?: {
33
+ enabled?: boolean
34
+ perPage?: number
35
+ maxPages?: number
36
+ }
37
+ select?: boolean
38
+ }
39
+
40
+ // eslint-disable-next-line ts/explicit-function-return-type
41
+ export function defineTable<const Dataset extends Array<BaseRow>>(
42
+ computedDataset: MaybeRefOrGetter<Dataset>,
43
+ tableOptions?: TableOptionsInput,
44
+ ) {
45
+ const $data = computed(() => toValue(computedDataset))
46
+
47
+ //
48
+ // Reactive options + defaults
49
+ const options = ref(Object.assign({
50
+ pagination: {
51
+ enabled: false,
52
+ perPage: 10,
53
+ maxPages: 3,
54
+ },
55
+ select: false,
56
+ }, tableOptions) as DeepRequired<TableOptionsInput>)
57
+
58
+ //
59
+ // Pagination
60
+ const currentPage = ref(1)
61
+
62
+ const pagination = computed(() => paginate(
63
+ $data.value.length,
64
+ currentPage.value,
65
+ options.value.pagination?.perPage,
66
+ options.value.pagination?.maxPages,
67
+ ))
68
+
69
+ const canNextPage = computed(() => pagination.value.currentPage < pagination.value.endPage)
70
+ const canPrevPage = computed(() => pagination.value.currentPage > pagination.value.startPage)
71
+
72
+ /**
73
+ * Sets the currently active data page. Please note that you provide the page
74
+ * number, no its index. So this is 1-indexed input
75
+ *
76
+ * @param page Page number
77
+ */
78
+ const setPage = (page: number): void => {
79
+ if ((page > currentPage.value && canNextPage.value)
80
+ || (page < currentPage.value && canPrevPage.value)) {
81
+ currentPage.value = page
82
+ }
83
+ }
84
+
85
+ //
86
+ // Sorting
87
+
88
+ const sorting = ref<Sorting<Ref<keyof Dataset[number]>>>({
89
+ key: undefined,
90
+ type: 'asc',
91
+ })
92
+
93
+ const setSort = (key: keyof Dataset[number], type: 'asc' | 'desc' | 'toggle' = 'asc'): void => {
94
+ sorting.value.key = key
95
+ sorting.value.type = type === 'toggle'
96
+ // Toggle between descending & ascending whenever the set sort fn is called
97
+ ? sorting.value.type === 'asc' ? 'desc' : 'asc'
98
+ : type
99
+ }
100
+
101
+ const clearSort = (): void => {
102
+ sorting.value.key = undefined
103
+ sorting.value.type = 'asc'
104
+ }
105
+
106
+ //
107
+ // Searching
108
+ const search = ref<string>()
109
+
110
+ //
111
+ // Dataset formatting
112
+ const filteredRows = computed(() => {
113
+ const searchValue = search.value
114
+ let final = $data.value
115
+
116
+ if (searchValue) {
117
+ final = final.filter((row: Dataset[number]) => {
118
+ const matches = Object
119
+ .values(row)
120
+ .map(row => `${row}`)
121
+ return searchString(matches, searchValue)
122
+ }) as Dataset
123
+ }
124
+
125
+ const key = sorting.value.key
126
+
127
+ if (key) {
128
+ // FIXME: change to `toSorted` when typescript is ok
129
+ final = [...final].sort((a: Dataset[number], b: Dataset[number]) => {
130
+ const aValue = a[key]
131
+ const bValue = b[key]
132
+ return sorting.value.type === 'asc'
133
+ ? aValue > bValue ? 1 : -1
134
+ : aValue > bValue ? -1 : 1
135
+ }) as Dataset
136
+ }
137
+
138
+ return final
139
+ })
140
+
141
+ const headers = computed(() => Object
142
+ .keys($data.value[0])
143
+ .map((key) => {
144
+ return {
145
+ label: key,
146
+ sortKey: sorting.value.key === key && sorting.value.type,
147
+ sortToggle: () => {
148
+ // 3-way toggle asc -> desc -> turn off (reset to undefined)
149
+ if (sorting.value.key === key) {
150
+ switch (sorting.value.type) {
151
+ case 'asc': {
152
+ sorting.value.type = 'desc'
153
+ break
154
+ }
155
+ case 'desc': {
156
+ sorting.value.key = undefined
157
+ sorting.value.key = 'asc'
158
+ break
159
+ }
160
+ default: {
161
+ sorting.value.key = key
162
+ sorting.value.type = 'asc'
163
+ break
164
+ }
165
+ }
166
+ }
167
+ else {
168
+ setSort(key)
169
+ }
170
+ },
171
+ } as Header
172
+ }),
173
+ )
174
+
175
+ const rows = computed(() => {
176
+ if (options.value.pagination?.enabled === true) {
177
+ return filteredRows.value.slice(
178
+ pagination.value.startIndex,
179
+ pagination.value.endIndex + 1,
180
+ ) as Dataset
181
+ }
182
+ return filteredRows.value as Dataset
183
+ })
184
+
185
+ //
186
+ // Row selecting
187
+ const selectedRows = ref<Set<BaseRow>>(new Set() as Set<BaseRow>)
188
+ const selectingEnabled = computed(() => options.value.select)
189
+
190
+ /**
191
+ * Accepts either an existing index of a row within the dataset or the dataset
192
+ * row itself. If the item is already selected, it will be deselected.
193
+ *
194
+ * @param row {Number | RowObject}
195
+ */
196
+ function selectRow(row: Dataset[number]): void {
197
+ if (selectedRows.value.has(row)) {
198
+ selectedRows.value.delete(row)
199
+ }
200
+ else {
201
+ selectedRows.value.add(row)
202
+ }
203
+ }
204
+
205
+ const isSelectedAll = computed(() => $data.value.length === selectedRows.value.size)
206
+
207
+ function selectAllRows(): void {
208
+ if (isSelectedAll.value) {
209
+ // If the selected indexes have the same length as the data array, we can
210
+ // assume all of them are selected. Therefore we toggle it by deselecting
211
+ // all of them
212
+ selectedRows.value = new Set()
213
+ }
214
+ else {
215
+ selectedRows.value = new Set($data.value.map(row => row))
216
+ }
217
+ }
218
+
219
+ provide(TableSelectionProvideSymbol, {
220
+ selectedRows,
221
+ selectRow,
222
+ selectAllRows,
223
+ enabled: selectingEnabled,
224
+ isSelectedAll,
225
+ })
226
+
227
+ return {
228
+ setSort,
229
+ clearSort,
230
+ search,
231
+ rows: readonly(rows),
232
+ allRows: readonly(filteredRows),
233
+ selectedRows: readonly(selectedRows),
234
+ headers: readonly(headers),
235
+ pagination,
236
+ canPrevPage,
237
+ canNextPage,
238
+ setPage,
239
+ options,
240
+ selectRow,
241
+ selectAllRows,
242
+ isSelectedAll,
243
+ }
244
+ }
@@ -1,27 +1,27 @@
1
- <script setup lang="ts">
2
- import { Icon } from '@iconify/vue'
3
- import { computed } from 'vue'
4
-
5
- export interface TabProps {
6
- disabled?: boolean
7
- id?: string
8
- label: string
9
- icon?: string
10
- }
11
-
12
- const props = defineProps<TabProps>()
13
- const id = computed(() => props.id ?? props.label)
14
- </script>
15
-
16
- <template>
17
- <button
18
- class="vui-tab"
19
- :data-tab-id="id"
20
- :class="{ disabled: props.disabled }"
21
- role="tab"
22
- :name="id"
23
- >
24
- <Icon v-if="props.icon" :icon="props.icon" />
25
- {{ props.label }}
26
- </button>
27
- </template>
1
+ <script setup lang="ts">
2
+ import { Icon } from '@iconify/vue'
3
+ import { computed } from 'vue'
4
+
5
+ export interface TabProps {
6
+ disabled?: boolean
7
+ id?: string
8
+ label: string
9
+ icon?: string
10
+ }
11
+
12
+ const props = defineProps<TabProps>()
13
+ const id = computed(() => props.id ?? props.label)
14
+ </script>
15
+
16
+ <template>
17
+ <button
18
+ class="vui-tab"
19
+ :data-tab-id="id"
20
+ :class="{ disabled: props.disabled }"
21
+ role="tab"
22
+ :name="id"
23
+ >
24
+ <Icon v-if="props.icon" :icon="props.icon" />
25
+ {{ props.label }}
26
+ </button>
27
+ </template>