@maz-ui/mcp 4.0.0-beta.26

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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +264 -0
  3. package/bin/maz-ui-mcp.mjs +7 -0
  4. package/dist/mcp.d.mts +13 -0
  5. package/dist/mcp.d.ts +13 -0
  6. package/dist/mcp.mjs +586 -0
  7. package/docs/generated-docs/maz-accordion.doc.md +21 -0
  8. package/docs/generated-docs/maz-animated-counter.doc.md +17 -0
  9. package/docs/generated-docs/maz-animated-element.doc.md +14 -0
  10. package/docs/generated-docs/maz-animated-text.doc.md +14 -0
  11. package/docs/generated-docs/maz-avatar.doc.md +44 -0
  12. package/docs/generated-docs/maz-backdrop.doc.md +61 -0
  13. package/docs/generated-docs/maz-badge.doc.md +16 -0
  14. package/docs/generated-docs/maz-bottom-sheet.doc.md +21 -0
  15. package/docs/generated-docs/maz-btn.doc.md +30 -0
  16. package/docs/generated-docs/maz-card-spotlight.doc.md +16 -0
  17. package/docs/generated-docs/maz-card.doc.md +39 -0
  18. package/docs/generated-docs/maz-carousel.doc.md +16 -0
  19. package/docs/generated-docs/maz-chart.doc.md +10 -0
  20. package/docs/generated-docs/maz-checkbox.doc.md +34 -0
  21. package/docs/generated-docs/maz-checklist.doc.md +30 -0
  22. package/docs/generated-docs/maz-circular-progress-bar.doc.md +27 -0
  23. package/docs/generated-docs/maz-date-picker.doc.md +52 -0
  24. package/docs/generated-docs/maz-dialog-confirm.doc.md +24 -0
  25. package/docs/generated-docs/maz-dialog.doc.md +22 -0
  26. package/docs/generated-docs/maz-drawer.doc.md +26 -0
  27. package/docs/generated-docs/maz-dropdown.doc.md +42 -0
  28. package/docs/generated-docs/maz-dropzone.doc.md +82 -0
  29. package/docs/generated-docs/maz-expand-animation.doc.md +12 -0
  30. package/docs/generated-docs/maz-fullscreen-loader.doc.md +13 -0
  31. package/docs/generated-docs/maz-gallery.doc.md +17 -0
  32. package/docs/generated-docs/maz-icon.doc.md +18 -0
  33. package/docs/generated-docs/maz-input-code.doc.md +25 -0
  34. package/docs/generated-docs/maz-input-number.doc.md +31 -0
  35. package/docs/generated-docs/maz-input-phone-number.doc.md +56 -0
  36. package/docs/generated-docs/maz-input-price.doc.md +26 -0
  37. package/docs/generated-docs/maz-input-tags.doc.md +24 -0
  38. package/docs/generated-docs/maz-input.doc.md +54 -0
  39. package/docs/generated-docs/maz-lazy-img.doc.md +31 -0
  40. package/docs/generated-docs/maz-link.doc.md +31 -0
  41. package/docs/generated-docs/maz-loading-bar.doc.md +6 -0
  42. package/docs/generated-docs/maz-pagination.doc.md +22 -0
  43. package/docs/generated-docs/maz-popover.doc.md +70 -0
  44. package/docs/generated-docs/maz-pull-to-refresh.doc.md +31 -0
  45. package/docs/generated-docs/maz-radio-buttons.doc.md +33 -0
  46. package/docs/generated-docs/maz-radio.doc.md +33 -0
  47. package/docs/generated-docs/maz-reading-progress-bar.doc.md +18 -0
  48. package/docs/generated-docs/maz-select-country.doc.md +44 -0
  49. package/docs/generated-docs/maz-select.doc.md +65 -0
  50. package/docs/generated-docs/maz-slider.doc.md +20 -0
  51. package/docs/generated-docs/maz-spinner.doc.md +6 -0
  52. package/docs/generated-docs/maz-stepper.doc.md +29 -0
  53. package/docs/generated-docs/maz-switch.doc.md +31 -0
  54. package/docs/generated-docs/maz-table-cell.doc.md +5 -0
  55. package/docs/generated-docs/maz-table-row.doc.md +11 -0
  56. package/docs/generated-docs/maz-table-title.doc.md +5 -0
  57. package/docs/generated-docs/maz-table.doc.md +66 -0
  58. package/docs/generated-docs/maz-tabs-bar.doc.md +18 -0
  59. package/docs/generated-docs/maz-tabs-content-item.doc.md +11 -0
  60. package/docs/generated-docs/maz-tabs-content.doc.md +5 -0
  61. package/docs/generated-docs/maz-tabs.doc.md +17 -0
  62. package/docs/generated-docs/maz-textarea.doc.md +41 -0
  63. package/docs/src/components/index.md +8 -0
  64. package/docs/src/components/maz-accordion.md +80 -0
  65. package/docs/src/components/maz-animated-counter.md +124 -0
  66. package/docs/src/components/maz-animated-element.md +36 -0
  67. package/docs/src/components/maz-animated-text.md +36 -0
  68. package/docs/src/components/maz-avatar.md +179 -0
  69. package/docs/src/components/maz-backdrop.md +16 -0
  70. package/docs/src/components/maz-badge.md +222 -0
  71. package/docs/src/components/maz-bottom-sheet.md +398 -0
  72. package/docs/src/components/maz-btn.md +526 -0
  73. package/docs/src/components/maz-card-spotlight.md +163 -0
  74. package/docs/src/components/maz-card.md +447 -0
  75. package/docs/src/components/maz-carousel.md +127 -0
  76. package/docs/src/components/maz-chart.md +346 -0
  77. package/docs/src/components/maz-checkbox.md +168 -0
  78. package/docs/src/components/maz-checklist.md +414 -0
  79. package/docs/src/components/maz-circular-progress-bar.md +147 -0
  80. package/docs/src/components/maz-date-picker.md +1078 -0
  81. package/docs/src/components/maz-dialog-confirm.md +240 -0
  82. package/docs/src/components/maz-dialog.md +208 -0
  83. package/docs/src/components/maz-drawer.md +177 -0
  84. package/docs/src/components/maz-dropdown.md +650 -0
  85. package/docs/src/components/maz-dropzone.md +442 -0
  86. package/docs/src/components/maz-expand-animation.md +99 -0
  87. package/docs/src/components/maz-fullscreen-loader.md +58 -0
  88. package/docs/src/components/maz-gallery.md +85 -0
  89. package/docs/src/components/maz-icon.md +85 -0
  90. package/docs/src/components/maz-input-code.md +61 -0
  91. package/docs/src/components/maz-input-number.md +81 -0
  92. package/docs/src/components/maz-input-phone-number.md +867 -0
  93. package/docs/src/components/maz-input-price.md +58 -0
  94. package/docs/src/components/maz-input-tags.md +114 -0
  95. package/docs/src/components/maz-input.md +453 -0
  96. package/docs/src/components/maz-lazy-img.md +24 -0
  97. package/docs/src/components/maz-link.md +156 -0
  98. package/docs/src/components/maz-loading-bar.md +26 -0
  99. package/docs/src/components/maz-pagination.md +81 -0
  100. package/docs/src/components/maz-popover.md +1414 -0
  101. package/docs/src/components/maz-pull-to-refresh.md +49 -0
  102. package/docs/src/components/maz-radio-buttons.md +456 -0
  103. package/docs/src/components/maz-radio.md +141 -0
  104. package/docs/src/components/maz-reading-progress-bar.md +74 -0
  105. package/docs/src/components/maz-select-country.md +636 -0
  106. package/docs/src/components/maz-select.md +439 -0
  107. package/docs/src/components/maz-slider.md +191 -0
  108. package/docs/src/components/maz-spinner.md +93 -0
  109. package/docs/src/components/maz-stepper.md +418 -0
  110. package/docs/src/components/maz-switch.md +92 -0
  111. package/docs/src/components/maz-table.md +571 -0
  112. package/docs/src/components/maz-tabs.md +231 -0
  113. package/docs/src/components/maz-textarea.md +218 -0
  114. package/docs/src/composables/use-aos.md +34 -0
  115. package/docs/src/composables/use-breakpoints.md +35 -0
  116. package/docs/src/composables/use-dialog.md +88 -0
  117. package/docs/src/composables/use-display-names.md +174 -0
  118. package/docs/src/composables/use-form-validator.md +1149 -0
  119. package/docs/src/composables/use-idle-timeout.md +256 -0
  120. package/docs/src/composables/use-reading-time.md +168 -0
  121. package/docs/src/composables/use-string-matching.md +63 -0
  122. package/docs/src/composables/use-swipe.md +223 -0
  123. package/docs/src/composables/use-timer.md +130 -0
  124. package/docs/src/composables/use-toast.md +71 -0
  125. package/docs/src/composables/use-user-visibility.md +169 -0
  126. package/docs/src/composables/use-wait.md +62 -0
  127. package/docs/src/composables/use-window-size.md +18 -0
  128. package/docs/src/demo/DemoAuthPage.vue +178 -0
  129. package/docs/src/demo/DemoDashboardPage.vue +298 -0
  130. package/docs/src/demo/DemoProductPage.vue +135 -0
  131. package/docs/src/directives/click-outside.md +275 -0
  132. package/docs/src/directives/fullscreen-img.md +101 -0
  133. package/docs/src/directives/lazy-img.md +184 -0
  134. package/docs/src/directives/tooltip.md +458 -0
  135. package/docs/src/directives/zoom-img.md +127 -0
  136. package/docs/src/guide/cli.md +144 -0
  137. package/docs/src/guide/getting-started.md +284 -0
  138. package/docs/src/guide/icon-set.md +60 -0
  139. package/docs/src/guide/icons.md +481 -0
  140. package/docs/src/guide/mcp.md +210 -0
  141. package/docs/src/guide/migration-v4.md +898 -0
  142. package/docs/src/guide/nuxt.md +411 -0
  143. package/docs/src/guide/resolvers.md +697 -0
  144. package/docs/src/guide/themes.md +789 -0
  145. package/docs/src/guide/translations.md +1173 -0
  146. package/docs/src/guide/vue.md +243 -0
  147. package/docs/src/helpers/camel-case.md +14 -0
  148. package/docs/src/helpers/capitalize.md +51 -0
  149. package/docs/src/helpers/check-availability.md +14 -0
  150. package/docs/src/helpers/country-code-to-unicode-flag.md +213 -0
  151. package/docs/src/helpers/currency.md +67 -0
  152. package/docs/src/helpers/date.md +67 -0
  153. package/docs/src/helpers/debounce-callback.md +14 -0
  154. package/docs/src/helpers/debounce-id.md +14 -0
  155. package/docs/src/helpers/debounce.md +14 -0
  156. package/docs/src/helpers/get-country-flag-url.md +156 -0
  157. package/docs/src/helpers/is-client.md +14 -0
  158. package/docs/src/helpers/is-equal.md +14 -0
  159. package/docs/src/helpers/is-standalone-mode.md +14 -0
  160. package/docs/src/helpers/kebab-case.md +14 -0
  161. package/docs/src/helpers/normalize-string.md +14 -0
  162. package/docs/src/helpers/number.md +65 -0
  163. package/docs/src/helpers/pascal-case.md +14 -0
  164. package/docs/src/helpers/script-loader.md +14 -0
  165. package/docs/src/helpers/sleep.md +14 -0
  166. package/docs/src/helpers/snake-case.md +14 -0
  167. package/docs/src/helpers/throttle-id.md +14 -0
  168. package/docs/src/helpers/throttle.md +14 -0
  169. package/docs/src/index.md +555 -0
  170. package/docs/src/made-with-maz-ui.md +58 -0
  171. package/docs/src/plugins/aos.md +347 -0
  172. package/docs/src/plugins/dialog.md +411 -0
  173. package/docs/src/plugins/toast.md +349 -0
  174. package/docs/src/plugins/wait.md +109 -0
  175. package/package.json +84 -0
