@winchsa/ui 0.1.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 (305) hide show
  1. package/README.md +166 -0
  2. package/dist/components/Breadcrumbs.vue +46 -0
  3. package/dist/components/Breadcrumbs.vue.d.ts +6 -0
  4. package/dist/components/Drawer.vue +60 -0
  5. package/dist/components/Drawer.vue.d.ts +44 -0
  6. package/dist/components/IconBtn.vue +18 -0
  7. package/dist/components/IconBtn.vue.d.ts +30 -0
  8. package/dist/components/Modal.vue +155 -0
  9. package/dist/components/Modal.vue.d.ts +0 -0
  10. package/dist/components/SiteTitle.vue +14 -0
  11. package/dist/components/SiteTitle.vue.d.ts +2 -0
  12. package/dist/components/Toaster.vue +19 -0
  13. package/dist/components/Toaster.vue.d.ts +5 -0
  14. package/dist/components/cards/CheckboxesCard.vue +76 -0
  15. package/dist/components/cards/CheckboxesCard.vue.d.ts +20 -0
  16. package/dist/components/cards/HeaderCard.vue +31 -0
  17. package/dist/components/cards/HeaderCard.vue.d.ts +8 -0
  18. package/dist/components/cards/ImageCard.vue +73 -0
  19. package/dist/components/cards/ImageCard.vue.d.ts +63 -0
  20. package/dist/components/cards/InputCard.vue +60 -0
  21. package/dist/components/cards/InputCard.vue.d.ts +41 -0
  22. package/dist/components/cards/StaticCard.vue +37 -0
  23. package/dist/components/cards/StaticCard.vue.d.ts +33 -0
  24. package/dist/components/core/AppBarSearch.vue +345 -0
  25. package/dist/components/core/AppBarSearch.vue.d.ts +1587 -0
  26. package/dist/components/core/AppDrawerHeaderSection.vue +21 -0
  27. package/dist/components/core/AppDrawerHeaderSection.vue.d.ts +30 -0
  28. package/dist/components/core/AppSearchHeader.vue +72 -0
  29. package/dist/components/core/AppSearchHeader.vue.d.ts +7 -0
  30. package/dist/components/core/AppStepper.vue +232 -0
  31. package/dist/components/core/AppStepper.vue.d.ts +25 -0
  32. package/dist/components/core/CustomizerSection.vue +19 -0
  33. package/dist/components/core/CustomizerSection.vue.d.ts +25 -0
  34. package/dist/components/core/DialogCloseBtn.vue +20 -0
  35. package/dist/components/core/DialogCloseBtn.vue.d.ts +9 -0
  36. package/dist/components/core/MoreBtn.vue +27 -0
  37. package/dist/components/core/MoreBtn.vue.d.ts +25 -0
  38. package/dist/components/core/ScrollToTop.vue +39 -0
  39. package/dist/components/core/ScrollToTop.vue.d.ts +2 -0
  40. package/dist/components/core/app-form-elements/AppCombobox.vue +67 -0
  41. package/dist/components/core/app-form-elements/AppCombobox.vue.d.ts +0 -0
  42. package/dist/components/core/app-form-elements/AppSelect.vue +98 -0
  43. package/dist/components/core/app-form-elements/AppSelect.vue.d.ts +0 -0
  44. package/dist/components/core/app-form-elements/AppSwitch.vue +59 -0
  45. package/dist/components/core/app-form-elements/AppSwitch.vue.d.ts +27 -0
  46. package/dist/components/core/app-form-elements/AppTextField.vue +66 -0
  47. package/dist/components/core/app-form-elements/AppTextField.vue.d.ts +26 -0
  48. package/dist/components/core/app-form-elements/AppTextarea.vue +69 -0
  49. package/dist/components/core/app-form-elements/AppTextarea.vue.d.ts +26 -0
  50. package/dist/components/core/app-form-elements/CustomCheckboxes.vue +69 -0
  51. package/dist/components/core/app-form-elements/CustomCheckboxes.vue.d.ts +39 -0
  52. package/dist/components/core/app-form-elements/CustomCheckboxesWithIcon.vue +80 -0
  53. package/dist/components/core/app-form-elements/CustomCheckboxesWithIcon.vue.d.ts +39 -0
  54. package/dist/components/core/app-form-elements/CustomCheckboxesWithImage.vue +67 -0
  55. package/dist/components/core/app-form-elements/CustomCheckboxesWithImage.vue.d.ts +15 -0
  56. package/dist/components/core/app-form-elements/CustomRadios.vue +69 -0
  57. package/dist/components/core/app-form-elements/CustomRadios.vue.d.ts +40 -0
  58. package/dist/components/core/app-form-elements/CustomRadiosWithIcon.vue +98 -0
  59. package/dist/components/core/app-form-elements/CustomRadiosWithIcon.vue.d.ts +45 -0
  60. package/dist/components/core/app-form-elements/CustomRadiosWithImage.vue +69 -0
  61. package/dist/components/core/app-form-elements/CustomRadiosWithImage.vue.d.ts +53 -0
  62. package/dist/components/core/cards/AppCard.vue +45 -0
  63. package/dist/components/core/cards/AppCard.vue.d.ts +26 -0
  64. package/dist/components/core/cards/AppCardActions.vue +126 -0
  65. package/dist/components/core/cards/AppCardActions.vue.d.ts +79 -0
  66. package/dist/components/core/cards/CardStatisticsHorizontal.vue +29 -0
  67. package/dist/components/core/cards/CardStatisticsHorizontal.vue.d.ts +10 -0
  68. package/dist/components/forms/Accordion.vue +43 -0
  69. package/dist/components/forms/Accordion.vue.d.ts +35 -0
  70. package/dist/components/forms/AppLabel.vue +47 -0
  71. package/dist/components/forms/AppLabel.vue.d.ts +36 -0
  72. package/dist/components/forms/AppLink.vue +50 -0
  73. package/dist/components/forms/AppLink.vue.d.ts +27 -0
  74. package/dist/components/forms/AppNumberField.vue +85 -0
  75. package/dist/components/forms/AppNumberField.vue.d.ts +45 -0
  76. package/dist/components/forms/AppOtpInput.vue +84 -0
  77. package/dist/components/forms/AppOtpInput.vue.d.ts +16 -0
  78. package/dist/components/forms/AttachmentCropperInput.vue +228 -0
  79. package/dist/components/forms/AttachmentCropperInput.vue.d.ts +25 -0
  80. package/dist/components/forms/AttachmentInput.vue +116 -0
  81. package/dist/components/forms/AttachmentInput.vue.d.ts +20 -0
  82. package/dist/components/forms/AutocompleteInput.vue +759 -0
  83. package/dist/components/forms/AutocompleteInput.vue.d.ts +0 -0
  84. package/dist/components/forms/BankSelect.vue +43 -0
  85. package/dist/components/forms/BankSelect.vue.d.ts +19 -0
  86. package/dist/components/forms/BaseButton.vue +42 -0
  87. package/dist/components/forms/BaseButton.vue.d.ts +31 -0
  88. package/dist/components/forms/CounterInput.vue +71 -0
  89. package/dist/components/forms/CounterInput.vue.d.ts +15 -0
  90. package/dist/components/forms/DatePicker.vue +400 -0
  91. package/dist/components/forms/DatePicker.vue.d.ts +34 -0
  92. package/dist/components/forms/DatePickerRange.vue +129 -0
  93. package/dist/components/forms/DatePickerRange.vue.d.ts +23 -0
  94. package/dist/components/forms/DraggedUploadFile.vue +120 -0
  95. package/dist/components/forms/DraggedUploadFile.vue.d.ts +10 -0
  96. package/dist/components/forms/ImageCardInput.vue +234 -0
  97. package/dist/components/forms/ImageCardInput.vue.d.ts +0 -0
  98. package/dist/components/forms/InputValidationWrapper.vue +24 -0
  99. package/dist/components/forms/InputValidationWrapper.vue.d.ts +33 -0
  100. package/dist/components/forms/LicensePlateInput.vue +159 -0
  101. package/dist/components/forms/LicensePlateInput.vue.d.ts +16 -0
  102. package/dist/components/forms/ManualDate.vue +262 -0
  103. package/dist/components/forms/ManualDate.vue.d.ts +17 -0
  104. package/dist/components/forms/MobileInput.vue +118 -0
  105. package/dist/components/forms/MobileInput.vue.d.ts +49 -0
  106. package/dist/components/forms/PasswordInput.vue +29 -0
  107. package/dist/components/forms/PasswordInput.vue.d.ts +13 -0
  108. package/dist/components/forms/RangeInput.vue +48 -0
  109. package/dist/components/forms/RangeInput.vue.d.ts +5 -0
  110. package/dist/components/forms/Tabs.vue +35 -0
  111. package/dist/components/forms/Tabs.vue.d.ts +42 -0
  112. package/dist/components/forms/TimePicker.vue +370 -0
  113. package/dist/components/forms/TimePicker.vue.d.ts +23 -0
  114. package/dist/components/icons/EndMarker.vue +25 -0
  115. package/dist/components/icons/EndMarker.vue.d.ts +17 -0
  116. package/dist/components/icons/RedXIcon.vue +36 -0
  117. package/dist/components/icons/RedXIcon.vue.d.ts +2 -0
  118. package/dist/components/icons/StarFillIcon.vue +28 -0
  119. package/dist/components/icons/StarFillIcon.vue.d.ts +2 -0
  120. package/dist/components/icons/StartMarker.vue +25 -0
  121. package/dist/components/icons/StartMarker.vue.d.ts +17 -0
  122. package/dist/components/icons/WorkerIcon.vue +39 -0
  123. package/dist/components/icons/WorkerIcon.vue.d.ts +2 -0
  124. package/dist/components/loading/LoadingBar.vue +31 -0
  125. package/dist/components/loading/LoadingBar.vue.d.ts +5 -0
  126. package/dist/components/loading/LoadingDialog.vue +41 -0
  127. package/dist/components/loading/LoadingDialog.vue.d.ts +11 -0
  128. package/dist/components/loading/LoadingItem.vue +66 -0
  129. package/dist/components/loading/LoadingItem.vue.d.ts +47 -0
  130. package/dist/components/table/DataTable.vue +319 -0
  131. package/dist/components/table/DataTable.vue.d.ts +0 -0
  132. package/dist/components/table/EditableDataTable.vue +329 -0
  133. package/dist/components/table/EditableDataTable.vue.d.ts +73 -0
  134. package/dist/components/table/EditableDataTableRow.vue +243 -0
  135. package/dist/components/table/EditableDataTableRow.vue.d.ts +18 -0
  136. package/dist/components/table/FilterGenerator.vue +232 -0
  137. package/dist/components/table/FilterGenerator.vue.d.ts +14 -0
  138. package/dist/components/table/StaticTable.vue +152 -0
  139. package/dist/components/table/StaticTable.vue.d.ts +25 -0
  140. package/dist/components/table/TablePagination.vue +73 -0
  141. package/dist/components/table/TablePagination.vue.d.ts +13 -0
  142. package/dist/composables/use-is-mobile.d.ts +1 -0
  143. package/dist/composables/use-is-mobile.js +10 -0
  144. package/dist/composables/use-is-mobile.mjs +4 -0
  145. package/dist/composables/use-table-filters.d.ts +23 -0
  146. package/dist/composables/use-table-filters.js +196 -0
  147. package/dist/composables/use-table-filters.mjs +183 -0
  148. package/dist/fonts/NotoSans-Medium.ttf +0 -0
  149. package/dist/fonts/NotoSansArabic-Medium.ttf +0 -0
  150. package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.eot +0 -0
  151. package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.svg +9 -0
  152. package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.ttf +0 -0
  153. package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.woff +0 -0
  154. package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.woff2 +0 -0
  155. package/dist/images/avatar.png +0 -0
  156. package/dist/images/sa.svg +1 -0
  157. package/dist/images/successful-registration.svg +15 -0
  158. package/dist/index.d.ts +66 -0
  159. package/dist/index.js +447 -0
  160. package/dist/index.mjs +128 -0
  161. package/dist/styles/@core/scss/base/_components.scss +164 -0
  162. package/dist/styles/@core/scss/base/_dark.scss +16 -0
  163. package/dist/styles/@core/scss/base/_default-layout-w-vertical-nav.scss +106 -0
  164. package/dist/styles/@core/scss/base/_default-layout.scss +16 -0
  165. package/dist/styles/@core/scss/base/_index.scss +47 -0
  166. package/dist/styles/@core/scss/base/_layouts.scss +63 -0
  167. package/dist/styles/@core/scss/base/_misc.scss +20 -0
  168. package/dist/styles/@core/scss/base/_mixins.scss +84 -0
  169. package/dist/styles/@core/scss/base/_route-transitions.scss +70 -0
  170. package/dist/styles/@core/scss/base/_utilities.scss +418 -0
  171. package/dist/styles/@core/scss/base/_utils.scss +100 -0
  172. package/dist/styles/@core/scss/base/_variables.scss +190 -0
  173. package/dist/styles/@core/scss/base/_vertical-nav.scss +264 -0
  174. package/dist/styles/@core/scss/base/libs/_perfect-scrollbar.scss +35 -0
  175. package/dist/styles/@core/scss/base/libs/vuetify/_index.scss +1 -0
  176. package/dist/styles/@core/scss/base/libs/vuetify/_overrides.scss +385 -0
  177. package/dist/styles/@core/scss/base/libs/vuetify/_variables.scss +48 -0
  178. package/dist/styles/@core/scss/base/placeholders/_default-layout-vertical-nav.scss +48 -0
  179. package/dist/styles/@core/scss/base/placeholders/_default-layout.scss +3 -0
  180. package/dist/styles/@core/scss/base/placeholders/_index.scss +5 -0
  181. package/dist/styles/@core/scss/base/placeholders/_misc.scss +7 -0
  182. package/dist/styles/@core/scss/base/placeholders/_nav.scss +26 -0
  183. package/dist/styles/@core/scss/base/placeholders/_vertical-nav.scss +84 -0
  184. package/dist/styles/@core/scss/base/skins/_bordered.scss +60 -0
  185. package/dist/styles/@core/scss/base/skins/_index.scss +1 -0
  186. package/dist/styles/@core/scss/template/_components.scss +1035 -0
  187. package/dist/styles/@core/scss/template/_default-layout-w-vertical-nav.scss +20 -0
  188. package/dist/styles/@core/scss/template/_utilities.scss +20 -0
  189. package/dist/styles/@core/scss/template/_variables.scss +67 -0
  190. package/dist/styles/@core/scss/template/_vertical-nav.scss +41 -0
  191. package/dist/styles/@core/scss/template/index.css +18764 -0
  192. package/dist/styles/@core/scss/template/index.scss +15 -0
  193. package/dist/styles/@core/scss/template/libs/apex-chart.css +90 -0
  194. package/dist/styles/@core/scss/template/libs/apex-chart.scss +99 -0
  195. package/dist/styles/@core/scss/template/libs/shepherd.css +82 -0
  196. package/dist/styles/@core/scss/template/libs/shepherd.scss +88 -0
  197. package/dist/styles/@core/scss/template/libs/vuetify/_variables.scss +461 -0
  198. package/dist/styles/@core/scss/template/libs/vuetify/index.css +741 -0
  199. package/dist/styles/@core/scss/template/libs/vuetify/index.scss +1 -0
  200. package/dist/styles/@core/scss/template/pages/misc.css +16 -0
  201. package/dist/styles/@core/scss/template/pages/misc.scss +20 -0
  202. package/dist/styles/@core/scss/template/placeholders/_default-layout-vertical-nav.scss +9 -0
  203. package/dist/styles/@core/scss/template/placeholders/_index.scss +3 -0
  204. package/dist/styles/@core/scss/template/placeholders/_nav.scss +15 -0
  205. package/dist/styles/@core/scss/template/placeholders/_vertical-nav.scss +18 -0
  206. package/dist/styles/@core/scss/template/skins/_bordered.scss +36 -0
  207. package/dist/styles/@core/scss/template/skins/_index.scss +1 -0
  208. package/dist/styles/@layouts/styles/_classes.scss +3 -0
  209. package/dist/styles/@layouts/styles/_dashboard-layout.scss +43 -0
  210. package/dist/styles/@layouts/styles/_global.scss +10 -0
  211. package/dist/styles/@layouts/styles/_mixins.scss +28 -0
  212. package/dist/styles/@layouts/styles/_placeholders.scss +53 -0
  213. package/dist/styles/@layouts/styles/_rtl.scss +7 -0
  214. package/dist/styles/@layouts/styles/_variables.scss +22 -0
  215. package/dist/styles/@layouts/styles/index.css +14 -0
  216. package/dist/styles/@layouts/styles/index.scss +2 -0
  217. package/dist/styles/assets/scss/styles.css +16099 -0
  218. package/dist/styles/assets/scss/styles.scss +246 -0
  219. package/dist/styles/assets/scss/variables/_template.scss +1 -0
  220. package/dist/styles/assets/scss/variables/_vuetify.scss +1 -0
  221. package/dist/types.d.ts +226 -0
  222. package/dist/utils/apiUrl.d.ts +1 -0
  223. package/dist/utils/apiUrl.js +15 -0
  224. package/dist/utils/apiUrl.mjs +8 -0
  225. package/dist/utils/client.d.ts +9 -0
  226. package/dist/utils/client.js +39 -0
  227. package/dist/utils/client.mjs +25 -0
  228. package/dist/utils/files.d.ts +2 -0
  229. package/dist/utils/files.js +35 -0
  230. package/dist/utils/files.mjs +22 -0
  231. package/dist/utils/formValidation.d.ts +7 -0
  232. package/dist/utils/formValidation.js +20 -0
  233. package/dist/utils/formValidation.mjs +13 -0
  234. package/dist/utils/formatters.d.ts +12 -0
  235. package/dist/utils/formatters.js +84 -0
  236. package/dist/utils/formatters.mjs +56 -0
  237. package/dist/utils/index.d.ts +9 -0
  238. package/dist/utils/index.js +104 -0
  239. package/dist/utils/index.mjs +9 -0
  240. package/dist/utils/queryParams.d.ts +4 -0
  241. package/dist/utils/queryParams.js +26 -0
  242. package/dist/utils/queryParams.mjs +18 -0
  243. package/dist/utils/ruleValidator.d.ts +28 -0
  244. package/dist/utils/ruleValidator.js +158 -0
  245. package/dist/utils/ruleValidator.mjs +144 -0
  246. package/dist/utils/toaster.d.ts +12 -0
  247. package/dist/utils/toaster.js +71 -0
  248. package/dist/utils/toaster.mjs +59 -0
  249. package/dist/utils/utils.d.ts +8 -0
  250. package/dist/utils/utils.js +70 -0
  251. package/dist/utils/utils.mjs +56 -0
  252. package/package.json +79 -0
  253. package/src/styles/@core/scss/base/_components.scss +164 -0
  254. package/src/styles/@core/scss/base/_dark.scss +16 -0
  255. package/src/styles/@core/scss/base/_default-layout-w-vertical-nav.scss +106 -0
  256. package/src/styles/@core/scss/base/_default-layout.scss +16 -0
  257. package/src/styles/@core/scss/base/_index.scss +47 -0
  258. package/src/styles/@core/scss/base/_layouts.scss +63 -0
  259. package/src/styles/@core/scss/base/_misc.scss +20 -0
  260. package/src/styles/@core/scss/base/_mixins.scss +84 -0
  261. package/src/styles/@core/scss/base/_route-transitions.scss +70 -0
  262. package/src/styles/@core/scss/base/_utilities.scss +418 -0
  263. package/src/styles/@core/scss/base/_utils.scss +100 -0
  264. package/src/styles/@core/scss/base/_variables.scss +190 -0
  265. package/src/styles/@core/scss/base/_vertical-nav.scss +264 -0
  266. package/src/styles/@core/scss/base/libs/_perfect-scrollbar.scss +35 -0
  267. package/src/styles/@core/scss/base/libs/vuetify/_index.scss +1 -0
  268. package/src/styles/@core/scss/base/libs/vuetify/_overrides.scss +385 -0
  269. package/src/styles/@core/scss/base/libs/vuetify/_variables.scss +48 -0
  270. package/src/styles/@core/scss/base/placeholders/_default-layout-vertical-nav.scss +48 -0
  271. package/src/styles/@core/scss/base/placeholders/_default-layout.scss +3 -0
  272. package/src/styles/@core/scss/base/placeholders/_index.scss +5 -0
  273. package/src/styles/@core/scss/base/placeholders/_misc.scss +7 -0
  274. package/src/styles/@core/scss/base/placeholders/_nav.scss +26 -0
  275. package/src/styles/@core/scss/base/placeholders/_vertical-nav.scss +84 -0
  276. package/src/styles/@core/scss/base/skins/_bordered.scss +60 -0
  277. package/src/styles/@core/scss/base/skins/_index.scss +1 -0
  278. package/src/styles/@core/scss/template/_components.scss +1035 -0
  279. package/src/styles/@core/scss/template/_default-layout-w-vertical-nav.scss +20 -0
  280. package/src/styles/@core/scss/template/_utilities.scss +20 -0
  281. package/src/styles/@core/scss/template/_variables.scss +67 -0
  282. package/src/styles/@core/scss/template/_vertical-nav.scss +41 -0
  283. package/src/styles/@core/scss/template/index.scss +15 -0
  284. package/src/styles/@core/scss/template/libs/apex-chart.scss +99 -0
  285. package/src/styles/@core/scss/template/libs/shepherd.scss +88 -0
  286. package/src/styles/@core/scss/template/libs/vuetify/_variables.scss +461 -0
  287. package/src/styles/@core/scss/template/libs/vuetify/index.scss +1 -0
  288. package/src/styles/@core/scss/template/pages/misc.scss +20 -0
  289. package/src/styles/@core/scss/template/placeholders/_default-layout-vertical-nav.scss +9 -0
  290. package/src/styles/@core/scss/template/placeholders/_index.scss +3 -0
  291. package/src/styles/@core/scss/template/placeholders/_nav.scss +15 -0
  292. package/src/styles/@core/scss/template/placeholders/_vertical-nav.scss +18 -0
  293. package/src/styles/@core/scss/template/skins/_bordered.scss +36 -0
  294. package/src/styles/@core/scss/template/skins/_index.scss +1 -0
  295. package/src/styles/@layouts/styles/_classes.scss +3 -0
  296. package/src/styles/@layouts/styles/_dashboard-layout.scss +43 -0
  297. package/src/styles/@layouts/styles/_global.scss +10 -0
  298. package/src/styles/@layouts/styles/_mixins.scss +28 -0
  299. package/src/styles/@layouts/styles/_placeholders.scss +53 -0
  300. package/src/styles/@layouts/styles/_rtl.scss +7 -0
  301. package/src/styles/@layouts/styles/_variables.scss +22 -0
  302. package/src/styles/@layouts/styles/index.scss +2 -0
  303. package/src/styles/assets/scss/styles.scss +246 -0
  304. package/src/styles/assets/scss/variables/_template.scss +1 -0
  305. package/src/styles/assets/scss/variables/_vuetify.scss +1 -0
