@chenzy-design/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/LICENSE +21 -0
  2. package/dist/back-top.d.ts +16 -0
  3. package/dist/back-top.d.ts.map +1 -0
  4. package/dist/back-top.js +29 -0
  5. package/dist/back-top.js.map +1 -0
  6. package/dist/back-top.test.d.ts +2 -0
  7. package/dist/back-top.test.d.ts.map +1 -0
  8. package/dist/back-top.test.js +44 -0
  9. package/dist/back-top.test.js.map +1 -0
  10. package/dist/banner.d.ts +19 -0
  11. package/dist/banner.d.ts.map +1 -0
  12. package/dist/banner.js +20 -0
  13. package/dist/banner.js.map +1 -0
  14. package/dist/banner.test.d.ts +2 -0
  15. package/dist/banner.test.d.ts.map +1 -0
  16. package/dist/banner.test.js +29 -0
  17. package/dist/banner.test.js.map +1 -0
  18. package/dist/breakpoints.d.ts +30 -0
  19. package/dist/breakpoints.d.ts.map +1 -0
  20. package/dist/breakpoints.js +45 -0
  21. package/dist/breakpoints.js.map +1 -0
  22. package/dist/breakpoints.test.d.ts +2 -0
  23. package/dist/breakpoints.test.d.ts.map +1 -0
  24. package/dist/breakpoints.test.js +46 -0
  25. package/dist/breakpoints.test.js.map +1 -0
  26. package/dist/calendar.d.ts +63 -0
  27. package/dist/calendar.d.ts.map +1 -0
  28. package/dist/calendar.js +94 -0
  29. package/dist/calendar.js.map +1 -0
  30. package/dist/calendar.test.d.ts +2 -0
  31. package/dist/calendar.test.d.ts.map +1 -0
  32. package/dist/calendar.test.js +88 -0
  33. package/dist/calendar.test.js.map +1 -0
  34. package/dist/cascader.d.ts +64 -0
  35. package/dist/cascader.d.ts.map +1 -0
  36. package/dist/cascader.js +79 -0
  37. package/dist/cascader.js.map +1 -0
  38. package/dist/cascader.test.d.ts +2 -0
  39. package/dist/cascader.test.d.ts.map +1 -0
  40. package/dist/cascader.test.js +107 -0
  41. package/dist/cascader.test.js.map +1 -0
  42. package/dist/color.d.ts +70 -0
  43. package/dist/color.d.ts.map +1 -0
  44. package/dist/color.js +217 -0
  45. package/dist/color.js.map +1 -0
  46. package/dist/color.test.d.ts +2 -0
  47. package/dist/color.test.d.ts.map +1 -0
  48. package/dist/color.test.js +161 -0
  49. package/dist/color.test.js.map +1 -0
  50. package/dist/config-provider.d.ts +57 -0
  51. package/dist/config-provider.d.ts.map +1 -0
  52. package/dist/config-provider.js +49 -0
  53. package/dist/config-provider.js.map +1 -0
  54. package/dist/config-provider.test.d.ts +2 -0
  55. package/dist/config-provider.test.d.ts.map +1 -0
  56. package/dist/config-provider.test.js +76 -0
  57. package/dist/config-provider.test.js.map +1 -0
  58. package/dist/copyable.d.ts +43 -0
  59. package/dist/copyable.d.ts.map +1 -0
  60. package/dist/copyable.js +102 -0
  61. package/dist/copyable.js.map +1 -0
  62. package/dist/copyable.test.d.ts +2 -0
  63. package/dist/copyable.test.d.ts.map +1 -0
  64. package/dist/copyable.test.js +97 -0
  65. package/dist/copyable.test.js.map +1 -0
  66. package/dist/date.d.ts +86 -0
  67. package/dist/date.d.ts.map +1 -0
  68. package/dist/date.js +226 -0
  69. package/dist/date.js.map +1 -0
  70. package/dist/date.test.d.ts +2 -0
  71. package/dist/date.test.d.ts.map +1 -0
  72. package/dist/date.test.js +171 -0
  73. package/dist/date.test.js.map +1 -0
  74. package/dist/dismiss.d.ts +28 -0
  75. package/dist/dismiss.d.ts.map +1 -0
  76. package/dist/dismiss.js +42 -0
  77. package/dist/dismiss.js.map +1 -0
  78. package/dist/editable.d.ts +59 -0
  79. package/dist/editable.d.ts.map +1 -0
  80. package/dist/editable.js +85 -0
  81. package/dist/editable.js.map +1 -0
  82. package/dist/editable.test.d.ts +2 -0
  83. package/dist/editable.test.d.ts.map +1 -0
  84. package/dist/editable.test.js +111 -0
  85. package/dist/editable.test.js.map +1 -0
  86. package/dist/ellipsis.d.ts +76 -0
  87. package/dist/ellipsis.d.ts.map +1 -0
  88. package/dist/ellipsis.js +99 -0
  89. package/dist/ellipsis.js.map +1 -0
  90. package/dist/ellipsis.test.d.ts +2 -0
  91. package/dist/ellipsis.test.d.ts.map +1 -0
  92. package/dist/ellipsis.test.js +94 -0
  93. package/dist/ellipsis.test.js.map +1 -0
  94. package/dist/floating.d.ts +78 -0
  95. package/dist/floating.d.ts.map +1 -0
  96. package/dist/floating.js +169 -0
  97. package/dist/floating.js.map +1 -0
  98. package/dist/floating.test.d.ts +2 -0
  99. package/dist/floating.test.d.ts.map +1 -0
  100. package/dist/floating.test.js +169 -0
  101. package/dist/floating.test.js.map +1 -0
  102. package/dist/focus-trap.d.ts +24 -0
  103. package/dist/focus-trap.d.ts.map +1 -0
  104. package/dist/focus-trap.js +64 -0
  105. package/dist/focus-trap.js.map +1 -0
  106. package/dist/form.d.ts +131 -0
  107. package/dist/form.d.ts.map +1 -0
  108. package/dist/form.js +257 -0
  109. package/dist/form.js.map +1 -0
  110. package/dist/form.test.d.ts +2 -0
  111. package/dist/form.test.d.ts.map +1 -0
  112. package/dist/form.test.js +323 -0
  113. package/dist/form.test.js.map +1 -0
  114. package/dist/highlight.d.ts +57 -0
  115. package/dist/highlight.d.ts.map +1 -0
  116. package/dist/highlight.js +124 -0
  117. package/dist/highlight.js.map +1 -0
  118. package/dist/highlight.test.d.ts +2 -0
  119. package/dist/highlight.test.d.ts.map +1 -0
  120. package/dist/highlight.test.js +155 -0
  121. package/dist/highlight.test.js.map +1 -0
  122. package/dist/id.d.ts +4 -0
  123. package/dist/id.d.ts.map +1 -0
  124. package/dist/id.js +14 -0
  125. package/dist/id.js.map +1 -0
  126. package/dist/id.test.d.ts +2 -0
  127. package/dist/id.test.d.ts.map +1 -0
  128. package/dist/id.test.js +13 -0
  129. package/dist/id.test.js.map +1 -0
  130. package/dist/index.d.ts +46 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +45 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/inert-background.d.ts +27 -0
  135. package/dist/inert-background.d.ts.map +1 -0
  136. package/dist/inert-background.js +92 -0
  137. package/dist/inert-background.js.map +1 -0
  138. package/dist/inert-background.test.d.ts +2 -0
  139. package/dist/inert-background.test.d.ts.map +1 -0
  140. package/dist/inert-background.test.js +62 -0
  141. package/dist/inert-background.test.js.map +1 -0
  142. package/dist/input-number.d.ts +34 -0
  143. package/dist/input-number.d.ts.map +1 -0
  144. package/dist/input-number.js +69 -0
  145. package/dist/input-number.js.map +1 -0
  146. package/dist/input-number.test.d.ts +2 -0
  147. package/dist/input-number.test.d.ts.map +1 -0
  148. package/dist/input-number.test.js +74 -0
  149. package/dist/input-number.test.js.map +1 -0
  150. package/dist/list-selection.d.ts +38 -0
  151. package/dist/list-selection.d.ts.map +1 -0
  152. package/dist/list-selection.js +61 -0
  153. package/dist/list-selection.js.map +1 -0
  154. package/dist/list-selection.test.d.ts +2 -0
  155. package/dist/list-selection.test.d.ts.map +1 -0
  156. package/dist/list-selection.test.js +61 -0
  157. package/dist/list-selection.test.js.map +1 -0
  158. package/dist/live-announcer.d.ts +38 -0
  159. package/dist/live-announcer.d.ts.map +1 -0
  160. package/dist/live-announcer.js +89 -0
  161. package/dist/live-announcer.js.map +1 -0
  162. package/dist/live-announcer.test.d.ts +2 -0
  163. package/dist/live-announcer.test.d.ts.map +1 -0
  164. package/dist/live-announcer.test.js +70 -0
  165. package/dist/live-announcer.test.js.map +1 -0
  166. package/dist/lottie-icon.d.ts +88 -0
  167. package/dist/lottie-icon.d.ts.map +1 -0
  168. package/dist/lottie-icon.js +84 -0
  169. package/dist/lottie-icon.js.map +1 -0
  170. package/dist/lottie-icon.test.d.ts +2 -0
  171. package/dist/lottie-icon.test.d.ts.map +1 -0
  172. package/dist/lottie-icon.test.js +88 -0
  173. package/dist/lottie-icon.test.js.map +1 -0
  174. package/dist/notification.d.ts +61 -0
  175. package/dist/notification.d.ts.map +1 -0
  176. package/dist/notification.js +133 -0
  177. package/dist/notification.js.map +1 -0
  178. package/dist/notification.test.d.ts +2 -0
  179. package/dist/notification.test.d.ts.map +1 -0
  180. package/dist/notification.test.js +103 -0
  181. package/dist/notification.test.js.map +1 -0
  182. package/dist/overflow-list.d.ts +102 -0
  183. package/dist/overflow-list.d.ts.map +1 -0
  184. package/dist/overflow-list.js +159 -0
  185. package/dist/overflow-list.js.map +1 -0
  186. package/dist/overflow-list.test.d.ts +2 -0
  187. package/dist/overflow-list.test.d.ts.map +1 -0
  188. package/dist/overflow-list.test.js +223 -0
  189. package/dist/overflow-list.test.js.map +1 -0
  190. package/dist/pagination.d.ts +51 -0
  191. package/dist/pagination.d.ts.map +1 -0
  192. package/dist/pagination.js +127 -0
  193. package/dist/pagination.js.map +1 -0
  194. package/dist/pagination.test.d.ts +2 -0
  195. package/dist/pagination.test.d.ts.map +1 -0
  196. package/dist/pagination.test.js +147 -0
  197. package/dist/pagination.test.js.map +1 -0
  198. package/dist/progress.d.ts +64 -0
  199. package/dist/progress.d.ts.map +1 -0
  200. package/dist/progress.js +92 -0
  201. package/dist/progress.js.map +1 -0
  202. package/dist/progress.test.d.ts +2 -0
  203. package/dist/progress.test.d.ts.map +1 -0
  204. package/dist/progress.test.js +79 -0
  205. package/dist/progress.test.js.map +1 -0
  206. package/dist/resize-observer.d.ts +133 -0
  207. package/dist/resize-observer.d.ts.map +1 -0
  208. package/dist/resize-observer.js +358 -0
  209. package/dist/resize-observer.js.map +1 -0
  210. package/dist/resize-observer.test.d.ts +2 -0
  211. package/dist/resize-observer.test.d.ts.map +1 -0
  212. package/dist/resize-observer.test.js +377 -0
  213. package/dist/resize-observer.test.js.map +1 -0
  214. package/dist/roving.d.ts +26 -0
  215. package/dist/roving.d.ts.map +1 -0
  216. package/dist/roving.js +61 -0
  217. package/dist/roving.js.map +1 -0
  218. package/dist/roving.test.d.ts +2 -0
  219. package/dist/roving.test.d.ts.map +1 -0
  220. package/dist/roving.test.js +48 -0
  221. package/dist/roving.test.js.map +1 -0
  222. package/dist/scroll-list.d.ts +81 -0
  223. package/dist/scroll-list.d.ts.map +1 -0
  224. package/dist/scroll-list.js +175 -0
  225. package/dist/scroll-list.js.map +1 -0
  226. package/dist/scroll-list.test.d.ts +2 -0
  227. package/dist/scroll-list.test.d.ts.map +1 -0
  228. package/dist/scroll-list.test.js +135 -0
  229. package/dist/scroll-list.test.js.map +1 -0
  230. package/dist/scroll-lock.d.ts +11 -0
  231. package/dist/scroll-lock.d.ts.map +1 -0
  232. package/dist/scroll-lock.js +45 -0
  233. package/dist/scroll-lock.js.map +1 -0
  234. package/dist/scroll-lock.test.d.ts +2 -0
  235. package/dist/scroll-lock.test.d.ts.map +1 -0
  236. package/dist/scroll-lock.test.js +55 -0
  237. package/dist/scroll-lock.test.js.map +1 -0
  238. package/dist/sider.d.ts +26 -0
  239. package/dist/sider.d.ts.map +1 -0
  240. package/dist/sider.js +55 -0
  241. package/dist/sider.js.map +1 -0
  242. package/dist/sider.test.d.ts +2 -0
  243. package/dist/sider.test.d.ts.map +1 -0
  244. package/dist/sider.test.js +29 -0
  245. package/dist/sider.test.js.map +1 -0
  246. package/dist/spin.d.ts +25 -0
  247. package/dist/spin.d.ts.map +1 -0
  248. package/dist/spin.js +96 -0
  249. package/dist/spin.js.map +1 -0
  250. package/dist/spin.test.d.ts +2 -0
  251. package/dist/spin.test.d.ts.map +1 -0
  252. package/dist/spin.test.js +80 -0
  253. package/dist/spin.test.js.map +1 -0
  254. package/dist/table.d.ts +101 -0
  255. package/dist/table.d.ts.map +1 -0
  256. package/dist/table.js +244 -0
  257. package/dist/table.js.map +1 -0
  258. package/dist/table.test.d.ts +2 -0
  259. package/dist/table.test.d.ts.map +1 -0
  260. package/dist/table.test.js +184 -0
  261. package/dist/table.test.js.map +1 -0
  262. package/dist/textarea.d.ts +48 -0
  263. package/dist/textarea.d.ts.map +1 -0
  264. package/dist/textarea.js +76 -0
  265. package/dist/textarea.js.map +1 -0
  266. package/dist/textarea.test.d.ts +2 -0
  267. package/dist/textarea.test.d.ts.map +1 -0
  268. package/dist/textarea.test.js +77 -0
  269. package/dist/textarea.test.js.map +1 -0
  270. package/dist/time.d.ts +93 -0
  271. package/dist/time.d.ts.map +1 -0
  272. package/dist/time.js +181 -0
  273. package/dist/time.js.map +1 -0
  274. package/dist/time.test.d.ts +2 -0
  275. package/dist/time.test.d.ts.map +1 -0
  276. package/dist/time.test.js +159 -0
  277. package/dist/time.test.js.map +1 -0
  278. package/dist/toast.d.ts +60 -0
  279. package/dist/toast.d.ts.map +1 -0
  280. package/dist/toast.js +135 -0
  281. package/dist/toast.js.map +1 -0
  282. package/dist/toast.test.d.ts +2 -0
  283. package/dist/toast.test.d.ts.map +1 -0
  284. package/dist/toast.test.js +127 -0
  285. package/dist/toast.test.js.map +1 -0
  286. package/dist/tree.d.ts +129 -0
  287. package/dist/tree.d.ts.map +1 -0
  288. package/dist/tree.js +351 -0
  289. package/dist/tree.js.map +1 -0
  290. package/dist/tree.test.d.ts +2 -0
  291. package/dist/tree.test.d.ts.map +1 -0
  292. package/dist/tree.test.js +291 -0
  293. package/dist/tree.test.js.map +1 -0
  294. package/dist/upload.d.ts +62 -0
  295. package/dist/upload.d.ts.map +1 -0
  296. package/dist/upload.js +85 -0
  297. package/dist/upload.js.map +1 -0
  298. package/dist/upload.test.d.ts +2 -0
  299. package/dist/upload.test.d.ts.map +1 -0
  300. package/dist/upload.test.js +169 -0
  301. package/dist/upload.test.js.map +1 -0
  302. package/dist/virtual-list.d.ts +83 -0
  303. package/dist/virtual-list.d.ts.map +1 -0
  304. package/dist/virtual-list.js +143 -0
  305. package/dist/virtual-list.js.map +1 -0
  306. package/dist/virtual-list.test.d.ts +2 -0
  307. package/dist/virtual-list.test.d.ts.map +1 -0
  308. package/dist/virtual-list.test.js +148 -0
  309. package/dist/virtual-list.test.js.map +1 -0
  310. package/package.json +22 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * createProgress helpers — framework-agnostic progress math & a11y.
