@zerodep-dev/vue-tsx-pro-mobile 0.0.0-stage → 0.4.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 (209) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -2
  3. package/dist/area/data.d.ts +10 -0
  4. package/dist/area/data.js +3899 -0
  5. package/dist/area/data.js.map +1 -0
  6. package/dist/area/index.d.ts +22 -0
  7. package/dist/area/index.js +41 -0
  8. package/dist/area/index.js.map +1 -0
  9. package/dist/base/Button.d.ts +170 -0
  10. package/dist/base/Button.js +537 -0
  11. package/dist/base/Button.js.map +1 -0
  12. package/dist/base/Icon.d.ts +38 -0
  13. package/dist/base/Icon.js +65 -0
  14. package/dist/base/Icon.js.map +1 -0
  15. package/dist/capability/PrivacyPrompt.d.ts +1 -0
  16. package/dist/capability/PrivacyPrompt.js +73 -0
  17. package/dist/capability/PrivacyPrompt.js.map +1 -0
  18. package/dist/capability/types.d.ts +92 -0
  19. package/dist/capability/usePermission.d.ts +23 -0
  20. package/dist/capability/usePermission.js +52 -0
  21. package/dist/capability/usePermission.js.map +1 -0
  22. package/dist/capability/useStorage.d.ts +8 -0
  23. package/dist/capability/useStorage.js +19 -0
  24. package/dist/capability/useStorage.js.map +1 -0
  25. package/dist/capability/web.d.ts +18 -0
  26. package/dist/capability/web.js +109 -0
  27. package/dist/capability/web.js.map +1 -0
  28. package/dist/capacitor/index.d.ts +9 -0
  29. package/dist/capacitor/index.js +143 -0
  30. package/dist/capacitor/index.js.map +1 -0
  31. package/dist/config/ConfigProvider.d.ts +37 -0
  32. package/dist/config/ConfigProvider.js +64 -0
  33. package/dist/config/ConfigProvider.js.map +1 -0
  34. package/dist/config/context.d.ts +16 -0
  35. package/dist/config/context.js +20 -0
  36. package/dist/config/context.js.map +1 -0
  37. package/dist/config/lang.d.ts +85 -0
  38. package/dist/config/lang.js +138 -0
  39. package/dist/config/lang.js.map +1 -0
  40. package/dist/display/Badge.d.ts +39 -0
  41. package/dist/display/Badge.js +108 -0
  42. package/dist/display/Badge.js.map +1 -0
  43. package/dist/display/Cell.d.ts +92 -0
  44. package/dist/display/Cell.js +204 -0
  45. package/dist/display/Cell.js.map +1 -0
  46. package/dist/display/Collapse.d.ts +47 -0
  47. package/dist/display/Collapse.js +173 -0
  48. package/dist/display/Collapse.js.map +1 -0
  49. package/dist/display/Empty.d.ts +42 -0
  50. package/dist/display/Empty.js +79 -0
  51. package/dist/display/Empty.js.map +1 -0
  52. package/dist/display/Grid.d.ts +49 -0
  53. package/dist/display/Grid.js +136 -0
  54. package/dist/display/Grid.js.map +1 -0
  55. package/dist/display/Image.d.ts +70 -0
  56. package/dist/display/Image.js +138 -0
  57. package/dist/display/Image.js.map +1 -0
  58. package/dist/display/IndexBar.d.ts +34 -0
  59. package/dist/display/IndexBar.js +158 -0
  60. package/dist/display/IndexBar.js.map +1 -0
  61. package/dist/display/List.d.ts +34 -0
  62. package/dist/display/List.js +105 -0
  63. package/dist/display/List.js.map +1 -0
  64. package/dist/display/NoticeBar.d.ts +57 -0
  65. package/dist/display/NoticeBar.js +172 -0
  66. package/dist/display/NoticeBar.js.map +1 -0
  67. package/dist/display/Steps.d.ts +59 -0
  68. package/dist/display/Steps.js +158 -0
  69. package/dist/display/Steps.js.map +1 -0
  70. package/dist/display/SwipeCell.d.ts +37 -0
  71. package/dist/display/SwipeCell.js +147 -0
  72. package/dist/display/SwipeCell.js.map +1 -0
  73. package/dist/display/Swiper.d.ts +47 -0
  74. package/dist/display/Swiper.js +173 -0
  75. package/dist/display/Swiper.js.map +1 -0
  76. package/dist/display/Tag.d.ts +99 -0
  77. package/dist/display/Tag.js +320 -0
  78. package/dist/display/Tag.js.map +1 -0
  79. package/dist/feedback/Dialog.d.ts +79 -0
  80. package/dist/feedback/Dialog.js +186 -0
  81. package/dist/feedback/Dialog.js.map +1 -0
  82. package/dist/feedback/FeedbackOutlet.d.ts +2 -0
  83. package/dist/feedback/FeedbackOutlet.js +31 -0
  84. package/dist/feedback/FeedbackOutlet.js.map +1 -0
  85. package/dist/feedback/Loading.d.ts +26 -0
  86. package/dist/feedback/Loading.js +68 -0
  87. package/dist/feedback/Loading.js.map +1 -0
  88. package/dist/feedback/Notify.d.ts +48 -0
  89. package/dist/feedback/Notify.js +116 -0
  90. package/dist/feedback/Notify.js.map +1 -0
  91. package/dist/feedback/PullRefresh.d.ts +58 -0
  92. package/dist/feedback/PullRefresh.js +178 -0
  93. package/dist/feedback/PullRefresh.js.map +1 -0
  94. package/dist/feedback/Skeleton.d.ts +56 -0
  95. package/dist/feedback/Skeleton.js +99 -0
  96. package/dist/feedback/Skeleton.js.map +1 -0
  97. package/dist/feedback/Toast.d.ts +89 -0
  98. package/dist/feedback/Toast.js +186 -0
  99. package/dist/feedback/Toast.js.map +1 -0
  100. package/dist/form/Checkbox.d.ts +52 -0
  101. package/dist/form/Checkbox.js +107 -0
  102. package/dist/form/Checkbox.js.map +1 -0
  103. package/dist/form/Field.d.ts +91 -0
  104. package/dist/form/Field.js +296 -0
  105. package/dist/form/Field.js.map +1 -0
  106. package/dist/form/Form.d.ts +50 -0
  107. package/dist/form/Form.js +96 -0
  108. package/dist/form/Form.js.map +1 -0
  109. package/dist/form/FormItem.d.ts +57 -0
  110. package/dist/form/FormItem.js +142 -0
  111. package/dist/form/FormItem.js.map +1 -0
  112. package/dist/form/Radio.d.ts +41 -0
  113. package/dist/form/Radio.js +85 -0
  114. package/dist/form/Radio.js.map +1 -0
  115. package/dist/form/Rate.d.ts +45 -0
  116. package/dist/form/Rate.js +162 -0
  117. package/dist/form/Rate.js.map +1 -0
  118. package/dist/form/Search.d.ts +50 -0
  119. package/dist/form/Search.js +152 -0
  120. package/dist/form/Search.js.map +1 -0
  121. package/dist/form/Slider.d.ts +43 -0
  122. package/dist/form/Slider.js +213 -0
  123. package/dist/form/Slider.js.map +1 -0
  124. package/dist/form/Stepper.d.ts +61 -0
  125. package/dist/form/Stepper.js +222 -0
  126. package/dist/form/Stepper.js.map +1 -0
  127. package/dist/form/Switch.d.ts +33 -0
  128. package/dist/form/Switch.js +116 -0
  129. package/dist/form/Switch.js.map +1 -0
  130. package/dist/form/Uploader.d.ts +67 -0
  131. package/dist/form/Uploader.js +207 -0
  132. package/dist/form/Uploader.js.map +1 -0
  133. package/dist/form/choice.d.ts +42 -0
  134. package/dist/form/choice.js +109 -0
  135. package/dist/form/choice.js.map +1 -0
  136. package/dist/form/context.d.ts +83 -0
  137. package/dist/form/context.js +89 -0
  138. package/dist/form/context.js.map +1 -0
  139. package/dist/index.d.ts +66 -0
  140. package/dist/index.js +59 -0
  141. package/dist/layout/Divider.d.ts +34 -0
  142. package/dist/layout/Divider.js +55 -0
  143. package/dist/layout/Divider.js.map +1 -0
  144. package/dist/layout/Space.d.ts +66 -0
  145. package/dist/layout/Space.js +65 -0
  146. package/dist/layout/Space.js.map +1 -0
  147. package/dist/navigation/BackTop.d.ts +29 -0
  148. package/dist/navigation/BackTop.js +89 -0
  149. package/dist/navigation/BackTop.js.map +1 -0
  150. package/dist/navigation/NavBar.d.ts +46 -0
  151. package/dist/navigation/NavBar.js +141 -0
  152. package/dist/navigation/NavBar.js.map +1 -0
  153. package/dist/navigation/Sticky.d.ts +19 -0
  154. package/dist/navigation/Sticky.js +28 -0
  155. package/dist/navigation/Sticky.js.map +1 -0
  156. package/dist/navigation/TabBar.d.ts +54 -0
  157. package/dist/navigation/TabBar.js +138 -0
  158. package/dist/navigation/TabBar.js.map +1 -0
  159. package/dist/navigation/Tabs.d.ts +45 -0
  160. package/dist/navigation/Tabs.js +206 -0
  161. package/dist/navigation/Tabs.js.map +1 -0
  162. package/dist/overlay/ActionSheet.d.ts +80 -0
  163. package/dist/overlay/ActionSheet.js +164 -0
  164. package/dist/overlay/ActionSheet.js.map +1 -0
  165. package/dist/overlay/Overlay.d.ts +35 -0
  166. package/dist/overlay/Overlay.js +85 -0
  167. package/dist/overlay/Overlay.js.map +1 -0
  168. package/dist/overlay/Popup.d.ts +76 -0
  169. package/dist/overlay/Popup.js +191 -0
  170. package/dist/overlay/Popup.js.map +1 -0
  171. package/dist/picker/Calendar.d.ts +69 -0
  172. package/dist/picker/Calendar.js +213 -0
  173. package/dist/picker/Calendar.js.map +1 -0
  174. package/dist/picker/Cascader.d.ts +50 -0
  175. package/dist/picker/Cascader.js +199 -0
  176. package/dist/picker/Cascader.js.map +1 -0
  177. package/dist/picker/DatePicker.d.ts +52 -0
  178. package/dist/picker/DatePicker.js +135 -0
  179. package/dist/picker/DatePicker.js.map +1 -0
  180. package/dist/picker/DropdownMenu.d.ts +39 -0
  181. package/dist/picker/DropdownMenu.js +242 -0
  182. package/dist/picker/DropdownMenu.js.map +1 -0
  183. package/dist/picker/Picker.d.ts +67 -0
  184. package/dist/picker/Picker.js +185 -0
  185. package/dist/picker/Picker.js.map +1 -0
  186. package/dist/picker/PickerColumn.d.ts +36 -0
  187. package/dist/picker/PickerColumn.js +175 -0
  188. package/dist/picker/PickerColumn.js.map +1 -0
  189. package/dist/theme/dark.d.ts +121 -0
  190. package/dist/theme/dark.js +77 -0
  191. package/dist/theme/dark.js.map +1 -0
  192. package/dist/theme/divider.d.ts +6 -0
  193. package/dist/theme/divider.js +18 -0
  194. package/dist/theme/divider.js.map +1 -0
  195. package/dist/theme/token-names.d.ts +1389 -0
  196. package/dist/theme/tokens.d.ts +549 -0
  197. package/dist/theme/tokens.js +312 -0
  198. package/dist/theme/tokens.js.map +1 -0
  199. package/dist/utils/host.d.ts +97 -0
  200. package/dist/utils/host.js +98 -0
  201. package/dist/utils/host.js.map +1 -0
  202. package/dist/utils/presence.d.ts +11 -0
  203. package/dist/utils/presence.js +34 -0
  204. package/dist/utils/presence.js.map +1 -0
  205. package/dist/utils/props.d.ts +38 -0
  206. package/dist/utils/props.js +115 -0
  207. package/dist/utils/props.js.map +1 -0
  208. package/dist/utils/scales.d.ts +48 -0
  209. package/package.json +106 -3
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ import { borderWidths, colors, durations, easings, fontSizes, fontWeights, fonts, letterSpacings, lineHeights, opacities, radii, shadows, sizes, space, strokeWidths, t } from "./theme/tokens.js";
2
+ import { darkTheme, systemTheme } from "./theme/dark.js";
3
+ import { enUS, zhCN } from "./config/lang.js";
4
+ import { ConfigContext, useConfig } from "./config/context.js";
5
+ import { dataAttrs, elementProps, hasContent, mergeAttrs, mergePartProps, mergeProps } from "./utils/props.js";
6
+ import { Icon, iconMarkup, iconStyles } from "./base/Icon.js";
7
+ import { Loading, loadingStyles } from "./feedback/Loading.js";
8
+ import { HOST_KEY, isMiniProgram, useHost, webHost } from "./utils/host.js";
9
+ import { Button, buttonRecipe } from "./base/Button.js";
10
+ import { Overlay, overlayStyles, useLockScroll } from "./overlay/Overlay.js";
11
+ import { Popup, popupStyles } from "./overlay/Popup.js";
12
+ import { PrivacyPrompt } from "./capability/PrivacyPrompt.js";
13
+ import { Dialog, dialogState, dialogStyles, settleDialog, showConfirmDialog, showDialog } from "./feedback/Dialog.js";
14
+ import { Notify, closeNotify, notifyState, notifyStyles, showNotify } from "./feedback/Notify.js";
15
+ import { Toast, closeToast, showFailToast, showLoadingToast, showSuccessToast, showToast, toastState, toastStyles } from "./feedback/Toast.js";
16
+ import { ConfigProvider, configProviderStyles } from "./config/ConfigProvider.js";
17
+ import { usePermission } from "./capability/usePermission.js";
18
+ import { useStorage } from "./capability/useStorage.js";
19
+ import { Divider, dividerStyles } from "./layout/Divider.js";
20
+ import { Space, spaceStyles } from "./layout/Space.js";
21
+ import { Cell, CellGroup, cellGroupStyles, cellStyles } from "./display/Cell.js";
22
+ import { Tag, tagRecipe } from "./display/Tag.js";
23
+ import { Badge, badgeStyles } from "./display/Badge.js";
24
+ import { Image, imageStyles } from "./display/Image.js";
25
+ import { SwipeCell, swipeCellStyles } from "./display/SwipeCell.js";
26
+ import { Empty, emptyStyles } from "./display/Empty.js";
27
+ import { NoticeBar, noticeBarStyles } from "./display/NoticeBar.js";
28
+ import { Grid, GridItem, gridStyles } from "./display/Grid.js";
29
+ import { Collapse, CollapseItem, collapseStyles } from "./display/Collapse.js";
30
+ import { Steps, stepsStyles } from "./display/Steps.js";
31
+ import { List, listStyles } from "./display/List.js";
32
+ import { Swiper, SwiperItem, swiperStyles } from "./display/Swiper.js";
33
+ import { IndexAnchor, IndexBar, indexBarStyles } from "./display/IndexBar.js";
34
+ import { NavBar, navBarStyles } from "./navigation/NavBar.js";
35
+ import { TabBar, TabBarItem, tabBarStyles } from "./navigation/TabBar.js";
36
+ import { Sticky, stickyStyles } from "./navigation/Sticky.js";
37
+ import { Tab, Tabs, tabsStyles } from "./navigation/Tabs.js";
38
+ import { BackTop, backTopStyles } from "./navigation/BackTop.js";
39
+ import { Picker, pickerStyles, resolveColumns } from "./picker/Picker.js";
40
+ import { DatePicker, TimePicker } from "./picker/DatePicker.js";
41
+ import { Cascader, cascaderStyles, findPath } from "./picker/Cascader.js";
42
+ import { Calendar, calendarStyles } from "./picker/Calendar.js";
43
+ import { DropdownItem, DropdownMenu, dropdownStyles } from "./picker/DropdownMenu.js";
44
+ import { ActionSheet, actionSheetStyles } from "./overlay/ActionSheet.js";
45
+ import { FormContext, isEmptyValue, useForm, useFormItem } from "./form/context.js";
46
+ import { Form } from "./form/Form.js";
47
+ import { FormItem, formItemStyles, renderFormItem } from "./form/FormItem.js";
48
+ import { Field, fieldStyles } from "./form/Field.js";
49
+ import { Search, searchStyles } from "./form/Search.js";
50
+ import { Switch, switchStyles } from "./form/Switch.js";
51
+ import { Checkbox, CheckboxGroup } from "./form/Checkbox.js";
52
+ import { Radio, RadioGroup } from "./form/Radio.js";
53
+ import { Stepper, stepperStyles } from "./form/Stepper.js";
54
+ import { Rate, rateStyles } from "./form/Rate.js";
55
+ import { Slider, sliderStyles } from "./form/Slider.js";
56
+ import { Uploader, uploaderStyles } from "./form/Uploader.js";
57
+ import { Skeleton, skeletonStyles } from "./feedback/Skeleton.js";
58
+ import { PullRefresh, pullRefreshStyles } from "./feedback/PullRefresh.js";
59
+ export { ActionSheet, BackTop, Badge, Button, Calendar, Cascader, Cell, CellGroup, Checkbox, CheckboxGroup, Collapse, CollapseItem, ConfigContext, ConfigProvider, DatePicker, Dialog, Divider, DropdownItem, DropdownMenu, Empty, Field, Form, FormContext, FormItem, Grid, GridItem, HOST_KEY, Icon, Image, IndexAnchor, IndexBar, List, Loading, NavBar, NoticeBar, Notify, Overlay, Picker, Popup, PrivacyPrompt, PullRefresh, Radio, RadioGroup, Rate, Search, Skeleton, Slider, Space, Stepper, Steps, Sticky, SwipeCell, Swiper, SwiperItem, Switch, Tab, TabBar, TabBarItem, Tabs, Tag, TimePicker, Toast, Uploader, actionSheetStyles, backTopStyles, badgeStyles, borderWidths, buttonRecipe, calendarStyles, cascaderStyles, cellGroupStyles, cellStyles, closeNotify, closeToast, collapseStyles, colors, configProviderStyles, darkTheme, dataAttrs, dialogState, dialogStyles, dividerStyles, dropdownStyles, durations, easings, elementProps, emptyStyles, enUS, fieldStyles, findPath, fontSizes, fontWeights, fonts, formItemStyles, gridStyles, hasContent, iconMarkup, iconStyles, imageStyles, indexBarStyles, isEmptyValue, isMiniProgram, letterSpacings, lineHeights, listStyles, loadingStyles, mergeAttrs, mergePartProps, mergeProps, navBarStyles, noticeBarStyles, notifyState, notifyStyles, opacities, overlayStyles, pickerStyles, popupStyles, pullRefreshStyles, radii, rateStyles, renderFormItem, resolveColumns, searchStyles, settleDialog, shadows, showConfirmDialog, showDialog, showFailToast, showLoadingToast, showNotify, showSuccessToast, showToast, sizes, skeletonStyles, sliderStyles, space, spaceStyles, stepperStyles, stepsStyles, stickyStyles, strokeWidths, swipeCellStyles, swiperStyles, switchStyles, systemTheme, t, tabBarStyles, tabsStyles, tagRecipe, toastState, toastStyles, uploaderStyles, useConfig, useForm, useFormItem, useHost, useLockScroll, usePermission, useStorage, webHost, zhCN };
@@ -0,0 +1,34 @@
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
+ import type { VNodeChild } from 'vue';
3
+ import { type PartProps } from '../utils/props';
4
+ /** 文字的位置 */
5
+ export interface DividerAligns {
6
+ /** 靠起始边 */
7
+ start: unknown;
8
+ /** 居中 */
9
+ center: unknown;
10
+ /** 靠结束边 */
11
+ end: unknown;
12
+ }
13
+ /** 未声明的属性落到根元素(div)上 */
14
+ export interface DividerProps extends PartProps<'div', 'role'> {
15
+ /** 线上的文字 */
16
+ children?: VNodeChild;
17
+ /**
18
+ * 文字的位置
19
+ * @default 'center'
20
+ */
21
+ align?: keyof DividerAligns;
22
+ /** 虚线 */
23
+ dashed?: boolean;
24
+ }
25
+ /** Divider 的样式:root、line、shortLine、dashed、text */
26
+ export declare const dividerStyles: Readonly<{
27
+ dashed: css.CompiledStyles;
28
+ line: css.CompiledStyles;
29
+ root: css.CompiledStyles;
30
+ shortLine: css.CompiledStyles;
31
+ text: css.CompiledStyles;
32
+ }>;
33
+ /** 分隔线(div[role=separator] > 线 + 文字 + 线) */
34
+ export declare const Divider: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<DividerProps>;
@@ -0,0 +1,55 @@
1
+ import { hasContent, mergeAttrs } from "../utils/props.js";
2
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
3
+ import { _component, childrenProp, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
4
+ import { createVNode } from "vue";
5
+ //#region src/layout/Divider.tsx
6
+ /** 文字的位置 */
7
+ /** 未声明的属性落到根元素(div)上 */
8
+ /** Divider 的样式:root、line、shortLine、dashed、text */
9
+ var dividerStyles = css.create({
10
+ root: {
11
+ display: "flex",
12
+ alignItems: "center",
13
+ gap: "_lg",
14
+ marginBlock: "_lg",
15
+ paddingInline: "_lg",
16
+ fontSize: "_sm",
17
+ color: "_textMuted"
18
+ },
19
+ line: {
20
+ flex: "1 1 0",
21
+ borderBlockStartWidth: "_hairline",
22
+ borderBlockStartStyle: "solid",
23
+ borderBlockStartColor: "_border"
24
+ },
25
+ shortLine: { flex: "0 0 10%" },
26
+ dashed: { borderBlockStartStyle: "dashed" },
27
+ text: { flex: "0 0 auto" }
28
+ });
29
+ /** 分隔线(div[role=separator] > 线 + 文字 + 线) */
30
+ var Divider = /*#__PURE__*/ _component((_props, _ctx) => {
31
+ const children = childrenProp(_props);
32
+ const align = readonlyProp(_props, "align", "center");
33
+ const dashed = readonlyProp(_props, "dashed", false);
34
+ const rest = restProps(_props, _ctx, false);
35
+ return () => {
36
+ const line = (short) => createVNode("div", mergeAttrs({ sx: [
37
+ dividerStyles.line,
38
+ short && dividerStyles.shortLine,
39
+ dashed.value && dividerStyles.dashed
40
+ ] }), null);
41
+ const labelled = hasContent(children.value);
42
+ return createVNode("div", mergeAttrs({ sx: dividerStyles.root }, rest, { role: "separator" }), [
43
+ line(labelled && align.value === "start"),
44
+ labelled && createVNode("span", mergeAttrs({ sx: dividerStyles.text }), [children.value]),
45
+ labelled && line(align.value === "end")
46
+ ]);
47
+ };
48
+ }, {
49
+ name: "Divider",
50
+ props: ["align", "dashed"]
51
+ });
52
+ //#endregion
53
+ export { Divider, dividerStyles };
54
+
55
+ //# sourceMappingURL=Divider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Divider.js","names":["_vtp_childrenProp","_vtp_readonlyProp","_vtp_restProps","_createVNode"],"sources":["../../src/layout/Divider.tsx"],"sourcesContent":["/**\n * 分隔线:把内容分成几段;可在线上放文字(居中或靠一边)。\n *\n * <Divider />\n * <Divider>以下为历史订单</Divider>\n * <Divider align=\"start\" dashed>备注</Divider>\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { hasContent, mergeAttrs, type PartProps } from '../utils/props';\n\n/** 文字的位置 */\nexport interface DividerAligns {\n /** 靠起始边 */\n start: unknown;\n /** 居中 */\n center: unknown;\n /** 靠结束边 */\n end: unknown;\n}\n\n/** 未声明的属性落到根元素(div)上 */\nexport interface DividerProps extends PartProps<'div', 'role'> {\n /** 线上的文字 */\n children?: VNodeChild;\n /**\n * 文字的位置\n * @default 'center'\n */\n align?: keyof DividerAligns;\n /** 虚线 */\n dashed?: boolean;\n}\n\n/** Divider 的样式:root、line、shortLine、dashed、text */\nexport const dividerStyles = css.create({\n root: {\n display: 'flex',\n alignItems: 'center',\n gap: '_lg',\n marginBlock: '_lg',\n // 与单元格、分组标题的左右留白对齐\n paddingInline: '_lg',\n fontSize: '_sm',\n color: '_textMuted',\n },\n line: {\n flex: '1 1 0',\n borderBlockStartWidth: '_hairline',\n borderBlockStartStyle: 'solid',\n borderBlockStartColor: '_border',\n },\n // 文字靠边时那一侧的线短一截\n shortLine: { flex: '0 0 10%' },\n dashed: { borderBlockStartStyle: 'dashed' },\n text: { flex: '0 0 auto' },\n});\n\n/** 分隔线(div[role=separator] > 线 + 文字 + 线) */\nexport const Divider = _component(\n ({ children, align = 'center', dashed = false, ...rest }: DividerProps) =>\n () => {\n const line = (short: boolean) => (\n <div\n {...mergeAttrs<'div'>({\n sx: [\n dividerStyles.line,\n short && dividerStyles.shortLine,\n dashed && dividerStyles.dashed,\n ],\n })}\n />\n );\n const labelled = hasContent(children);\n return (\n <div {...mergeAttrs<'div'>({ sx: dividerStyles.root }, rest, { role: 'separator' })}>\n {line(labelled && align === 'start')}\n {labelled && <span {...mergeAttrs<'span'>({ sx: dividerStyles.text })}>{children}</span>}\n {labelled && line(align === 'end')}\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;AAoCA,IAAa,gBAAgB,IAAI,OAAO;CACtC,MAAM;EACJ,SAAS;EACT,YAAY;EACZ,KAAK;EACL,aAAa;EAEb,eAAe;EACf,UAAU;EACV,OAAO;CACT;CACA,MAAM;EACJ,MAAM;EACN,uBAAuB;EACvB,uBAAuB;EACvB,uBAAuB;CACzB;CAEA,WAAW,EAAE,MAAM,UAAU;CAC7B,QAAQ,EAAE,uBAAuB,SAAS;CAC1C,MAAM,EAAE,MAAM,WAAW;AAC3B,CAAC;;AAGD,IAAa,UAAU,0BACrB,QAAA,SAAA;CAAA,MAAA,WAAAA,aAAA,MAAA;CAAA,MAAA,QAAAC,aAAA,QAAA,SAAqB,QAAQ;CAAA,MAAA,SAAAA,aAAA,QAAA,UAAW,KAAK;CAAA,MAAK,OAAIC,UAAA,QAAA,MAAA,KAAA;CAAA,aAC9C;EACJ,MAAM,QAAQ,UAAcC,YAAA,OAEpB,WAAkB,EACpB,IAAI;GACF,cAAc;GACd,SAAS,cAAc;GACvB,OAAA,SAAU,cAAc;EAAM,EAElC,CAAC,GAAC,IAAA;EAGN,MAAM,WAAW,WAAU,SAAA,KAAS;EACpC,OAAAA,YAAA,OACW,WAAkB,EAAE,IAAI,cAAc,KAAK,GAAG,MAAM,EAAE,MAAM,YAAY,CAAC,GAAC;GAChF,KAAK,YAAY,MAAA,UAAU,OAAO;GAClC,YAAQA,YAAA,QAAc,WAAmB,EAAE,IAAI,cAAc,KAAK,CAAC,GAAC,CAAA,SAAA,KAAA,CAAA;GACpE,YAAY,KAAK,MAAA,UAAU,KAAK;EAAC,CAAA;CAGxC;AAAC,GAAA;CAAA,MAAA;CAAA,OAAA,CAAA,SAAA,QAAA;AAAA,CACL"}
@@ -0,0 +1,66 @@
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
+ import type { VNodeChild } from 'vue';
3
+ import { type PartProps } from '../utils/props';
4
+ /** 排列方向 */
5
+ export interface SpaceDirections {
6
+ /** 横排(默认换行) */
7
+ horizontal: unknown;
8
+ /** 竖排 */
9
+ vertical: unknown;
10
+ }
11
+ /** 交叉轴上的对齐 */
12
+ export interface SpaceAligns {
13
+ /** 起始边 */
14
+ start: unknown;
15
+ /** 居中 */
16
+ center: unknown;
17
+ /** 结束边 */
18
+ end: unknown;
19
+ /** 文字基线 */
20
+ baseline: unknown;
21
+ /** 拉伸 */
22
+ stretch: unknown;
23
+ }
24
+ /** 未声明的属性落到根元素(div)上 */
25
+ export interface SpaceProps extends PartProps<'div'> {
26
+ /**
27
+ * 方向
28
+ * @default 'horizontal'
29
+ */
30
+ direction?: keyof SpaceDirections;
31
+ /**
32
+ * 间距档位(随字号缩放)
33
+ * @default 'sm'
34
+ */
35
+ gap?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
36
+ /** 交叉轴上的对齐;横排默认居中 */
37
+ align?: keyof SpaceAligns;
38
+ /**
39
+ * 横排时放不下就换行
40
+ * @default true
41
+ */
42
+ wrap?: boolean;
43
+ /** 占满容器宽度(竖排时子元素也撑满) */
44
+ fill?: boolean;
45
+ /** 内容 */
46
+ children?: VNodeChild;
47
+ }
48
+ /** Space 的样式:root、vertical、wrap、fill、各间距与对齐 */
49
+ export declare const spaceStyles: Readonly<{
50
+ baseline: css.CompiledStyles;
51
+ center: css.CompiledStyles;
52
+ end: css.CompiledStyles;
53
+ fill: css.CompiledStyles;
54
+ lg: css.CompiledStyles;
55
+ md: css.CompiledStyles;
56
+ root: css.CompiledStyles;
57
+ sm: css.CompiledStyles;
58
+ start: css.CompiledStyles;
59
+ stretch: css.CompiledStyles;
60
+ vertical: css.CompiledStyles;
61
+ wrap: css.CompiledStyles;
62
+ xl: css.CompiledStyles;
63
+ xs: css.CompiledStyles;
64
+ }>;
65
+ /** 间距(div,弹性布局) */
66
+ export declare const Space: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<SpaceProps>;
@@ -0,0 +1,65 @@
1
+ import { mergeAttrs } from "../utils/props.js";
2
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
3
+ import { _component, childrenProp, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
4
+ import { createVNode } from "vue";
5
+ //#region src/layout/Space.tsx
6
+ /** 排列方向 */
7
+ /** 交叉轴上的对齐 */
8
+ /** 未声明的属性落到根元素(div)上 */
9
+ /** Space 的样式:root、vertical、wrap、fill、各间距与对齐 */
10
+ var spaceStyles = css.create({
11
+ root: {
12
+ display: "inline-flex",
13
+ alignItems: "center"
14
+ },
15
+ vertical: {
16
+ flexDirection: "column",
17
+ alignItems: "stretch"
18
+ },
19
+ wrap: { flexWrap: "wrap" },
20
+ fill: {
21
+ display: "flex",
22
+ width: "100%"
23
+ },
24
+ xs: { gap: "_xs" },
25
+ sm: { gap: "_sm" },
26
+ md: { gap: "_md" },
27
+ lg: { gap: "_lg" },
28
+ xl: { gap: "_xl" },
29
+ start: { alignItems: "flex-start" },
30
+ center: { alignItems: "center" },
31
+ end: { alignItems: "flex-end" },
32
+ baseline: { alignItems: "baseline" },
33
+ stretch: { alignItems: "stretch" }
34
+ });
35
+ /** 间距(div,弹性布局) */
36
+ var Space = /*#__PURE__*/ _component((_props, _ctx) => {
37
+ const direction = readonlyProp(_props, "direction", "horizontal");
38
+ const gap = readonlyProp(_props, "gap", "sm");
39
+ const align = readonlyProp(_props, "align");
40
+ const wrap = readonlyProp(_props, "wrap", true);
41
+ const fill = readonlyProp(_props, "fill", false);
42
+ const children = childrenProp(_props);
43
+ const rest = restProps(_props, _ctx, false);
44
+ return () => createVNode("div", mergeAttrs({ sx: [
45
+ spaceStyles.root,
46
+ spaceStyles[gap.value],
47
+ direction.value === "vertical" && spaceStyles.vertical,
48
+ direction.value === "horizontal" && wrap.value && spaceStyles.wrap,
49
+ fill.value && spaceStyles.fill,
50
+ align.value && spaceStyles[align.value]
51
+ ] }, rest), [children.value]);
52
+ }, {
53
+ name: "Space",
54
+ props: [
55
+ "direction",
56
+ "gap",
57
+ "align",
58
+ "wrap",
59
+ "fill"
60
+ ]
61
+ });
62
+ //#endregion
63
+ export { Space, spaceStyles };
64
+
65
+ //# sourceMappingURL=Space.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Space.js","names":["_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_createVNode"],"sources":["../../src/layout/Space.tsx"],"sourcesContent":["/**\n * 间距:一组元素横排或竖排,之间留同样的空;横排时可换行。\n *\n * <Space><Button>甲</Button><Button>乙</Button></Space>\n * <Space direction=\"vertical\" gap=\"lg\" fill>…</Space>\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { mergeAttrs, type PartProps } from '../utils/props';\n\n/** 排列方向 */\nexport interface SpaceDirections {\n /** 横排(默认换行) */\n horizontal: unknown;\n /** 竖排 */\n vertical: unknown;\n}\n\n/** 交叉轴上的对齐 */\nexport interface SpaceAligns {\n /** 起始边 */\n start: unknown;\n /** 居中 */\n center: unknown;\n /** 结束边 */\n end: unknown;\n /** 文字基线 */\n baseline: unknown;\n /** 拉伸 */\n stretch: unknown;\n}\n\n/** 未声明的属性落到根元素(div)上 */\nexport interface SpaceProps extends PartProps<'div'> {\n /**\n * 方向\n * @default 'horizontal'\n */\n direction?: keyof SpaceDirections;\n /**\n * 间距档位(随字号缩放)\n * @default 'sm'\n */\n gap?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** 交叉轴上的对齐;横排默认居中 */\n align?: keyof SpaceAligns;\n /**\n * 横排时放不下就换行\n * @default true\n */\n wrap?: boolean;\n /** 占满容器宽度(竖排时子元素也撑满) */\n fill?: boolean;\n /** 内容 */\n children?: VNodeChild;\n}\n\n/** Space 的样式:root、vertical、wrap、fill、各间距与对齐 */\nexport const spaceStyles = css.create({\n root: { display: 'inline-flex', alignItems: 'center' },\n vertical: { flexDirection: 'column', alignItems: 'stretch' },\n wrap: { flexWrap: 'wrap' },\n fill: { display: 'flex', width: '100%' },\n xs: { gap: '_xs' },\n sm: { gap: '_sm' },\n md: { gap: '_md' },\n lg: { gap: '_lg' },\n xl: { gap: '_xl' },\n start: { alignItems: 'flex-start' },\n center: { alignItems: 'center' },\n end: { alignItems: 'flex-end' },\n baseline: { alignItems: 'baseline' },\n stretch: { alignItems: 'stretch' },\n});\n\n/** 间距(div,弹性布局) */\nexport const Space = _component(\n ({\n direction = 'horizontal',\n gap = 'sm',\n align,\n wrap = true,\n fill = false,\n children,\n ...rest\n }: SpaceProps) =>\n () => (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n spaceStyles.root,\n spaceStyles[gap],\n direction === 'vertical' && spaceStyles.vertical,\n direction === 'horizontal' && wrap && spaceStyles.wrap,\n fill && spaceStyles.fill,\n align && spaceStyles[align],\n ],\n },\n rest,\n )}\n >\n {children}\n </div>\n ),\n);\n"],"mappings":";;;;;;;;;AA2DA,IAAa,cAAc,IAAI,OAAO;CACpC,MAAM;EAAE,SAAS;EAAe,YAAY;CAAS;CACrD,UAAU;EAAE,eAAe;EAAU,YAAY;CAAU;CAC3D,MAAM,EAAE,UAAU,OAAO;CACzB,MAAM;EAAE,SAAS;EAAQ,OAAO;CAAO;CACvC,IAAI,EAAE,KAAK,MAAM;CACjB,IAAI,EAAE,KAAK,MAAM;CACjB,IAAI,EAAE,KAAK,MAAM;CACjB,IAAI,EAAE,KAAK,MAAM;CACjB,IAAI,EAAE,KAAK,MAAM;CACjB,OAAO,EAAE,YAAY,aAAa;CAClC,QAAQ,EAAE,YAAY,SAAS;CAC/B,KAAK,EAAE,YAAY,WAAW;CAC9B,UAAU,EAAE,YAAY,WAAW;CACnC,SAAS,EAAE,YAAY,UAAU;AACnC,CAAC;;AAGD,IAAa,QAAQ,0BACnB,QAAA,SAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,aACc,YAAY;CAAA,MAAA,MAAAA,aAAA,QAAA,OAClB,IAAI;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,QAEH,IAAI;CAAA,MAAA,OAAAA,aAAA,QAAA,QACJ,KAAK;CAAA,MAAA,WAAAC,aAAA,MAAA;CAAA,MAET,OAAIC,UAAA,QAAA,MAAA,KAAA;CAAA,aAEPC,YAAA,OAEQ,WACF,EACE,IAAI;EACF,YAAY;EACZ,YAAW,IAAA;EACX,UAAA,UAAc,cAAc,YAAY;EACxC,UAAA,UAAc,gBAAY,KAAA,SAAY,YAAY;EAClD,KAAA,SAAQ,YAAY;EACpB,MAAA,SAAS,YAAW,MAAA;CAAO,EAE/B,GACA,IACF,GAAC,CAAA,SAAA,KAAA,CAAA;AAIJ,GAAA;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACL"}
@@ -0,0 +1,29 @@
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
+ import { type VNodeChild } from 'vue';
3
+ import { type PartProps } from '../utils/props';
4
+ /** 未声明的属性落到按钮上 */
5
+ export interface BackTopProps extends PartProps<'button', 'type'> {
6
+ /**
7
+ * 滚过多少(px)才出现
8
+ * @default 200
9
+ */
10
+ offset?: number;
11
+ /**
12
+ * 离底部多远(CSS 长度,另加安全区)
13
+ * @default '6em'
14
+ */
15
+ bottom?: string;
16
+ /**
17
+ * 离右边多远(CSS 长度)
18
+ * @default '1.25em'
19
+ */
20
+ right?: string;
21
+ /** 按钮里的内容(代替向上的箭头) */
22
+ children?: VNodeChild;
23
+ }
24
+ /** BackTop 的样式:root */
25
+ export declare const backTopStyles: Readonly<{
26
+ root: css.CompiledStyles;
27
+ }>;
28
+ /** 回到顶部(button,渲染到浮层根) */
29
+ export declare const BackTop: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<BackTopProps>;
@@ -0,0 +1,89 @@
1
+ import { useConfig } from "../config/context.js";
2
+ import { dataAttrs, mergeAttrs } from "../utils/props.js";
3
+ import { Icon } from "../base/Icon.js";
4
+ import { useHost } from "../utils/host.js";
5
+ import { usePresence } from "../utils/presence.js";
6
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
7
+ import { _component, childrenProp, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
8
+ import { Teleport, createVNode, onBeforeUnmount, onMounted, ref } from "vue";
9
+ import { ArrowUp } from "@lucide/icons";
10
+ //#region src/navigation/BackTop.tsx
11
+ /**
12
+ * 回到顶部:页面往下滚过一段之后,右下角出现一个圆按钮,点了平滑滚回顶部。
13
+ *
14
+ * <BackTop />
15
+ * <BackTop offset={800} bottom="5em" />
16
+ *
17
+ * 滚动位置经宿主约定取(H5 是窗口,小程序是页面的 onPageScroll),浮在浮层根里。
18
+ */
19
+ /** 未声明的属性落到按钮上 */
20
+ /** BackTop 的样式:root */
21
+ var backTopStyles = css.create({ root: {
22
+ position: "fixed",
23
+ zIndex: 1500,
24
+ display: "inline-flex",
25
+ alignItems: "center",
26
+ justifyContent: "center",
27
+ width: "2.85em",
28
+ height: "2.85em",
29
+ margin: 0,
30
+ padding: 0,
31
+ borderWidth: 0,
32
+ borderRadius: "_full",
33
+ backgroundColor: {
34
+ default: "_surface",
35
+ ":active": "_fillActive"
36
+ },
37
+ boxShadow: "_md",
38
+ color: "_text",
39
+ fontSize: "_md",
40
+ cursor: "pointer",
41
+ opacity: {
42
+ default: 0,
43
+ "[data-state=\"open\"]": 1
44
+ },
45
+ transform: {
46
+ default: "scale(0.8)",
47
+ "[data-state=\"open\"]": "none"
48
+ },
49
+ transitionProperty: "opacity, transform",
50
+ transitionDuration: "_md"
51
+ } });
52
+ /** 回到顶部(button,渲染到浮层根) */
53
+ var BackTop = /*#__PURE__*/ _component((_props, _ctx) => {
54
+ const offset = readonlyProp(_props, "offset", 200);
55
+ const bottom = readonlyProp(_props, "bottom", "6em");
56
+ const right = readonlyProp(_props, "right", "1.25em");
57
+ const children = childrenProp(_props);
58
+ const rest = restProps(_props, _ctx, false);
59
+ const host = useHost();
60
+ const config = useConfig();
61
+ let shown = ref(false);
62
+ onMounted(() => shown.value = host.scrollTop() > offset.value);
63
+ const stop = host.onScroll((top) => shown.value = top > offset.value);
64
+ onBeforeUnmount(stop);
65
+ const presence = usePresence(() => shown.value, 240);
66
+ return () => presence.mounted && createVNode(Teleport, { "to": host.overlayRoot() }, { default: () => [createVNode("button", mergeAttrs({
67
+ sx: [config.rootSx, backTopStyles.root],
68
+ style: {
69
+ insetBlockEnd: `calc(${bottom.value} + env(safe-area-inset-bottom))`,
70
+ insetInlineEnd: right.value
71
+ }
72
+ }, rest, {
73
+ type: "button",
74
+ "aria-label": config.lang.backTop,
75
+ onClick: () => host.scrollTo(0, { smooth: true }),
76
+ ...dataAttrs({ "data-state": presence.visible ? "open" : "closed" })
77
+ }), [children.value ?? createVNode(Icon, { "icon": ArrowUp }, null)])] });
78
+ }, {
79
+ name: "BackTop",
80
+ props: [
81
+ "offset",
82
+ "bottom",
83
+ "right"
84
+ ]
85
+ });
86
+ //#endregion
87
+ export { BackTop, backTopStyles };
88
+
89
+ //# sourceMappingURL=BackTop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackTop.js","names":["_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_vue_ref","_createVNode"],"sources":["../../src/navigation/BackTop.tsx"],"sourcesContent":["/**\n * 回到顶部:页面往下滚过一段之后,右下角出现一个圆按钮,点了平滑滚回顶部。\n *\n * <BackTop />\n * <BackTop offset={800} bottom=\"5em\" />\n *\n * 滚动位置经宿主约定取(H5 是窗口,小程序是页面的 onPageScroll),浮在浮层根里。\n */\nimport { ArrowUp } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Teleport, onBeforeUnmount, onMounted, type VNodeChild } from 'vue';\nimport { Icon } from '../base/Icon';\nimport { useConfig } from '../config/context';\nimport { useHost } from '../utils/host';\nimport { usePresence } from '../utils/presence';\nimport { dataAttrs, mergeAttrs, type PartProps } from '../utils/props';\n\n/** 未声明的属性落到按钮上 */\nexport interface BackTopProps extends PartProps<'button', 'type'> {\n /**\n * 滚过多少(px)才出现\n * @default 200\n */\n offset?: number;\n /**\n * 离底部多远(CSS 长度,另加安全区)\n * @default '6em'\n */\n bottom?: string;\n /**\n * 离右边多远(CSS 长度)\n * @default '1.25em'\n */\n right?: string;\n /** 按钮里的内容(代替向上的箭头) */\n children?: VNodeChild;\n}\n\n/** BackTop 的样式:root */\nexport const backTopStyles = css.create({\n root: {\n position: 'fixed',\n zIndex: 1500,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2.85em',\n height: '2.85em',\n margin: 0,\n padding: 0,\n borderWidth: 0,\n borderRadius: '_full',\n backgroundColor: { default: '_surface', ':active': '_fillActive' },\n boxShadow: '_md',\n color: '_text',\n fontSize: '_md',\n cursor: 'pointer',\n opacity: { default: 0, '[data-state=\"open\"]': 1 },\n transform: { default: 'scale(0.8)', '[data-state=\"open\"]': 'none' },\n transitionProperty: 'opacity, transform',\n transitionDuration: '_md',\n },\n});\n\n/** 回到顶部(button,渲染到浮层根) */\nexport const BackTop = _component(\n ({ offset = 200, bottom = '6em', right = '1.25em', children, ...rest }: BackTopProps) => {\n const host = useHost();\n const config = useConfig();\n let shown = _state(false);\n // 挂上时按当前的位置判断一次(从别的页面返回时页面可能已经滚下去了)\n onMounted(() => (shown = host.scrollTop() > offset));\n const stop = host.onScroll((top) => (shown = top > offset));\n onBeforeUnmount(stop);\n const presence = usePresence(() => shown, 240);\n return () =>\n presence.mounted && (\n <Teleport to={host.overlayRoot() as never}>\n <button\n {...mergeAttrs<'button'>(\n {\n sx: [config.rootSx, backTopStyles.root],\n style: {\n insetBlockEnd: `calc(${bottom} + env(safe-area-inset-bottom))`,\n insetInlineEnd: right,\n },\n },\n rest,\n {\n type: 'button',\n 'aria-label': config.lang.backTop,\n onClick: () => host.scrollTo(0, { smooth: true }),\n ...dataAttrs({ 'data-state': presence.visible ? 'open' : 'closed' }),\n },\n )}\n >\n {children ?? <Icon icon={ArrowUp} />}\n </button>\n </Teleport>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwCA,IAAa,gBAAgB,IAAI,OAAO,EACtC,MAAM;CACJ,UAAU;CACV,QAAQ;CACR,SAAS;CACT,YAAY;CACZ,gBAAgB;CAChB,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,aAAa;CACb,cAAc;CACd,iBAAiB;EAAE,SAAS;EAAY,WAAW;CAAc;CACjE,WAAW;CACX,OAAO;CACP,UAAU;CACV,QAAQ;CACR,SAAS;EAAE,SAAS;EAAG,yBAAuB;CAAE;CAChD,WAAW;EAAE,SAAS;EAAc,yBAAuB;CAAO;CAClE,oBAAoB;CACpB,oBAAoB;AACtB,EACF,CAAC;;AAGD,IAAa,UAAU,0BACrB,QAAA,SAAyF;CAAA,MAAA,SAAAA,aAAA,QAAA,UAA7E,GAAG;CAAA,MAAA,SAAAA,aAAA,QAAA,UAAW,KAAK;CAAA,MAAA,QAAAA,aAAA,QAAA,SAAU,QAAQ;CAAA,MAAA,WAAAC,aAAA,MAAA;CAAA,MAAe,OAAIC,UAAA,QAAA,MAAA,KAAA;CAClE,MAAM,OAAO,QAAQ;CACrB,MAAM,SAAS,UAAU;CACzB,IAAI,QAAKC,IAAU,KAAK;CAExB,gBAAiB,MAAA,QAAQ,KAAK,UAAU,IAAC,OAAA,KAAU;CACnD,MAAM,OAAO,KAAK,UAAU,QAAS,MAAA,QAAQ,MAAG,OAAA,KAAU;CAC1D,gBAAgB,IAAI;CACpB,MAAM,WAAW,kBAAY,MAAA,OAAa,GAAG;CAC7C,aACE,SAAS,WAAOC,YAAA,UAAA,EAAA,MACA,KAAK,YAAY,EAAC,GAAA,EAAA,eAAA,CAAAA,YAAA,UAExB,WACF;EACE,IAAI,CAAC,OAAO,QAAQ,cAAc,IAAI;EACtC,OAAO;GACL,eAAe,QAAA,OAAA,MAAA;GACf,gBAAc,MAAA;EAChB;CACF,GACA,MACA;EACE,MAAM;EACN,cAAc,OAAO,KAAK;EAC1B,eAAe,KAAK,SAAS,GAAG,EAAE,QAAQ,KAAK,CAAC;EAChD,GAAG,UAAU,EAAE,cAAc,SAAS,UAAU,SAAS,SAAS,CAAC;CACrE,CACF,GAAC,CAEA,SAAA,SAAAA,YAAA,MAAA,EAAA,QAAwB,QAAO,GAAA,IAAA,CAAI,CAAA,CAAA,EAAA,CAAA;AAI9C,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
@@ -0,0 +1,46 @@
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
+ import type { VNodeChild } from 'vue';
3
+ import { type PartProps } from '../utils/props';
4
+ /** 未声明的属性落到根元素(div)上 */
5
+ export interface NavBarProps extends PartProps<'div', 'title' | 'placeholder'> {
6
+ /** 标题 */
7
+ title?: VNodeChild;
8
+ /** 左边显示返回箭头 */
9
+ leftArrow?: boolean;
10
+ /** 左边的文字(箭头后面) */
11
+ left?: VNodeChild;
12
+ /** 右边的内容(文字、图标按钮) */
13
+ right?: VNodeChild;
14
+ /** 固定在页面顶部 */
15
+ fixed?: boolean;
16
+ /** 固定时在原位置留出同样高的空 */
17
+ placeholder?: boolean;
18
+ /**
19
+ * 底部的细线
20
+ * @default true
21
+ */
22
+ border?: boolean;
23
+ /** 点了左边 */
24
+ onClickLeft?: (event: Event) => void;
25
+ /** 点了右边 */
26
+ onClickRight?: (event: Event) => void;
27
+ /** 左边按钮的部件属性 */
28
+ propsLeft?: PartProps<'button'>;
29
+ /** 右边按钮的部件属性 */
30
+ propsRight?: PartProps<'button'>;
31
+ }
32
+ /** NavBar 的样式:root、fixed、border、bar、title、side、left、right、placeholder */
33
+ export declare const navBarStyles: Readonly<{
34
+ arrow: css.CompiledStyles;
35
+ bar: css.CompiledStyles;
36
+ border: css.CompiledStyles;
37
+ fixed: css.CompiledStyles;
38
+ left: css.CompiledStyles;
39
+ placeholder: css.CompiledStyles;
40
+ right: css.CompiledStyles;
41
+ root: css.CompiledStyles;
42
+ side: css.CompiledStyles;
43
+ title: css.CompiledStyles;
44
+ }>;
45
+ /** 导航栏(div > 左 + 标题 + 右) */
46
+ export declare const NavBar: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<NavBarProps>;
@@ -0,0 +1,141 @@
1
+ import { useConfig } from "../config/context.js";
2
+ import { hasContent, mergeAttrs } from "../utils/props.js";
3
+ import { Icon } from "../base/Icon.js";
4
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
5
+ import { _component, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
6
+ import { createVNode } from "vue";
7
+ import { ChevronLeft } from "@lucide/icons";
8
+ //#region src/navigation/NavBar.tsx
9
+ /**
10
+ * 导航栏:页面顶部的一条,中间标题,左边返回,右边操作。H5 页面用;小程序有原生的导航栏,自定义导航栏(navigationStyle: custom)时也可以用它。
11
+ *
12
+ * <NavBar title="订单详情" leftArrow onClickLeft={() => history.back()} />
13
+ * <NavBar title="购物车" right="编辑" onClickRight={edit} fixed placeholder />
14
+ *
15
+ * fixed 时固定在顶部并让出刘海屏的安全区;placeholder 在原位置留出同样高的空,下面的内容不被盖住。
16
+ */
17
+ /** 未声明的属性落到根元素(div)上 */
18
+ /** NavBar 的样式:root、fixed、border、bar、title、side、left、right、placeholder */
19
+ var navBarStyles = css.create({
20
+ root: {
21
+ backgroundColor: "_surface",
22
+ color: "_text"
23
+ },
24
+ fixed: {
25
+ position: "fixed",
26
+ insetBlockStart: 0,
27
+ insetInline: 0,
28
+ zIndex: 1e3,
29
+ paddingBlockStart: "env(safe-area-inset-top)"
30
+ },
31
+ border: {
32
+ borderBlockEndWidth: "_hairline",
33
+ borderBlockEndStyle: "solid",
34
+ borderBlockEndColor: "_border"
35
+ },
36
+ bar: {
37
+ position: "relative",
38
+ display: "flex",
39
+ alignItems: "center",
40
+ justifyContent: "center",
41
+ height: "3.15em",
42
+ fontSize: "_md"
43
+ },
44
+ title: {
45
+ maxWidth: "60%",
46
+ overflow: "hidden",
47
+ whiteSpace: "nowrap",
48
+ textOverflow: "ellipsis",
49
+ fontSize: "_lg",
50
+ fontWeight: "_semibold"
51
+ },
52
+ side: {
53
+ position: "absolute",
54
+ insetBlock: 0,
55
+ display: "inline-flex",
56
+ alignItems: "center",
57
+ gap: "0.15em",
58
+ margin: 0,
59
+ paddingBlock: 0,
60
+ paddingInline: "_lg",
61
+ borderWidth: 0,
62
+ backgroundColor: "transparent",
63
+ color: {
64
+ default: "_accentText",
65
+ ":active": "_accentActive"
66
+ },
67
+ fontFamily: "inherit",
68
+ fontSize: "inherit",
69
+ cursor: "pointer"
70
+ },
71
+ left: { insetInlineStart: 0 },
72
+ right: { insetInlineEnd: 0 },
73
+ arrow: {
74
+ fontSize: "1.4em",
75
+ marginInlineStart: "-0.3em"
76
+ },
77
+ placeholder: {
78
+ height: "calc(3.15em + env(safe-area-inset-top))",
79
+ fontSize: "_md"
80
+ }
81
+ });
82
+ /** 导航栏(div > 左 + 标题 + 右) */
83
+ var NavBar = /*#__PURE__*/ _component((_props, _ctx) => {
84
+ const title = readonlyProp(_props, "title");
85
+ const leftArrow = readonlyProp(_props, "leftArrow", false);
86
+ const left = readonlyProp(_props, "left");
87
+ const right = readonlyProp(_props, "right");
88
+ const fixed = readonlyProp(_props, "fixed", false);
89
+ const placeholder = readonlyProp(_props, "placeholder", false);
90
+ const border = readonlyProp(_props, "border", true);
91
+ const onClickLeft = readonlyProp(_props, "onClickLeft");
92
+ const onClickRight = readonlyProp(_props, "onClickRight");
93
+ const propsLeft = readonlyProp(_props, "propsLeft");
94
+ const propsRight = readonlyProp(_props, "propsRight");
95
+ const rest = restProps(_props, _ctx, true);
96
+ const config = useConfig();
97
+ return () => {
98
+ const bar = createVNode("div", mergeAttrs({ sx: [
99
+ navBarStyles.root,
100
+ fixed.value && navBarStyles.fixed,
101
+ border.value && navBarStyles.border
102
+ ] }, rest), [createVNode("div", mergeAttrs({ sx: navBarStyles.bar }), [
103
+ (leftArrow.value || hasContent(left.value)) && createVNode("button", mergeAttrs({ sx: [navBarStyles.side, navBarStyles.left] }, propsLeft.value, {
104
+ type: "button",
105
+ "aria-label": hasContent(left.value) ? void 0 : config.lang.back,
106
+ onClick: (event) => onClickLeft.value?.(event)
107
+ }), [leftArrow.value && createVNode(Icon, {
108
+ "icon": ChevronLeft,
109
+ "sx": navBarStyles.arrow
110
+ }, null), left.value]),
111
+ hasContent(title.value) && createVNode("div", mergeJsxProps(mergeAttrs({ sx: navBarStyles.title }), {
112
+ "role": "heading",
113
+ "aria-level": 1
114
+ }), [title.value]),
115
+ hasContent(right.value) && createVNode("button", mergeAttrs({ sx: [navBarStyles.side, navBarStyles.right] }, propsRight.value, {
116
+ type: "button",
117
+ onClick: (event) => onClickRight.value?.(event)
118
+ }), [right.value])
119
+ ])]);
120
+ return fixed.value && placeholder.value ? [createVNode("div", mergeAttrs({ sx: navBarStyles.placeholder }), null), bar] : bar;
121
+ };
122
+ }, {
123
+ name: "NavBar",
124
+ props: [
125
+ "title",
126
+ "leftArrow",
127
+ "left",
128
+ "right",
129
+ "fixed",
130
+ "placeholder",
131
+ "border",
132
+ "onClickLeft",
133
+ "onClickRight",
134
+ "propsLeft",
135
+ "propsRight"
136
+ ]
137
+ });
138
+ //#endregion
139
+ export { NavBar, navBarStyles };
140
+
141
+ //# sourceMappingURL=NavBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavBar.js","names":["_vtp_readonlyProp","_vtp_restProps","_createVNode","_mergeProps"],"sources":["../../src/navigation/NavBar.tsx"],"sourcesContent":["/**\n * 导航栏:页面顶部的一条,中间标题,左边返回,右边操作。H5 页面用;小程序有原生的导航栏,自定义导航栏(navigationStyle: custom)时也可以用它。\n *\n * <NavBar title=\"订单详情\" leftArrow onClickLeft={() => history.back()} />\n * <NavBar title=\"购物车\" right=\"编辑\" onClickRight={edit} fixed placeholder />\n *\n * fixed 时固定在顶部并让出刘海屏的安全区;placeholder 在原位置留出同样高的空,下面的内容不被盖住。\n */\nimport { ChevronLeft } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { Icon } from '../base/Icon';\nimport { useConfig } from '../config/context';\nimport { hasContent, mergeAttrs, type PartProps } from '../utils/props';\n\n/** 未声明的属性落到根元素(div)上 */\nexport interface NavBarProps extends PartProps<'div', 'title' | 'placeholder'> {\n /** 标题 */\n title?: VNodeChild;\n /** 左边显示返回箭头 */\n leftArrow?: boolean;\n /** 左边的文字(箭头后面) */\n left?: VNodeChild;\n /** 右边的内容(文字、图标按钮) */\n right?: VNodeChild;\n /** 固定在页面顶部 */\n fixed?: boolean;\n /** 固定时在原位置留出同样高的空 */\n placeholder?: boolean;\n /**\n * 底部的细线\n * @default true\n */\n border?: boolean;\n /** 点了左边 */\n onClickLeft?: (event: Event) => void;\n /** 点了右边 */\n onClickRight?: (event: Event) => void;\n /** 左边按钮的部件属性 */\n propsLeft?: PartProps<'button'>;\n /** 右边按钮的部件属性 */\n propsRight?: PartProps<'button'>;\n}\n\n/** NavBar 的样式:root、fixed、border、bar、title、side、left、right、placeholder */\nexport const navBarStyles = css.create({\n root: { backgroundColor: '_surface', color: '_text' },\n fixed: {\n position: 'fixed',\n insetBlockStart: 0,\n insetInline: 0,\n zIndex: 1000,\n paddingBlockStart: 'env(safe-area-inset-top)',\n },\n border: {\n borderBlockEndWidth: '_hairline',\n borderBlockEndStyle: 'solid',\n borderBlockEndColor: '_border',\n },\n bar: {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '3.15em',\n fontSize: '_md',\n },\n title: {\n maxWidth: '60%',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n fontSize: '_lg',\n fontWeight: '_semibold',\n },\n side: {\n position: 'absolute',\n insetBlock: 0,\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.15em',\n margin: 0,\n paddingBlock: 0,\n paddingInline: '_lg',\n borderWidth: 0,\n backgroundColor: 'transparent',\n color: { default: '_accentText', ':active': '_accentActive' },\n fontFamily: 'inherit',\n fontSize: 'inherit',\n cursor: 'pointer',\n },\n left: { insetInlineStart: 0 },\n right: { insetInlineEnd: 0 },\n arrow: { fontSize: '1.4em', marginInlineStart: '-0.3em' },\n placeholder: { height: 'calc(3.15em + env(safe-area-inset-top))', fontSize: '_md' },\n});\n\n/** 导航栏(div > 左 + 标题 + 右) */\nexport const NavBar = _component(\n ({\n title,\n leftArrow = false,\n left,\n right,\n fixed = false,\n placeholder = false,\n border = true,\n onClickLeft,\n onClickRight,\n propsLeft,\n propsRight,\n ...rest\n }: NavBarProps) => {\n const config = useConfig();\n return () => {\n const bar = (\n <div\n {...mergeAttrs<'div'>(\n { sx: [navBarStyles.root, fixed && navBarStyles.fixed, border && navBarStyles.border] },\n rest,\n )}\n >\n <div {...mergeAttrs<'div'>({ sx: navBarStyles.bar })}>\n {(leftArrow || hasContent(left)) && (\n <button\n {...mergeAttrs<'button'>(\n { sx: [navBarStyles.side, navBarStyles.left] },\n propsLeft,\n {\n type: 'button',\n // 只有箭头时按钮没有文字,给读屏一个名称\n 'aria-label': hasContent(left) ? undefined : config.lang.back,\n onClick: (event: Event) => onClickLeft?.(event),\n },\n )}\n >\n {leftArrow && <Icon icon={ChevronLeft} sx={navBarStyles.arrow} />}\n {left}\n </button>\n )}\n {hasContent(title) && (\n <div {...mergeAttrs<'div'>({ sx: navBarStyles.title })} role=\"heading\" aria-level={1}>\n {title}\n </div>\n )}\n {hasContent(right) && (\n <button\n {...mergeAttrs<'button'>(\n { sx: [navBarStyles.side, navBarStyles.right] },\n propsRight,\n {\n type: 'button',\n onClick: (event: Event) => onClickRight?.(event),\n },\n )}\n >\n {right}\n </button>\n )}\n </div>\n </div>\n );\n return fixed && placeholder\n ? [<div {...mergeAttrs<'div'>({ sx: navBarStyles.placeholder })} />, bar]\n : bar;\n };\n },\n);\n"],"mappings":"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"}