package/README.md ADDED
@@ -0,0 +1,166 @@
1
+ # Winch UI
2
+
3
+ A Vue 3 + Vuetify UI component library for Winch SA.
4
+
5
+ **🚧 TESTING VERSION** - This is a test version published to personal npm account.
6
+
7
+ ## 📦 Publishing Workflow
8
+
9
+ ### Prerequisites
10
+
11
+ 1. **NPM Token**: Add `NPM_TOKEN` secret to your GitHub repository settings
12
+ - Go to [npmjs.com](https://www.npmjs.com) → Account Settings → Access Tokens
13
+ - Create a new token with "Automation" type
14
+ - Add it as `NPM_TOKEN` in your repository secrets
15
+
16
+ 2. **Personal Account**: This test version uses your personal npm account
17
+
18
+ ### Publishing Options
19
+
20
+ #### Option 1: Automatic Publishing (Recommended)
21
+ The package automatically publishes when you push to the main branch:
22
+
23
+ - **Every commit** to main triggers an automatic patch version bump and release
24
+ - **Manual workflow** can be triggered from GitHub Actions tab for specific version bumps
25
+ - **Git tags** starting with `v` trigger immediate releases
26
+
27
+ #### Option 2: Manual Version Bumps
28
+ ```bash
29
+ # For patch releases (0.1.0 → 0.1.1)
30
+ pnpm run publish:patch
31
+
32
+ # For minor releases (0.1.0 → 0.2.0)
33
+ pnpm run publish:minor
34
+
35
+ # For major releases (0.1.0 → 1.0.0)
36
+ pnpm run publish:major
37
+ ```
38
+
39
+ #### Option 3: GitHub Actions Manual Trigger
40
+ 1. Go to your repository's "Actions" tab
41
+ 2. Select "Release" workflow
42
+ 3. Click "Run workflow"
43
+ 4. Choose version type (patch/minor/major)
44
+ 5. Click "Run workflow"
45
+
46
+ #### Option 4: Git Tags
47
+ Create a git tag to trigger immediate release:
48
+
49
+ ```bash
50
+ git tag v0.1.1
51
+ git push origin v0.1.1
52
+ ```
53
+
54
+ #### Option 5: Direct Publishing
55
+ ```bash
56
+ # Build and publish directly
57
+ pnpm run release
58
+
59
+ # Dry run to test publishing without publishing
60
+ pnpm run release:dry-run
61
+ ```
62
+
63
+ ## 🚀 Installation in Projects (TESTING)
64
+
65
+ ```bash
66
+ # Using pnpm
67
+ pnpm add @winchsa/ui
68
+
69
+ # Using npm
70
+ npm install @winchsa/ui
71
+
72
+ # Using yarn
73
+ yarn add @winchsa/ui
74
+ ```
75
+
76
+ ## 📖 Usage
77
+
78
+ ```vue
79
+ <template>
80
+ <div>
81
+ <!-- Your Winch UI components here -->
82
+ </div>
83
+ </template>
84
+
85
+ <script setup>
86
+ // Import components as needed
87
+ // import { YourComponent } from '@winchsa/ui'
88
+ </script>
89
+ ```
90
+
91
+ ## 🛠️ Development
92
+
93
+ ```bash
94
+ # Install dependencies
95
+ pnpm install
96
+
97
+ # Start development server
98
+ pnpm run dev
99
+
100
+ # Build for production
101
+ pnpm run build
102
+
103
+ # Run linting
104
+ pnpm run lint
105
+
106
+ # Fix linting issues
107
+ pnpm run lint:fix
108
+
109
+ # Run tests
110
+ pnpm run test
111
+ ```
112
+
113
+ ## 🔄 GitHub Actions Workflows
114
+
115
+ ### CI Workflow (`ci.yml`)
116
+ - Runs on every push and pull request
117
+ - Lints code, runs tests, and builds the package
118
+ - Ensures code quality before merging
119
+
120
+ ### Auto Version Bump (`auto-version.yml`)
121
+ - Automatically bumps patch version on commits to main
122
+ - Skips version bumps for documentation changes
123
+ - Prevents infinite loops on version bump commits
124
+
125
+ ### Release Workflow (`release.yml`)
126
+ - Publishes to npm when version changes
127
+ - Creates GitHub releases for tagged versions
128
+ - Handles both automatic and manual version bumps
129
+ - Checks for duplicate versions before publishing
130
+
131
+ ## 📋 Release Notes
132
+
133
+ The workflow will automatically:
134
+ - ✅ Run CI checks (lint, test, build)
135
+ - ✅ Bump version automatically on commits
136
+ - ✅ Build the library
137
+ - ✅ Check if version already exists on npm
138
+ - ✅ Publish to npm with public access (personal account)
139
+ - ✅ Create GitHub releases for tagged versions
140
+ - ✅ Skip publishing if version already exists
141
+ - ✅ Handle manual version bumps via GitHub Actions
142
+
143
+ ## 🔓 Public Package (Testing)
144
+
145
+ This test version is published with public access to your personal npm account.
146
+
147
+ ## 🚨 Troubleshooting
148
+
149
+ ### Version Already Exists
150
+ If you get an error that a version already exists:
151
+ 1. Check the current version in `package.json`
152
+ 2. Use a different version type (patch/minor/major)
153
+ 3. Or manually edit the version in `package.json`
154
+
155
+ ### Publishing Fails
156
+ 1. Ensure `NPM_TOKEN` is set in repository secrets
157
+ 2. Check that you have publish permissions to `@winchsa/ui`
158
+ 3. Verify the package builds successfully locally
159
+
160
+ ## 🔄 Moving to Organization
161
+
162
+ When ready to move to the organization:
163
+ 1. Change package name back to `@winchsa/ui`
164
+ 2. Update access to `restricted` in both `package.json` and `.npmrc`
165
+ 3. Update GitHub Actions workflows
166
+ 4. Ensure organization has paid npm plan for private packages
@@ -0,0 +1,46 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ import { useI18n } from "vue-i18n";
4
+ import { useRoute } from "vue-router";
5
+ import { VBreadcrumbsItem, VBreadcrumbs } from "vuetify/components";
6
+ import AppLink from "./forms/AppLink.vue";
7
+ const { t } = useI18n();
8
+ const { path } = useRoute();
9
+ const props = defineProps({
10
+ items: { type: Array, required: true }
11
+ });
12
+ const itemsBreadcrumb = computed(() => props.items.map((item) => {
13
+ if (props.items.lastIndexOf(item) === props.items.length - 1) {
14
+ item.to = path;
15
+ }
16
+ return {
17
+ ...item,
18
+ title: item.hasLang === false ? item.title : t(item.title, item?.params || {})
19
+ };
20
+ }));
21
+ </script>
22
+
23
+ <template>
24
+ <VBreadcrumbs color="blue">
25
+ <VBreadcrumbsItem v-for="(item, index) in itemsBreadcrumb" :key="item.title" @click="item.onClick">
26
+ <p v-if="itemsBreadcrumb.length - 1 === index" class="ma-0 text-gray-600">
27
+ {{ item.title }}
28
+ </p>
29
+ <AppLink v-else :to="item.to">
30
+ {{ item.title }}
31
+ </AppLink>
32
+ <span v-if="itemsBreadcrumb.length - 1 !== index" class="v-breadcrumbs-divider text-gray-600">/</span>
33
+ </VBreadcrumbsItem>
34
+ </VBreadcrumbs>
35
+ </template>
36
+
37
+ <style scoped>
38
+ :deep(.v-breadcrumbs-item--active.v-breadcrumbs-item--disabled) a {
39
+ pointer-events: all;
40
+ user-select: text !important;
41
+ cursor: text !important;
42
+ }
43
+ :deep(.v-breadcrumbs-item--active.v-breadcrumbs-item--disabled) a::after {
44
+ display: none !important;
45
+ }
46
+ </style>
@@ -0,0 +1,6 @@
1
+ import type { Breadcrumb } from '../types';
2
+ type __VLS_Props = {
3
+ items: Breadcrumb[];
4
+ };
5
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
+ export default _default;
@@ -0,0 +1,60 @@
1
+ <script setup>
2
+ import { VCardTitle, VDialog, VCardActions, VCardText } from "vuetify/components";
3
+ import AppCard from "./core/cards/AppCard.vue";
4
+ import IconBtn from "./IconBtn.vue";
5
+ defineProps({
6
+ isAppRtl: { type: Boolean, required: true }
7
+ });
8
+ const editModal = defineModel("editModal", { type: Boolean });
9
+ </script>
10
+
11
+ <template>
12
+ <VDialog
13
+ v-model="editModal"
14
+ max-width="480"
15
+ height="100%"
16
+ class="my-0 edit_driver_modal"
17
+ :content-class="isAppRtl ? 'left' : 'right'"
18
+ :transition="isAppRtl ? 'slide-x-transition' : 'slide-x-reverse-transition'"
19
+ >
20
+ <AppCard class="h-100 py-10">
21
+ <VCardTitle class="d-flex justify-space-between">
22
+ <slot name="title" />
23
+
24
+ <IconBtn
25
+ size="small"
26
+ icon="tabler-x"
27
+ @click="editModal = false"
28
+ />
29
+ </VCardTitle>
30
+
31
+ <VCardText class="d-flex flex-column h-100">
32
+ <div class="flex-grow-1">
33
+ <slot />
34
+ </div>
35
+
36
+ <VCardActions class="pa-0">
37
+ <slot name="actions" />
38
+ </VCardActions>
39
+ </VCardText>
40
+ </AppCard>
41
+ </VDialog>
42
+ </template>
43
+
44
+ <style scoped>
45
+ :deep(.v-overlay__content) {
46
+ margin: 0px;
47
+ max-height: 100%;
48
+ height: 100%;
49
+ }
50
+ :deep(.v-overlay__content).left {
51
+ left: 0;
52
+ }
53
+ :deep(.v-overlay__content).right {
54
+ right: 0;
55
+ }
56
+
57
+ :deep(.v-tabs) {
58
+ border: none !important;
59
+ }
60
+ </style>
@@ -0,0 +1,44 @@
1
+ import { VCardTitle, VDialog, VCardActions, VCardText } from 'vuetify/components';
2
+ import AppCard from './core/cards/AppCard.vue';
3
+ import IconBtn from './IconBtn.vue';
4
+ type __VLS_Props = {
5
+ isAppRtl: boolean;
6
+ };
7
+ declare const editModal: import("vue").ModelRef<boolean | undefined, string, boolean | undefined, boolean | undefined>;
8
+ type __VLS_PublicProps = {
9
+ 'editModal'?: boolean;
10
+ } & __VLS_Props;
11
+ declare const __VLS_ctx: InstanceType<__VLS_PickNotAny<typeof __VLS_self, new () => {}>>;
12
+ declare var __VLS_13: {}, __VLS_26: {}, __VLS_32: {};
13
+ type __VLS_Slots = __VLS_PrettifyGlobal<__VLS_OmitStringIndex<typeof __VLS_ctx.$slots> & {
14
+ title?: (props: typeof __VLS_13) => any;
15
+ } & {
16
+ default?: (props: typeof __VLS_26) => any;
17
+ } & {
18
+ actions?: (props: typeof __VLS_32) => any;
19
+ }>;
20
+ declare const __VLS_self: import("vue").DefineComponent<__VLS_PublicProps, {
21
+ VCardTitle: typeof VCardTitle;
22
+ VDialog: typeof VDialog;
23
+ VCardActions: typeof VCardActions;
24
+ VCardText: typeof VCardText;
25
+ AppCard: typeof AppCard;
26
+ IconBtn: typeof IconBtn;
27
+ editModal: typeof editModal;
28
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
29
+ "update:editModal": (value: boolean | undefined) => any;
30
+ }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
31
+ "onUpdate:editModal"?: ((value: boolean | undefined) => any) | undefined;
32
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
33
+ declare const __VLS_component: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
34
+ "update:editModal": (value: boolean | undefined) => any;
35
+ }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
36
+ "onUpdate:editModal"?: ((value: boolean | undefined) => any) | undefined;
37
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
38
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
39
+ export default _default;
40
+ type __VLS_WithSlots<T, S> = T & {
41
+ new (): {
42
+ $slots: S;
43
+ };
44
+ };
@@ -0,0 +1,18 @@
1
+ <script setup>
2
+ import { VBtn } from "vuetify/components";
3
+ const props = defineProps({
4
+ color: { type: null, required: false, default: "default" },
5
+ variant: { type: null, required: false, default: "text" },
6
+ density: { type: null, required: false, default: "comfortable" }
7
+ });
8
+ </script>
9
+
10
+ <template>
11
+ <VBtn :icon="true" v-bind="{ ...props, ...$attrs }">
12
+ <slot />
13
+ </VBtn>
14
+ </template>
15
+
16
+ <style>
17
+ .v-btn .v-icon{height:22px;width:22px}
18
+ </style>
@@ -0,0 +1,30 @@
1
+ import { VBtn } from 'vuetify/components';
2
+ type __VLS_Props = {
3
+ color?: any;
4
+ variant?: any;
5
+ density?: any;
6
+ };
7
+ declare const __VLS_ctx: InstanceType<__VLS_PickNotAny<typeof __VLS_self, new () => {}>>;
8
+ declare var __VLS_6: {};
9
+ type __VLS_Slots = __VLS_PrettifyGlobal<__VLS_OmitStringIndex<typeof __VLS_ctx.$slots> & {
10
+ default?: (props: typeof __VLS_6) => any;
11
+ }>;
12
+ declare const __VLS_self: import("vue").DefineComponent<__VLS_Props, {
13
+ VBtn: typeof VBtn;
14
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
15
+ color: any;
16
+ density: any;
17
+ variant: any;
18
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
19
+ declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
20
+ color: any;
21
+ density: any;
22
+ variant: any;
23
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
24
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
25
+ export default _default;
26
+ type __VLS_WithSlots<T, S> = T & {
27
+ new (): {
28
+ $slots: S;
29
+ };
30
+ };
@@ -0,0 +1,155 @@
1
+ <script setup>
2
+ import { PerfectScrollbar } from "vue3-perfect-scrollbar";
3
+ import { useDisplay } from "vuetify";
4
+ import { computed, nextTick, ref } from "vue";
5
+ import { VDialog, VCol, VRow, VIcon } from "vuetify/components";
6
+ import { useI18n } from "vue-i18n";
7
+ import AppCard from "../components/core/cards/AppCard.vue";
8
+ import BaseButton from "./forms/BaseButton.vue";
9
+ import DialogCloseBtn from "./core/DialogCloseBtn.vue";
10
+ const { xs } = useDisplay();
11
+ const { t } = useI18n();
12
+ const props = defineProps({
13
+ modelValue: { type: Boolean, required: false, default: false },
14
+ persistent: { type: Boolean, required: false, default: false },
15
+ title: { type: String, required: false, default: "" },
16
+ width: { type: String, required: false, default: "434px" },
17
+ maxWidth: { type: String, required: false, default: "70%" },
18
+ zIndex: { type: String, required: false, default: "9999" },
19
+ confirmBtn: { type: [Object, null], required: false, default: () => ({
20
+ text: "actions.save",
21
+ color: "primary"
22
+ }) },
23
+ closeBtn: { type: [Object, null], required: false, default: () => ({
24
+ text: "actions.cancel",
25
+ color: "gray-200"
26
+ }) },
27
+ hasIcon: { type: Boolean, required: false, default: true },
28
+ icon: { type: String, required: false, default: "tabler-info-circle" },
29
+ iconColor: { type: String, required: false, default: "primary" },
30
+ contentContainerClass: { type: Array, required: false },
31
+ showActions: { type: Boolean, required: false, default: true },
32
+ loading: { type: Boolean, required: false },
33
+ actionsClass: { type: [String, Array], required: false },
34
+ height: { type: [String, Number], required: false }
35
+ });
36
+ const emits = defineEmits(["update:modelValue", "save", "cancel"]);
37
+ const modalScrollbarRef = ref(null);
38
+ const save = () => {
39
+ emits("save");
40
+ };
41
+ const cancel = () => {
42
+ isOpen.value = false;
43
+ emits("cancel");
44
+ };
45
+ const isOpen = computed({
46
+ get() {
47
+ return props.modelValue;
48
+ },
49
+ set(value) {
50
+ emits("update:modelValue", value);
51
+ }
52
+ });
53
+ const checkScrollbar = () => {
54
+ nextTick(() => {
55
+ if (modalScrollbarRef?.value?.ps) {
56
+ modalScrollbarRef?.value?.ps.update();
57
+ }
58
+ });
59
+ };
60
+ const mergedConfirmBtn = computed(() => ({
61
+ text: "actions.save",
62
+ color: "primary",
63
+ disabled: false,
64
+ ...props.confirmBtn || {}
65
+ }));
66
+ const mergedCloseBtn = computed(() => ({
67
+ text: "actions.cancel",
68
+ color: "gray-200",
69
+ disabled: false,
70
+ ...props.closeBtn || {}
71
+ }));
72
+ </script>
73
+
74
+ <template>
75
+ <PerfectScrollbar
76
+ ref="modalScrollbarRef"
77
+ :options="{
78
+ wheelPropagation: false,
79
+ suppressScrollX: true
80
+ }"
81
+ @mouseover="checkScrollbar"
82
+ >
83
+ <VDialog
84
+ v-model="isOpen"
85
+ :width="xs ? '100%' : width"
86
+ :max-width="xs ? '90%' : maxWidth"
87
+ :z-index="zIndex"
88
+ :persistent="persistent"
89
+ :height="height"
90
+ >
91
+ <DialogCloseBtn @click="cancel" />
92
+ <AppCard class="pa-4 pb-0 h-100" :height="height">
93
+ <div v-if="title" class="d-flex justify-space-between border-b pb-2 mb-3">
94
+ <h4 class="mb-2 font-weight-bold">
95
+ {{ title }}
96
+ </h4>
97
+ </div>
98
+
99
+ <div class="d-flex flex-column align-center justify-center gap-2" :class="contentContainerClass">
100
+ <div v-if="hasIcon" class="d-flex align-center justify-center app-w-50px app-h-50px rounded-pill position-relative my-4">
101
+ <div class="d-flex align-center justify-center app-w-60px app-h-60px rounded-pill position-absolute app-opacity-17" :class="`bg-${iconColor}`" />
102
+ <div class="d-flex align-center justify-center app-w-50px app-h-50px rounded-pill position-absolute app-opacity-11" :class="`bg-${iconColor}`" />
103
+ <VIcon
104
+ size="30"
105
+ :icon="icon"
106
+ :color="iconColor"
107
+ />
108
+ </div>
109
+ <div class="w-100 text-center">
110
+ <slot />
111
+ </div>
112
+ </div>
113
+
114
+ <slot v-if="showActions" name="actions">
115
+ <VRow class="modal-actions" no-gutters>
116
+ <slot name="additional-actions" />
117
+ <VCol
118
+ cols="12"
119
+ :class="actionsClass"
120
+ class="d-flex flex-wrap justify-center gap-4 mt-4 "
121
+ >
122
+ <BaseButton
123
+ v-if="mergedCloseBtn"
124
+ :color="mergedCloseBtn.color"
125
+ :disabled="mergedCloseBtn?.disabled"
126
+ class="flex-1-1"
127
+ elevation="0"
128
+ @click="cancel"
129
+ >
130
+ {{ t(mergedCloseBtn.text) }}
131
+ </BaseButton>
132
+
133
+ <BaseButton
134
+ v-if="mergedConfirmBtn"
135
+ type="submit"
136
+ class="flex-1-1"
137
+ :color="mergedConfirmBtn.color"
138
+ :disabled="mergedConfirmBtn?.disabled"
139
+ elevation="0"
140
+ :loading="loading"
141
+ @click="save"
142
+ >
143
+ {{ t(mergedConfirmBtn.text) }}
144
+ </BaseButton>
145
+ </VCol>
146
+ </VRow>
147
+ </slot>
148
+ </AppCard>
149
+ </VDialog>
150
+ </PerfectScrollbar>
151
+ </template>
152
+
153
+ <style scoped>
154
+ .modal-actions{background-color:#fff;bottom:0;padding-bottom:18px;position:sticky}
155
+ </style>
File without changes
@@ -0,0 +1,14 @@
1
+ <script setup>
2
+ import { computed } from "vue";
3
+ import { useI18n } from "vue-i18n";
4
+ const { t } = useI18n();
5
+ const siteName = computed(() => {
6
+ return t(`${import.meta.env.VITE_APP_TYPE}_site_name`);
7
+ });
8
+ </script>
9
+
10
+ <template>
11
+ <h2 class="text-center">
12
+ {{ siteName }}
13
+ </h2>
14
+ </template>
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
@@ -0,0 +1,19 @@
1
+ <script setup>
2
+ import { Toaster } from "vue-sonner";
3
+ defineProps({
4
+ theme: { type: String, required: true }
5
+ });
6
+ </script>
7
+
8
+ <template>
9
+ <Toaster
10
+ position="top-center"
11
+ :theme="theme"
12
+ close-button
13
+ rich-colors
14
+ />
15
+ </template>
16
+
17
+ <style>
18
+ [data-sonner-toast] [data-icon]{margin:0}[data-sonner-toast] [data-icon] svg{margin-inline-start:-2px}[data-sonner-toaster][data-theme=light]{--normal-bg:#fff;--normal-text:var(--gray12);--normal-icon:#fdc930;--success-text:#28c76f;--error-text:#ea5455;--error-bg:#fbe3e4;--error-border:#fbe3e4;--success-bg:#dcf6e8;--success-border:#dcf6e8}[data-sonner-toaster][data-theme=dark]{--normal-bg:#2f3349;--normal-border:#2f3349;--normal-text:var(--gray1);--success-text:#28c76f;--error-text:#ea5455;--error-bg:#4c384b;--error-border:#4c384b;--success-bg:#2d4b4f;--success-border:#2d4b4f}[data-sonner-toast][data-styled=true]{gap:10px!important}
19
+ </style>
@@ -0,0 +1,5 @@
1
+ type __VLS_Props = {
2
+ theme: 'light' | 'dark';
3
+ };
4
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
5
+ export default _default;
@@ -0,0 +1,76 @@
1
+ <script setup>
2
+ import { onMounted, reactive, watch } from "vue";
3
+ import { VCardItem, VCheckbox, VDivider } from "vuetify/components";
4
+ import AppCard from "../core/cards/AppCard.vue";
5
+ const props = defineProps({
6
+ id: { type: [String, Number], required: false, default: "" },
7
+ title: { type: String, required: false, default: "" },
8
+ modelValue: { type: Array, required: true, default: () => [] }
9
+ });
10
+ const data = reactive({
11
+ selectedAll: false,
12
+ model: props.modelValue || []
13
+ });
14
+ const emit = defineEmits(["update:modelValue"]);
15
+ watch(
16
+ () => props.modelValue,
17
+ () => {
18
+ data.model = props.modelValue;
19
+ }
20
+ );
21
+ watch(
22
+ () => data.model,
23
+ () => {
24
+ allCheckboxSelected();
25
+ getItemOnChange();
26
+ },
27
+ { deep: true }
28
+ );
29
+ onMounted(() => {
30
+ allCheckboxSelected();
31
+ });
32
+ const selectAll = () => {
33
+ data.selectedAll = !data.selectedAll;
34
+ data.model.forEach((item) => item.selected = data.selectedAll);
35
+ };
36
+ function allCheckboxSelected() {
37
+ data.model.find((item) => item.selected === false || item.selected === void 0) ? data.selectedAll = false : data.selectedAll = true;
38
+ }
39
+ function getItemOnChange() {
40
+ emit("update:modelValue", data.model);
41
+ }
42
+ </script>
43
+
44
+ <template>
45
+ <AppCard class="h-100">
46
+ <!-- title card -->
47
+ <VCardItem class="text-center">
48
+ <div class="d-flex justify-space-between w-100">
49
+ <h3 class="fw-bold">
50
+ {{ title }}
51
+ </h3>
52
+
53
+ <VCheckbox
54
+ v-model="data.selectedAll"
55
+ class="form-check-input"
56
+ @click="selectAll()"
57
+ />
58
+ </div>
59
+
60
+ <VDivider />
61
+ </VCardItem>
62
+
63
+ <VCardItem class="pt-0">
64
+ <div
65
+ v-for="(item, key) in data.model"
66
+ :key="key"
67
+ class="d-flex justify-space-between mb-2"
68
+ >
69
+ <span>{{ item.label }}</span>
70
+
71
+ <!-- item checkbox -->
72
+ <VCheckbox v-model="item.selected" />
73
+ </div>
74
+ </VCardItem>
75
+ </AppCard>
76
+ </template>
@@ -0,0 +1,20 @@
1
+ type ChechboxModel = {
2
+ key: string | number;
3
+ label: string;
4
+ selected?: boolean;
5
+ };
6
+ type __VLS_Props = {
7
+ id?: string | number;
8
+ title?: string;
9
+ modelValue: ChechboxModel[];
10
+ };
11
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
12
+ "update:modelValue": (value: ChechboxModel[]) => any;
13
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
14
+ "onUpdate:modelValue"?: ((value: ChechboxModel[]) => any) | undefined;
15
+ }>, {
16
+ title: string;
17
+ modelValue: ChechboxModel[];
18
+ id: string | number;
19
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
20
+ export default _default;