@dolanske/vui 0.3.4 → 0.4.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 (110) hide show
  1. package/LICENSE +673 -673
  2. package/README.md +49 -40
  3. package/dist/components/Dropdown/DropdownItem.vue.d.ts +1 -0
  4. package/dist/style.css +1 -1
  5. package/dist/vui.js +864 -859
  6. package/package.json +68 -68
  7. package/src/App.vue +198 -175
  8. package/src/components/Accordion/Accordion.vue +91 -91
  9. package/src/components/Accordion/AccordionGroup.vue +43 -43
  10. package/src/components/Accordion/accordion.scss +80 -80
  11. package/src/components/Alert/Alert.vue +53 -53
  12. package/src/components/Alert/alert.scss +80 -80
  13. package/src/components/Avatar/Avatar.vue +50 -50
  14. package/src/components/Avatar/avatar.scss +52 -52
  15. package/src/components/Badge/Badge.vue +21 -21
  16. package/src/components/Badge/badge.scss +89 -89
  17. package/src/components/Breadcrumbs/BreadcrumbItem.vue +26 -26
  18. package/src/components/Breadcrumbs/Breadcrumbs.vue +33 -33
  19. package/src/components/Breadcrumbs/breadcrumbs.scss +30 -30
  20. package/src/components/Button/Button.vue +90 -90
  21. package/src/components/Button/button.scss +176 -176
  22. package/src/components/ButtonGroup/ButtonGroup.vue +25 -25
  23. package/src/components/ButtonGroup/button-group.scss +51 -51
  24. package/src/components/Calendar/Calendar.vue +60 -60
  25. package/src/components/Calendar/calendar.scss +56 -56
  26. package/src/components/Card/Card.vue +48 -48
  27. package/src/components/Card/card.scss +53 -53
  28. package/src/components/Checkbox/Checkbox.vue +52 -52
  29. package/src/components/Checkbox/checkbox.scss +66 -66
  30. package/src/components/CopyClipboard/CopyClipboard.vue +82 -82
  31. package/src/components/CopyClipboard/copy-clipboard.scss +17 -17
  32. package/src/components/Divider/Divider.vue +44 -44
  33. package/src/components/Divider/divider.scss +35 -35
  34. package/src/components/Drawer/Drawer.vue +97 -97
  35. package/src/components/Drawer/drawer.scss +36 -36
  36. package/src/components/Dropdown/Dropdown.vue +111 -111
  37. package/src/components/Dropdown/DropdownItem.vue +32 -29
  38. package/src/components/Dropdown/DropdownTitle.vue +8 -8
  39. package/src/components/Dropdown/dropdown.scss +118 -117
  40. package/src/components/Flex/Flex.vue +110 -106
  41. package/src/components/Grid/Grid.vue +57 -54
  42. package/src/components/Input/Counter.vue +70 -70
  43. package/src/components/Input/Dropzone.vue +65 -65
  44. package/src/components/Input/File.vue +15 -15
  45. package/src/components/Input/Input.vue +121 -121
  46. package/src/components/Input/Password.vue +47 -47
  47. package/src/components/Input/Textarea.vue +76 -76
  48. package/src/components/Input/input.scss +208 -208
  49. package/src/components/Kbd/Kbd.vue +48 -48
  50. package/src/components/Kbd/KbdGroup.vue +31 -31
  51. package/src/components/Kbd/kbd.scss +18 -18
  52. package/src/components/Modal/Confirm.vue +56 -56
  53. package/src/components/Modal/Modal.vue +91 -91
  54. package/src/components/Modal/modal.scss +49 -49
  55. package/src/components/OTP/OTP.vue +133 -133
  56. package/src/components/OTP/OTPItem.vue +37 -37
  57. package/src/components/OTP/otp.scss +83 -83
  58. package/src/components/Pagination/Pagination.vue +74 -74
  59. package/src/components/Pagination/pagination.ts +78 -78
  60. package/src/components/Popout/Popout.vue +42 -42
  61. package/src/components/Popout/popout.scss +8 -8
  62. package/src/components/Progress/Progress.vue +90 -90
  63. package/src/components/Progress/progress.scss +41 -41
  64. package/src/components/Radio/Radio.vue +36 -36
  65. package/src/components/Radio/RadioGroup.vue +40 -40
  66. package/src/components/Radio/radio.scss +59 -59
  67. package/src/components/Select/Select.vue +180 -180
  68. package/src/components/Select/select.scss +44 -44
  69. package/src/components/Sheet/Sheet.vue +92 -92
  70. package/src/components/Sheet/sheet.scss +60 -60
  71. package/src/components/Sidebar/Sidebar.vue +85 -0
  72. package/src/components/Sidebar/sidebar.scss +123 -0
  73. package/src/components/Skeleton/Skeleton.vue +43 -43
  74. package/src/components/Skeleton/skeleton.scss +14 -14
  75. package/src/components/Spinner/Spinner.vue +42 -42
  76. package/src/components/Spinner/spinner.scss +46 -46
  77. package/src/components/Switch/Switch.vue +30 -30
  78. package/src/components/Switch/switch.scss +52 -52
  79. package/src/components/Table/Cell.vue +23 -23
  80. package/src/components/Table/Header.vue +59 -59
  81. package/src/components/Table/Row.vue +9 -9
  82. package/src/components/Table/SelectAll.vue +23 -23
  83. package/src/components/Table/SelectRow.vue +29 -29
  84. package/src/components/Table/Table.vue +66 -66
  85. package/src/components/Table/table.scss +134 -134
  86. package/src/components/Table/table.ts +244 -244
  87. package/src/components/Tabs/Tab.vue +27 -27
  88. package/src/components/Tabs/Tabs.vue +82 -82
  89. package/src/components/Tabs/tabs.scss +79 -79
  90. package/src/components/Toast/Toasts.vue +47 -47
  91. package/src/components/Toast/toast.scss +41 -41
  92. package/src/components/Toast/toast.ts +68 -68
  93. package/src/components/Tooltip/Tooltip.vue +86 -86
  94. package/src/components/Tooltip/tooltip.scss +4 -4
  95. package/src/index.scss +1 -1
  96. package/src/index.ts +119 -119
  97. package/src/internal/Backdrop/Backdrop.vue +22 -22
  98. package/src/internal/Backdrop/backdrop.scss +28 -28
  99. package/src/main.ts +5 -5
  100. package/src/shared/helpers.ts +74 -74
  101. package/src/shared/types.ts +29 -29
  102. package/src/style/animation.scss +21 -21
  103. package/src/style/core.scss +148 -148
  104. package/src/style/fonts.scss +53 -53
  105. package/src/style/layout.scss +136 -136
  106. package/src/style/media-query.scss +29 -29
  107. package/src/style/reset.scss +135 -135
  108. package/src/style/tooltip.scss +128 -128
  109. package/src/style/typography.scss +338 -338
  110. 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>