@zerodep-dev/vue-tsx-pro-mobile 0.0.0-stage → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -0,0 +1,108 @@
1
+ import { t } from "../theme/tokens.js";
2
+ import { hasContent, mergeAttrs } from "../utils/props.js";
3
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
4
+ import { _component, childrenProp, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
5
+ import { createVNode } from "vue";
6
+ //#region src/display/Badge.tsx
7
+ /** 未声明的属性落到外层(span)上 */
8
+ /** Badge 的样式:root、badge、corner、dot、各色调 */
9
+ var badgeStyles = css.create({
10
+ root: {
11
+ position: "relative",
12
+ display: "inline-flex",
13
+ verticalAlign: "middle"
14
+ },
15
+ badge: {
16
+ boxSizing: "border-box",
17
+ display: "inline-flex",
18
+ alignItems: "center",
19
+ justifyContent: "center",
20
+ minWidth: "1.4em",
21
+ height: "1.4em",
22
+ paddingInline: "0.35em",
23
+ borderRadius: "_full",
24
+ fontSize: "_xs",
25
+ fontWeight: "_medium",
26
+ lineHeight: "_none",
27
+ fontVariantNumeric: "tabular-nums",
28
+ whiteSpace: "nowrap",
29
+ boxShadow: `0 0 0 1px ${t.colors.surface}`
30
+ },
31
+ corner: {
32
+ position: "absolute",
33
+ insetBlockStart: 0,
34
+ insetInlineEnd: 0,
35
+ transform: "translate(50%, -50%)",
36
+ transformOrigin: "100% 0",
37
+ zIndex: 1
38
+ },
39
+ dot: {
40
+ minWidth: "8px",
41
+ width: "8px",
42
+ height: "8px",
43
+ padding: 0
44
+ },
45
+ danger: {
46
+ color: "_dangerContrast",
47
+ backgroundColor: "_danger"
48
+ },
49
+ accent: {
50
+ color: "_accentContrast",
51
+ backgroundColor: "_accent"
52
+ },
53
+ success: {
54
+ color: "_successContrast",
55
+ backgroundColor: "_success"
56
+ },
57
+ warning: {
58
+ color: "_warningContrast",
59
+ backgroundColor: "_warning"
60
+ },
61
+ neutral: {
62
+ color: "_inverseText",
63
+ backgroundColor: "_inverseSurface"
64
+ }
65
+ });
66
+ /** 徽标(span > 内容 + 徽标) */
67
+ var Badge = /*#__PURE__*/ _component((_props, _ctx) => {
68
+ const content = readonlyProp(_props, "content");
69
+ const max = readonlyProp(_props, "max");
70
+ const dot = readonlyProp(_props, "dot", false);
71
+ const showZero = readonlyProp(_props, "showZero", false);
72
+ const tone = readonlyProp(_props, "tone", "danger");
73
+ const offset = readonlyProp(_props, "offset");
74
+ const children = childrenProp(_props);
75
+ const propsBadge = readonlyProp(_props, "propsBadge");
76
+ const rest = restProps(_props, _ctx, false);
77
+ return () => {
78
+ const text = typeof content.value === "number" && max.value != null && content.value > max.value ? `${max.value}+` : content.value;
79
+ const visible = dot.value || content.value != null && content.value !== "" && (content.value !== 0 || showZero.value);
80
+ const attached = hasContent(children.value);
81
+ const badge = visible && createVNode("span", mergeAttrs({ sx: [
82
+ badgeStyles.badge,
83
+ badgeStyles[tone.value],
84
+ attached && badgeStyles.corner,
85
+ dot.value && badgeStyles.dot
86
+ ] }, propsBadge.value, { style: offset.value && {
87
+ marginInlineEnd: `${-offset.value[0]}px`,
88
+ marginBlockStart: `${offset.value[1]}px`
89
+ } }), [dot.value ? null : text]);
90
+ if (!attached) return badge || null;
91
+ return createVNode("span", mergeAttrs({ sx: badgeStyles.root }, rest), [children.value, badge]);
92
+ };
93
+ }, {
94
+ name: "Badge",
95
+ props: [
96
+ "content",
97
+ "max",
98
+ "dot",
99
+ "showZero",
100
+ "tone",
101
+ "offset",
102
+ "propsBadge"
103
+ ]
104
+ });
105
+ //#endregion
106
+ export { Badge, badgeStyles };
107
+
108
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","names":["_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_createVNode"],"sources":["../../src/display/Badge.tsx"],"sourcesContent":["/**\n * 徽标:右上角的数字或红点,挂在图标、头像、按钮上;也可以单独用。\n *\n * <Badge content={5}><Icon icon={Bell} /></Badge>\n * <Badge content={120} max={99}><Avatar … /></Badge> 显示 99+\n * <Badge dot><Icon icon={MessageCircle} /></Badge>\n * <Badge content=\"新\" tone=\"success\" /> 单独使用\n *\n * 内容是 0 时默认不显示(showZero 显示)。\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 { t } from '../theme/tokens';\nimport { hasContent, mergeAttrs, type PartProps } from '../utils/props';\n\n/** 未声明的属性落到外层(span)上 */\nexport interface BadgeProps extends PartProps<'span'> {\n /** 数字或文字 */\n content?: number | string;\n /** 数字超过它时显示 `max+` */\n max?: number;\n /** 只显示一个小红点 */\n dot?: boolean;\n /** 内容是 0 时也显示 */\n showZero?: boolean;\n /**\n * 色调\n * @default 'danger'\n */\n tone?: 'danger' | 'accent' | 'success' | 'warning' | 'neutral';\n /** 相对右上角的偏移(px):[向右, 向下] */\n offset?: readonly [number, number];\n /** 被标记的内容;没有时徽标单独显示(行内) */\n children?: VNodeChild;\n /** 徽标本身的部件属性 */\n propsBadge?: PartProps<'span'>;\n}\n\n/** Badge 的样式:root、badge、corner、dot、各色调 */\nexport const badgeStyles = css.create({\n root: { position: 'relative', display: 'inline-flex', verticalAlign: 'middle' },\n badge: {\n boxSizing: 'border-box',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '1.4em',\n height: '1.4em',\n paddingInline: '0.35em',\n borderRadius: '_full',\n fontSize: '_xs',\n fontWeight: '_medium',\n lineHeight: '_none',\n fontVariantNumeric: 'tabular-nums',\n whiteSpace: 'nowrap',\n // 白边把徽标从下面的图标、头像上分出来\n boxShadow: `0 0 0 1px ${t.colors.surface}`,\n },\n corner: {\n position: 'absolute',\n insetBlockStart: 0,\n insetInlineEnd: 0,\n transform: 'translate(50%, -50%)',\n transformOrigin: '100% 0',\n zIndex: 1,\n },\n dot: { minWidth: '8px', width: '8px', height: '8px', padding: 0 },\n danger: { color: '_dangerContrast', backgroundColor: '_danger' },\n accent: { color: '_accentContrast', backgroundColor: '_accent' },\n success: { color: '_successContrast', backgroundColor: '_success' },\n warning: { color: '_warningContrast', backgroundColor: '_warning' },\n neutral: { color: '_inverseText', backgroundColor: '_inverseSurface' },\n});\n\n/** 徽标(span > 内容 + 徽标) */\nexport const Badge = _component(\n ({\n content,\n max,\n dot = false,\n showZero = false,\n tone = 'danger',\n offset,\n children,\n propsBadge,\n ...rest\n }: BadgeProps) =>\n () => {\n const text =\n typeof content === 'number' && max != null && content > max ? `${max}+` : content;\n const visible = dot || (content != null && content !== '' && (content !== 0 || showZero));\n const attached = hasContent(children);\n const badge = visible && (\n <span\n {...mergeAttrs<'span'>(\n {\n sx: [\n badgeStyles.badge,\n badgeStyles[tone],\n attached && badgeStyles.corner,\n dot && badgeStyles.dot,\n ],\n },\n propsBadge,\n {\n style: offset && {\n marginInlineEnd: `${-offset[0]}px`,\n marginBlockStart: `${offset[1]}px`,\n },\n },\n )}\n >\n {dot ? null : text}\n </span>\n );\n if (!attached) return badge || null;\n return (\n <span {...mergeAttrs<'span'>({ sx: badgeStyles.root }, rest)}>\n {children}\n {badge}\n </span>\n );\n },\n);\n"],"mappings":";;;;;;;;AAwCA,IAAa,cAAc,IAAI,OAAO;CACpC,MAAM;EAAE,UAAU;EAAY,SAAS;EAAe,eAAe;CAAS;CAC9E,OAAO;EACL,WAAW;EACX,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,UAAU;EACV,QAAQ;EACR,eAAe;EACf,cAAc;EACd,UAAU;EACV,YAAY;EACZ,YAAY;EACZ,oBAAoB;EACpB,YAAY;EAEZ,WAAW,aAAa,EAAE,OAAO;CACnC;CACA,QAAQ;EACN,UAAU;EACV,iBAAiB;EACjB,gBAAgB;EAChB,WAAW;EACX,iBAAiB;EACjB,QAAQ;CACV;CACA,KAAK;EAAE,UAAU;EAAO,OAAO;EAAO,QAAQ;EAAO,SAAS;CAAE;CAChE,QAAQ;EAAE,OAAO;EAAmB,iBAAiB;CAAU;CAC/D,QAAQ;EAAE,OAAO;EAAmB,iBAAiB;CAAU;CAC/D,SAAS;EAAE,OAAO;EAAoB,iBAAiB;CAAW;CAClE,SAAS;EAAE,OAAO;EAAoB,iBAAiB;CAAW;CAClE,SAAS;EAAE,OAAO;EAAgB,iBAAiB;CAAkB;AACvE,CAAC;;AAGD,IAAa,QAAQ,0BACnB,QAAA,SAAA;CAAA,MAAA,UAAAA,aAAA,QAAA,SAAA;CAAA,MAAA,MAAAA,aAAA,QAAA,KAAA;CAAA,MAAA,MAAAA,aAAA,QAAA,OAGQ,KAAK;CAAA,MAAA,WAAAA,aAAA,QAAA,YACA,KAAK;CAAA,MAAA,OAAAA,aAAA,QAAA,QACT,QAAQ;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,WAAAC,aAAA,MAAA;CAAA,MAAA,aAAAD,aAAA,QAAA,YAAA;CAAA,MAIZ,OAAIE,UAAA,QAAA,MAAA,KAAA;CAAA,aAED;EACJ,MAAM,OACJ,OAAA,QAAA,UAAmB,YAAY,IAAA,SAAO,QAAQ,QAAA,QAAA,IAAA,QAAgB,GAAA,IAAA,MAAA,KAAS,QAAA;EACzE,MAAM,UAAU,IAAA,SAAQ,QAAA,SAAW,QAAQ,QAAA,UAAY,OAAO,QAAA,UAAY,KAAC,SAAA;EAC3E,MAAM,WAAW,WAAU,SAAA,KAAS;EACpC,MAAM,QAAQ,WAAOC,YAAA,QAEb,WACF,EACE,IAAI;GACF,YAAY;GACZ,YAAW,KAAA;GACX,YAAY,YAAY;GACxB,IAAA,SAAO,YAAY;EAAG,EAE1B,GAAC,WAAA,OAED,EACE,OAAO,OAAA,SAAU;GACf,iBAAiB,GAAG,CAAC,OAAA,MAAO,GAAE;GAC9B,kBAAkB,GAAG,OAAA,MAAO,GAAE;EAChC,EACF,CACF,GAAC,CAEA,IAAA,QAAM,OAAO,IAAI,CAAA;EAGtB,IAAI,CAAC,UAAU,OAAO,SAAS;EAC/B,OAAAA,YAAA,QACY,WAAmB,EAAE,IAAI,YAAY,KAAK,GAAG,IAAI,GAAC,CAAA,SAAA,OAEzD,KAAK,CAAA;CAGZ;AAAC,GAAA;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACL"}
@@ -0,0 +1,92 @@
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
+ import type { VNodeChild } from 'vue';
3
+ import { type IconData, type IconProps } from '../base/Icon';
4
+ import { type PartProps } from '../utils/props';
5
+ /** 箭头的方向 */
6
+ export interface CellArrows {
7
+ /** 向右:进入下一页 */
8
+ right: unknown;
9
+ /** 向下:展开 */
10
+ down: unknown;
11
+ /** 向上:收起 */
12
+ up: unknown;
13
+ }
14
+ /** 未声明的属性落到根元素(div)上;title 是标题内容,不是元素的 title 属性 */
15
+ export interface CellProps extends PartProps<'div', 'role' | 'title'> {
16
+ /** 标题 */
17
+ title?: VNodeChild;
18
+ /** 标题下的说明 */
19
+ description?: VNodeChild;
20
+ /** 右边的值;也可以写在 children 里 */
21
+ value?: VNodeChild;
22
+ /** 标题前的图标 */
23
+ icon?: IconData;
24
+ /** 右边的箭头:true 是向右,也可以给方向 */
25
+ arrow?: boolean | keyof CellArrows;
26
+ /** 可点击:按下有反馈;有 onClick 或 arrow 时自动是可点击的 */
27
+ clickable?: boolean;
28
+ /** 标题前加红色星号(必填) */
29
+ required?: boolean;
30
+ /** 内容垂直居中(默认顶端对齐,说明多行时标题与值仍在第一行) */
31
+ center?: boolean;
32
+ /**
33
+ * 尺寸:lg 用在大号的列表项
34
+ * @default 'md'
35
+ */
36
+ size?: 'md' | 'lg';
37
+ /** 不画下面的细线 */
38
+ noDivider?: boolean;
39
+ /** 右边的值(与 value 二选一) */
40
+ children?: VNodeChild;
41
+ /** 图标的部件属性 */
42
+ propsIcon?: Partial<IconProps>;
43
+ /** 标题与说明那一栏的部件属性 */
44
+ propsBody?: PartProps<'div'>;
45
+ /** 标题的部件属性 */
46
+ propsTitle?: PartProps<'div'>;
47
+ /** 说明的部件属性 */
48
+ propsDescription?: PartProps<'div'>;
49
+ /** 值的部件属性 */
50
+ propsValue?: PartProps<'div'>;
51
+ /** 箭头的部件属性 */
52
+ propsArrow?: Partial<IconProps>;
53
+ }
54
+ /** Cell 的样式:root、clickable、center、lg、icon、body、title、required、description、value、arrow */
55
+ export declare const cellStyles: Readonly<{
56
+ arrow: css.CompiledStyles;
57
+ body: css.CompiledStyles;
58
+ center: css.CompiledStyles;
59
+ clickable: css.CompiledStyles;
60
+ description: css.CompiledStyles;
61
+ icon: css.CompiledStyles;
62
+ lg: css.CompiledStyles;
63
+ required: css.CompiledStyles;
64
+ root: css.CompiledStyles;
65
+ title: css.CompiledStyles;
66
+ value: css.CompiledStyles;
67
+ }>;
68
+ /** 单元格(div):可点击时 role="button" */
69
+ export declare const Cell: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<CellProps>;
70
+ /** 未声明的属性落到根元素(div)上;title 是分组标题,不是元素的 title 属性 */
71
+ export interface CellGroupProps extends PartProps<'div', 'title'> {
72
+ /** 分组标题,在卡片上方 */
73
+ title?: VNodeChild;
74
+ /** 卡片样式:左右留边、圆角,浮在页面的灰底上 */
75
+ inset?: boolean;
76
+ /** 单元格 */
77
+ children?: VNodeChild;
78
+ /** 标题的部件属性 */
79
+ propsTitle?: PartProps<'div'>;
80
+ /** 包着单元格的那一层的部件属性 */
81
+ propsBody?: PartProps<'div'>;
82
+ }
83
+ /** CellGroup 的样式:root、title、insetTitle、body、insetBody */
84
+ export declare const cellGroupStyles: Readonly<{
85
+ body: css.CompiledStyles;
86
+ insetBody: css.CompiledStyles;
87
+ insetTitle: css.CompiledStyles;
88
+ root: css.CompiledStyles;
89
+ title: css.CompiledStyles;
90
+ }>;
91
+ /** 单元格分组(div > 标题 + 单元格) */
92
+ export declare const CellGroup: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<CellGroupProps>;
@@ -0,0 +1,204 @@
1
+ import { dataAttrs, hasContent, mergeAttrs, mergePartProps } from "../utils/props.js";
2
+ import { Icon } from "../base/Icon.js";
3
+ import { dividerImage, dividerLayout } from "../theme/divider.js";
4
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
5
+ import { _component, childrenProp, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
6
+ import { createTextVNode, createVNode } from "vue";
7
+ import { ChevronDown, ChevronRight, ChevronUp } from "@lucide/icons";
8
+ //#region src/display/Cell.tsx
9
+ /**
10
+ * 单元格与单元格分组:列表、设置页、表单的一行——左边标题(可带图标与说明),右边值,可带箭头、可点击。
11
+ *
12
+ * <CellGroup title="账户" inset>
13
+ * <Cell title="昵称" value="莱恩" arrow onClick={edit} />
14
+ * <Cell title="手机号" description="用于登录与找回密码" value="138****0000" />
15
+ * </CellGroup>
16
+ *
17
+ * 单元格之间的细线从左边内边距处开始,最后一个不画;inset 的分组是浮在灰底上的圆角卡片。
18
+ */
19
+ /** 箭头的方向 */
20
+ /** 未声明的属性落到根元素(div)上;title 是标题内容,不是元素的 title 属性 */
21
+ /** Cell 的样式:root、clickable、center、lg、icon、body、title、required、description、value、arrow */
22
+ var cellStyles = css.create({
23
+ root: {
24
+ boxSizing: "border-box",
25
+ position: "relative",
26
+ display: "flex",
27
+ alignItems: "flex-start",
28
+ gap: "_md",
29
+ width: "100%",
30
+ minHeight: "_control",
31
+ paddingBlock: "0.7em",
32
+ paddingInline: "_lg",
33
+ fontSize: "_md",
34
+ lineHeight: "1.5",
35
+ color: "_text",
36
+ backgroundColor: "_surface",
37
+ backgroundImage: {
38
+ default: dividerImage,
39
+ ":last-child": "none",
40
+ "[data-no-divider]": "none"
41
+ },
42
+ ...dividerLayout
43
+ },
44
+ clickable: {
45
+ cursor: "pointer",
46
+ userSelect: "none",
47
+ backgroundColor: {
48
+ default: "_surface",
49
+ ":active": "_fillActive"
50
+ },
51
+ transitionProperty: "background-color",
52
+ transitionDuration: "_xs"
53
+ },
54
+ center: { alignItems: "center" },
55
+ lg: {
56
+ minHeight: "3.5em",
57
+ paddingBlock: "0.9em",
58
+ fontSize: "_lg"
59
+ },
60
+ icon: {
61
+ fontSize: "1.15em",
62
+ marginBlockStart: "0.15em",
63
+ color: "_text"
64
+ },
65
+ body: {
66
+ flex: "1 1 auto",
67
+ minWidth: 0
68
+ },
69
+ title: { overflowWrap: "anywhere" },
70
+ required: {
71
+ color: "_dangerText",
72
+ marginInlineEnd: "0.15em"
73
+ },
74
+ description: {
75
+ marginBlockStart: "0.15em",
76
+ fontSize: "_xs",
77
+ color: "_textMuted"
78
+ },
79
+ value: {
80
+ flex: "0 1 auto",
81
+ maxWidth: "60%",
82
+ color: "_textMuted",
83
+ textAlign: "end",
84
+ overflowWrap: "anywhere"
85
+ },
86
+ arrow: {
87
+ fontSize: "1.1em",
88
+ marginBlockStart: "0.2em",
89
+ marginInlineStart: "-0.25em",
90
+ color: "_textPlaceholder"
91
+ }
92
+ });
93
+ var ARROWS = {
94
+ right: ChevronRight,
95
+ down: ChevronDown,
96
+ up: ChevronUp
97
+ };
98
+ /** 单元格(div):可点击时 role="button" */
99
+ var Cell = /*#__PURE__*/ _component((_props, _ctx) => {
100
+ const title = readonlyProp(_props, "title");
101
+ const description = readonlyProp(_props, "description");
102
+ const value = readonlyProp(_props, "value");
103
+ const icon = readonlyProp(_props, "icon");
104
+ const arrow = readonlyProp(_props, "arrow", false);
105
+ const clickable = readonlyProp(_props, "clickable");
106
+ const required = readonlyProp(_props, "required", false);
107
+ const center = readonlyProp(_props, "center", false);
108
+ const size = readonlyProp(_props, "size", "md");
109
+ const noDivider = readonlyProp(_props, "noDivider", false);
110
+ const children = childrenProp(_props);
111
+ const propsIcon = readonlyProp(_props, "propsIcon");
112
+ const propsBody = readonlyProp(_props, "propsBody");
113
+ const propsTitle = readonlyProp(_props, "propsTitle");
114
+ const propsDescription = readonlyProp(_props, "propsDescription");
115
+ const propsValue = readonlyProp(_props, "propsValue");
116
+ const propsArrow = readonlyProp(_props, "propsArrow");
117
+ const rest = restProps(_props, _ctx, false);
118
+ return () => {
119
+ const pressable = clickable.value ?? (arrow.value !== false || rest.onClick != null);
120
+ const content = hasContent(value.value) ? value.value : children.value;
121
+ return createVNode("div", mergeAttrs({ sx: [
122
+ cellStyles.root,
123
+ pressable && cellStyles.clickable,
124
+ center.value && cellStyles.center,
125
+ size.value === "lg" && cellStyles.lg
126
+ ] }, rest, {
127
+ role: pressable ? "button" : void 0,
128
+ ...dataAttrs({ "data-no-divider": noDivider.value || void 0 })
129
+ }), [
130
+ icon.value && createVNode(Icon, mergePartProps({
131
+ icon: icon.value,
132
+ sx: cellStyles.icon
133
+ }, propsIcon.value), null),
134
+ (hasContent(title.value) || hasContent(description.value)) && createVNode("div", mergeAttrs({ sx: cellStyles.body }, propsBody.value), [hasContent(title.value) && createVNode("div", mergeAttrs({ sx: cellStyles.title }, propsTitle.value), [required.value && createVNode("span", mergeAttrs({ sx: cellStyles.required }, void 0, { "aria-hidden": "true" }), [createTextVNode("*")]), title.value]), hasContent(description.value) && createVNode("div", mergeAttrs({ sx: cellStyles.description }, propsDescription.value), [description.value])]),
135
+ hasContent(content) && createVNode("div", mergeAttrs({ sx: cellStyles.value }, propsValue.value), [content]),
136
+ arrow.value !== false && createVNode(Icon, mergePartProps({
137
+ icon: ARROWS[arrow.value === true ? "right" : arrow.value],
138
+ sx: cellStyles.arrow
139
+ }, propsArrow.value), null)
140
+ ]);
141
+ };
142
+ }, {
143
+ name: "Cell",
144
+ props: [
145
+ "title",
146
+ "description",
147
+ "value",
148
+ "icon",
149
+ "arrow",
150
+ "clickable",
151
+ "required",
152
+ "center",
153
+ "size",
154
+ "noDivider",
155
+ "propsIcon",
156
+ "propsBody",
157
+ "propsTitle",
158
+ "propsDescription",
159
+ "propsValue",
160
+ "propsArrow"
161
+ ]
162
+ });
163
+ /** 未声明的属性落到根元素(div)上;title 是分组标题,不是元素的 title 属性 */
164
+ /** CellGroup 的样式:root、title、insetTitle、body、insetBody */
165
+ var cellGroupStyles = css.create({
166
+ root: { boxSizing: "border-box" },
167
+ title: {
168
+ paddingInline: "_lg",
169
+ paddingBlockStart: "_lg",
170
+ paddingBlockEnd: "_sm",
171
+ fontSize: "_sm",
172
+ lineHeight: "1.4",
173
+ color: "_textMuted"
174
+ },
175
+ insetTitle: { paddingInline: "1.75em" },
176
+ body: { backgroundColor: "_surface" },
177
+ insetBody: {
178
+ marginInline: "_lg",
179
+ borderRadius: "_lg",
180
+ overflow: "hidden"
181
+ }
182
+ });
183
+ /** 单元格分组(div > 标题 + 单元格) */
184
+ var CellGroup = /*#__PURE__*/ _component((_props2, _ctx2) => {
185
+ const title = readonlyProp(_props2, "title");
186
+ const inset = readonlyProp(_props2, "inset", false);
187
+ const children = childrenProp(_props2);
188
+ const propsTitle = readonlyProp(_props2, "propsTitle");
189
+ const propsBody = readonlyProp(_props2, "propsBody");
190
+ const rest = restProps(_props2, _ctx2, false);
191
+ return () => createVNode("div", mergeAttrs({ sx: cellGroupStyles.root }, rest), [hasContent(title.value) && createVNode("div", mergeAttrs({ sx: [cellGroupStyles.title, inset.value && cellGroupStyles.insetTitle] }, propsTitle.value), [title.value]), createVNode("div", mergeAttrs({ sx: [cellGroupStyles.body, inset.value && cellGroupStyles.insetBody] }, propsBody.value), [children.value])]);
192
+ }, {
193
+ name: "CellGroup",
194
+ props: [
195
+ "title",
196
+ "inset",
197
+ "propsTitle",
198
+ "propsBody"
199
+ ]
200
+ });
201
+ //#endregion
202
+ export { Cell, CellGroup, cellGroupStyles, cellStyles };
203
+
204
+ //# sourceMappingURL=Cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cell.js","names":["_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_createVNode","_createTextVNode"],"sources":["../../src/display/Cell.tsx"],"sourcesContent":["/**\n * 单元格与单元格分组:列表、设置页、表单的一行——左边标题(可带图标与说明),右边值,可带箭头、可点击。\n *\n * <CellGroup title=\"账户\" inset>\n * <Cell title=\"昵称\" value=\"莱恩\" arrow onClick={edit} />\n * <Cell title=\"手机号\" description=\"用于登录与找回密码\" value=\"138****0000\" />\n * </CellGroup>\n *\n * 单元格之间的细线从左边内边距处开始,最后一个不画;inset 的分组是浮在灰底上的圆角卡片。\n */\nimport { ChevronDown, ChevronRight, ChevronUp } 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, type IconData, type IconProps } from '../base/Icon';\nimport { dividerImage, dividerLayout } from '../theme/divider';\nimport { dataAttrs, hasContent, mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\n\n/** 箭头的方向 */\nexport interface CellArrows {\n /** 向右:进入下一页 */\n right: unknown;\n /** 向下:展开 */\n down: unknown;\n /** 向上:收起 */\n up: unknown;\n}\n\n/** 未声明的属性落到根元素(div)上;title 是标题内容,不是元素的 title 属性 */\nexport interface CellProps extends PartProps<'div', 'role' | 'title'> {\n /** 标题 */\n title?: VNodeChild;\n /** 标题下的说明 */\n description?: VNodeChild;\n /** 右边的值;也可以写在 children 里 */\n value?: VNodeChild;\n /** 标题前的图标 */\n icon?: IconData;\n /** 右边的箭头:true 是向右,也可以给方向 */\n arrow?: boolean | keyof CellArrows;\n /** 可点击:按下有反馈;有 onClick 或 arrow 时自动是可点击的 */\n clickable?: boolean;\n /** 标题前加红色星号(必填) */\n required?: boolean;\n /** 内容垂直居中(默认顶端对齐,说明多行时标题与值仍在第一行) */\n center?: boolean;\n /**\n * 尺寸:lg 用在大号的列表项\n * @default 'md'\n */\n size?: 'md' | 'lg';\n /** 不画下面的细线 */\n noDivider?: boolean;\n /** 右边的值(与 value 二选一) */\n children?: VNodeChild;\n /** 图标的部件属性 */\n propsIcon?: Partial<IconProps>;\n /** 标题与说明那一栏的部件属性 */\n propsBody?: PartProps<'div'>;\n /** 标题的部件属性 */\n propsTitle?: PartProps<'div'>;\n /** 说明的部件属性 */\n propsDescription?: PartProps<'div'>;\n /** 值的部件属性 */\n propsValue?: PartProps<'div'>;\n /** 箭头的部件属性 */\n propsArrow?: Partial<IconProps>;\n}\n\n/** Cell 的样式:root、clickable、center、lg、icon、body、title、required、description、value、arrow */\nexport const cellStyles = css.create({\n root: {\n boxSizing: 'border-box',\n position: 'relative',\n display: 'flex',\n alignItems: 'flex-start',\n gap: '_md',\n width: '100%',\n minHeight: '_control',\n paddingBlock: '0.7em',\n paddingInline: '_lg',\n fontSize: '_md',\n lineHeight: '1.5',\n color: '_text',\n backgroundColor: '_surface',\n // 细线:从左边内边距处画到右边,最后一个不画(不用伪元素:小程序把样式展开成行内样式,伪元素进不去)\n backgroundImage: {\n default: dividerImage,\n ':last-child': 'none',\n '[data-no-divider]': 'none',\n },\n ...dividerLayout,\n },\n clickable: {\n cursor: 'pointer',\n userSelect: 'none',\n backgroundColor: { default: '_surface', ':active': '_fillActive' },\n transitionProperty: 'background-color',\n transitionDuration: '_xs',\n },\n center: { alignItems: 'center' },\n lg: { minHeight: '3.5em', paddingBlock: '0.9em', fontSize: '_lg' },\n icon: { fontSize: '1.15em', marginBlockStart: '0.15em', color: '_text' },\n body: { flex: '1 1 auto', minWidth: 0 },\n title: { overflowWrap: 'anywhere' },\n required: { color: '_dangerText', marginInlineEnd: '0.15em' },\n description: { marginBlockStart: '0.15em', fontSize: '_xs', color: '_textMuted' },\n value: {\n flex: '0 1 auto',\n maxWidth: '60%',\n color: '_textMuted',\n textAlign: 'end',\n overflowWrap: 'anywhere',\n },\n arrow: {\n fontSize: '1.1em',\n marginBlockStart: '0.2em',\n marginInlineStart: '-0.25em',\n color: '_textPlaceholder',\n },\n});\n\nconst ARROWS = { right: ChevronRight, down: ChevronDown, up: ChevronUp } as const;\n\n/** 单元格(div):可点击时 role=\"button\" */\nexport const Cell = _component(\n ({\n title,\n description,\n value,\n icon,\n arrow = false,\n clickable,\n required = false,\n center = false,\n size = 'md',\n noDivider = false,\n children,\n propsIcon,\n propsBody,\n propsTitle,\n propsDescription,\n propsValue,\n propsArrow,\n ...rest\n }: CellProps) =>\n () => {\n const pressable = clickable ?? (arrow !== false || rest.onClick != null);\n const content = hasContent(value) ? value : children;\n return (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n cellStyles.root,\n pressable && cellStyles.clickable,\n center && cellStyles.center,\n size === 'lg' && cellStyles.lg,\n ],\n },\n rest,\n {\n role: pressable ? 'button' : undefined,\n ...dataAttrs({ 'data-no-divider': noDivider || undefined }),\n },\n )}\n >\n {icon && (\n <Icon {...mergePartProps<IconProps>({ icon, sx: cellStyles.icon }, propsIcon)} />\n )}\n {(hasContent(title) || hasContent(description)) && (\n <div {...mergeAttrs<'div'>({ sx: cellStyles.body }, propsBody)}>\n {hasContent(title) && (\n <div {...mergeAttrs<'div'>({ sx: cellStyles.title }, propsTitle)}>\n {required && (\n <span\n {...mergeAttrs<'span'>({ sx: cellStyles.required }, undefined, {\n 'aria-hidden': 'true',\n })}\n >\n *\n </span>\n )}\n {title}\n </div>\n )}\n {hasContent(description) && (\n <div {...mergeAttrs<'div'>({ sx: cellStyles.description }, propsDescription)}>\n {description}\n </div>\n )}\n </div>\n )}\n {hasContent(content) && (\n <div {...mergeAttrs<'div'>({ sx: cellStyles.value }, propsValue)}>{content}</div>\n )}\n {arrow !== false && (\n <Icon\n {...mergePartProps<IconProps>(\n { icon: ARROWS[arrow === true ? 'right' : arrow], sx: cellStyles.arrow },\n propsArrow,\n )}\n />\n )}\n </div>\n );\n },\n);\n\n/** 未声明的属性落到根元素(div)上;title 是分组标题,不是元素的 title 属性 */\nexport interface CellGroupProps extends PartProps<'div', 'title'> {\n /** 分组标题,在卡片上方 */\n title?: VNodeChild;\n /** 卡片样式:左右留边、圆角,浮在页面的灰底上 */\n inset?: boolean;\n /** 单元格 */\n children?: VNodeChild;\n /** 标题的部件属性 */\n propsTitle?: PartProps<'div'>;\n /** 包着单元格的那一层的部件属性 */\n propsBody?: PartProps<'div'>;\n}\n\n/** CellGroup 的样式:root、title、insetTitle、body、insetBody */\nexport const cellGroupStyles = css.create({\n root: { boxSizing: 'border-box' },\n title: {\n paddingInline: '_lg',\n paddingBlockStart: '_lg',\n paddingBlockEnd: '_sm',\n fontSize: '_sm',\n lineHeight: '1.4',\n color: '_textMuted',\n },\n insetTitle: { paddingInline: '1.75em' },\n body: { backgroundColor: '_surface' },\n insetBody: { marginInline: '_lg', borderRadius: '_lg', overflow: 'hidden' },\n});\n\n/** 单元格分组(div > 标题 + 单元格) */\nexport const CellGroup = _component(\n ({ title, inset = false, children, propsTitle, propsBody, ...rest }: CellGroupProps) =>\n () => (\n <div {...mergeAttrs<'div'>({ sx: cellGroupStyles.root }, rest)}>\n {hasContent(title) && (\n <div\n {...mergeAttrs<'div'>(\n { sx: [cellGroupStyles.title, inset && cellGroupStyles.insetTitle] },\n propsTitle,\n )}\n >\n {title}\n </div>\n )}\n <div\n {...mergeAttrs<'div'>(\n { sx: [cellGroupStyles.body, inset && cellGroupStyles.insetBody] },\n propsBody,\n )}\n >\n {children}\n </div>\n </div>\n ),\n);\n"],"mappings":"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"}
@@ -0,0 +1,47 @@
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 CollapseProps extends Omit<PartProps<'div'>, 'onChange'> {
6
+ /** 展开的项;双向绑定写 `_value={x}`。手风琴模式下是一个名字(或 null),否则是名字的数组 */
7
+ _value?: string[] | string | null;
8
+ /** 手风琴:同时只展开一个 */
9
+ accordion?: boolean;
10
+ /** 展开的项变了 */
11
+ onChange?: (value: string[] | string | null) => void;
12
+ /** 各个 CollapseItem */
13
+ children?: VNodeChild;
14
+ }
15
+ /** Collapse 的样式:root、header、title、arrow、panel、content */
16
+ export declare const collapseStyles: Readonly<{
17
+ arrow: css.CompiledStyles;
18
+ clip: css.CompiledStyles;
19
+ content: css.CompiledStyles;
20
+ header: css.CompiledStyles;
21
+ item: css.CompiledStyles;
22
+ panel: css.CompiledStyles;
23
+ root: css.CompiledStyles;
24
+ title: css.CompiledStyles;
25
+ value: css.CompiledStyles;
26
+ }>;
27
+ /** 折叠面板(div > 各项) */
28
+ export declare const Collapse: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<CollapseProps>;
29
+ /** 未声明的属性落到这一项的根元素(div)上 */
30
+ export interface CollapseItemProps extends PartProps<'div', 'title'> {
31
+ /** 名字:展开的状态按它记 */
32
+ name: string;
33
+ /** 标题 */
34
+ title: VNodeChild;
35
+ /** 标题右边的值 */
36
+ value?: VNodeChild;
37
+ /** 不能展开 */
38
+ disabled?: boolean;
39
+ /** 展开的内容 */
40
+ children?: VNodeChild;
41
+ /** 标题栏(button)的部件属性 */
42
+ propsHeader?: PartProps<'button'>;
43
+ /** 内容的部件属性 */
44
+ propsContent?: PartProps<'div'>;
45
+ }
46
+ /** 折叠面板的一项(div > 标题栏 button[aria-expanded] + 内容) */
47
+ export declare const CollapseItem: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<CollapseItemProps>;
@@ -0,0 +1,173 @@
1
+ import { dataAttrs, hasContent, mergeAttrs } from "../utils/props.js";
2
+ import { Icon } from "../base/Icon.js";
3
+ import { dividerImage, dividerLayout } from "../theme/divider.js";
4
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
5
+ import { _component, bindable, childrenProp, createContext, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
6
+ import { createVNode } from "vue";
7
+ import { ChevronDown } from "@lucide/icons";
8
+ //#region src/display/Collapse.tsx
9
+ /**
10
+ * 折叠面板:一组可展开、收起的段落(常见问题、订单详情的分组);手风琴模式下同时只展开一个。
11
+ *
12
+ * <Collapse _value={open}>
13
+ * <CollapseItem name="ship" title="多久发货?">付款后 48 小时内发货。</CollapseItem>
14
+ * <CollapseItem name="refund" title="怎么退款?">…</CollapseItem>
15
+ * </Collapse>
16
+ * <Collapse _value={current} accordion>…</Collapse>
17
+ *
18
+ * 展开收起的高度动画用网格行(0fr ↔ 1fr),不用量内容的高度,小程序里也一样。
19
+ */
20
+ /** 面板提供给各项的 */
21
+ var CollapseContext = createContext("Collapse");
22
+ /** 未声明的属性落到根元素(div)上 */
23
+ /** Collapse 的样式:root、header、title、arrow、panel、content */
24
+ var collapseStyles = css.create({
25
+ root: { backgroundColor: "_surface" },
26
+ item: {
27
+ backgroundImage: {
28
+ default: dividerImage,
29
+ ":last-child": "none"
30
+ },
31
+ ...dividerLayout
32
+ },
33
+ header: {
34
+ boxSizing: "border-box",
35
+ display: "flex",
36
+ alignItems: "center",
37
+ gap: "_md",
38
+ width: "100%",
39
+ minHeight: "_control",
40
+ margin: 0,
41
+ paddingBlock: "0.7em",
42
+ paddingInline: "_lg",
43
+ borderWidth: 0,
44
+ backgroundColor: {
45
+ default: "transparent",
46
+ ":active:not([disabled])": "_fillActive"
47
+ },
48
+ color: {
49
+ default: "_text",
50
+ "[disabled]": "_textDisabled"
51
+ },
52
+ fontFamily: "inherit",
53
+ fontSize: "_md",
54
+ lineHeight: "1.5",
55
+ textAlign: "start",
56
+ cursor: {
57
+ default: "pointer",
58
+ "[disabled]": "not-allowed"
59
+ }
60
+ },
61
+ title: {
62
+ flex: "1 1 auto",
63
+ minWidth: 0,
64
+ overflowWrap: "anywhere"
65
+ },
66
+ value: {
67
+ flex: "none",
68
+ color: "_textMuted"
69
+ },
70
+ arrow: {
71
+ flex: "none",
72
+ color: "_textPlaceholder",
73
+ transform: {
74
+ default: "none",
75
+ "[data-open]": "rotate(180deg)"
76
+ },
77
+ transitionProperty: "transform",
78
+ transitionDuration: "_md"
79
+ },
80
+ panel: {
81
+ display: "grid",
82
+ gridTemplateRows: {
83
+ default: "0fr",
84
+ "[data-open]": "1fr"
85
+ },
86
+ transitionProperty: "grid-template-rows",
87
+ transitionDuration: "_md",
88
+ transitionTimingFunction: "_standard"
89
+ },
90
+ clip: {
91
+ overflow: "hidden",
92
+ minHeight: 0
93
+ },
94
+ content: {
95
+ paddingBlock: "0.25em 1em",
96
+ paddingInline: "_lg",
97
+ fontSize: "_sm",
98
+ lineHeight: "1.6",
99
+ color: "_textMuted"
100
+ }
101
+ });
102
+ /** 折叠面板(div > 各项) */
103
+ var Collapse = /*#__PURE__*/ _component((_props, _ctx) => {
104
+ const value = bindable(_props, "_value", () => [], _ctx.emit);
105
+ const accordion = readonlyProp(_props, "accordion", false);
106
+ const onChange = readonlyProp(_props, "onChange");
107
+ const children = childrenProp(_props);
108
+ const rest = restProps(_props, _ctx, false);
109
+ CollapseContext.provide({
110
+ isOpen: (name) => Array.isArray(value.value) ? value.value.includes(name) : value.value === name,
111
+ toggle(name) {
112
+ if (accordion.value) value.value = value.value === name ? null : name;
113
+ else {
114
+ const list = Array.isArray(value.value) ? value.value : [];
115
+ value.value = list.includes(name) ? list.filter((item) => item !== name) : [...list, name];
116
+ }
117
+ onChange.value?.(value.value);
118
+ }
119
+ });
120
+ return () => createVNode("div", mergeAttrs({ sx: collapseStyles.root }, rest), [children.value]);
121
+ }, {
122
+ name: "Collapse",
123
+ props: [
124
+ "_value",
125
+ "onUpdate:_value",
126
+ "accordion",
127
+ "onChange"
128
+ ]
129
+ });
130
+ /** 未声明的属性落到这一项的根元素(div)上 */
131
+ /** 折叠面板的一项(div > 标题栏 button[aria-expanded] + 内容) */
132
+ var CollapseItem = /*#__PURE__*/ _component((_props2, _ctx2) => {
133
+ const name = readonlyProp(_props2, "name");
134
+ const title = readonlyProp(_props2, "title");
135
+ const value = readonlyProp(_props2, "value");
136
+ const disabled = readonlyProp(_props2, "disabled", false);
137
+ const children = childrenProp(_props2);
138
+ const propsHeader = readonlyProp(_props2, "propsHeader");
139
+ const propsContent = readonlyProp(_props2, "propsContent");
140
+ const rest = restProps(_props2, _ctx2, false);
141
+ const collapse = CollapseContext.inject();
142
+ return () => {
143
+ const open = collapse.isOpen(name.value);
144
+ const state = dataAttrs({ "data-open": open });
145
+ return createVNode("div", mergeAttrs({ sx: collapseStyles.item }, rest, state), [createVNode("button", mergeAttrs({ sx: collapseStyles.header }, propsHeader.value, {
146
+ type: "button",
147
+ disabled: disabled.value,
148
+ "aria-expanded": open ? "true" : "false",
149
+ onClick: () => collapse.toggle(name.value)
150
+ }), [
151
+ createVNode("span", mergeAttrs({ sx: collapseStyles.title }), [title.value]),
152
+ hasContent(value.value) && createVNode("span", mergeAttrs({ sx: collapseStyles.value }), [value.value]),
153
+ createVNode(Icon, mergeJsxProps({
154
+ "icon": ChevronDown,
155
+ "sx": collapseStyles.arrow
156
+ }, state), null)
157
+ ]), createVNode("div", mergeAttrs({ sx: collapseStyles.panel }, state), [createVNode("div", mergeAttrs({ sx: collapseStyles.clip }), [createVNode("div", mergeAttrs({ sx: collapseStyles.content }, propsContent.value), [children.value])])])]);
158
+ };
159
+ }, {
160
+ name: "CollapseItem",
161
+ props: [
162
+ "name",
163
+ "title",
164
+ "value",
165
+ "disabled",
166
+ "propsHeader",
167
+ "propsContent"
168
+ ]
169
+ });
170
+ //#endregion
171
+ export { Collapse, CollapseItem, collapseStyles };
172
+
173
+ //# sourceMappingURL=Collapse.js.map