@cavulsqa/create 2.9.3 → 2.10.1

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 (199) hide show
  1. package/README.md +12 -1
  2. package/bin/create.mjs +18 -25
  3. package/lib/templates.mjs +56 -0
  4. package/package.json +13 -5
  5. package/templates/f7-app/auto-imports.d.ts +9 -0
  6. package/templates/f7-app/package.json +6 -3
  7. package/templates/f7-app/src/env.d.ts +1 -0
  8. package/templates/f7-app/src/main.ts +3 -0
  9. package/templates/f7-app/src/plugins/bootstrapError.ts +2 -0
  10. package/templates/f7-app/src/plugins/recorder.plugin.ts +155 -0
  11. package/templates/f7-app/src/shared/recorder/capacitorSink.ts +124 -0
  12. package/templates/f7-app/vite.config.ts +1 -0
  13. package/templates/m3e-app/.claude/rules/data-fetching.md +68 -0
  14. package/templates/m3e-app/.claude/rules/database.md +106 -0
  15. package/templates/m3e-app/.claude/rules/m3e-ui.md +48 -0
  16. package/templates/m3e-app/.claude/rules/modules.md +43 -0
  17. package/templates/m3e-app/.claude/rules/native.md +60 -0
  18. package/templates/m3e-app/.claude/skills/m3-expressive/SKILL.md +68 -0
  19. package/templates/m3e-app/.claude/skills/m3-expressive/color.md +44 -0
  20. package/templates/m3e-app/.claude/skills/m3-expressive/components.md +325 -0
  21. package/templates/m3e-app/.claude/skills/m3-expressive/layout.md +42 -0
  22. package/templates/m3e-app/.claude/skills/m3-expressive/motion.md +51 -0
  23. package/templates/m3e-app/.claude/skills/m3-expressive/shapes-type.md +48 -0
  24. package/templates/m3e-app/.claude/skills/m3-expressive/sources.md +53 -0
  25. package/templates/m3e-app/.claude/skills/module-architecture/SKILL.md +65 -0
  26. package/templates/m3e-app/.claude/skills/module-architecture/file-templates.md +178 -0
  27. package/templates/m3e-app/.claude/skills/reactive-data/SKILL.md +90 -0
  28. package/templates/m3e-app/.claude/skills/reactive-data/testing.md +55 -0
  29. package/templates/m3e-app/.env.example +32 -0
  30. package/templates/m3e-app/CLAUDE.md +93 -0
  31. package/templates/m3e-app/auto-imports.d.ts +851 -0
  32. package/templates/m3e-app/capacitor.config.ts +44 -0
  33. package/templates/m3e-app/components.d.ts +252 -0
  34. package/templates/m3e-app/index.html +16 -0
  35. package/templates/m3e-app/package.json +108 -0
  36. package/templates/m3e-app/src/App.vue +129 -0
  37. package/templates/m3e-app/src/app/pragmas.config.ts +35 -0
  38. package/templates/m3e-app/src/app/scroll.config.ts +20 -0
  39. package/templates/m3e-app/src/app/storage.config.ts +65 -0
  40. package/templates/m3e-app/src/app/tabs.ts +33 -0
  41. package/templates/m3e-app/src/app/theme.config.ts +51 -0
  42. package/templates/m3e-app/src/assets/css/app.css +18 -0
  43. package/templates/m3e-app/src/assets/css/base.css +53 -0
  44. package/templates/m3e-app/src/assets/css/layout/container-transform.css +113 -0
  45. package/templates/m3e-app/src/assets/css/layout/shell.css +69 -0
  46. package/templates/m3e-app/src/assets/css/layout/transitions.css +121 -0
  47. package/templates/m3e-app/src/assets/css/m3e.css +6 -0
  48. package/templates/m3e-app/src/assets/css/theme/framework7.css +18 -0
  49. package/templates/m3e-app/src/assets/css/theme/tailwind.css +365 -0
  50. package/templates/m3e-app/src/domains/benchmark/benchmark.dataset.ts +209 -0
  51. package/templates/m3e-app/src/domains/benchmark/benchmark.suite.ts +662 -0
  52. package/templates/m3e-app/src/domains/sales/sales.repository.ts +458 -0
  53. package/templates/m3e-app/src/env.d.ts +40 -0
  54. package/templates/m3e-app/src/locales/ar.json +1260 -0
  55. package/templates/m3e-app/src/locales/en.json +1260 -0
  56. package/templates/m3e-app/src/locales/fr.json +1260 -0
  57. package/templates/m3e-app/src/main.ts +41 -0
  58. package/templates/m3e-app/src/modules/demo/components/DemoBenchmark.vue +119 -0
  59. package/templates/m3e-app/src/modules/demo/components/DemoBusLog.vue +63 -0
  60. package/templates/m3e-app/src/modules/demo/components/DemoCreateOrderSheet.vue +203 -0
  61. package/templates/m3e-app/src/modules/demo/components/DemoMetricsSheet.vue +75 -0
  62. package/templates/m3e-app/src/modules/demo/components/DemoOrderList.vue +75 -0
  63. package/templates/m3e-app/src/modules/demo/components/DemoPipelineBenchmark.vue +65 -0
  64. package/templates/m3e-app/src/modules/demo/components/DemoStatCards.vue +71 -0
  65. package/templates/m3e-app/src/modules/demo/composables/useBenchmark.ts +139 -0
  66. package/templates/m3e-app/src/modules/demo/composables/useOrderStatus.ts +64 -0
  67. package/templates/m3e-app/src/modules/demo/composables/useReactiveDemo.ts +171 -0
  68. package/templates/m3e-app/src/modules/demo/router/routes/demo.routes.ts +22 -0
  69. package/templates/m3e-app/src/modules/demo/views/DemoView.vue +210 -0
  70. package/templates/m3e-app/src/modules/demo/views/OrderDetailView.vue +136 -0
  71. package/templates/m3e-app/src/modules/demo/views/OrderSearchView.vue +74 -0
  72. package/templates/m3e-app/src/modules/gallery/components/GalleryBlock.vue +16 -0
  73. package/templates/m3e-app/src/modules/gallery/components/GalleryCarouselTile.vue +71 -0
  74. package/templates/m3e-app/src/modules/gallery/components/GalleryCustomerForm.vue +76 -0
  75. package/templates/m3e-app/src/modules/gallery/components/GalleryProofOfDelivery.vue +69 -0
  76. package/templates/m3e-app/src/modules/gallery/components/agenda/AgendaDay.vue +106 -0
  77. package/templates/m3e-app/src/modules/gallery/components/agenda/AgendaMonth.vue +40 -0
  78. package/templates/m3e-app/src/modules/gallery/components/agenda/AgendaVisitList.vue +45 -0
  79. package/templates/m3e-app/src/modules/gallery/components/chat/ChatAttachSheet.vue +106 -0
  80. package/templates/m3e-app/src/modules/gallery/components/chat/ChatContactPicker.vue +85 -0
  81. package/templates/m3e-app/src/modules/gallery/components/chat/ChatInviteComposer.vue +131 -0
  82. package/templates/m3e-app/src/modules/gallery/components/chat/ChatPollComposer.vue +148 -0
  83. package/templates/m3e-app/src/modules/gallery/components/chat/ChatRecentPhotos.vue +62 -0
  84. package/templates/m3e-app/src/modules/gallery/components/inputs/InputsAccount.vue +79 -0
  85. package/templates/m3e-app/src/modules/gallery/components/inputs/InputsTags.vue +53 -0
  86. package/templates/m3e-app/src/modules/gallery/components/inputs/InputsVerification.vue +73 -0
  87. package/templates/m3e-app/src/modules/gallery/components/inputs/PasswordStrength.vue +37 -0
  88. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryButtons.vue +128 -0
  89. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryCarousels.vue +236 -0
  90. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryCharts.vue +84 -0
  91. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryFabs.vue +70 -0
  92. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryInputs.vue +219 -0
  93. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryNavigation.vue +141 -0
  94. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryOverlays.vue +368 -0
  95. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryPickers.vue +175 -0
  96. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryProgress.vue +118 -0
  97. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryScale.vue +103 -0
  98. package/templates/m3e-app/src/modules/gallery/components/sections/GallerySelection.vue +219 -0
  99. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryShapes.vue +48 -0
  100. package/templates/m3e-app/src/modules/gallery/components/sections/GallerySurfaces.vue +213 -0
  101. package/templates/m3e-app/src/modules/gallery/components/sections/GalleryTables.vue +185 -0
  102. package/templates/m3e-app/src/modules/gallery/components/surfaces/SurfacesContainerTransform.vue +46 -0
  103. package/templates/m3e-app/src/modules/gallery/composables/chatTeam.ts +18 -0
  104. package/templates/m3e-app/src/modules/gallery/composables/composeKind.ts +2 -0
  105. package/templates/m3e-app/src/modules/gallery/composables/currentPosition.ts +35 -0
  106. package/templates/m3e-app/src/modules/gallery/composables/demoOrders.ts +29 -0
  107. package/templates/m3e-app/src/modules/gallery/composables/featuredStories.ts +73 -0
  108. package/templates/m3e-app/src/modules/gallery/composables/fieldFormats.ts +36 -0
  109. package/templates/m3e-app/src/modules/gallery/composables/openExternal.ts +11 -0
  110. package/templates/m3e-app/src/modules/gallery/composables/routePlan.ts +90 -0
  111. package/templates/m3e-app/src/modules/gallery/composables/useAgenda.ts +61 -0
  112. package/templates/m3e-app/src/modules/gallery/composables/useChatCustomers.ts +31 -0
  113. package/templates/m3e-app/src/modules/gallery/composables/useChatDemo.ts +299 -0
  114. package/templates/m3e-app/src/modules/gallery/composables/useGallerySections.ts +230 -0
  115. package/templates/m3e-app/src/modules/gallery/composables/useLocalAttachments.ts +71 -0
  116. package/templates/m3e-app/src/modules/gallery/composables/useLocationShare.ts +38 -0
  117. package/templates/m3e-app/src/modules/gallery/composables/usePhotoScenes.ts +82 -0
  118. package/templates/m3e-app/src/modules/gallery/composables/useTreeDemo.ts +67 -0
  119. package/templates/m3e-app/src/modules/gallery/composables/wilayas.ts +67 -0
  120. package/templates/m3e-app/src/modules/gallery/router/routes/gallery.routes.ts +52 -0
  121. package/templates/m3e-app/src/modules/gallery/views/GalleryAgendaView.vue +117 -0
  122. package/templates/m3e-app/src/modules/gallery/views/GalleryChatView.vue +292 -0
  123. package/templates/m3e-app/src/modules/gallery/views/GalleryContactsView.vue +77 -0
  124. package/templates/m3e-app/src/modules/gallery/views/GalleryFeaturedView.vue +60 -0
  125. package/templates/m3e-app/src/modules/gallery/views/GalleryLoginView.vue +135 -0
  126. package/templates/m3e-app/src/modules/gallery/views/GalleryOnboardingView.vue +116 -0
  127. package/templates/m3e-app/src/modules/gallery/views/GallerySectionView.vue +27 -0
  128. package/templates/m3e-app/src/modules/gallery/views/GalleryTabsView.vue +135 -0
  129. package/templates/m3e-app/src/modules/gallery/views/GalleryView.vue +50 -0
  130. package/templates/m3e-app/src/modules/home/components/HomeHero.vue +57 -0
  131. package/templates/m3e-app/src/modules/home/composables/useHomeFeatures.ts +128 -0
  132. package/templates/m3e-app/src/modules/home/composables/useOpenFeature.ts +22 -0
  133. package/templates/m3e-app/src/modules/home/router/routes/home.routes.ts +21 -0
  134. package/templates/m3e-app/src/modules/home/views/FeatureDetailView.vue +66 -0
  135. package/templates/m3e-app/src/modules/home/views/HomeView.vue +47 -0
  136. package/templates/m3e-app/src/modules/settings/components/RolePalette.vue +38 -0
  137. package/templates/m3e-app/src/modules/settings/components/SeedSwatches.vue +41 -0
  138. package/templates/m3e-app/src/modules/settings/components/SettingsChoice.vue +43 -0
  139. package/templates/m3e-app/src/modules/settings/components/StudioPreview.vue +52 -0
  140. package/templates/m3e-app/src/modules/settings/router/routes/settings.routes.ts +17 -0
  141. package/templates/m3e-app/src/modules/settings/types.ts +7 -0
  142. package/templates/m3e-app/src/modules/settings/views/ColorStudioView.vue +166 -0
  143. package/templates/m3e-app/src/modules/settings/views/SettingsView.vue +157 -0
  144. package/templates/m3e-app/src/plugins/bootstrapError.ts +62 -0
  145. package/templates/m3e-app/src/plugins/capacitor/index.ts +14 -0
  146. package/templates/m3e-app/src/plugins/capacitor/useAndroidBackButton.ts +36 -0
  147. package/templates/m3e-app/src/plugins/capacitor/useKeyboard.ts +48 -0
  148. package/templates/m3e-app/src/plugins/capacitor/useSplashScreen.ts +43 -0
  149. package/templates/m3e-app/src/plugins/capacitor/useStatusBar.ts +16 -0
  150. package/templates/m3e-app/src/plugins/framework7.plugin.ts +36 -0
  151. package/templates/m3e-app/src/plugins/i18n.plugin.ts +87 -0
  152. package/templates/m3e-app/src/plugins/m3e.plugin.ts +22 -0
  153. package/templates/m3e-app/src/plugins/seed.plugin.ts +7 -0
  154. package/templates/m3e-app/src/plugins/sqlite.plugin.ts +32 -0
  155. package/templates/m3e-app/src/router/global/global.routes.ts +12 -0
  156. package/templates/m3e-app/src/router/index.ts +20 -0
  157. package/templates/m3e-app/src/shared/components/error/404.vue +13 -0
  158. package/templates/m3e-app/src/shared/components/layout/EmptyState.vue +30 -0
  159. package/templates/m3e-app/src/shared/components/layout/SectionHeader.vue +10 -0
  160. package/templates/m3e-app/src/shared/components/page/AppPage.vue +104 -0
  161. package/templates/m3e-app/src/shared/composables/navigation/useActiveTab.ts +39 -0
  162. package/templates/m3e-app/src/shared/composables/navigation/useContainerTransform.ts +117 -0
  163. package/templates/m3e-app/src/shared/composables/navigation/useNavigationGuard.ts +48 -0
  164. package/templates/m3e-app/src/shared/composables/navigation/useNavigationVisibility.ts +64 -0
  165. package/templates/m3e-app/src/shared/composables/navigation/useViewRouter.ts +25 -0
  166. package/templates/m3e-app/src/shared/composables/navigation/useWindowClass.ts +22 -0
  167. package/templates/m3e-app/src/shared/composables/theme/useThemeSettings.ts +155 -0
  168. package/templates/m3e-app/src/shared/database/candidates/capacitorSqlite.ts +36 -0
  169. package/templates/m3e-app/src/shared/database/candidates/index.ts +4 -0
  170. package/templates/m3e-app/src/shared/database/candidates/opfsSahPool.ts +25 -0
  171. package/templates/m3e-app/src/shared/database/candidates/types.ts +56 -0
  172. package/templates/m3e-app/src/shared/database/candidates/waSqlite.ts +56 -0
  173. package/templates/m3e-app/src/shared/database/database.ts +219 -0
  174. package/templates/m3e-app/src/shared/database/index.ts +3 -0
  175. package/templates/m3e-app/src/shared/database/migrations.ts +223 -0
  176. package/templates/m3e-app/src/shared/database/opfs.worker.ts +5 -0
  177. package/templates/m3e-app/src/shared/database/queries.ts +26 -0
  178. package/templates/m3e-app/src/shared/database/schema.ts +153 -0
  179. package/templates/m3e-app/src/shared/database/storage.ts +64 -0
  180. package/templates/m3e-app/src/shared/database/wa.worker.ts +5 -0
  181. package/templates/m3e-app/src/shared/utils/lazyRoute.ts +41 -0
  182. package/templates/m3e-app/src/shared/utils/resolvers/resolvers.ts +42 -0
  183. package/templates/m3e-app/src/shared/utils/textDirection.ts +22 -0
  184. package/templates/m3e-app/src/shared/utils/theme/themeSettings.ts +59 -0
  185. package/templates/m3e-app/src/shared/utils/tone.ts +8 -0
  186. package/templates/m3e-app/tests/benchmark.suite.test.ts +104 -0
  187. package/templates/m3e-app/tests/containerTransform.test.ts +58 -0
  188. package/templates/m3e-app/tests/fieldFormats.test.ts +25 -0
  189. package/templates/m3e-app/tests/lazyRoute.test.ts +30 -0
  190. package/templates/m3e-app/tests/locales.test.ts +73 -0
  191. package/templates/m3e-app/tests/migrations.test.ts +74 -0
  192. package/templates/m3e-app/tests/navigationGuard.test.ts +82 -0
  193. package/templates/m3e-app/tests/openDatabase.test.ts +54 -0
  194. package/templates/m3e-app/tests/sales.repository.test.ts +329 -0
  195. package/templates/m3e-app/tests/storage.test.ts +117 -0
  196. package/templates/m3e-app/tests/textDirection.test.ts +11 -0
  197. package/templates/m3e-app/tooling/linkedPackages.ts +112 -0
  198. package/templates/m3e-app/tsconfig.json +21 -0
  199. package/templates/m3e-app/vite.config.ts +144 -0