@@ -0,0 +1,256 @@
1
+ ---
2
+ title: useIdleTimeout
3
+ description: A Vue 3 composable that provides an easy way to track user inactivity on your website and execute a callback function when the user becomes idle.
4
+ ---
5
+
6
+ # {{ $frontmatter.title }}
7
+
8
+ {{ $frontmatter.description }}
9
+
10
+ ::: info
11
+ A plugin to know the amount of time a user has spent on your website
12
+ :::
13
+
14
+ ## Demo
15
+
16
+ <ComponentDemo>
17
+ <div class="flex items-start gap-05 items-center flex-wrap">
18
+ <MazBtn @click="idleTimeout.start()" color="info">
19
+ Start
20
+ </MazBtn>
21
+ <MazBtn @click="idleTimeout.pause()" color="warning">
22
+ Pause
23
+ </MazBtn>
24
+ <MazBtn @click="idleTimeout.resume()">
25
+ Resume
26
+ </MazBtn>
27
+ <MazBtn @click="idleTimeout.reset()" color="secondary">
28
+ Reset
29
+ </MazBtn>
30
+ <MazBtn @click="idleTimeout.destroy()" color="destructive">
31
+ Destroy
32
+ </MazBtn>
33
+ </div>
34
+
35
+ <br />
36
+
37
+ <MazCard block>
38
+ <div style="display: flex;">
39
+ <div style="flex: 1;">isIdle: {{event.isIdle ?? false}}</div>
40
+ <div v-if="event.eventType" style="flex: 1; padding-left: 10px;">eventType: {{event.eventType ?? '-' }}</div>
41
+ </div>
42
+ </MazCard>
43
+
44
+ <br />
45
+ <br />
46
+
47
+ <p class="maz-text-warning">Wait 5 seconds without any actions to see the dialog popup</p>
48
+
49
+ <template #code>
50
+
51
+ ```vue
52
+ <script lang="ts" setup>
53
+ import { MazBtn, MazCard } from 'maz-ui/components'
54
+
55
+ import { useDialog, useIdleTimeout } from 'maz-ui/composables'
56
+
57
+ import { onBeforeUnmount, onMounted, ref } from 'vue'
58
+
59
+ const dialog = useDialog()
60
+
61
+ const event = ref({})
62
+
63
+ const timeout = 5000
64
+
65
+ const idleTimeout = useIdleTimeout({
66
+ callback,
67
+ options: {
68
+ timeout,
69
+ immediate: false,
70
+ once: false,
71
+ },
72
+ })
73
+
74
+ async function callback({ isIdle, eventType, instance }) {
75
+ console.log({ isIdle, eventType })
76
+ event.value = { isIdle, eventType }
77
+
78
+ if (isIdle) {
79
+ try {
80
+ instance.destroy()
81
+ await dialog.open({
82
+ title: 'Are you still here?',
83
+ message: `You have been inactive for ${timeout / 1000} secondes, do you want to continue?`,
84
+ cancelText: 'No',
85
+ confirmText: 'Yes',
86
+ }).promise
87
+ instance.start()
88
+ }
89
+ catch (e) {
90
+ // do something like logout the user
91
+ }
92
+ }
93
+ }
94
+
95
+ onMounted(() => {
96
+ // should be executed on client side
97
+ idleTimeout.start()
98
+ })
99
+
100
+ onBeforeUnmount(() => {
101
+ // Destroy the instance when the component is destroyed to avoid memory leaks
102
+ idleTimeout.destroy()
103
+ })
104
+ </script>
105
+
106
+ <template>
107
+ <MazBtn color="info" @click="idle.start()">
108
+ Start
109
+ </MazBtn>
110
+ <MazBtn color="warning" @click="idle.pause()">
111
+ Pause
112
+ </MazBtn>
113
+ <MazBtn @click="idle.resume()">
114
+ Resume
115
+ </MazBtn>
116
+ <MazBtn color="secondary" @click="idle.reset()">
117
+ Reset
118
+ </MazBtn>
119
+ <MazBtn color="destructive" @click="idle.destroy()">
120
+ Destroy
121
+ </MazBtn>
122
+
123
+ <MazCard block>
124
+ <div style="display: flex;">
125
+ <div style="flex: 1;">
126
+ isIdle: {{ event.isIdle }}
127
+ </div>
128
+ <div v-if="event.eventType" style="flex: 1; padding-left: 10px;">
129
+ eventType: {{ event.eventType }}
130
+ </div>
131
+ </div>
132
+ </MazCard>
133
+ </template>
134
+ ```
135
+
136
+ </template>
137
+ </ComponentDemo>
138
+
139
+ <script lang="ts" setup>
140
+ import { onMounted, ref, onBeforeUnmount } from 'vue'
141
+
142
+ import { useIdleTimeout } from 'maz-ui/src/composables/useIdleTimeout'
143
+ import { useDialog } from 'maz-ui/src/composables/useDialog'
144
+
145
+ const dialog = useDialog()
146
+
147
+ const event = ref({})
148
+
149
+ const timeout = 5000
150
+
151
+ const idleTimeout = useIdleTimeout({
152
+ callback,
153
+ options: {
154
+ timeout,
155
+ immediate: false,
156
+ once: false,
157
+ },
158
+ })
159
+
160
+ async function callback({ isIdle, eventType, instance }) {
161
+ console.log({ isIdle, eventType })
162
+ event.value = { isIdle, eventType }
163
+
164
+ if (isIdle) {
165
+ try {
166
+ instance.destroy()
167
+ await dialog.open({
168
+ title: 'Are you still here?',
169
+ message: `You have been inactive for ${timeout / 1000} secondes, do you want to continue?`,
170
+ data: {
171
+ cancelText: 'No',
172
+ confirmText: 'Yes',
173
+ }
174
+ }).promise
175
+ instance.start()
176
+ } catch (e) {
177
+ instance.destroy()
178
+ }
179
+ }
180
+ }
181
+
182
+ onMounted(() => {
183
+ // should be executed on client
184
+ idleTimeout.start()
185
+ })
186
+
187
+ onBeforeUnmount(() => {
188
+ idleTimeout.destroy()
189
+ })
190
+ </script>
191
+
192
+ ## Callback
193
+
194
+ ```ts
195
+ type IdleTimeoutCallback = (payload: {
196
+ isIdle: boolean
197
+ eventType?: string
198
+ }) => void
199
+ ```
200
+
201
+ ## Options
202
+
203
+ ```ts
204
+ interface IdleTimeoutStrictOption {
205
+ /** @default document.body */
206
+ element?: HTMLElement | Document
207
+ /** @default 60 * 1000 * 5 --> 5 minutes */
208
+ timeout?: number
209
+ /** @default false */
210
+ once?: boolean
211
+ /** @default true */
212
+ immediate?: boolean
213
+ }
214
+ ```
215
+
216
+ ## Actions
217
+
218
+ ### Start
219
+
220
+ Start tracking user - needed for SSR when `immediate` option is set to false (execute it on client side)
221
+
222
+ ```ts
223
+ idleTimeout.start()
224
+ ```
225
+
226
+ ### Pause
227
+
228
+ Will pause the timeout and events, can't be executed when the timeout has expired
229
+
230
+ ```ts
231
+ idleTimeout.pause()
232
+ ```
233
+
234
+ ### Resume
235
+
236
+ Resume the instance will reinit the timeout
237
+
238
+ ```ts
239
+ idleTimeout.resume()
240
+ ```
241
+
242
+ ### Reset
243
+
244
+ Reset the timeout of the instance like a restart
245
+
246
+ ```ts
247
+ idleTimeout.reset()
248
+ ```
249
+
250
+ ### Destroy
251
+
252
+ Will destroy the instance and stop tracking
253
+
254
+ ```ts
255
+ idleTimeout.destroy()
256
+ ```
@@ -0,0 +1,168 @@
1
+ ---
2
+ title: useReadingTime
3
+ description: This composable allows you to calculate the reading time of a text
4
+ ---
5
+
6
+ # {{ $frontmatter.title }}
7
+
8
+ {{ $frontmatter.description }}
9
+
10
+ ## Basic usage
11
+
12
+ Time to read this page: <strong>{{ duration }} minutes</strong>
13
+
14
+ ```vue
15
+ <script lang="ts" setup>
16
+ import { useReadingTime } from 'maz-ui/composables'
17
+
18
+ const { duration } = useReadingTime({
19
+ content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lectus quam id leo in. Placerat vestibulum lectus mauris ultrices eros in cursus turpis. Et tortor consequat id porta nibh venenatis cras sed. Praesent tristique magna sit amet. Iaculis at erat pellentesque adipiscing commodo elit at. Interdum velit euismod in pellentesque massa placerat duis. Eget nunc scelerisque viverra mauris in aliquam. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum odio. Egestas integer eget aliquet nibh praesent tristique magna sit amet. Volutpat blandit aliquam etiam erat velit scelerisque. Eget nullam non nisi est sit amet. Turpis egestas sed tempus urna et pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo. Rutrum tellus pellentesque eu tincidunt tortor aliquam. Non odio euismod lacinia at. Magna eget est lorem ipsum. Et ultrices neque ornare aenean euismod elementum nisi. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim lobortis. Lobortis feugiat vivamus at augue eget arcu. Ut diam quam nulla porttitor massa id neque. Turpis in eu mi bibendum neque egestas. Vivamus at augue eget arcu dictum varius duis at. Nunc sed blandit libero volutpat. Convallis a cras semper auctor neque vitae tempus. Odio facilisis mauris sit amet massa vitae tortor condimentum. Condimentum id venenatis a condimentum. Tincidunt praesent semper feugiat nibh sed pulvinar. Dolor magna eget est lorem ipsum dolor. Ultricies mi eget mauris pharetra et ultrices neque ornare aenean. Sapien pellentesque habitant morbi tristique senectus et netus. Tortor vitae purus faucibus ornare suspendisse sed nisi. Est lorem ipsum dolor sit amet consectetur adipiscing elit pellentesque. Enim neque volutpat ac tincidunt vitae. Iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Scelerisque felis imperdiet proin fermentum leo vel orci porta non. Ut etiam sit amet nisl purus in mollis nunc sed. Sed velit dignissim sodales ut eu sem integer. Odio tempor orci dapibus ultrices in iaculis nunc. Id semper risus in hendrerit gravida. Aliquam faucibus purus in massa tempor nec. Mattis nunc sed blandit libero volutpat sed cras ornare arcu. Quisque id diam vel quam elementum pulvinar etiam non quam. Et egestas quis ipsum suspendisse ultrices gravida dictum. Velit aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. In hac habitasse platea dictumst quisque. Amet nisl purus in mollis nunc sed id semper. Sollicitudin tempor id eu nisl nunc mi. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. In iaculis nunc sed augue lacus viverra vitae.'
20
+ })
21
+ </script>
22
+
23
+ <template>
24
+ <div>
25
+ Time to read this page: <strong>{{ duration }} minutes</strong>
26
+ </div>
27
+ </template>
28
+ ```
29
+
30
+ ## With content selector
31
+
32
+ ::: warning
33
+ This method is not SSR friendly (only on client side, with Nuxt use this composable in `onMounted(() => { ... })`) and not recommended because it is less performant than the previous one
34
+ :::
35
+
36
+ Time to read this page: <strong>{{ durationSelector }} minutes</strong>
37
+
38
+ <MazCard collapsible class="maz-w-full" title="Content to read">
39
+ <div id="content-to-read" class="maz-px-4">
40
+ <p>
41
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lectus quam id leo in. Placerat vestibulum lectus mauris ultrices eros in cursus turpis. Et tortor consequat id porta nibh venenatis cras sed. Praesent tristique magna sit amet. Iaculis at erat pellentesque adipiscing commodo elit at. Interdum velit euismod in pellentesque massa placerat duis. Eget nunc scelerisque viverra mauris in aliquam. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum odio. Egestas integer eget aliquet nibh praesent tristique magna sit amet. Volutpat blandit aliquam etiam erat velit scelerisque. Eget nullam non nisi est sit amet. Turpis egestas sed tempus urna et pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo. Rutrum tellus pellentesque eu tincidunt tortor aliquam. Non odio euismod lacinia at. Magna eget est lorem ipsum.
42
+ </p>
43
+ <p>
44
+ Et ultrices neque ornare aenean euismod elementum nisi. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim lobortis. Lobortis feugiat vivamus at augue eget arcu. Ut diam quam nulla porttitor massa id neque. Turpis in eu mi bibendum neque egestas. Vivamus at augue eget arcu dictum varius duis at. Nunc sed blandit libero volutpat. Convallis a cras semper auctor neque vitae tempus. Odio facilisis mauris sit amet massa vitae tortor condimentum. Condimentum id venenatis a condimentum. Tincidunt praesent semper feugiat nibh sed pulvinar. Dolor magna eget est lorem ipsum dolor. Ultricies mi eget mauris pharetra et ultrices neque ornare aenean. Sapien pellentesque habitant morbi tristique senectus et netus. Tortor vitae purus faucibus ornare suspendisse sed nisi. Est lorem ipsum dolor sit amet consectetur adipiscing elit pellentesque. Enim neque volutpat ac tincidunt vitae.
45
+ </p>
46
+ <p>
47
+ Iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Scelerisque felis imperdiet proin fermentum leo vel orci porta non. Ut etiam sit amet nisl purus in mollis nunc sed. Sed velit dignissim sodales ut eu sem integer. Odio tempor orci dapibus ultrices in iaculis nunc. Id semper risus in hendrerit gravida. Aliquam faucibus purus in massa tempor nec. Mattis nunc sed blandit libero volutpat sed cras ornare arcu. Quisque id diam vel quam elementum pulvinar etiam non quam. Et egestas quis ipsum suspendisse ultrices gravida dictum. Velit aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. In hac habitasse platea dictumst quisque. Amet nisl purus in mollis nunc sed id semper. Sollicitudin tempor id eu nisl nunc mi. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. In iaculis nunc sed augue lacus viverra vitae.
48
+ </p>
49
+ </div>
50
+ </MazCard>
51
+
52
+ ```vue
53
+ <script lang="ts" setup>
54
+ import { useReadingTime } from 'maz-ui/composables'
55
+
56
+ const readingTime = ref<number>()
57
+
58
+ const { duration } = useReadingTime({
59
+ contentSelector: '#content-to-read'
60
+ })
61
+
62
+ readingTime.value = duration
63
+
64
+ onMounted(() => {
65
+ const { duration } = useReadingTime({
66
+ contentSelector: '#content-to-read'
67
+ })
68
+
69
+ readingTime.value = duration
70
+ })
71
+ </script>
72
+
73
+ <template>
74
+ <div>
75
+ Time to read this page: <strong>{{ duration }} minutes</strong>
76
+ </div>
77
+
78
+ <MazCard collapsible class="maz-w-full" title="Content to read">
79
+ <div id="content-to-read" class="maz-px-4">
80
+ <p>
81
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lectus quam id leo in. Placerat vestibulum lectus mauris ultrices eros in cursus turpis. Et tortor consequat id porta nibh venenatis cras sed. Praesent tristique magna sit amet. Iaculis at erat pellentesque adipiscing commodo elit at. Interdum velit euismod in pellentesque massa placerat duis. Eget nunc scelerisque viverra mauris in aliquam. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum odio. Egestas integer eget aliquet nibh praesent tristique magna sit amet. Volutpat blandit aliquam etiam erat velit scelerisque. Eget nullam non nisi est sit amet. Turpis egestas sed tempus urna et pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo. Rutrum tellus pellentesque eu tincidunt tortor aliquam. Non odio euismod lacinia at. Magna eget est lorem ipsum.
82
+ </p>
83
+ <p>
84
+ Et ultrices neque ornare aenean euismod elementum nisi. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim lobortis. Lobortis feugiat vivamus at augue eget arcu. Ut diam quam nulla porttitor massa id neque. Turpis in eu mi bibendum neque egestas. Vivamus at augue eget arcu dictum varius duis at. Nunc sed blandit libero volutpat. Convallis a cras semper auctor neque vitae tempus. Odio facilisis mauris sit amet massa vitae tortor condimentum. Condimentum id venenatis a condimentum. Tincidunt praesent semper feugiat nibh sed pulvinar. Dolor magna eget est lorem ipsum dolor. Ultricies mi eget mauris pharetra et ultrices neque ornare aenean. Sapien pellentesque habitant morbi tristique senectus et netus. Tortor vitae purus faucibus ornare suspendisse sed nisi. Est lorem ipsum dolor sit amet consectetur adipiscing elit pellentesque. Enim neque volutpat ac tincidunt vitae.
85
+ </p>
86
+ <p>
87
+ Iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Scelerisque felis imperdiet proin fermentum leo vel orci porta non. Ut etiam sit amet nisl purus in mollis nunc sed. Sed velit dignissim sodales ut eu sem integer. Odio tempor orci dapibus ultrices in iaculis nunc. Id semper risus in hendrerit gravida. Aliquam faucibus purus in massa tempor nec. Mattis nunc sed blandit libero volutpat sed cras ornare arcu. Quisque id diam vel quam elementum pulvinar etiam non quam. Et egestas quis ipsum suspendisse ultrices gravida dictum. Velit aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. In hac habitasse platea dictumst quisque. Amet nisl purus in mollis nunc sed id semper. Sollicitudin tempor id eu nisl nunc mi. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. In iaculis nunc sed augue lacus viverra vitae.
88
+ </p>
89
+ </div>
90
+ </MazCard>
91
+ </template>
92
+ ```
93
+
94
+ ## Velocity
95
+
96
+ > The velocity is the number of words per minute. By default it is 150 words per minute.
97
+
98
+ **Velocity**: {{ velocity ?? 150 }} words per minute
99
+
100
+ <MazInputNumber v-model="velocity" placeholder="Velocity" />
101
+
102
+ Time to read this page: <strong>{{ durationSelector }} minutes</strong>
103
+
104
+ {{wordCount}}
105
+
106
+ <script lang="ts" setup>
107
+ import { ref, onMounted } from 'vue'
108
+ import { useReadingTime } from 'maz-ui/src/composables/useReadingTime'
109
+
110
+ const velocity = ref()
111
+
112
+ const { duration } = useReadingTime({
113
+ content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lectus quam id leo in. Placerat vestibulum lectus mauris ultrices eros in cursus turpis. Et tortor consequat id porta nibh venenatis cras sed. Praesent tristique magna sit amet. Iaculis at erat pellentesque adipiscing commodo elit at. Interdum velit euismod in pellentesque massa placerat duis. Eget nunc scelerisque viverra mauris in aliquam. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum odio. Egestas integer eget aliquet nibh praesent tristique magna sit amet. Volutpat blandit aliquam etiam erat velit scelerisque. Eget nullam non nisi est sit amet. Turpis egestas sed tempus urna et pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo. Rutrum tellus pellentesque eu tincidunt tortor aliquam. Non odio euismod lacinia at. Magna eget est lorem ipsum. Et ultrices neque ornare aenean euismod elementum nisi. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim lobortis. Lobortis feugiat vivamus at augue eget arcu. Ut diam quam nulla porttitor massa id neque. Turpis in eu mi bibendum neque egestas. Vivamus at augue eget arcu dictum varius duis at. Nunc sed blandit libero volutpat. Convallis a cras semper auctor neque vitae tempus. Odio facilisis mauris sit amet massa vitae tortor condimentum. Condimentum id venenatis a condimentum. Tincidunt praesent semper feugiat nibh sed pulvinar. Dolor magna eget est lorem ipsum dolor. Ultricies mi eget mauris pharetra et ultrices neque ornare aenean. Sapien pellentesque habitant morbi tristique senectus et netus. Tortor vitae purus faucibus ornare suspendisse sed nisi. Est lorem ipsum dolor sit amet consectetur adipiscing elit pellentesque. Enim neque volutpat ac tincidunt vitae. Iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Scelerisque felis imperdiet proin fermentum leo vel orci porta non. Ut etiam sit amet nisl purus in mollis nunc sed. Sed velit dignissim sodales ut eu sem integer. Odio tempor orci dapibus ultrices in iaculis nunc. Id semper risus in hendrerit gravida. Aliquam faucibus purus in massa tempor nec. Mattis nunc sed blandit libero volutpat sed cras ornare arcu. Quisque id diam vel quam elementum pulvinar etiam non quam. Et egestas quis ipsum suspendisse ultrices gravida dictum. Velit aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. In hac habitasse platea dictumst quisque. Amet nisl purus in mollis nunc sed id semper. Sollicitudin tempor id eu nisl nunc mi. Dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim. In iaculis nunc sed augue lacus viverra vitae.',
114
+ velocity,
115
+ })
116
+
117
+ const contentSelector = ref()
118
+
119
+ const { duration: durationSelector, wordCount } = useReadingTime({
120
+ contentSelector,
121
+ velocity,
122
+ })
123
+
124
+ onMounted(() => {
125
+ setTimeout(() => {
126
+ contentSelector.value = '#content-to-read'
127
+ }, 500)
128
+ })
129
+ </script>
130
+
131
+ ## Types
132
+
133
+ ### Options
134
+
135
+ ```ts
136
+ export interface ReadingTimeOptions {
137
+ /**
138
+ * Content to calculate the reading time
139
+ * @default undefined
140
+ */
141
+ content?: string | Ref<string>
142
+ /**
143
+ * Selector of the content to calculate the reading time
144
+ * @default undefined
145
+ */
146
+ contentSelector?: string | Ref<string>
147
+ /**
148
+ * Words per minute
149
+ * @default 150
150
+ */
151
+ velocity?: number
152
+ }
153
+ ```
154
+
155
+ ### Returns
156
+
157
+ ```ts
158
+ export interface ReadingTimeReturn {
159
+ /** Content to calculate the reading time */
160
+ content: ComputedRef<string | undefined | null>
161
+ /** Number of words in the content */
162
+ wordCount: ComputedRef<number>
163
+ /** Words per minute */
164
+ velocity: ComputedRef<number>
165
+ /** Reading time in minutes */
166
+ duration: ComputedRef<number>
167
+ }
168
+ ```
@@ -0,0 +1,63 @@
1
+ ---
2
+ title: useStringMatching
3
+ description: Efficient composable for string matching tasks, utilizing Levenshtein distance calculation. Simplify comparison operations with minimal setup. Enhance text similarity checks effortlessly.
4
+ ---
5
+
6
+ # {{ $frontmatter.title }}
7
+
8
+ {{ $frontmatter.description }}
9
+
10
+ ## Usage
11
+
12
+ <ComponentDemo>
13
+ <div class="maz-flex maz-gap-4 maz-items-start maz-flex-wrap maz-mb-4">
14
+ <MazInput v-model="string1" label="Enter first string" />
15
+ <MazInput v-model="string2" label="Enter second string" />
16
+ </div>
17
+
18
+ <p class="!maz-mb-1">
19
+ <b>isMatching:</b> {{ isMatching }}
20
+ </p>
21
+ <p class="!maz-my-0">
22
+ <b>score:</b> {{ score }}
23
+ </p>
24
+
25
+ <template #code>
26
+
27
+ ```vue
28
+ <script lang="ts" setup>
29
+ import { useStringMatching } from 'maz-ui/composables'
30
+ import { ref } from 'vue'
31
+
32
+ const string1 = ref<string>('maz-ui')
33
+ const string2 = ref<string>('màéz-uiok')
34
+
35
+ const { score, isMatching } = useStringMatching(string1, string2)
36
+ </script>
37
+
38
+ <template>
39
+ <MazInput v-model="string1" label="Enter first string" />
40
+ <MazInput v-model="string2" label="Enter second string" />
41
+
42
+ <p>
43
+ <b>isMatching:</b> {{ isMatching }}
44
+ </p>
45
+ <p>
46
+ <b>score:</b> {{ score }}
47
+ </p>
48
+ </template>
49
+ ```
50
+
51
+ </template>
52
+
53
+ </ComponentDemo>
54
+
55
+ <script lang="ts" setup>
56
+ import { ref } from 'vue'
57
+ import { useStringMatching } from 'maz-ui/src/composables/useStringMatching'
58
+
59
+ const string1 = ref<string>('maz-ui')
60
+ const string2 = ref<string>('méz-ui')
61
+
62
+ const { score, isMatching } = useStringMatching(string1, string2, 0.75)
63
+ </script>