@toife/vue 3.2.5 → 3.2.7

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 (299) hide show
  1. package/package.json +20 -21
  2. package/src/components/action/action.composable.ts +32 -0
  3. package/src/components/action/action.html +25 -0
  4. package/src/components/action/action.vue +69 -0
  5. package/src/components/action/index.ts +2 -0
  6. package/src/components/app/app.html +24 -0
  7. package/src/components/app/app.vue +45 -0
  8. package/src/components/app/index.ts +1 -0
  9. package/src/components/avatar/avatar.html +3 -0
  10. package/src/components/avatar/avatar.vue +35 -0
  11. package/src/components/avatar/index.ts +1 -0
  12. package/src/components/button/button.html +6 -0
  13. package/src/components/button/button.vue +54 -0
  14. package/src/components/button/index.ts +1 -0
  15. package/src/components/cable/cable.html +3 -0
  16. package/src/components/cable/cable.vue +33 -0
  17. package/src/components/cable/index.ts +1 -0
  18. package/src/components/card/card/card.html +3 -0
  19. package/src/components/card/card/card.vue +52 -0
  20. package/src/components/card/card/index.ts +1 -0
  21. package/src/components/card/card-body/card-body.html +3 -0
  22. package/src/components/card/card-body/card-body.vue +6 -0
  23. package/src/components/card/card-body/index.ts +1 -0
  24. package/src/components/card/card-footer/card-footer.html +3 -0
  25. package/src/components/card/card-footer/card-footer.vue +18 -0
  26. package/src/components/card/card-footer/index.ts +1 -0
  27. package/src/components/card/card-header/card-header.html +3 -0
  28. package/src/components/card/card-header/card-header.vue +18 -0
  29. package/src/components/card/card-header/index.ts +1 -0
  30. package/src/components/card/index.ts +4 -0
  31. package/src/components/checkbox/checkbox.html +12 -0
  32. package/src/components/checkbox/checkbox.vue +74 -0
  33. package/src/components/checkbox/index.ts +1 -0
  34. package/src/components/collapse/collapse.html +16 -0
  35. package/src/components/collapse/collapse.vue +126 -0
  36. package/src/components/collapse/index.ts +1 -0
  37. package/src/components/container/container.html +1 -0
  38. package/src/components/container/container.vue +7 -0
  39. package/src/components/container/index.ts +1 -0
  40. package/src/components/decision-modal/decision-modal.composable.ts +33 -0
  41. package/src/components/decision-modal/decision-modal.html +29 -0
  42. package/src/components/decision-modal/decision-modal.vue +76 -0
  43. package/src/components/decision-modal/index.ts +2 -0
  44. package/src/components/divider/divider.html +1 -0
  45. package/src/components/divider/divider.vue +26 -0
  46. package/src/components/divider/index.ts +1 -0
  47. package/src/components/dropdown/dropdown.html +6 -0
  48. package/src/components/dropdown/dropdown.vue +101 -0
  49. package/src/components/dropdown/index.ts +1 -0
  50. package/src/components/field/field.html +30 -0
  51. package/src/components/field/field.vue +121 -0
  52. package/src/components/field/index.ts +1 -0
  53. package/src/components/form-group/form-group.html +3 -0
  54. package/src/components/form-group/form-group.vue +15 -0
  55. package/src/components/form-group/index.ts +1 -0
  56. package/src/components/gesture-indicator/gesture-indicator.html +1 -0
  57. package/src/components/gesture-indicator/gesture-indicator.vue +32 -0
  58. package/src/components/gesture-indicator/index.ts +1 -0
  59. package/src/components/image/image.html +1 -0
  60. package/src/components/image/image.vue +32 -0
  61. package/src/components/image/index.ts +1 -0
  62. package/src/components/index.ts +32 -0
  63. package/src/components/layout/flex/flex.html +1 -0
  64. package/src/components/layout/flex/flex.vue +15 -0
  65. package/src/components/layout/flex/index.ts +1 -0
  66. package/src/components/layout/flex-item/flex-item.html +1 -0
  67. package/src/components/layout/flex-item/flex-item.vue +11 -0
  68. package/src/components/layout/flex-item/index.ts +1 -0
  69. package/src/components/layout/grid/grid.html +1 -0
  70. package/src/components/layout/grid/grid.vue +15 -0
  71. package/src/components/layout/grid/index.ts +1 -0
  72. package/src/components/layout/grid-item/grid-item.html +1 -0
  73. package/src/components/layout/grid-item/grid-item.vue +11 -0
  74. package/src/components/layout/grid-item/index.ts +1 -0
  75. package/src/components/layout/index.ts +4 -0
  76. package/src/components/modal/index.ts +1 -0
  77. package/src/components/modal/modal.html +20 -0
  78. package/src/components/modal/modal.vue +248 -0
  79. package/src/components/page/index.ts +1 -0
  80. package/src/components/page/page.html +3 -0
  81. package/src/components/page/page.vue +7 -0
  82. package/src/components/present/index.ts +2 -0
  83. package/src/components/present/present.composable.ts +22 -0
  84. package/src/components/present/present.html +11 -0
  85. package/src/components/present/present.vue +234 -0
  86. package/src/components/radio/index.ts +2 -0
  87. package/src/components/radio/radio/index.ts +1 -0
  88. package/src/components/radio/radio/radio.html +11 -0
  89. package/src/components/radio/radio/radio.vue +84 -0
  90. package/src/components/radio/radio-group/index.ts +1 -0
  91. package/src/components/radio/radio-group/radio-group.html +3 -0
  92. package/src/components/radio/radio-group/radio-group.vue +59 -0
  93. package/src/components/refresher/index.ts +1 -0
  94. package/src/components/refresher/refresher.html +3 -0
  95. package/src/components/refresher/refresher.vue +100 -0
  96. package/src/components/route/index.ts +5 -0
  97. package/src/components/route/route-navigator/index.ts +1 -0
  98. package/src/components/route/route-navigator/route-navigator.html +19 -0
  99. package/src/components/route/route-navigator/route-navigator.vue +254 -0
  100. package/src/components/route/route-outlet/index.ts +1 -0
  101. package/src/components/route/route-outlet/route-outlet.html +1 -0
  102. package/src/components/route/route-outlet/route-outlet.vue +39 -0
  103. package/src/components/route/route-provider/index.ts +1 -0
  104. package/src/components/route/route-provider/route-provider.html +1 -0
  105. package/src/components/route/route-provider/route-provider.vue +24 -0
  106. package/src/components/route/route-wrapper/index.ts +2 -0
  107. package/src/components/route/route-wrapper/route-wrapper.composable.ts +49 -0
  108. package/src/components/route/route-wrapper/route-wrapper.html +3 -0
  109. package/src/components/route/route-wrapper/route-wrapper.vue +44 -0
  110. package/src/components/route/route.util.ts +9 -0
  111. package/src/components/segmented-field/index.ts +1 -0
  112. package/src/components/segmented-field/segmented-field.html +16 -0
  113. package/src/components/segmented-field/segmented-field.vue +243 -0
  114. package/src/components/select/index.ts +1 -0
  115. package/src/components/select/select.html +28 -0
  116. package/src/components/select/select.vue +101 -0
  117. package/src/components/skeleton/index.ts +1 -0
  118. package/src/components/skeleton/skeleton.html +1 -0
  119. package/src/components/skeleton/skeleton.vue +33 -0
  120. package/src/components/slide-range/index.ts +1 -0
  121. package/src/components/slide-range/slide-range.html +20 -0
  122. package/src/components/slide-range/slide-range.vue +269 -0
  123. package/src/components/switch/index.ts +1 -0
  124. package/src/components/switch/switch.html +14 -0
  125. package/src/components/switch/switch.vue +86 -0
  126. package/src/components/tabs/index.ts +2 -0
  127. package/src/components/tabs/tab/index.ts +1 -0
  128. package/src/components/tabs/tab/tab.html +5 -0
  129. package/src/components/tabs/tab/tab.vue +34 -0
  130. package/src/components/tabs/tabs/index.ts +1 -0
  131. package/src/components/tabs/tabs/tabs.html +3 -0
  132. package/src/components/tabs/tabs/tabs.vue +151 -0
  133. package/src/components/tag/index.ts +1 -0
  134. package/src/components/tag/tag.html +1 -0
  135. package/src/components/tag/tag.vue +33 -0
  136. package/src/components/toast/index.ts +3 -0
  137. package/src/components/toast/toast/index.ts +1 -0
  138. package/src/components/toast/toast/toast.html +9 -0
  139. package/src/components/toast/toast/toast.vue +28 -0
  140. package/src/components/toast/toast-content/index.ts +1 -0
  141. package/src/components/toast/toast-content/toast-content.html +1 -0
  142. package/src/components/toast/toast-content/toast-content.vue +51 -0
  143. package/src/components/toast/toast.composable.ts +22 -0
  144. package/src/components/toolbar/index.ts +1 -0
  145. package/src/components/toolbar/toolbar.html +3 -0
  146. package/src/components/toolbar/toolbar.vue +39 -0
  147. package/src/env.d.ts +7 -0
  148. package/src/factory.ts +162 -0
  149. package/src/index.ts +4 -0
  150. package/src/shared/provider-state.ts +8 -0
  151. package/src/types.ts +4 -0
  152. package/dist/components/action/action.composable.d.ts +0 -44
  153. package/dist/components/action/action.vue.d.ts +0 -16
  154. package/dist/components/action/index.d.ts +0 -2
  155. package/dist/components/app/app.vue.d.ts +0 -11
  156. package/dist/components/app/index.d.ts +0 -1
  157. package/dist/components/avatar/avatar.vue.d.ts +0 -8
  158. package/dist/components/avatar/index.d.ts +0 -1
  159. package/dist/components/button/button.vue.d.ts +0 -9
  160. package/dist/components/button/index.d.ts +0 -1
  161. package/dist/components/cable/cable.vue.d.ts +0 -6
  162. package/dist/components/cable/index.d.ts +0 -1
  163. package/dist/components/card/card/card.vue.d.ts +0 -7
  164. package/dist/components/card/card/index.d.ts +0 -1
  165. package/dist/components/card/card-body/card-body.vue.d.ts +0 -2
  166. package/dist/components/card/card-body/index.d.ts +0 -1
  167. package/dist/components/card/card-footer/card-footer.vue.d.ts +0 -2
  168. package/dist/components/card/card-footer/index.d.ts +0 -1
  169. package/dist/components/card/card-header/card-header.vue.d.ts +0 -2
  170. package/dist/components/card/card-header/index.d.ts +0 -1
  171. package/dist/components/card/index.d.ts +0 -4
  172. package/dist/components/checkbox/checkbox.vue.d.ts +0 -18
  173. package/dist/components/checkbox/index.d.ts +0 -1
  174. package/dist/components/collapse/collapse.vue.d.ts +0 -12
  175. package/dist/components/collapse/index.d.ts +0 -1
  176. package/dist/components/container/container.vue.d.ts +0 -2
  177. package/dist/components/container/index.d.ts +0 -1
  178. package/dist/components/decision-modal/decision-modal.composable.d.ts +0 -46
  179. package/dist/components/decision-modal/decision-modal.vue.d.ts +0 -16
  180. package/dist/components/decision-modal/index.d.ts +0 -2
  181. package/dist/components/divider/divider.vue.d.ts +0 -5
  182. package/dist/components/divider/index.d.ts +0 -1
  183. package/dist/components/dropdown/dropdown.vue.d.ts +0 -20
  184. package/dist/components/dropdown/index.d.ts +0 -1
  185. package/dist/components/field/field.vue.d.ts +0 -30
  186. package/dist/components/field/index.d.ts +0 -1
  187. package/dist/components/form-group/form-group.vue.d.ts +0 -5
  188. package/dist/components/form-group/index.d.ts +0 -1
  189. package/dist/components/gesture-indicator/gesture-indicator.vue.d.ts +0 -6
  190. package/dist/components/gesture-indicator/index.d.ts +0 -1
  191. package/dist/components/image/image.vue.d.ts +0 -3
  192. package/dist/components/image/index.d.ts +0 -1
  193. package/dist/components/index.d.ts +0 -32
  194. package/dist/components/layout/flex/flex.vue.d.ts +0 -5
  195. package/dist/components/layout/flex/index.d.ts +0 -1
  196. package/dist/components/layout/flex-item/flex-item.vue.d.ts +0 -5
  197. package/dist/components/layout/flex-item/index.d.ts +0 -1
  198. package/dist/components/layout/grid/grid.vue.d.ts +0 -5
  199. package/dist/components/layout/grid/index.d.ts +0 -1
  200. package/dist/components/layout/grid-item/grid-item.vue.d.ts +0 -5
  201. package/dist/components/layout/grid-item/index.d.ts +0 -1
  202. package/dist/components/layout/index.d.ts +0 -4
  203. package/dist/components/modal/index.d.ts +0 -1
  204. package/dist/components/modal/modal.vue.d.ts +0 -17
  205. package/dist/components/page/index.d.ts +0 -1
  206. package/dist/components/page/page.vue.d.ts +0 -2
  207. package/dist/components/present/index.d.ts +0 -2
  208. package/dist/components/present/present.composable.d.ts +0 -5
  209. package/dist/components/present/present.vue.d.ts +0 -18
  210. package/dist/components/radio/index.d.ts +0 -2
  211. package/dist/components/radio/radio/index.d.ts +0 -1
  212. package/dist/components/radio/radio/radio.vue.d.ts +0 -7
  213. package/dist/components/radio/radio-group/index.d.ts +0 -1
  214. package/dist/components/radio/radio-group/radio-group.vue.d.ts +0 -13
  215. package/dist/components/refresher/index.d.ts +0 -1
  216. package/dist/components/refresher/refresher.vue.d.ts +0 -12
  217. package/dist/components/route/index.d.ts +0 -5
  218. package/dist/components/route/route-navigator/index.d.ts +0 -1
  219. package/dist/components/route/route-navigator/route-navigator.vue.d.ts +0 -11
  220. package/dist/components/route/route-outlet/index.d.ts +0 -1
  221. package/dist/components/route/route-outlet/route-outlet.vue.d.ts +0 -5
  222. package/dist/components/route/route-provider/index.d.ts +0 -1
  223. package/dist/components/route/route-provider/route-provider.vue.d.ts +0 -3
  224. package/dist/components/route/route-wrapper/index.d.ts +0 -2
  225. package/dist/components/route/route-wrapper/route-wrapper.composable.d.ts +0 -6
  226. package/dist/components/route/route-wrapper/route-wrapper.vue.d.ts +0 -5
  227. package/dist/components/route/route.util.d.ts +0 -3
  228. package/dist/components/segmented-field/index.d.ts +0 -1
  229. package/dist/components/segmented-field/segmented-field.vue.d.ts +0 -28
  230. package/dist/components/select/index.d.ts +0 -1
  231. package/dist/components/select/select.vue.d.ts +0 -19
  232. package/dist/components/skeleton/index.d.ts +0 -1
  233. package/dist/components/skeleton/skeleton.vue.d.ts +0 -6
  234. package/dist/components/slide-range/index.d.ts +0 -1
  235. package/dist/components/slide-range/slide-range.vue.d.ts +0 -18
  236. package/dist/components/switch/index.d.ts +0 -1
  237. package/dist/components/switch/switch.vue.d.ts +0 -13
  238. package/dist/components/tabs/index.d.ts +0 -2
  239. package/dist/components/tabs/tab/index.d.ts +0 -1
  240. package/dist/components/tabs/tab/tab.vue.d.ts +0 -5
  241. package/dist/components/tabs/tabs/index.d.ts +0 -1
  242. package/dist/components/tabs/tabs/tabs.vue.d.ts +0 -14
  243. package/dist/components/tag/index.d.ts +0 -1
  244. package/dist/components/tag/tag.vue.d.ts +0 -6
  245. package/dist/components/toast/index.d.ts +0 -3
  246. package/dist/components/toast/toast/index.d.ts +0 -1
  247. package/dist/components/toast/toast/toast.vue.d.ts +0 -5
  248. package/dist/components/toast/toast-content/index.d.ts +0 -1
  249. package/dist/components/toast/toast-content/toast-content.vue.d.ts +0 -11
  250. package/dist/components/toast/toast.composable.d.ts +0 -22
  251. package/dist/components/toolbar/index.d.ts +0 -1
  252. package/dist/components/toolbar/toolbar.vue.d.ts +0 -7
  253. package/dist/factory.d.ts +0 -38
  254. package/dist/index.d.ts +0 -3
  255. package/dist/index.es.js +0 -3522
  256. package/dist/index.umd.js +0 -1
  257. package/dist/shared/provider-state.d.ts +0 -5
  258. package/dist/styles/action.css +0 -1
  259. package/dist/styles/app.css +0 -1
  260. package/dist/styles/avatar.css +0 -1
  261. package/dist/styles/button.css +0 -1
  262. package/dist/styles/cable.css +0 -1
  263. package/dist/styles/card-body.css +0 -1
  264. package/dist/styles/card-footer.css +0 -1
  265. package/dist/styles/card-header.css +0 -1
  266. package/dist/styles/card.css +0 -1
  267. package/dist/styles/checkbox.css +0 -1
  268. package/dist/styles/collapse.css +0 -1
  269. package/dist/styles/container.css +0 -1
  270. package/dist/styles/decision-modal.css +0 -1
  271. package/dist/styles/divider.css +0 -1
  272. package/dist/styles/dropdown.css +0 -1
  273. package/dist/styles/field.css +0 -1
  274. package/dist/styles/flex-item.css +0 -1
  275. package/dist/styles/flex.css +0 -1
  276. package/dist/styles/form-group.css +0 -1
  277. package/dist/styles/gesture-indicator.css +0 -1
  278. package/dist/styles/grid-item.css +0 -1
  279. package/dist/styles/grid.css +0 -1
  280. package/dist/styles/index.css +0 -40
  281. package/dist/styles/modal.css +0 -1
  282. package/dist/styles/page.css +0 -1
  283. package/dist/styles/present.css +0 -1
  284. package/dist/styles/radio-group.css +0 -1
  285. package/dist/styles/radio.css +0 -1
  286. package/dist/styles/refresher.css +0 -1
  287. package/dist/styles/route-navigator.css +0 -1
  288. package/dist/styles/segmented-field.css +0 -1
  289. package/dist/styles/select.css +0 -1
  290. package/dist/styles/skeleton.css +0 -1
  291. package/dist/styles/slide-range.css +0 -1
  292. package/dist/styles/switch.css +0 -1
  293. package/dist/styles/tab.css +0 -1
  294. package/dist/styles/tabs.css +0 -1
  295. package/dist/styles/tag.css +0 -1
  296. package/dist/styles/toast-content.css +0 -1
  297. package/dist/styles/toast.css +0 -1
  298. package/dist/styles/toolbar.css +0 -1
  299. package/dist/types.d.ts +0 -4