@@ -0,0 +1,219 @@
1
+ <template>
2
+ <InputsAccount />
3
+ <InputsVerification />
4
+ <InputsTags />
5
+
6
+ <GalleryBlock
7
+ :title="t('gallery.inputs.searchView')"
8
+ :note="t('gallery.inputs.searchViewNote')"
9
+ stack
10
+ >
11
+ <M3SearchView
12
+ v-model="customerQuery"
13
+ :placeholder="t('gallery.inputs.searchCustomers')"
14
+ :back-label="t('shell.back')"
15
+ :clear-label="t('gallery.inputs.clear')"
16
+ >
17
+ <template #trailing>
18
+ <M3IconButton :label="t('gallery.inputs.voice')"><i-ms-mic-outline-rounded /></M3IconButton>
19
+ </template>
20
+ <template #default="{ query: term }">
21
+ <M3List variant="standard" :label="t('gallery.inputs.searchCustomers')">
22
+ <template v-if="term">
23
+ <M3ListItem
24
+ v-for="customer in matches(term)"
25
+ :key="customer"
26
+ clickable
27
+ :headline="customer"
28
+ @click="customerQuery = customer"
29
+ >
30
+ <template #leading><i-ms-person-outline-rounded /></template>
31
+ </M3ListItem>
32
+ <M3ListItem
33
+ v-if="matches(term).length === 0"
34
+ :headline="t('gallery.inputs.noMatches')"
35
+ />
36
+ </template>
37
+ <template v-else>
38
+ <M3ListItem
39
+ v-for="recent in RECENT"
40
+ :key="recent"
41
+ clickable
42
+ :headline="recent"
43
+ @click="customerQuery = recent"
44
+ >
45
+ <template #leading><i-ms-history-rounded /></template>
46
+ </M3ListItem>
47
+ </template>
48
+ </M3List>
49
+ </template>
50
+ </M3SearchView>
51
+ </GalleryBlock>
52
+
53
+ <GalleryBlock :title="t('gallery.inputs.search')" :note="t('gallery.inputs.searchNote')" stack>
54
+ <M3SearchBar
55
+ v-model="query"
56
+ :placeholder="t('gallery.inputs.searchPlaceholder')"
57
+ :clear-label="t('gallery.inputs.clear')"
58
+ >
59
+ <template #trailing>
60
+ <M3IconButton :label="t('gallery.inputs.voice')"><i-ms-mic-outline-rounded /></M3IconButton>
61
+ </template>
62
+ </M3SearchBar>
63
+ </GalleryBlock>
64
+
65
+ <GalleryBlock
66
+ :title="t('gallery.inputs.dropdown')"
67
+ :note="t('gallery.inputs.dropdownNote')"
68
+ stack
69
+ >
70
+ <M3ExposedDropdown
71
+ v-model="status"
72
+ :label="t('gallery.inputs.status')"
73
+ :options="statusOptions"
74
+ />
75
+ <M3ExposedDropdown
76
+ v-model="wilaya"
77
+ editable
78
+ variant="outlined"
79
+ :label="t('gallery.inputs.wilaya')"
80
+ :supporting="t('gallery.inputs.wilayaHint')"
81
+ :options="WILAYA_OPTIONS"
82
+ :no-results-text="t('gallery.inputs.noMatches')"
83
+ :results-text="resultsText"
84
+ >
85
+ <template #leading><i-ms-location-on-outline-rounded /></template>
86
+ </M3ExposedDropdown>
87
+ </GalleryBlock>
88
+
89
+ <GalleryBlock :title="t('gallery.inputs.filled')" :note="t('gallery.inputs.filledNote')" stack>
90
+ <M3TextField
91
+ v-model="name"
92
+ :label="t('gallery.inputs.name')"
93
+ :supporting="t('gallery.inputs.nameHint')"
94
+ autocomplete="name"
95
+ >
96
+ <template #leading><i-ms-person-outline-rounded /></template>
97
+ </M3TextField>
98
+ <M3TextField
99
+ v-model="amount"
100
+ :label="t('gallery.inputs.amount')"
101
+ inputmode="decimal"
102
+ suffix="DA"
103
+ :error="amountError"
104
+ />
105
+ </GalleryBlock>
106
+
107
+ <GalleryBlock
108
+ :title="t('gallery.inputs.outlined')"
109
+ :note="t('gallery.inputs.outlinedNote')"
110
+ stack
111
+ >
112
+ <M3TextField
113
+ v-model="email"
114
+ variant="outlined"
115
+ :label="t('gallery.inputs.email')"
116
+ type="email"
117
+ autocomplete="email"
118
+ />
119
+ <M3TextField
120
+ v-model="note"
121
+ variant="outlined"
122
+ multiline
123
+ :rows="3"
124
+ :maxlength="140"
125
+ :label="t('gallery.inputs.note')"
126
+ />
127
+ </GalleryBlock>
128
+
129
+ <GalleryBlock
130
+ :title="t('gallery.inputs.richText')"
131
+ :note="t('gallery.inputs.richTextNote')"
132
+ stack
133
+ >
134
+ <M3TextEditor
135
+ v-model="report"
136
+ :label="t('gallery.inputs.report')"
137
+ :placeholder="t('gallery.inputs.reportPlaceholder')"
138
+ :labels="editorLabels"
139
+ :link-label="t('gallery.inputs.linkAddress')"
140
+ :apply-label="t('gallery.inputs.apply')"
141
+ :remove-link-label="t('gallery.inputs.removeLink')"
142
+ :invalid-link-text="t('gallery.inputs.invalidLink')"
143
+ />
144
+ <p class="type-body-small m-0 text-on-surface-variant">
145
+ {{ t("gallery.inputs.stored", { n: report.length }) }}
146
+ </p>
147
+ </GalleryBlock>
148
+
149
+ <GalleryProofOfDelivery />
150
+ </template>
151
+
152
+ <script setup lang="ts">
153
+ import GalleryBlock from "@/modules/gallery/components/GalleryBlock.vue";
154
+ import GalleryProofOfDelivery from "@/modules/gallery/components/GalleryProofOfDelivery.vue";
155
+ import InputsAccount from "@/modules/gallery/components/inputs/InputsAccount.vue";
156
+ import InputsTags from "@/modules/gallery/components/inputs/InputsTags.vue";
157
+ import InputsVerification from "@/modules/gallery/components/inputs/InputsVerification.vue";
158
+ import { WILAYA_OPTIONS } from "@/modules/gallery/composables/wilayas";
159
+
160
+ const { t } = useI18n();
161
+ const report = ref(
162
+ "<p>Visited <b>Supérette El Feth</b>: the shelf was restocked.</p><ul><li>Orange 1L - 12 cases</li><li>Apple 1L - 6 cases</li></ul>",
163
+ );
164
+ const editorLabels = computed(() => ({
165
+ bold: t("gallery.inputs.commands.bold"),
166
+ italic: t("gallery.inputs.commands.italic"),
167
+ underline: t("gallery.inputs.commands.underline"),
168
+ strikeThrough: t("gallery.inputs.commands.strikeThrough"),
169
+ insertUnorderedList: t("gallery.inputs.commands.bulleted"),
170
+ insertOrderedList: t("gallery.inputs.commands.numbered"),
171
+ link: t("gallery.inputs.commands.link"),
172
+ removeFormat: t("gallery.inputs.commands.clear"),
173
+ }));
174
+ const query = ref("");
175
+ const customerQuery = ref("");
176
+ const CUSTOMERS = [
177
+ "Alger Distribution",
178
+ "Annaba Market",
179
+ "Béjaïa Foods",
180
+ "Blida Wholesale",
181
+ "Constantine Retail",
182
+ "Oran Hypermarché",
183
+ "Sétif Grocers",
184
+ "Tlemcen Pharma",
185
+ ];
186
+ const RECENT = ["Oran", "Constantine Retail", "Blida"];
187
+ const matches = (term: string) => {
188
+ const needle = term.trim().toLocaleLowerCase();
189
+ return CUSTOMERS.filter((customer) => customer.toLocaleLowerCase().includes(needle));
190
+ };
191
+ const STATUSES = ["draft", "confirmed", "delivered", "cancelled"] as const;
192
+ const status = ref<(typeof STATUSES)[number] | null>("confirmed");
193
+ const wilaya = ref<number | null>(31);
194
+ const statusOptions = computed(() =>
195
+ STATUSES.map((value) => ({
196
+ value,
197
+ label: t(`gallery.inputs.statuses.${value}`),
198
+ disabled: value === "cancelled",
199
+ })),
200
+ );
201
+ const resultsText = (count: number) => t("gallery.inputs.results", { count }, count);
202
+ const name = ref("");
203
+ const amount = ref("12,5x");
204
+ const email = ref("");
205
+ const note = ref("");
206
+
207
+ const amountError = computed(() =>
208
+ /^\d+([.,]\d{1,2})?$/.test(amount.value) || amount.value === ""
209
+ ? undefined
210
+ : t("gallery.inputs.amountInvalid"),
211
+ );
212
+ </script>
213
+
214
+ <style scoped>
215
+ /* The outlined field's floating label cuts its notch from the surface it sits on. */
216
+ section {
217
+ --m3-text-field-notch: var(--md-sys-color-surface-container-low);
218
+ }
219
+ </style>
@@ -0,0 +1,141 @@
1
+ <template>
2
+ <GalleryBlock
3
+ :title="t('gallery.navigation.primaryTabs')"
4
+ :note="t('gallery.navigation.primaryTabsNote')"
5
+ stack
6
+ >
7
+ <M3Tabs v-model="primary" :label="t('gallery.navigation.primaryTabs')">
8
+ <M3Tab value="flights" :label="t('gallery.navigation.flights')">
9
+ <template #icon><i-ms-local-shipping-outline-rounded /></template>
10
+ </M3Tab>
11
+ <M3Tab value="trips" :label="t('gallery.navigation.trips')">
12
+ <template #icon><i-ms-bookmark-outline-rounded /></template>
13
+ </M3Tab>
14
+ <M3Tab value="explore" :label="t('gallery.navigation.explore')">
15
+ <template #icon><i-ms-search-rounded /></template>
16
+ </M3Tab>
17
+ </M3Tabs>
18
+ </GalleryBlock>
19
+
20
+ <GalleryBlock
21
+ :title="t('gallery.navigation.secondaryTabs')"
22
+ :note="t('gallery.navigation.secondaryTabsNote')"
23
+ stack
24
+ >
25
+ <M3Tabs
26
+ v-model="secondary"
27
+ variant="secondary"
28
+ scrollable
29
+ :label="t('gallery.navigation.secondaryTabs')"
30
+ >
31
+ <M3Tab
32
+ v-for="tab in SCROLLING"
33
+ :key="tab"
34
+ :value="tab"
35
+ :label="t(`gallery.navigation.months.${tab}`)"
36
+ />
37
+ </M3Tabs>
38
+ </GalleryBlock>
39
+
40
+ <GalleryBlock :title="t('gallery.navigation.bar')" :note="t('gallery.navigation.barNote')" stack>
41
+ <div class="overflow-hidden rounded-md">
42
+ <M3NavigationBar
43
+ v-model="bar"
44
+ layout="vertical"
45
+ class="pb-0!"
46
+ :label="t('gallery.navigation.bar')"
47
+ >
48
+ <M3NavigationItem value="inbox" :label="t('gallery.navigation.inbox')" :badge="3">
49
+ <template #icon="{ selected }"
50
+ ><i-ms-home-rounded v-if="selected" /><i-ms-home-outline-rounded v-else
51
+ /></template>
52
+ </M3NavigationItem>
53
+ <M3NavigationItem value="starred" :label="t('gallery.navigation.starred')">
54
+ <template #icon="{ selected }"
55
+ ><i-ms-star-rounded v-if="selected" /><i-ms-star-outline-rounded v-else
56
+ /></template>
57
+ </M3NavigationItem>
58
+ <M3NavigationItem value="saved" :label="t('gallery.navigation.saved')" badge>
59
+ <template #icon="{ selected }"
60
+ ><i-ms-bookmark-rounded v-if="selected" /><i-ms-bookmark-outline-rounded v-else
61
+ /></template>
62
+ </M3NavigationItem>
63
+ </M3NavigationBar>
64
+ </div>
65
+ </GalleryBlock>
66
+
67
+ <GalleryBlock
68
+ :title="t('gallery.navigation.toolbar')"
69
+ :note="t('gallery.navigation.toolbarNote')"
70
+ stack
71
+ >
72
+ <div class="flex justify-center">
73
+ <M3FloatingToolbar
74
+ position="static"
75
+ :variant="vibrant ? 'vibrant' : 'standard'"
76
+ :label="t('gallery.navigation.toolbar')"
77
+ >
78
+ <M3IconButton :label="t('gallery.buttons.bold')"><i-ms-format-bold-rounded /></M3IconButton>
79
+ <M3IconButton :label="t('gallery.buttons.italic')"
80
+ ><i-ms-format-italic-rounded
81
+ /></M3IconButton>
82
+ <M3IconButton :label="t('gallery.buttons.underline')"
83
+ ><i-ms-format-underlined-rounded
84
+ /></M3IconButton>
85
+ <M3IconButton
86
+ v-model:selected="vibrant"
87
+ toggle
88
+ variant="filled"
89
+ :label="t('gallery.navigation.vibrant')"
90
+ >
91
+ <i-ms-palette-outline-rounded />
92
+ </M3IconButton>
93
+ <template #fab>
94
+ <M3Fab :label="t('gallery.fabs.compose')" color="tertiary-container"
95
+ ><i-ms-add-rounded
96
+ /></M3Fab>
97
+ </template>
98
+ </M3FloatingToolbar>
99
+ </div>
100
+ </GalleryBlock>
101
+
102
+ <GalleryBlock
103
+ :title="t('gallery.navigation.breadcrumbs')"
104
+ :note="t('gallery.navigation.breadcrumbsNote')"
105
+ stack
106
+ >
107
+ <M3Breadcrumbs
108
+ :items="trail"
109
+ :label="t('gallery.navigation.breadcrumbs')"
110
+ :more-label="t('gallery.navigation.moreLevels')"
111
+ @select="(_, index) => (depth = index + 1)"
112
+ />
113
+ <div class="flex flex-wrap gap-2">
114
+ <M3Button variant="tonal" size="s" :disabled="depth >= CATALOGUE.length" @click="depth += 1">
115
+ {{ t("gallery.navigation.deeper") }}
116
+ </M3Button>
117
+ <M3Button variant="text" size="s" :disabled="depth <= 1" @click="depth = 1">
118
+ {{ t("gallery.navigation.top") }}
119
+ </M3Button>
120
+ </div>
121
+ </GalleryBlock>
122
+ </template>
123
+
124
+ <script setup lang="ts">
125
+ import GalleryBlock from "@/modules/gallery/components/GalleryBlock.vue";
126
+
127
+ const { t } = useI18n();
128
+ const CATALOGUE = ["catalogue", "beverages", "juices", "brand", "orange", "pack"] as const;
129
+ const depth = ref<number>(CATALOGUE.length);
130
+ const trail = computed(() =>
131
+ CATALOGUE.slice(0, depth.value).map((level) => ({
132
+ label: t(`gallery.navigation.levels.${level}`),
133
+ })),
134
+ );
135
+ const SCROLLING = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug"] as const;
136
+
137
+ const primary = ref("flights");
138
+ const secondary = ref<string>("mar");
139
+ const bar = ref("inbox");
140
+ const vibrant = ref(false);
141
+ </script>