3
+ * Pure functions only: percent clamping, status resolution, circle/dashboard
4
+ * SVG geometry, and progressbar aria props. No DOM, no framework deps.
5
+ * See specs/components/feedback/Progress.spec.md §3.
6
+ */
7
+ export type ProgressStatus = 'normal' | 'success' | 'error' | 'warning';
8
+ export type ProgressType = 'line' | 'circle' | 'dashboard';
9
+ export type GapPosition = 'top' | 'bottom' | 'left' | 'right';
10
+ /** Clamp any input to an integer-friendly 0..100 (NaN/±∞ → 0/100). */
11
+ export declare function clampPercent(percent: number): number;
12
+ /**
13
+ * Resolve the effective status. When status is left at 'normal' and the bar is
14
+ * full, optionally promote to 'success' (successWhenFull). An explicitly set
15
+ * error/warning/success is always respected.
16
+ */
17
+ export declare function resolveStatus(percent: number, status: ProgressStatus, successWhenFull?: boolean): ProgressStatus;
18
+ export interface CirclePathInput {
19
+ /** diameter in px */
20
+ width: number;
21
+ /** stroke width in px */
22
+ strokeWidth: number;
23
+ /** percent 0..100 */
24
+ percent: number;
25
+ /** open-gap angle for dashboard (0 for full circle) */
26
+ gapDegree?: number;
27
+ gapPosition?: GapPosition;
28
+ }
29
+ export interface CirclePathProps {
30
+ radius: number;
31
+ /** center coordinate (width/2) */
32
+ center: number;
33
+ /** full stroke length of the track (accounting for the gap) */
34
+ circumference: number;
35
+ /** dasharray for the track */
36
+ trackDash: string;
37
+ /** dashoffset for the filled stroke (maps percent → arc length) */
38
+ fillDash: string;
39
+ /** rotation transform so the start sits at the right place */
40
+ rotation: number;
41
+ }
42
+ /**
43
+ * Compute SVG geometry for circle/dashboard. The visible track spans
44
+ * (360 - gapDegree) degrees; the fill covers `percent`% of that span.
45
+ */
46
+ export declare function getCirclePathProps(input: CirclePathInput): CirclePathProps;
47
+ export interface RootAriaInput {
48
+ percent: number;
49
+ indeterminate?: boolean;
50
+ label?: string;
51
+ valueText?: string;
52
+ }
53
+ export interface RootAriaProps {
54
+ role: 'progressbar';
55
+ 'aria-valuemin': 0;
56
+ 'aria-valuemax': 100;
57
+ 'aria-valuenow'?: number;
58
+ 'aria-valuetext'?: string;
59
+ 'aria-label'?: string;
60
+ 'aria-busy'?: true;
61
+ }
62
+ /** Build progressbar aria props; indeterminate omits valuenow + sets busy. */
63
+ export declare function getRootAriaProps(input: RootAriaInput): RootAriaProps;
64
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AACxE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAC3D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9D,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,cAAc,EACtB,eAAe,UAAQ,GACtB,cAAc,CAIhB;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe,CA0B1E;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,eAAe,EAAE,CAAC,CAAC;IACnB,eAAe,EAAE,GAAG,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAcpE"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * createProgress helpers — framework-agnostic progress math & a11y.
3
+ * Pure functions only: percent clamping, status resolution, circle/dashboard
4
+ * SVG geometry, and progressbar aria props. No DOM, no framework deps.
5
+ * See specs/components/feedback/Progress.spec.md §3.
6
+ */
7
+ /** Clamp any input to an integer-friendly 0..100 (NaN/±∞ → 0/100). */
8
+ export function clampPercent(percent) {
9
+ if (Number.isNaN(percent))
10
+ return 0;
11
+ if (percent < 0)
12
+ return 0;
13
+ if (percent > 100)
14
+ return 100;
15
+ return percent;
16
+ }
17
+ /**
18
+ * Resolve the effective status. When status is left at 'normal' and the bar is
19
+ * full, optionally promote to 'success' (successWhenFull). An explicitly set
20
+ * error/warning/success is always respected.
21
+ */
22
+ export function resolveStatus(percent, status, successWhenFull = false) {
23
+ if (status !== 'normal')
24
+ return status;
25
+ if (successWhenFull && clampPercent(percent) >= 100)
26
+ return 'success';
27
+ return 'normal';
28
+ }
29
+ /** rotation (deg) that places the gap/start according to gapPosition */
30
+ function startRotation(gapPosition, gapDegree) {
31
+ // base: a full circle starts at 3 o'clock; rotate -90 to start at top.
32
+ switch (gapPosition) {
33
+ case 'top':
34
+ return -90 + gapDegree / 2;
35
+ case 'bottom':
36
+ return 90 + gapDegree / 2;
37
+ case 'left':
38
+ return 180 + gapDegree / 2;
39
+ case 'right':
40
+ return 0 + gapDegree / 2;
41
+ default:
42
+ return 90 + gapDegree / 2;
43
+ }
44
+ }
45
+ /**
46
+ * Compute SVG geometry for circle/dashboard. The visible track spans
47
+ * (360 - gapDegree) degrees; the fill covers `percent`% of that span.
48
+ */
49
+ export function getCirclePathProps(input) {
50
+ const { width, strokeWidth, gapDegree = 0, gapPosition = 'bottom' } = input;
51
+ const percent = clampPercent(input.percent);
52
+ const center = width / 2;
53
+ const radius = center - strokeWidth / 2;
54
+ const perimeter = 2 * Math.PI * radius;
55
+ // visible portion of the perimeter (full perimeter minus the gap)
56
+ const visibleRatio = (360 - gapDegree) / 360;
57
+ const visibleLen = perimeter * visibleRatio;
58
+ const gapLen = perimeter - visibleLen;
59
+ // track: draw visibleLen, then leave gapLen empty
60
+ const trackDash = `${visibleLen} ${gapLen}`;
61
+ // fill: draw percent% of the visible length, rest is offset
62
+ const fillLen = (visibleLen * percent) / 100;
63
+ const fillDash = `${fillLen} ${perimeter - fillLen}`;
64
+ return {
65
+ radius,
66
+ center,
67
+ circumference: perimeter,
68
+ trackDash,
69
+ fillDash,
70
+ rotation: startRotation(gapPosition, gapDegree),
71
+ };
72
+ }
73
+ /** Build progressbar aria props; indeterminate omits valuenow + sets busy. */
74
+ export function getRootAriaProps(input) {
75
+ const props = {
76
+ role: 'progressbar',
77
+ 'aria-valuemin': 0,
78
+ 'aria-valuemax': 100,
79
+ };
80
+ if (input.indeterminate) {
81
+ props['aria-busy'] = true;
82
+ }
83
+ else {
84
+ props['aria-valuenow'] = clampPercent(input.percent);
85
+ if (input.valueText)
86
+ props['aria-valuetext'] = input.valueText;
87
+ }
88
+ if (input.label)
89
+ props['aria-label'] = input.label;
90
+ return props;
91
+ }
92
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=progress.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.test.d.ts","sourceRoot":"","sources":["../src/progress.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { clampPercent, resolveStatus, getCirclePathProps, getRootAriaProps, } from './progress.js';
3
+ describe('clampPercent', () => {
4
+ it('clamps to 0..100 and handles NaN', () => {
5
+ expect(clampPercent(50)).toBe(50);
6
+ expect(clampPercent(-10)).toBe(0);
7
+ expect(clampPercent(120)).toBe(100);
8
+ expect(clampPercent(Number.NaN)).toBe(0);
9
+ expect(clampPercent(0)).toBe(0);
10
+ expect(clampPercent(100)).toBe(100);
11
+ });
12
+ });
13
+ describe('resolveStatus', () => {
14
+ it('respects an explicit status', () => {
15
+ expect(resolveStatus(100, 'error')).toBe('error');
16
+ expect(resolveStatus(50, 'warning')).toBe('warning');
17
+ });
18
+ it('promotes to success when full and successWhenFull', () => {
19
+ expect(resolveStatus(100, 'normal', true)).toBe('success');
20
+ expect(resolveStatus(99, 'normal', true)).toBe('normal');
21
+ expect(resolveStatus(100, 'normal', false)).toBe('normal');
22
+ });
23
+ });
24
+ describe('getCirclePathProps', () => {
25
+ it('computes radius/perimeter for a full circle', () => {
26
+ const p = getCirclePathProps({ width: 120, strokeWidth: 8, percent: 0 });
27
+ expect(p.center).toBe(60);
28
+ expect(p.radius).toBe(56); // 60 - 8/2
29
+ expect(p.circumference).toBeCloseTo(2 * Math.PI * 56, 5);
30
+ });
31
+ it('fill length is proportional to percent (full circle)', () => {
32
+ const r = 56;
33
+ const perim = 2 * Math.PI * r;
34
+ const p = getCirclePathProps({ width: 120, strokeWidth: 8, percent: 50 });
35
+ const fillLen = Number(p.fillDash.split(' ')[0]);
36
+ expect(fillLen).toBeCloseTo(perim * 0.5, 4);
37
+ });
38
+ it('dashboard gap reduces the visible track length', () => {
39
+ const r = 56;
40
+ const perim = 2 * Math.PI * r;
41
+ const p = getCirclePathProps({
42
+ width: 120,
43
+ strokeWidth: 8,
44
+ percent: 100,
45
+ gapDegree: 90,
46
+ });
47
+ // visible track = 270/360 of perimeter
48
+ const trackLen = Number(p.trackDash.split(' ')[0]);
49
+ expect(trackLen).toBeCloseTo(perim * (270 / 360), 4);
50
+ // 100% fill covers the full visible track
51
+ const fillLen = Number(p.fillDash.split(' ')[0]);
52
+ expect(fillLen).toBeCloseTo(trackLen, 4);
53
+ });
54
+ it('rotation differs by gapPosition', () => {
55
+ const top = getCirclePathProps({ width: 100, strokeWidth: 6, percent: 0, gapDegree: 60, gapPosition: 'top' });
56
+ const bottom = getCirclePathProps({ width: 100, strokeWidth: 6, percent: 0, gapDegree: 60, gapPosition: 'bottom' });
57
+ expect(top.rotation).not.toBe(bottom.rotation);
58
+ });
59
+ });
60
+ describe('getRootAriaProps', () => {
61
+ it('emits valuenow for determinate progress', () => {
62
+ const a = getRootAriaProps({ percent: 42, label: '上传进度', valueText: '42% 完成' });
63
+ expect(a.role).toBe('progressbar');
64
+ expect(a['aria-valuenow']).toBe(42);
65
+ expect(a['aria-valuemin']).toBe(0);
66
+ expect(a['aria-valuemax']).toBe(100);
67
+ expect(a['aria-valuetext']).toBe('42% 完成');
68
+ expect(a['aria-label']).toBe('上传进度');
69
+ });
70
+ it('omits valuenow and sets busy when indeterminate', () => {
71
+ const a = getRootAriaProps({ percent: 50, indeterminate: true });
72
+ expect(a['aria-valuenow']).toBeUndefined();
73
+ expect(a['aria-busy']).toBe(true);
74
+ });
75
+ it('clamps valuenow', () => {
76
+ expect(getRootAriaProps({ percent: 150 })['aria-valuenow']).toBe(100);
77
+ });
78
+ });
79
+ //# sourceMappingURL=progress.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.test.js","sourceRoot":"","sources":["../src/progress.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * createResizeObserver — framework-agnostic wrapper over native ResizeObserver.
3
+ * Normalizes entries to a stable shape and degrades silently when unsupported
4
+ * (SSR / old browsers). The svelte layer owns the element refs and lifecycle.
5
+ * See specs/components/other/ResizeObserver.spec.md §3.
6
+ *
7
+ * 进阶子集:
8
+ * - throttle / debounce 节流去抖(命令式定时器 + cleanup,红线 #3)
9
+ * - 多目标(observe/unobserve 多个元素,回调按 target 路由)
10
+ * - 单例 observer 池 getGlobalResizeObserver()(多元素复用 1 个原生 observer)
11
+ * - window.resize 降级(fallbackToWindow:原生不可用或显式开启时近似监听)
12
+ * - onResizeStart / onResizeEnd:连续变化首帧 / 静默结束(纯状态机 + 命令式静默计时器)
13
+ */
14
+ export type ResizeBox = 'content-box' | 'border-box' | 'device-pixel-content-box';
15
+ /** 节流/去抖调度策略。'none' = 原生即时(默认,向后兼容)。 */
16
+ export type ResizeSchedule = {
17
+ strategy: 'none';
18
+ } | {
19
+ strategy: 'throttle';
20
+ wait: number;
21
+ } | {
22
+ strategy: 'debounce';
23
+ wait: number;
24
+ };
25
+ /** normalized size payload — consumers never call getBoundingClientRect */
26
+ export interface CDResizeEntry {
27
+ target: Element;
28
+ width: number;
29
+ height: number;
30
+ box: ResizeBox;
31
+ }
32
+ export interface ResizeObserverOptions {
33
+ box?: ResizeBox;
34
+ onResize: (entry: CDResizeEntry) => void;
35
+ /**
36
+ * 节流间隔(ms),leading+trailing,0 即原生即时回调。与 debounce 互斥
37
+ * (同时 >0 时 debounce 优先)。
38
+ */
39
+ throttle?: number;
40
+ /** 防抖等待(ms),trailing-only,0 关闭。与 throttle 互斥(优先于 throttle)。 */
41
+ debounce?: number;
42
+ /**
43
+ * 一段连续尺寸变化的首帧触发(不在 resizing 态时收到首个 resize)。
44
+ * 用于"调整中"态(如显示尺寸 badge)。
45
+ */
46
+ onResizeStart?: ((entry: CDResizeEntry) => void) | undefined;
47
+ /**
48
+ * 连续变化结束后(静默 resizeEndDelay 无新 resize)触发,payload 为最后一帧。
49
+ * 用于"调整完成"提交。
50
+ */
51
+ onResizeEnd?: ((entry: CDResizeEntry) => void) | undefined;
52
+ /**
53
+ * onResizeEnd 静默判定窗口(ms),0 表示沿用 schedule wait(无则默认 RESIZE_END_DELAY)。
54
+ * 仅当传了 onResizeStart / onResizeEnd 时生效。
55
+ */
56
+ resizeEndDelay?: number;
57
+ /**
58
+ * 原生 ResizeObserver 不可用(SSR/老环境)或显式开启时,降级监听 window.resize,
59
+ * 在每次 window resize 用 getBoundingClientRect 重新测量已注册目标并上报(精度较低)。
60
+ * 默认 false:不支持环境静默降级(不监听、不抛错)。
61
+ */
62
+ fallbackToWindow?: boolean;
63
+ }
64
+ export interface ResizeObserverApi {
65
+ readonly supported: boolean;
66
+ observe(el: Element): void;
67
+ unobserve(el: Element): void;
68
+ disconnect(): void;
69
+ }
70
+ /** true when the native ResizeObserver is available (client only). */
71
+ export declare function isResizeObserverSupported(): boolean;
72
+ /**
73
+ * Normalize a native ResizeObserverEntry into CDResizeEntry. Prefers
74
+ * borderBoxSize / contentBoxSize (avoids forced reflow) and falls back to
75
+ * contentRect for older implementations.
76
+ */
77
+ export declare function normalizeEntry(entry: ResizeObserverEntry, box: ResizeBox): CDResizeEntry;
78
+ /**
79
+ * 归一化节流/去抖配置为单一 schedule。纯函数、不依赖时钟(红线 #2 友好)。
80
+ * debounce 优先于 throttle(spec:二者互斥,同时 >0 时 debounce 优先)。
81
+ */
82
+ export declare function resolveSchedule(opts: {
83
+ throttle?: number;
84
+ debounce?: number;
85
+ }): ResizeSchedule;
86
+ /**
87
+ * advanceResizePhase — start/end 状态机的纯函数核心(红线 #2,不依赖时钟/计时器)。
88
+ * 给定"当前是否处于 resizing 态"与一个新到达的 resize 事件,返回新状态及应派发的
89
+ * 边界事件标记。计时器(决定何时进入 'end')由命令式调用方持有,本函数只描述跃迁:
90
+ * - 不在 resizing 态收到 resize → start,进入 resizing 态。
91
+ * - 已在 resizing 态收到 resize → 无边界事件(仅续期,态不变)。
92
+ * 'end' 的跃迁见 endResizePhase(由静默计时器触发)。
93
+ */
94
+ export declare function advanceResizePhase(resizing: boolean): {
95
+ resizing: boolean;
96
+ emitStart: boolean;
97
+ };
98
+ /**
99
+ * endResizePhase — 静默计时器到点时的纯跃迁:若处于 resizing 态则结束并标记派发 end。
100
+ * 非 resizing 态(无在途变化)则不派发,幂等。
101
+ */
102
+ export declare function endResizePhase(resizing: boolean): {
103
+ resizing: boolean;
104
+ emitEnd: boolean;
105
+ };
106
+ /**
107
+ * createScheduler — 命令式定时器调度器。包裹一个回调,按 schedule 节流/去抖。
108
+ * - none: 即时透传(零开销,向后兼容)。
109
+ * - throttle: leading+trailing,窗口内丢弃中间帧,trailing 补发最后一帧。
110
+ * - debounce: trailing-only,静默 wait 后才发最后一帧。
111
+ * 返回 { run, flush, cancel };cancel 必须在 cleanup 调用以清定时器(红线 #3)。
112
+ *
113
+ * 注意:run 接受一个无参 commit 闭包(最新值在调用方闭包里持有),
114
+ * 调度器只负责"何时"调用,不持有业务数据。
115
+ */
116
+ export declare function createScheduler(schedule: ResizeSchedule): {
117
+ run: (commit: () => void) => void;
118
+ flush: () => void;
119
+ cancel: () => void;
120
+ };
121
+ export declare function createResizeObserver(options: ResizeObserverOptions): ResizeObserverApi;
122
+ type PoolListener = (entry: CDResizeEntry) => void;
123
+ /**
124
+ * getGlobalResizeObserver — 取得指定 box 的进程内单例池。
125
+ * 返回 { supported, subscribe };subscribe 返回取消订阅函数(必须在 cleanup 调用)。
126
+ * 节流/去抖请在订阅方包裹 createScheduler,池本身只做即时路由分发。
127
+ */
128
+ export declare function getGlobalResizeObserver(box?: ResizeBox): {
129
+ readonly supported: boolean;
130
+ subscribe(el: Element, listener: PoolListener): () => void;
131
+ };
132
+ export {};
133
+ //# sourceMappingURL=resize-observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-observer.d.ts","sourceRoot":"","sources":["../src/resize-observer.ts"],"names":[],"mappings":"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"}