@@ -0,0 +1,32 @@
1
+ <template src="./image.html"></template>
2
+ <script setup lang="ts">
3
+ import { unref, ref, watch, computed, inject } from "vue";
4
+ import { APP_PROVIDER_STATE_KEY, type AppProviderState, type ImageProps } from "@toife/core";
5
+ import type { ProviderStateRefs } from "../../shared/provider-state";
6
+
7
+ // Component setup (props, emits, injects)
8
+ // ----------------------------------------------------------------------------
9
+ const props = defineProps<ImageProps>();
10
+ const appState = inject<ProviderStateRefs<AppProviderState>>(APP_PROVIDER_STATE_KEY);
11
+
12
+ // Reactive state
13
+ // ----------------------------------------------------------------------------
14
+ // Initialize from src to avoid an empty src flash before mount
15
+ const dataSrc = ref<string>(props.src ?? "");
16
+ const defaultSrc = computed(() => props.defaultSrc ?? unref(appState?.data)?.errorImageUrl ?? "");
17
+
18
+ // Methods
19
+ // ----------------------------------------------------------------------------
20
+ const handleError = () => {
21
+ if (defaultSrc.value) {
22
+ dataSrc.value = defaultSrc.value as string;
23
+ }
24
+ };
25
+
26
+ watch(
27
+ () => props.src,
28
+ (newVal) => {
29
+ dataSrc.value = newVal ?? "";
30
+ }
31
+ );
32
+ </script>
@@ -0,0 +1 @@
1
+ export { default as Image } from "./image.vue";
@@ -0,0 +1,32 @@
1
+ export * from "./app";
2
+ export * from "./present";
3
+ export * from "./modal";
4
+ export * from "./gesture-indicator";
5
+ export * from "./layout";
6
+ export * from "./button";
7
+ export * from "./cable";
8
+ export * from "./toolbar";
9
+ export * from "./skeleton";
10
+ export * from "./tabs";
11
+ export * from "./switch";
12
+ export * from "./checkbox";
13
+ export * from "./radio";
14
+ export * from "./card";
15
+ export * from "./toast";
16
+ export * from "./avatar";
17
+ export * from "./divider";
18
+ export * from "./image";
19
+ export * from "./action";
20
+ export * from "./decision-modal";
21
+ export * from "./field";
22
+ export * from "./segmented-field";
23
+ export * from "./container";
24
+ export * from "./refresher";
25
+ export * from "./route";
26
+ export * from "./page";
27
+ export * from "./collapse";
28
+ export * from "./form-group";
29
+ export * from "./dropdown";
30
+ export * from "./select";
31
+ export * from "./slide-range";
32
+ export * from "./tag";
@@ -0,0 +1 @@
1
+ <div v-bind="flexAttrs"><slot /></div>
@@ -0,0 +1,15 @@
1
+ <style lang="scss" src="@toife/core/features/layout/flex.scss" scoped></style>
2
+ <template src="./flex.html"></template>
3
+ <script lang="ts" setup>
4
+ import { computed } from "vue";
5
+ import { FLEX_DEFAULT_PROPS, getFlexAttrs, type FlexProps } from "@toife/core";
6
+ // Component setup (props, emits, injects)
7
+ // ----------------------------------------------------------------------------
8
+ const props = withDefaults(defineProps<FlexProps>(), {
9
+ ...FLEX_DEFAULT_PROPS,
10
+ });
11
+
12
+ // Computed properties
13
+ // ----------------------------------------------------------------------------
14
+ const flexAttrs = computed(() => getFlexAttrs(props.options));
15
+ </script>
@@ -0,0 +1 @@
1
+ export { default as Flex } from "./flex.vue";
@@ -0,0 +1 @@
1
+ <div v-bind="flexItemAttrs"><slot /></div>
@@ -0,0 +1,11 @@
1
+ <style lang="scss" src="@toife/core/features/layout/flex-item.scss" scoped></style>
2
+ <template src="./flex-item.html"></template>
3
+ <script lang="ts" setup>
4
+ import { computed } from "vue";
5
+ import { FLEX_ITEM_DEFAULT_PROPS, getFlexItemAttrs, type FlexItemProps } from "@toife/core";
6
+ const props = withDefaults(defineProps<FlexItemProps>(), {
7
+ ...FLEX_ITEM_DEFAULT_PROPS,
8
+ });
9
+
10
+ const flexItemAttrs = computed(() => getFlexItemAttrs(props.options));
11
+ </script>
@@ -0,0 +1 @@
1
+ export { default as FlexItem } from "./flex-item.vue";
@@ -0,0 +1 @@
1
+ <div v-bind="gridAttrs"><slot /></div>
@@ -0,0 +1,15 @@
1
+ <style lang="scss" src="@toife/core/features/layout/grid.scss" scoped></style>
2
+ <template src="./grid.html"></template>
3
+ <script lang="ts" setup>
4
+ import { computed } from "vue";
5
+ import { GRID_DEFAULT_PROPS, getGridAttrs, type GridProps } from "@toife/core";
6
+ // Component setup (props, emits, injects)
7
+ // ----------------------------------------------------------------------------
8
+ const props = withDefaults(defineProps<GridProps>(), {
9
+ ...GRID_DEFAULT_PROPS,
10
+ });
11
+
12
+ // Computed properties
13
+ // ----------------------------------------------------------------------------
14
+ const gridAttrs = computed(() => getGridAttrs(props.options));
15
+ </script>
@@ -0,0 +1 @@
1
+ export { default as Grid } from "./grid.vue";
@@ -0,0 +1 @@
1
+ <div v-bind="gridItemAttrs"><slot /></div>
@@ -0,0 +1,11 @@
1
+ <style lang="scss" src="@toife/core/features/layout/grid-item.scss" scoped></style>
2
+ <template src="./grid-item.html"></template>
3
+ <script lang="ts" setup>
4
+ import { computed } from "vue";
5
+ import { GRID_ITEM_DEFAULT_PROPS, getGridItemAttrs, type GridItemProps } from "@toife/core";
6
+ const props = withDefaults(defineProps<GridItemProps>(), {
7
+ ...GRID_ITEM_DEFAULT_PROPS,
8
+ });
9
+
10
+ const gridItemAttrs = computed(() => getGridItemAttrs(props.options));
11
+ </script>
@@ -0,0 +1 @@
1
+ export { default as GridItem } from "./grid-item.vue";
@@ -0,0 +1,4 @@
1
+ export * from "./grid";
2
+ export * from "./flex";
3
+ export * from "./grid-item";
4
+ export * from "./flex-item";
@@ -0,0 +1 @@
1
+ export { default as Modal } from "./modal.vue";
@@ -0,0 +1,20 @@
1
+ <Present
2
+ ref="present"
3
+ :duration="duration"
4
+ :bounce="bounce"
5
+ :class="class"
6
+ :placement="placement"
7
+ :backdrop="backdrop"
8
+ :visible="visible"
9
+ :keepalive="keepalive"
10
+ @close="close"
11
+ :style="style"
12
+ >
13
+ <GestureIndicator
14
+ :placement="placement"
15
+ v-if="gesture && indicator && placement != 'center'"
16
+ ></GestureIndicator>
17
+ <div ref="modal" v-bind="modalAttrs">
18
+ <slot />
19
+ </div>
20
+ </Present>
@@ -0,0 +1,248 @@
1
+ <style lang="scss" src="@toife/core/features/modal/modal.scss" scoped></style>
2
+ <template src="./modal.html"></template>
3
+ <script lang="ts" setup>
4
+ import { computed, inject, onUnmounted, ref, unref, watch } from "vue";
5
+ import {
6
+ gesture as toifeGesture,
7
+ type GestureFastPayload,
8
+ type GestureMovePayload,
9
+ type GestureUpPayload,
10
+ } from "@toife/gesture";
11
+ import { Present } from "../present";
12
+ import { GestureIndicator } from "../gesture-indicator";
13
+ import {
14
+ MODAL_DEFAULT_PROPS,
15
+ APP_PROVIDER_STATE_KEY,
16
+ SCROLLABLE_OVERFLOW_VALUES,
17
+ getModalAttrs,
18
+ type AppProviderState,
19
+ type ModalEvent,
20
+ type ModalProps,
21
+ } from "@toife/core";
22
+ import type { ProviderStateRefs } from "../../shared/provider-state";
23
+
24
+ // Component setup (props, emits, injects)
25
+ // ----------------------------------------------------------------------------
26
+ const props = withDefaults(defineProps<ModalProps>(), {
27
+ ...MODAL_DEFAULT_PROPS,
28
+ });
29
+ const emit = defineEmits<ModalEvent>();
30
+ const appState = inject<ProviderStateRefs<AppProviderState>>(APP_PROVIDER_STATE_KEY);
31
+
32
+ // Reactive state
33
+ // ----------------------------------------------------------------------------
34
+ const modal = ref();
35
+ const present = ref();
36
+ const isBusy = ref(false);
37
+ const isMoving = ref(false);
38
+ const ges = ref<unknown>(null);
39
+
40
+ // Computed properties
41
+ // ----------------------------------------------------------------------------
42
+ const gestureDir = computed(() => {
43
+ if (props.placement == "bottom") return "down";
44
+ if (props.placement == "top") return "up";
45
+ if (props.placement == "left") return "left";
46
+ if (props.placement == "right") return "right";
47
+ });
48
+
49
+ const modalAttrs = computed(() => {
50
+ const shape = props?.shape || unref(appState?.shape) || "";
51
+ const role = props.role || unref(appState?.role) || "";
52
+
53
+ return getModalAttrs({
54
+ role,
55
+ shape,
56
+ placement: props.placement,
57
+ fullscreen: props.fullscreen,
58
+ className: props.class,
59
+ style: props.style,
60
+ });
61
+ });
62
+
63
+ // Methods
64
+ // ----------------------------------------------------------------------------
65
+ const close = (e: string) => {
66
+ emit("close", e);
67
+ };
68
+
69
+ function hasScrollableOverflow(value: string): boolean {
70
+ return (SCROLLABLE_OVERFLOW_VALUES as readonly string[]).includes(value);
71
+ }
72
+
73
+ /**
74
+ * Check if the element is scrollable
75
+ * @param el - The element
76
+ * @param axis - The axis of the scroll
77
+ * @returns True if the element is scrollable, false otherwise
78
+ */
79
+ const isScrollable = (el: HTMLElement, axis: "x" | "y") => {
80
+ const style = getComputedStyle(el);
81
+ if (axis == "y") {
82
+ return el.scrollHeight > el.clientHeight && hasScrollableOverflow(style.overflowY);
83
+ }
84
+
85
+ return el.scrollWidth > el.clientWidth && hasScrollableOverflow(style.overflowX);
86
+ };
87
+
88
+ /**
89
+ * Check if the element has remaining scroll
90
+ * @param el - The element
91
+ * @param direction - The direction of the scroll
92
+ * @returns True if the element has remaining scroll, false otherwise
93
+ */
94
+ const hasRemainingScroll = (el: HTMLElement, direction: "up" | "down" | "left" | "right") => {
95
+ if (direction == "down") return el.scrollTop > 0;
96
+ if (direction == "up") return el.scrollTop < el.scrollHeight - el.clientHeight;
97
+ if (direction == "right") return el.scrollLeft > 0;
98
+
99
+ return el.scrollLeft < el.scrollWidth - el.clientWidth;
100
+ };
101
+
102
+ /**
103
+ * Check if the gesture can start
104
+ * @param e - The event
105
+ * @returns True if the gesture can start, false otherwise
106
+ */
107
+ const canStartGesture = (e: unknown) => {
108
+ if (!modal.value || !gestureDir.value) return true;
109
+
110
+ const target = (e as { target?: EventTarget }).target;
111
+ if (!(target instanceof Element)) return true;
112
+
113
+ const axis = gestureDir.value == "left" || gestureDir.value == "right" ? "x" : "y";
114
+ let current: Element | null = target;
115
+
116
+ while (current && current !== modal.value) {
117
+ if (current instanceof HTMLElement && isScrollable(current, axis)) {
118
+ if (hasRemainingScroll(current, gestureDir.value)) {
119
+ return false;
120
+ }
121
+ }
122
+ current = current.parentElement;
123
+ }
124
+
125
+ return true;
126
+ };
127
+
128
+ // Cooldown so rapid gesture events do not fight the sheet animation
129
+ const busy = () => {
130
+ isBusy.value = true;
131
+ setTimeout(() => {
132
+ isBusy.value = false;
133
+ }, 300);
134
+ };
135
+
136
+ // Lifecycle
137
+ // ----------------------------------------------------------------------------
138
+ watch(
139
+ () => modal.value,
140
+ (val) => {
141
+ if (val) {
142
+ // Drag-to-dismiss along the placement axis (skipped for centered modals)
143
+ ges.value = toifeGesture(modal.value, {
144
+ options: {
145
+ minDist: 30,
146
+ },
147
+
148
+ beforeEvent(e: Event) {
149
+ if (isBusy.value || !props.gesture || props.placement == "center") {
150
+ return false;
151
+ }
152
+
153
+ if (!canStartGesture(e)) {
154
+ return false;
155
+ }
156
+
157
+ return true;
158
+ },
159
+
160
+ down() {
161
+ isMoving.value = false;
162
+ },
163
+
164
+ fast({ initialDirection }: GestureFastPayload) {
165
+ busy();
166
+ if (initialDirection == gestureDir.value) {
167
+ emit("close", "gesture");
168
+ } else {
169
+ present.value.open();
170
+ }
171
+ },
172
+
173
+ move({ deltaY, deltaX, initialDirection }: GestureMovePayload) {
174
+ if (initialDirection != gestureDir.value) return;
175
+ let tv = 0;
176
+ if (props.placement == "bottom" || props.placement == "top") tv = deltaY;
177
+ else tv = deltaX;
178
+
179
+ if (props.placement == "bottom") {
180
+ tv = deltaY > 0 ? deltaY : 0;
181
+ }
182
+
183
+ if (props.placement == "top") {
184
+ tv = deltaY < 0 ? deltaY : 0;
185
+ }
186
+
187
+ if (props.placement == "left") {
188
+ tv = deltaX < 0 ? deltaX : 0;
189
+ }
190
+
191
+ if (props.placement == "right") {
192
+ tv = deltaX > 0 ? deltaX : 0;
193
+ }
194
+
195
+ if (
196
+ (props.placement == "bottom" && (tv >= 10 || isMoving.value)) ||
197
+ (props.placement == "top" && (tv <= -10 || isMoving.value)) ||
198
+ (props.placement == "left" && (tv <= -10 || isMoving.value)) ||
199
+ (props.placement == "right" && (tv >= 10 || isMoving.value))
200
+ ) {
201
+ isMoving.value = true;
202
+ present.value.render({
203
+ presentTranslate: tv + "px",
204
+ presentTransitionDuration: "0s",
205
+ });
206
+ }
207
+ },
208
+
209
+ up({ deltaY, deltaX, initialDirection }: GestureUpPayload) {
210
+ isMoving.value = false;
211
+ busy();
212
+ if (initialDirection != gestureDir.value) {
213
+ present.value.open();
214
+ return;
215
+ }
216
+
217
+ let size, diff, val;
218
+ if (props.placement == "bottom" || props.placement == "top") {
219
+ size = modal.value.offsetHeight;
220
+ val = deltaY;
221
+ } else {
222
+ size = modal.value.offsetWidth;
223
+ val = deltaX;
224
+ }
225
+
226
+ diff = (val / size) * 100;
227
+
228
+ if (diff > 50) {
229
+ emit("close", "gesture");
230
+ } else {
231
+ present.value.open();
232
+ }
233
+ },
234
+
235
+ cancel() {
236
+ isMoving.value = false;
237
+ busy();
238
+ present.value.open();
239
+ },
240
+ });
241
+ }
242
+ }
243
+ );
244
+
245
+ onUnmounted(() => {
246
+ if (ges.value) (ges.value as { destroy: () => void }).destroy();
247
+ });
248
+ </script>
@@ -0,0 +1 @@
1
+ export { default as Page } from "./page.vue";
@@ -0,0 +1,3 @@
1
+ <div v-bind="pageAttrs">
2
+ <slot />
3
+ </div>
@@ -0,0 +1,7 @@
1
+ <template src="./page.html"></template>
2
+ <style lang="scss" src="@toife/core/features/page/page.scss" scoped></style>
3
+ <script lang="ts" setup>
4
+ import { getPageAttrs } from "@toife/core";
5
+ // Top-level page surface inside the app shell
6
+ const pageAttrs = getPageAttrs();
7
+ </script>
@@ -0,0 +1,2 @@
1
+ export { default as Present } from "./present.vue";
2
+ export * from "./present.composable";
@@ -0,0 +1,22 @@
1
+ import { ref } from "vue";
2
+
3
+ // Base z-index for stacked overlays; increments by 2 so backdrop sits one level below its sheet
4
+ const index = ref(1000);
5
+
6
+ export const usePresent = () => {
7
+ const newIndex = () => {
8
+ index.value += 2;
9
+ return index.value;
10
+ };
11
+
12
+ const resetIndex = () => {
13
+ index.value = 1000;
14
+ return index.value;
15
+ };
16
+
17
+ return {
18
+ newIndex,
19
+ resetIndex,
20
+ index,
21
+ };
22
+ };
@@ -0,0 +1,11 @@
1
+ <Teleport :to="teleportTo" :disabled="!isTeleportReady">
2
+ <div
3
+ v-bind="backdropAttrs"
4
+ @click="onClickBackdrop"
5
+ v-if="isRender && backdrop !== 'none'"
6
+ v-show="isShow"
7
+ ></div>
8
+ <div v-bind="presentAttrs" v-if="isRender" v-show="isShow">
9
+ <slot />
10
+ </div>
11
+ </Teleport>