timered-counter 0.0.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 (206) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/dist/custom-elements.json +8484 -0
  4. package/dist/src/counter-adapter.d.ts +38 -0
  5. package/dist/src/counter-adapter.js +69 -0
  6. package/dist/src/counter-adapter.js.map +1 -0
  7. package/dist/src/easing/cubic-bezier.d.ts +5 -0
  8. package/dist/src/easing/cubic-bezier.js +35 -0
  9. package/dist/src/easing/cubic-bezier.js.map +1 -0
  10. package/dist/src/easing/easing-functions.d.ts +1 -0
  11. package/dist/src/easing/easing-functions.js +10 -0
  12. package/dist/src/easing/easing-functions.js.map +1 -0
  13. package/dist/src/easing/index.d.ts +2 -0
  14. package/dist/src/easing/index.js +3 -0
  15. package/dist/src/easing/index.js.map +1 -0
  16. package/dist/src/easing/penner-easing-functions.d.ts +33 -0
  17. package/dist/src/easing/penner-easing-functions.js +82 -0
  18. package/dist/src/easing/penner-easing-functions.js.map +1 -0
  19. package/dist/src/index.d.ts +18 -0
  20. package/dist/src/index.js +13 -0
  21. package/dist/src/index.js.map +1 -0
  22. package/dist/src/mixins/counter-aira.d.ts +9 -0
  23. package/dist/src/mixins/counter-aira.js +41 -0
  24. package/dist/src/mixins/counter-aira.js.map +1 -0
  25. package/dist/src/mixins/counter-animation.d.ts +13 -0
  26. package/dist/src/mixins/counter-animation.js +55 -0
  27. package/dist/src/mixins/counter-animation.js.map +1 -0
  28. package/dist/src/mixins/counter-base.d.ts +21 -0
  29. package/dist/src/mixins/counter-base.js +152 -0
  30. package/dist/src/mixins/counter-base.js.map +1 -0
  31. package/dist/src/mixins/counter-parts.d.ts +42 -0
  32. package/dist/src/mixins/counter-parts.js +180 -0
  33. package/dist/src/mixins/counter-parts.js.map +1 -0
  34. package/dist/src/mixins/counter-styles.d.ts +17 -0
  35. package/dist/src/mixins/counter-styles.js +93 -0
  36. package/dist/src/mixins/counter-styles.js.map +1 -0
  37. package/dist/src/number-adapter/build-in-bigint.d.ts +6 -0
  38. package/dist/src/number-adapter/build-in-bigint.js +92 -0
  39. package/dist/src/number-adapter/build-in-bigint.js.map +1 -0
  40. package/dist/src/number-adapter/build-in-number.d.ts +3 -0
  41. package/dist/src/number-adapter/build-in-number.js +84 -0
  42. package/dist/src/number-adapter/build-in-number.js.map +1 -0
  43. package/dist/src/number-adapter/decimal-js.d.ts +4 -0
  44. package/dist/src/number-adapter/decimal-js.js +87 -0
  45. package/dist/src/number-adapter/decimal-js.js.map +1 -0
  46. package/dist/src/number-adapter/index.d.ts +4 -0
  47. package/dist/src/number-adapter/index.js +5 -0
  48. package/dist/src/number-adapter/index.js.map +1 -0
  49. package/dist/src/number-adapter/types.d.ts +34 -0
  50. package/dist/src/number-adapter/types.js +2 -0
  51. package/dist/src/number-adapter/types.js.map +1 -0
  52. package/dist/src/string-adapter/build-in-intl-segmenter.d.ts +10 -0
  53. package/dist/src/string-adapter/build-in-intl-segmenter.js +18 -0
  54. package/dist/src/string-adapter/build-in-intl-segmenter.js.map +1 -0
  55. package/dist/src/string-adapter/build-in-string.d.ts +12 -0
  56. package/dist/src/string-adapter/build-in-string.js +16 -0
  57. package/dist/src/string-adapter/build-in-string.js.map +1 -0
  58. package/dist/src/string-adapter/grapheme-splitter.d.ts +8 -0
  59. package/dist/src/string-adapter/grapheme-splitter.js +16 -0
  60. package/dist/src/string-adapter/grapheme-splitter.js.map +1 -0
  61. package/dist/src/string-adapter/index.d.ts +4 -0
  62. package/dist/src/string-adapter/index.js +5 -0
  63. package/dist/src/string-adapter/index.js.map +1 -0
  64. package/dist/src/string-adapter/types.d.ts +19 -0
  65. package/dist/src/string-adapter/types.js +2 -0
  66. package/dist/src/string-adapter/types.js.map +1 -0
  67. package/dist/src/styles/timered-counter-datetime-styles.d.ts +1 -0
  68. package/dist/src/styles/timered-counter-datetime-styles.js +8 -0
  69. package/dist/src/styles/timered-counter-datetime-styles.js.map +1 -0
  70. package/dist/src/styles/timered-counter-number-styles.d.ts +1 -0
  71. package/dist/src/styles/timered-counter-number-styles.js +3 -0
  72. package/dist/src/styles/timered-counter-number-styles.js.map +1 -0
  73. package/dist/src/styles/timered-counter-string-styles.d.ts +1 -0
  74. package/dist/src/styles/timered-counter-string-styles.js +3 -0
  75. package/dist/src/styles/timered-counter-string-styles.js.map +1 -0
  76. package/dist/src/styles/timered-counter-styles.d.ts +1 -0
  77. package/dist/src/styles/timered-counter-styles.js +25 -0
  78. package/dist/src/styles/timered-counter-styles.js.map +1 -0
  79. package/dist/src/timered-counter-datetime-duration.d.ts +37 -0
  80. package/dist/src/timered-counter-datetime-duration.js +186 -0
  81. package/dist/src/timered-counter-datetime-duration.js.map +1 -0
  82. package/dist/src/timered-counter-number.d.ts +23 -0
  83. package/dist/src/timered-counter-number.js +114 -0
  84. package/dist/src/timered-counter-number.js.map +1 -0
  85. package/dist/src/timered-counter-string.d.ts +30 -0
  86. package/dist/src/timered-counter-string.js +138 -0
  87. package/dist/src/timered-counter-string.js.map +1 -0
  88. package/dist/src/timered-counter.d.ts +15 -0
  89. package/dist/src/timered-counter.js +80 -0
  90. package/dist/src/timered-counter.js.map +1 -0
  91. package/dist/src/transitions/roller/index.d.ts +1 -0
  92. package/dist/src/transitions/roller/index.js +2 -0
  93. package/dist/src/transitions/roller/index.js.map +1 -0
  94. package/dist/src/transitions/roller/roller-digit.d.ts +28 -0
  95. package/dist/src/transitions/roller/roller-digit.js +259 -0
  96. package/dist/src/transitions/roller/roller-digit.js.map +1 -0
  97. package/dist/src/transitions/roller/roller.d.ts +42 -0
  98. package/dist/src/transitions/roller/roller.js +235 -0
  99. package/dist/src/transitions/roller/roller.js.map +1 -0
  100. package/dist/src/transitions/roller/styles.d.ts +2 -0
  101. package/dist/src/transitions/roller/styles.js +77 -0
  102. package/dist/src/transitions/roller/styles.js.map +1 -0
  103. package/dist/src/types/duration.d.ts +33 -0
  104. package/dist/src/types/duration.js +35 -0
  105. package/dist/src/types/duration.js.map +1 -0
  106. package/dist/src/types/group.d.ts +67 -0
  107. package/dist/src/types/group.js +2 -0
  108. package/dist/src/types/group.js.map +1 -0
  109. package/dist/src/utils/any-base.d.ts +6 -0
  110. package/dist/src/utils/any-base.js +56 -0
  111. package/dist/src/utils/any-base.js.map +1 -0
  112. package/dist/src/utils/duration.d.ts +15 -0
  113. package/dist/src/utils/duration.js +66 -0
  114. package/dist/src/utils/duration.js.map +1 -0
  115. package/dist/src/utils/extract-group-option.d.ts +9 -0
  116. package/dist/src/utils/extract-group-option.js +81 -0
  117. package/dist/src/utils/extract-group-option.js.map +1 -0
  118. package/dist/src/utils/iso8601-duration.d.ts +4 -0
  119. package/dist/src/utils/iso8601-duration.js +32 -0
  120. package/dist/src/utils/iso8601-duration.js.map +1 -0
  121. package/dist/src/utils/localized-date-time-fields.d.ts +2 -0
  122. package/dist/src/utils/localized-date-time-fields.js +24 -0
  123. package/dist/src/utils/localized-date-time-fields.js.map +1 -0
  124. package/dist/src/utils/parse-json-string.d.ts +1 -0
  125. package/dist/src/utils/parse-json-string.js +9 -0
  126. package/dist/src/utils/parse-json-string.js.map +1 -0
  127. package/dist/src/utils/polyfill-keyframes.d.ts +1 -0
  128. package/dist/src/utils/polyfill-keyframes.js +19 -0
  129. package/dist/src/utils/polyfill-keyframes.js.map +1 -0
  130. package/dist/src/utils/preprocess-part-data.d.ts +25 -0
  131. package/dist/src/utils/preprocess-part-data.js +59 -0
  132. package/dist/src/utils/preprocess-part-data.js.map +1 -0
  133. package/dist/src/utils/transition-digit.d.ts +2 -0
  134. package/dist/src/utils/transition-digit.js +51 -0
  135. package/dist/src/utils/transition-digit.js.map +1 -0
  136. package/dist/src/utils/uuid.d.ts +1 -0
  137. package/dist/src/utils/uuid.js +7 -0
  138. package/dist/src/utils/uuid.js.map +1 -0
  139. package/dist/stories/story-parts/animation-events.d.ts +9 -0
  140. package/dist/stories/story-parts/animation-events.js +35 -0
  141. package/dist/stories/story-parts/animation-events.js.map +1 -0
  142. package/dist/stories/story-parts/animation-options.d.ts +8 -0
  143. package/dist/stories/story-parts/animation-options.js +25 -0
  144. package/dist/stories/story-parts/animation-options.js.map +1 -0
  145. package/dist/stories/story-parts/big-number.d.ts +8 -0
  146. package/dist/stories/story-parts/big-number.js +25 -0
  147. package/dist/stories/story-parts/big-number.js.map +1 -0
  148. package/dist/stories/story-parts/datetime-locale.d.ts +8 -0
  149. package/dist/stories/story-parts/datetime-locale.js +30 -0
  150. package/dist/stories/story-parts/datetime-locale.js.map +1 -0
  151. package/dist/stories/story-parts/datetime-precision.d.ts +8 -0
  152. package/dist/stories/story-parts/datetime-precision.js +82 -0
  153. package/dist/stories/story-parts/datetime-precision.js.map +1 -0
  154. package/dist/stories/story-parts/edge-case.d.ts +8 -0
  155. package/dist/stories/story-parts/edge-case.js +12 -0
  156. package/dist/stories/story-parts/edge-case.js.map +1 -0
  157. package/dist/stories/story-parts/emoji.d.ts +9 -0
  158. package/dist/stories/story-parts/emoji.js +20 -0
  159. package/dist/stories/story-parts/emoji.js.map +1 -0
  160. package/dist/stories/story-parts/locale-number.d.ts +7 -0
  161. package/dist/stories/story-parts/locale-number.js +23 -0
  162. package/dist/stories/story-parts/locale-number.js.map +1 -0
  163. package/dist/stories/story-parts/slots.d.ts +10 -0
  164. package/dist/stories/story-parts/slots.js +29 -0
  165. package/dist/stories/story-parts/slots.js.map +1 -0
  166. package/dist/stories/story-parts/styles.d.ts +7 -0
  167. package/dist/stories/story-parts/styles.js +34 -0
  168. package/dist/stories/story-parts/styles.js.map +1 -0
  169. package/dist/stories/story-parts/value-change.d.ts +9 -0
  170. package/dist/stories/story-parts/value-change.js +20 -0
  171. package/dist/stories/story-parts/value-change.js.map +1 -0
  172. package/dist/stories/timered-counter/decimaljs.stories.d.ts +6 -0
  173. package/dist/stories/timered-counter/decimaljs.stories.js +34 -0
  174. package/dist/stories/timered-counter/decimaljs.stories.js.map +1 -0
  175. package/dist/stories/timered-counter/index.stories.d.ts +9 -0
  176. package/dist/stories/timered-counter/index.stories.js +180 -0
  177. package/dist/stories/timered-counter/index.stories.js.map +1 -0
  178. package/dist/stories/timered-counter-datetime-duration/index.stories.d.ts +7 -0
  179. package/dist/stories/timered-counter-datetime-duration/index.stories.js +95 -0
  180. package/dist/stories/timered-counter-datetime-duration/index.stories.js.map +1 -0
  181. package/dist/stories/timered-counter-number/decimaljs.stories.d.ts +6 -0
  182. package/dist/stories/timered-counter-number/decimaljs.stories.js +34 -0
  183. package/dist/stories/timered-counter-number/decimaljs.stories.js.map +1 -0
  184. package/dist/stories/timered-counter-number/index.stories.d.ts +9 -0
  185. package/dist/stories/timered-counter-number/index.stories.js +188 -0
  186. package/dist/stories/timered-counter-number/index.stories.js.map +1 -0
  187. package/dist/stories/timered-counter-string/decimaljs.stories.d.ts +7 -0
  188. package/dist/stories/timered-counter-string/decimaljs.stories.js +55 -0
  189. package/dist/stories/timered-counter-string/decimaljs.stories.js.map +1 -0
  190. package/dist/stories/timered-counter-string/grapheme-splitter.stories.d.ts +7 -0
  191. package/dist/stories/timered-counter-string/grapheme-splitter.stories.js +56 -0
  192. package/dist/stories/timered-counter-string/grapheme-splitter.stories.js.map +1 -0
  193. package/dist/stories/timered-counter-string/index.stories.d.ts +9 -0
  194. package/dist/stories/timered-counter-string/index.stories.js +126 -0
  195. package/dist/stories/timered-counter-string/index.stories.js.map +1 -0
  196. package/dist/stories/timered-counter-string/intl-segmenter.stories.d.ts +7 -0
  197. package/dist/stories/timered-counter-string/intl-segmenter.stories.js +56 -0
  198. package/dist/stories/timered-counter-string/intl-segmenter.stories.js.map +1 -0
  199. package/dist/stories/utils/index.d.ts +8 -0
  200. package/dist/stories/utils/index.js +20 -0
  201. package/dist/stories/utils/index.js.map +1 -0
  202. package/dist/test/td-counter.test.d.ts +1 -0
  203. package/dist/test/td-counter.test.js +25 -0
  204. package/dist/test/td-counter.test.js.map +1 -0
  205. package/dist/tsconfig.tsbuildinfo +1 -0
  206. package/package.json +128 -0
@@ -0,0 +1,66 @@
1
+ import { differenceInMilliseconds, differenceInDays, differenceInHours, differenceInMinutes, differenceInMonths, differenceInQuarters, differenceInSeconds, differenceInWeeks, differenceInYears, subDays, subHours, subMilliseconds, subMinutes, subMonths, subQuarters, subSeconds, subWeeks, subYears, } from 'date-fns';
2
+ import { DurationPartType } from '../types/duration.js';
3
+ /**
4
+ * 计算两个日期之间的时间间隔. 返回一个数组, 包含 {@link parts} 每个部分的值.
5
+ *
6
+ * @example duration(new Date("2022-01-01"), new Date("2022-01-02"), [DurationPartType.Day, DurationPartType.Hour, DurationPartType.Minute, DurationPartType.Second]) // [1, 0, 0, 0]
7
+ * @example duration(new Date("2022-01-01 12:00:00"), new Date("2022-01-02 12:30:00"), [DurationPartType.Day, DurationPartType.Hour, DurationPartType.Minute, DurationPartType.Second]) // [1, 0, 30, 0]
8
+ *
9
+ * @param start
10
+ * @param end
11
+ * @param parts
12
+ */
13
+ export function durationObject(start, end, parts) {
14
+ let remain = end;
15
+ const result = {};
16
+ for (const part of parts) {
17
+ let value = 0;
18
+ switch (part) {
19
+ case DurationPartType.Year:
20
+ value = differenceInYears(remain, start);
21
+ remain = subYears(remain, value);
22
+ break;
23
+ case DurationPartType.Quarter:
24
+ value = differenceInQuarters(remain, start);
25
+ remain = subQuarters(remain, value);
26
+ break;
27
+ case DurationPartType.Month:
28
+ value = differenceInMonths(remain, start);
29
+ remain = subMonths(remain, value);
30
+ break;
31
+ case DurationPartType.Week:
32
+ value = differenceInWeeks(remain, start);
33
+ remain = subWeeks(remain, value);
34
+ break;
35
+ case DurationPartType.Day:
36
+ value = differenceInDays(remain, start);
37
+ remain = subDays(remain, value);
38
+ break;
39
+ case DurationPartType.Hour:
40
+ value = differenceInHours(remain, start);
41
+ remain = subHours(remain, value);
42
+ break;
43
+ case DurationPartType.Minute:
44
+ value = differenceInMinutes(remain, start);
45
+ remain = subMinutes(remain, value);
46
+ break;
47
+ case DurationPartType.Second:
48
+ value = differenceInSeconds(remain, start);
49
+ remain = subSeconds(remain, value);
50
+ break;
51
+ case DurationPartType.Millisecond:
52
+ value = differenceInMilliseconds(remain, start);
53
+ remain = subMilliseconds(remain, value);
54
+ break;
55
+ default:
56
+ throw new Error(`Unknown duration part: ${part}`);
57
+ }
58
+ result[part] = value;
59
+ }
60
+ return result;
61
+ }
62
+ export function duration(start, end, parts) {
63
+ const obj = durationObject(start, end, parts);
64
+ return parts.map(part => obj[part]);
65
+ }
66
+ //# sourceMappingURL=duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.js","sourceRoot":"","sources":["../../../src/utils/duration.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n differenceInMilliseconds,\n differenceInDays,\n differenceInHours,\n differenceInMinutes,\n differenceInMonths,\n differenceInQuarters,\n differenceInSeconds,\n differenceInWeeks,\n differenceInYears,\n subDays,\n subHours,\n subMilliseconds,\n subMinutes,\n subMonths,\n subQuarters,\n subSeconds,\n subWeeks,\n subYears,\n} from 'date-fns';\nimport { DurationPartType } from '../types/duration.js';\n\n/**\n * 计算两个日期之间的时间间隔. 返回一个数组, 包含 {@link parts} 每个部分的值.\n *\n * @example duration(new Date(\"2022-01-01\"), new Date(\"2022-01-02\"), [DurationPartType.Day, DurationPartType.Hour, DurationPartType.Minute, DurationPartType.Second]) // [1, 0, 0, 0]\n * @example duration(new Date(\"2022-01-01 12:00:00\"), new Date(\"2022-01-02 12:30:00\"), [DurationPartType.Day, DurationPartType.Hour, DurationPartType.Minute, DurationPartType.Second]) // [1, 0, 30, 0]\n *\n * @param start\n * @param end\n * @param parts\n */\nexport function durationObject(\n start: Date,\n end: Date,\n parts: DurationPartType[],\n): { [key in DurationPartType]?: number } {\n let remain = end;\n\n const result: { [key in DurationPartType]?: number } = {};\n for (const part of parts) {\n let value = 0;\n\n switch (part) {\n case DurationPartType.Year:\n value = differenceInYears(remain, start);\n remain = subYears(remain, value);\n break;\n case DurationPartType.Quarter:\n value = differenceInQuarters(remain, start);\n remain = subQuarters(remain, value);\n break;\n case DurationPartType.Month:\n value = differenceInMonths(remain, start);\n remain = subMonths(remain, value);\n break;\n case DurationPartType.Week:\n value = differenceInWeeks(remain, start);\n remain = subWeeks(remain, value);\n break;\n case DurationPartType.Day:\n value = differenceInDays(remain, start);\n remain = subDays(remain, value);\n break;\n case DurationPartType.Hour:\n value = differenceInHours(remain, start);\n remain = subHours(remain, value);\n break;\n case DurationPartType.Minute:\n value = differenceInMinutes(remain, start);\n remain = subMinutes(remain, value);\n break;\n case DurationPartType.Second:\n value = differenceInSeconds(remain, start);\n remain = subSeconds(remain, value);\n break;\n case DurationPartType.Millisecond:\n value = differenceInMilliseconds(remain, start);\n remain = subMilliseconds(remain, value);\n break;\n default:\n throw new Error(`Unknown duration part: ${part}`);\n }\n\n result[part] = value;\n }\n\n return result;\n}\n\nexport function duration(\n start: Date,\n end: Date,\n parts: DurationPartType[],\n): number[] {\n const obj = durationObject(start, end, parts);\n return parts.map(part => obj[part]) as number[];\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { GroupValueOrGetter, PartValueOrGetter, ExtractGroupValue, ExtractPartValue, PartDigitValueOrGetter, PartDigitCellValueOrGetter, ExtractPartDigitCellValue, ExtractPartDigitValue, GroupGetterOptions } from '../types/group.js';
2
+ export declare function extractGroupOption<P extends GroupValueOrGetter<unknown>, Result = ExtractGroupValue<P>>(option: P, getterOptions: GroupGetterOptions): Result;
3
+ export declare function extractPartOption<P extends PartValueOrGetter<unknown>, Result = ExtractPartValue<P>>(option: P, getterOptions: GroupGetterOptions): Result[];
4
+ export declare function extractPartDigitOption<P extends PartDigitValueOrGetter<unknown>, Result = ExtractPartDigitValue<P>>(option: P, getterOptions: GroupGetterOptions): Result[][];
5
+ export declare function extractPartDigitCellOption<P extends PartDigitCellValueOrGetter<unknown>, Result = ExtractPartDigitCellValue<P>>(option: P, getterOptions: GroupGetterOptions): Result[][][];
6
+ export declare function mergeGroupOption<P extends GroupValueOrGetter<unknown>, Result = ExtractGroupValue<P>>(data: Result, source: Result): Result;
7
+ export declare function mergePartOption<P extends PartValueOrGetter<unknown>, Result = ExtractPartValue<P>>(data?: Result[], source?: Result[]): Result[];
8
+ export declare function mergePartDigitOption<P extends PartDigitValueOrGetter<unknown>, Result = ExtractPartDigitValue<P>>(data?: Result[][], source?: Result[][]): Result[][];
9
+ export declare function mergePartDigitCellOption<P extends PartDigitCellValueOrGetter<unknown>, Result = ExtractPartDigitCellValue<P>>(data?: Result[][][], source?: Result[][][]): Result[][][];
@@ -0,0 +1,81 @@
1
+ import { isArray, isFunction, merge } from 'remeda';
2
+ export function extractGroupOption(option, getterOptions) {
3
+ return (isFunction(option)
4
+ ? option(getterOptions)
5
+ : option);
6
+ }
7
+ export function extractPartOption(option, getterOptions) {
8
+ const groupOption = extractGroupOption(option, getterOptions);
9
+ const { data } = getterOptions;
10
+ const result = [];
11
+ for (let i = 0; i < data.length; i += 1) {
12
+ const value = isArray(groupOption) ? groupOption[i] : groupOption;
13
+ result.push(value);
14
+ }
15
+ return result;
16
+ }
17
+ export function extractPartDigitOption(option, getterOptions) {
18
+ const extractedOption = extractPartOption(option, getterOptions);
19
+ const { data } = getterOptions;
20
+ const result = [];
21
+ for (let i = 0; i < data.length; i += 1) {
22
+ const { digits } = data[i];
23
+ const partOption = extractedOption[i];
24
+ result.push([]);
25
+ for (let j = 0; j < digits.length; j += 1) {
26
+ const value = isArray(partOption) ? partOption[j] : partOption;
27
+ result[i].push(value);
28
+ }
29
+ }
30
+ return result;
31
+ }
32
+ export function extractPartDigitCellOption(option, getterOptions) {
33
+ const extractedOption = extractPartDigitOption(option, getterOptions);
34
+ const { data } = getterOptions;
35
+ const result = [];
36
+ for (let i = 0; i < data.length; i += 1) {
37
+ const { digits } = data[i];
38
+ const partOption = extractedOption[i];
39
+ result.push([]);
40
+ for (let j = 0; j < digits.length; j += 1) {
41
+ const { data: digitData } = digits[j];
42
+ const partDigitOption = partOption[j];
43
+ result[i].push([]);
44
+ for (let k = 0; k < digitData.length; k += 1) {
45
+ const value = isArray(partDigitOption)
46
+ ? partDigitOption[k]
47
+ : partDigitOption;
48
+ result[i][j].push(value);
49
+ }
50
+ }
51
+ }
52
+ return result;
53
+ }
54
+ export function mergeGroupOption(data, source) {
55
+ return merge(data ?? {}, source ?? {});
56
+ }
57
+ export function mergePartOption(data = [], source = []) {
58
+ const keys = Array.from(new Set(Object.keys(data).concat(Object.keys(source))));
59
+ for (const key of keys) {
60
+ const index = Number.parseInt(key, 10);
61
+ data[index] = mergeGroupOption(data[index], source[index]);
62
+ }
63
+ return data;
64
+ }
65
+ export function mergePartDigitOption(data = [], source = []) {
66
+ const keys = Array.from(new Set(Object.keys(data).concat(Object.keys(source))));
67
+ for (const key of keys) {
68
+ const index = Number.parseInt(key, 10);
69
+ data[index] = mergePartOption(data[index], source[index]);
70
+ }
71
+ return data;
72
+ }
73
+ export function mergePartDigitCellOption(data = [], source = []) {
74
+ const keys = Array.from(new Set(Object.keys(data).concat(Object.keys(source))));
75
+ for (const key of keys) {
76
+ const index = Number.parseInt(key, 10);
77
+ data[index] = mergePartDigitOption(data[index], source[index]);
78
+ }
79
+ return data;
80
+ }
81
+ //# sourceMappingURL=extract-group-option.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-group-option.js","sourceRoot":"","sources":["../../../src/utils/extract-group-option.ts"],"names":[],"mappings":"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","sourcesContent":["import { isArray, isFunction, merge } from 'remeda';\nimport {\n GroupValueOrGetter,\n PartValueOrGetter,\n ExtractGroupValue,\n ExtractPartValue,\n GroupGetter,\n PartDigitValueOrGetter,\n PartDigitCellValueOrGetter,\n ExtractPartDigitCellValue,\n ExtractPartDigitValue,\n GroupGetterOptions,\n} from '../types/group.js';\n\nexport function extractGroupOption<\n P extends GroupValueOrGetter<unknown>,\n Result = ExtractGroupValue<P>,\n>(option: P, getterOptions: GroupGetterOptions) {\n return (\n isFunction(option)\n ? (option as GroupGetter<ExtractGroupValue<P>>)(getterOptions)\n : option\n ) as Result;\n}\n\nexport function extractPartOption<\n P extends PartValueOrGetter<unknown>,\n Result = ExtractPartValue<P>,\n>(option: P, getterOptions: GroupGetterOptions) {\n const groupOption = extractGroupOption(option, getterOptions);\n\n const { data } = getterOptions;\n\n const result: Result[] = [];\n for (let i = 0; i < data.length; i += 1) {\n const value = isArray(groupOption) ? groupOption[i] : groupOption;\n result.push(value as Result);\n }\n\n return result;\n}\n\nexport function extractPartDigitOption<\n P extends PartDigitValueOrGetter<unknown>,\n Result = ExtractPartDigitValue<P>,\n>(option: P, getterOptions: GroupGetterOptions) {\n const extractedOption = extractPartOption(option, getterOptions);\n\n const { data } = getterOptions;\n\n const result: Result[][] = [];\n for (let i = 0; i < data.length; i += 1) {\n const { digits } = data[i];\n const partOption = extractedOption[i];\n\n result.push([]);\n\n for (let j = 0; j < digits.length; j += 1) {\n const value = isArray(partOption) ? partOption[j] : partOption;\n result[i].push(value as Result);\n }\n }\n\n return result;\n}\n\nexport function extractPartDigitCellOption<\n P extends PartDigitCellValueOrGetter<unknown>,\n Result = ExtractPartDigitCellValue<P>,\n>(option: P, getterOptions: GroupGetterOptions) {\n const extractedOption = extractPartDigitOption(option, getterOptions);\n\n const { data } = getterOptions;\n\n const result: Result[][][] = [];\n for (let i = 0; i < data.length; i += 1) {\n const { digits } = data[i];\n const partOption = extractedOption[i];\n\n result.push([]);\n\n for (let j = 0; j < digits.length; j += 1) {\n const { data: digitData } = digits[j];\n const partDigitOption = partOption[j];\n\n result[i].push([]);\n\n for (let k = 0; k < digitData.length; k += 1) {\n const value = isArray(partDigitOption)\n ? partDigitOption[k]\n : partDigitOption;\n result[i][j].push(value as Result);\n }\n }\n }\n\n return result;\n}\n\nexport function mergeGroupOption<\n P extends GroupValueOrGetter<unknown>,\n Result = ExtractGroupValue<P>,\n>(data: Result, source: Result): Result {\n return merge(data ?? {}, source ?? {}) as Result;\n}\n\nexport function mergePartOption<\n P extends PartValueOrGetter<unknown>,\n Result = ExtractPartValue<P>,\n>(data: Result[] = [], source: Result[] = []): Result[] {\n const keys = Array.from(\n new Set(Object.keys(data).concat(Object.keys(source))),\n );\n for (const key of keys) {\n const index = Number.parseInt(key, 10);\n data[index] = mergeGroupOption(data[index], source[index]);\n }\n\n return data;\n}\n\nexport function mergePartDigitOption<\n P extends PartDigitValueOrGetter<unknown>,\n Result = ExtractPartDigitValue<P>,\n>(data: Result[][] = [], source: Result[][] = []): Result[][] {\n const keys = Array.from(\n new Set(Object.keys(data).concat(Object.keys(source))),\n );\n for (const key of keys) {\n const index = Number.parseInt(key, 10);\n data[index] = mergePartOption(data[index], source[index]);\n }\n\n return data;\n}\n\nexport function mergePartDigitCellOption<\n P extends PartDigitCellValueOrGetter<unknown>,\n Result = ExtractPartDigitCellValue<P>,\n>(data: Result[][][] = [], source: Result[][][] = []): Result[][][] {\n const keys = Array.from(\n new Set(Object.keys(data).concat(Object.keys(source))),\n );\n for (const key of keys) {\n const index = Number.parseInt(key, 10);\n data[index] = mergePartDigitOption(data[index], source[index]);\n }\n\n return data;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { DurationPartType } from '../types/duration.js';
2
+ export declare function iso8601Duration(duration: {
3
+ [key in DurationPartType]?: number;
4
+ }): string;
@@ -0,0 +1,32 @@
1
+ import { isNumber } from 'remeda';
2
+ import { DurationPartType } from '../types/duration.js';
3
+ const ISO8601DurationMarker = {
4
+ [DurationPartType.Year]: 'Y',
5
+ [DurationPartType.Month]: 'M',
6
+ [DurationPartType.Week]: 'W',
7
+ [DurationPartType.Day]: 'D',
8
+ [DurationPartType.Hour]: 'H',
9
+ [DurationPartType.Minute]: 'M',
10
+ [DurationPartType.Second]: 'S',
11
+ };
12
+ const DateParts = [
13
+ DurationPartType.Year,
14
+ DurationPartType.Month,
15
+ DurationPartType.Week,
16
+ DurationPartType.Day,
17
+ ];
18
+ const TimeParts = [
19
+ DurationPartType.Hour,
20
+ DurationPartType.Minute,
21
+ DurationPartType.Second,
22
+ ];
23
+ export function iso8601Duration(duration) {
24
+ const datePart = DateParts.map(part => isNumber(duration[part])
25
+ ? `${duration[part]}${ISO8601DurationMarker[part]}`
26
+ : '');
27
+ const timePart = TimeParts.map(part => isNumber(duration[part])
28
+ ? `${duration[part]}${ISO8601DurationMarker[part]}`
29
+ : '');
30
+ return `P${datePart.join('')}T${timePart.join('')}`;
31
+ }
32
+ //# sourceMappingURL=iso8601-duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iso8601-duration.js","sourceRoot":"","sources":["../../../src/utils/iso8601-duration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,qBAAqB,GAAG;IAC5B,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG;IAC5B,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,GAAG;IAC7B,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG;IAC5B,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,GAAG;IAC3B,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG;IAC5B,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,GAAG;IAC9B,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,GAAG;CACtB,CAAC;AAEX,MAAM,SAAS,GAAG;IAChB,gBAAgB,CAAC,IAAI;IACrB,gBAAgB,CAAC,KAAK;IACtB,gBAAgB,CAAC,IAAI;IACrB,gBAAgB,CAAC,GAAG;CACZ,CAAC;AACX,MAAM,SAAS,GAAG;IAChB,gBAAgB,CAAC,IAAI;IACrB,gBAAgB,CAAC,MAAM;IACvB,gBAAgB,CAAC,MAAM;CACf,CAAC;AAEX,MAAM,UAAU,eAAe,CAAC,QAE/B;IACC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACpC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,EAAE;QACnD,CAAC,CAAC,EAAE,CACP,CAAC;IACF,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACpC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,EAAE;QACnD,CAAC,CAAC,EAAE,CACP,CAAC;IACF,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACtD,CAAC","sourcesContent":["import { isNumber } from 'remeda';\nimport { DurationPartType } from '../types/duration.js';\n\nconst ISO8601DurationMarker = {\n [DurationPartType.Year]: 'Y',\n [DurationPartType.Month]: 'M',\n [DurationPartType.Week]: 'W',\n [DurationPartType.Day]: 'D',\n [DurationPartType.Hour]: 'H',\n [DurationPartType.Minute]: 'M',\n [DurationPartType.Second]: 'S',\n} as const;\n\nconst DateParts = [\n DurationPartType.Year,\n DurationPartType.Month,\n DurationPartType.Week,\n DurationPartType.Day,\n] as const;\nconst TimeParts = [\n DurationPartType.Hour,\n DurationPartType.Minute,\n DurationPartType.Second,\n] as const;\n\nexport function iso8601Duration(duration: {\n [key in DurationPartType]?: number;\n}): string {\n const datePart = DateParts.map(part =>\n isNumber(duration[part])\n ? `${duration[part]}${ISO8601DurationMarker[part]}`\n : '',\n );\n const timePart = TimeParts.map(part =>\n isNumber(duration[part])\n ? `${duration[part]}${ISO8601DurationMarker[part]}`\n : '',\n );\n return `P${datePart.join('')}T${timePart.join('')}`;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const DateTimeFields: readonly ["era", "year", "quarter", "month", "weekOfYear", "weekday", "day", "dayPeriod", "hour", "minute", "second", "timeZoneName"];
2
+ export declare function getLocalizedDateTimeFields(locale: Intl.Locale): Record<string, string>;
@@ -0,0 +1,24 @@
1
+ export const DateTimeFields = [
2
+ "era",
3
+ "year",
4
+ "quarter",
5
+ "month",
6
+ "weekOfYear",
7
+ "weekday",
8
+ "day",
9
+ "dayPeriod",
10
+ "hour",
11
+ "minute",
12
+ "second",
13
+ "timeZoneName",
14
+ ];
15
+ export function getLocalizedDateTimeFields(locale) {
16
+ const displayNames = new Intl.DisplayNames(locale, {
17
+ type: "dateTimeField",
18
+ });
19
+ return DateTimeFields.reduce((acc, field) => {
20
+ acc[field] = displayNames.of(field) ?? "";
21
+ return acc;
22
+ }, {});
23
+ }
24
+ //# sourceMappingURL=localized-date-time-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localized-date-time-fields.js","sourceRoot":"","sources":["../../../src/utils/localized-date-time-fields.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,KAAK;IACL,MAAM;IACN,SAAS;IACT,OAAO;IACP,YAAY;IACZ,SAAS;IACT,KAAK;IACL,WAAW;IACX,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,cAAc;CACN,CAAC;AAEX,MAAM,UAAU,0BAA0B,CAAC,MAAmB;IAC5D,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;QACjD,IAAI,EAAE,eAAe;KACtB,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC,MAAM,CAC1B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACb,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAA8D,CAC/D,CAAC;AACJ,CAAC","sourcesContent":["export const DateTimeFields = [\n \"era\",\n \"year\",\n \"quarter\",\n \"month\",\n \"weekOfYear\",\n \"weekday\",\n \"day\",\n \"dayPeriod\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n] as const;\n\nexport function getLocalizedDateTimeFields(locale: Intl.Locale) {\n const displayNames = new Intl.DisplayNames(locale, {\n type: \"dateTimeField\",\n });\n\n return DateTimeFields.reduce(\n (acc, field) => {\n acc[field] = displayNames.of(field) ?? \"\";\n return acc;\n },\n {} as Record<(typeof DateTimeFields)[number] | string, string>\n );\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function parseJsonString(value: string): any;
@@ -0,0 +1,9 @@
1
+ export function parseJsonString(value) {
2
+ try {
3
+ return JSON.parse(value);
4
+ }
5
+ catch (error) {
6
+ return value;
7
+ }
8
+ }
9
+ //# sourceMappingURL=parse-json-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-json-string.js","sourceRoot":"","sources":["../../../src/utils/parse-json-string.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC","sourcesContent":["export function parseJsonString(value: string) {\n try {\n return JSON.parse(value);\n } catch (error) {\n return value;\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function polyfillKeyframes(keyframes: Keyframe[] | PropertyIndexedKeyframes): Keyframe[];
@@ -0,0 +1,19 @@
1
+ export function polyfillKeyframes(keyframes) {
2
+ if (Array.isArray(keyframes)) {
3
+ return keyframes;
4
+ }
5
+ const properties = Object.keys(keyframes);
6
+ const length = Math.max(...properties.map(property => keyframes[property].length));
7
+ const result = [];
8
+ for (let i = 0; i < length; i++) {
9
+ const frame = {};
10
+ properties.forEach(property => {
11
+ const values = keyframes[property];
12
+ frame[property] =
13
+ values[i] !== undefined ? values[i] : values[values.length - 1];
14
+ });
15
+ result.push(frame);
16
+ }
17
+ return result;
18
+ }
19
+ //# sourceMappingURL=polyfill-keyframes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfill-keyframes.js","sourceRoot":"","sources":["../../../src/utils/polyfill-keyframes.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAC/B,SAAgD;IAEhD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CACrB,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAE,SAAS,CAAC,QAAQ,CAAe,CAAC,MAAM,CAAC,CACzE,CAAC;IAEF,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAwB,CAAC;YAC1D,KAAK,CAAC,QAAQ,CAAC;gBACb,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["export function polyfillKeyframes(\n keyframes: Keyframe[] | PropertyIndexedKeyframes,\n): Keyframe[] {\n if (Array.isArray(keyframes)) {\n return keyframes;\n }\n\n const properties = Object.keys(keyframes);\n const length = Math.max(\n ...properties.map(property => (keyframes[property] as unknown[]).length),\n );\n\n const result: Keyframe[] = [];\n for (let i = 0; i < length; i++) {\n const frame: Keyframe = {};\n properties.forEach(property => {\n const values = keyframes[property] as (string | number)[];\n frame[property] =\n values[i] !== undefined ? values[i] : values[values.length - 1];\n });\n result.push(frame);\n }\n\n return result;\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { PartData } from '../types/group.js';
2
+ export interface PartPreprocessedData {
3
+ /**
4
+ * 是否需要启动动画
5
+ */
6
+ animate: boolean;
7
+ /**
8
+ * 是否需要移除上一次的动画设置的样式
9
+ */
10
+ cancelPrevAnimation: boolean;
11
+ earlyReturn?: string;
12
+ /**
13
+ * 全局索引
14
+ */
15
+ index: number;
16
+ /**
17
+ * 所在 `part` 的索引
18
+ */
19
+ partIndex: number;
20
+ /**
21
+ * 所在 `digit` 的索引
22
+ */
23
+ digitIndex: number;
24
+ }
25
+ export declare function preprocessPartData(newDirection: 'up' | 'down', newData: PartData[], oldDirection: 'up' | 'down', oldData: PartData[]): PartPreprocessedData[][];
@@ -0,0 +1,59 @@
1
+ import { isDeepEqual } from 'remeda';
2
+ /**
3
+ * 以下代码块用于判断是否需要启动滚动动画.
4
+ * 下列情况将跳过滚动动画:
5
+ * 1. 当新的滚动数据(即 digits)长度为 1 时.
6
+ * 2. 当滚动方向未改变时:
7
+ * 1. 当滚动数据头尾相同时.
8
+ * 2. 当前滚动数据与上一次全等时.
9
+ */
10
+ function rollerPartTest(direction, digits) {
11
+ const [newDirection, oldDirection] = direction;
12
+ const [newDigits, oldDigits] = digits;
13
+ const result = {
14
+ animate: true,
15
+ cancelPrevAnimation: false,
16
+ };
17
+ let earlyReturn = '';
18
+ if (newDigits.data.length === 1) {
19
+ result.animate = false;
20
+ result.cancelPrevAnimation = true;
21
+ earlyReturn = 'only one digit';
22
+ }
23
+ if (newDirection !== oldDirection)
24
+ return result;
25
+ if (newDigits.data[0] === newDigits.data[newDigits.data.length - 1]) {
26
+ result.animate = false;
27
+ result.cancelPrevAnimation = true;
28
+ earlyReturn = 'same head and tail';
29
+ }
30
+ if (isDeepEqual(newDigits, oldDigits)) {
31
+ result.animate = false;
32
+ earlyReturn = 'same digits';
33
+ }
34
+ if (earlyReturn)
35
+ result.earlyReturn = earlyReturn;
36
+ return result;
37
+ }
38
+ export function preprocessPartData(newDirection, newData, oldDirection, oldData) {
39
+ const results = [];
40
+ let globalIndex = 0;
41
+ for (let i = 0; i < newData.length; i++) {
42
+ const newPart = newData[i];
43
+ const oldPart = oldData?.[i];
44
+ const partDataResults = [];
45
+ for (let j = 0; j < newPart.digits.length; j++) {
46
+ const newDigit = newPart.digits[j];
47
+ const oldDigit = oldPart?.digits.find(d => d.place === newDigit.place);
48
+ partDataResults.push({
49
+ ...rollerPartTest([newDirection, oldDirection], [newDigit, oldDigit]),
50
+ index: globalIndex++,
51
+ partIndex: i,
52
+ digitIndex: j,
53
+ });
54
+ }
55
+ results.push(partDataResults);
56
+ }
57
+ return results;
58
+ }
59
+ //# sourceMappingURL=preprocess-part-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess-part-data.js","sourceRoot":"","sources":["../../../src/utils/preprocess-part-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AA2BrC;;;;;;;GAOG;AACH,SAAS,cAAc,CACrB,SAAqD,EACrD,MAAkD;IAElD,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,SAAS,CAAC;IAC/C,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC;IAEtC,MAAM,MAAM,GAGR;QACF,OAAO,EAAE,IAAI;QACb,mBAAmB,EAAE,KAAK;KAC3B,CAAC;IACF,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAClC,WAAW,GAAG,gBAAgB,CAAC;IACjC,CAAC;IAED,IAAI,YAAY,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC;IAEjD,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAClC,WAAW,GAAG,oBAAoB,CAAC;IACrC,CAAC;IAED,IAAI,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,WAAW,GAAG,aAAa,CAAC;IAC9B,CAAC;IAED,IAAI,WAAW;QAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IAElD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,YAA2B,EAC3B,OAAmB,EACnB,YAA2B,EAC3B,OAAmB;IAEnB,MAAM,OAAO,GAA6B,EAAE,CAAC;IAE7C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7B,MAAM,eAAe,GAA2B,EAAE,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;YAEvE,eAAe,CAAC,IAAI,CAAC;gBACnB,GAAG,cAAc,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACrE,KAAK,EAAE,WAAW,EAAE;gBACpB,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;aACd,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import { isDeepEqual } from 'remeda';\nimport { PartData, PartDataDigit } from '../types/group.js';\n\nexport interface PartPreprocessedData {\n /**\n * 是否需要启动动画\n */\n animate: boolean;\n /**\n * 是否需要移除上一次的动画设置的样式\n */\n cancelPrevAnimation: boolean;\n earlyReturn?: string;\n /**\n * 全局索引\n */\n index: number;\n /**\n * 所在 `part` 的索引\n */\n partIndex: number;\n /**\n * 所在 `digit` 的索引\n */\n digitIndex: number;\n}\n\n/**\n * 以下代码块用于判断是否需要启动滚动动画.\n * 下列情况将跳过滚动动画:\n * 1. 当新的滚动数据(即 digits)长度为 1 时.\n * 2. 当滚动方向未改变时:\n * 1. 当滚动数据头尾相同时.\n * 2. 当前滚动数据与上一次全等时.\n */\nfunction rollerPartTest(\n direction: ['up' | 'down', 'up' | 'down' | undefined],\n digits: [PartDataDigit, PartDataDigit | undefined],\n) {\n const [newDirection, oldDirection] = direction;\n const [newDigits, oldDigits] = digits;\n\n const result: Pick<\n PartPreprocessedData,\n 'animate' | 'cancelPrevAnimation' | 'earlyReturn'\n > = {\n animate: true,\n cancelPrevAnimation: false,\n };\n let earlyReturn = '';\n if (newDigits.data.length === 1) {\n result.animate = false;\n result.cancelPrevAnimation = true;\n earlyReturn = 'only one digit';\n }\n\n if (newDirection !== oldDirection) return result;\n\n if (newDigits.data[0] === newDigits.data[newDigits.data.length - 1]) {\n result.animate = false;\n result.cancelPrevAnimation = true;\n earlyReturn = 'same head and tail';\n }\n\n if (isDeepEqual(newDigits, oldDigits)) {\n result.animate = false;\n earlyReturn = 'same digits';\n }\n\n if (earlyReturn) result.earlyReturn = earlyReturn;\n\n return result;\n}\n\nexport function preprocessPartData(\n newDirection: 'up' | 'down',\n newData: PartData[],\n oldDirection: 'up' | 'down',\n oldData: PartData[],\n) {\n const results: PartPreprocessedData[][] = [];\n\n let globalIndex = 0;\n for (let i = 0; i < newData.length; i++) {\n const newPart = newData[i];\n const oldPart = oldData?.[i];\n\n const partDataResults: PartPreprocessedData[] = [];\n for (let j = 0; j < newPart.digits.length; j++) {\n const newDigit = newPart.digits[j];\n const oldDigit = oldPart?.digits.find(d => d.place === newDigit.place);\n\n partDataResults.push({\n ...rollerPartTest([newDirection, oldDirection], [newDigit, oldDigit]),\n index: globalIndex++,\n partIndex: i,\n digitIndex: j,\n });\n }\n results.push(partDataResults);\n }\n\n return results;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { ExtractNumberAdapterType, NumberAdapter } from '../number-adapter/index.js';
2
+ export declare function transitionDigit<NS extends NumberAdapter, V = ExtractNumberAdapterType<NS>>(na: NS, from: V, to: V, count: number): V[];
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @see https://github.com/d3/d3-interpolate/blob/main/src/round.js
3
+ * @param na
4
+ * @param a
5
+ * @param b
6
+ */
7
+ function interpolateRound(na, a, b) {
8
+ return function (t) {
9
+ return na.round(na.add(na.mul(a, na.sub(na.create(1), t)), na.mul(b, t)));
10
+ };
11
+ }
12
+ /**
13
+ * @see https://github.com/d3/d3-interpolate/blob/main/src/number.js
14
+ * @param na
15
+ * @param a
16
+ * @param b
17
+ */
18
+ function interpolateNumber(na, a, b) {
19
+ return function (t) {
20
+ return na.add(na.mul(a, na.sub(na.create(1), t)), na.mul(b, t));
21
+ };
22
+ }
23
+ export function transitionDigit(na, from, to, count) {
24
+ let _count = count;
25
+ const interpolateFunc = na.isInteger(from) && na.isInteger(to)
26
+ ? interpolateRound(na, from, to)
27
+ : interpolateNumber(na, from, to);
28
+ /**
29
+ * 将浮点数转换为整数进行插值计算, 提供与整数插值类似的效果.
30
+ * 取最大的小数位数作为插值个数. 但不超过30.
31
+ */
32
+ // const maxDecimalPlaces = Number.isInteger(from - to)
33
+ // ? 0
34
+ // : Math.max(new Decimal(from).dp(), new Decimal(to).dp());
35
+ // const multiplier = Math.pow(10, maxDecimalPlaces);
36
+ // const count = Math.min(
37
+ // Math.abs(Math.floor(from * multiplier) - Math.floor(to * multiplier)) + 1,
38
+ // 30
39
+ // );
40
+ if (na.eq(from, to))
41
+ _count = 1;
42
+ // [0, 1/count, 2/count, ..., 1]
43
+ // const percents = range(count).map((d) => d / Math.max(count - 1, 1));
44
+ const result = [];
45
+ for (let i = 0; i < _count; i++) {
46
+ const percent = na.div(na.create(i), na.create(Math.max(_count - 1, 1)));
47
+ result.push(interpolateFunc(percent));
48
+ }
49
+ return result;
50
+ }
51
+ //# sourceMappingURL=transition-digit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transition-digit.js","sourceRoot":"","sources":["../../../src/utils/transition-digit.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,SAAS,gBAAgB,CAGvB,EAAM,EAAE,CAAI,EAAE,CAAI;IAClB,OAAO,UAAU,CAAS;QACxB,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAGxB,EAAM,EAAE,CAAI,EAAE,CAAI;IAClB,OAAO,UAAU,CAAS;QACxB,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAG7B,EAAM,EAAE,IAAO,EAAE,EAAK,EAAE,KAAa;IACrC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,eAAe,GACnB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,CAAC,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;QAChC,CAAC,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAEtC;;;OAGG;IACH,uDAAuD;IACvD,QAAQ;IACR,8DAA8D;IAC9D,qDAAqD;IACrD,0BAA0B;IAC1B,+EAA+E;IAC/E,OAAO;IACP,KAAK;IAEL,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QAAE,MAAM,GAAG,CAAC,CAAC;IAChC,gCAAgC;IAChC,wEAAwE;IAExE,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import {\n ExtractNumberAdapterType,\n NumberAdapter,\n} from '../number-adapter/index.js';\n\n/**\n * @see https://github.com/d3/d3-interpolate/blob/main/src/round.js\n * @param na\n * @param a\n * @param b\n */\nfunction interpolateRound<\n NS extends NumberAdapter,\n V = ExtractNumberAdapterType<NS>,\n>(na: NS, a: V, b: V) {\n return function (t: number) {\n return na.round(na.add(na.mul(a, na.sub(na.create(1), t)), na.mul(b, t)));\n };\n}\n\n/**\n * @see https://github.com/d3/d3-interpolate/blob/main/src/number.js\n * @param na\n * @param a\n * @param b\n */\nfunction interpolateNumber<\n NS extends NumberAdapter,\n V = ExtractNumberAdapterType<NS>,\n>(na: NS, a: V, b: V) {\n return function (t: number) {\n return na.add(na.mul(a, na.sub(na.create(1), t)), na.mul(b, t));\n };\n}\n\nexport function transitionDigit<\n NS extends NumberAdapter,\n V = ExtractNumberAdapterType<NS>,\n>(na: NS, from: V, to: V, count: number) {\n let _count = count;\n const interpolateFunc =\n na.isInteger(from) && na.isInteger(to)\n ? interpolateRound(na, from, to)\n : interpolateNumber(na, from, to);\n\n /**\n * 将浮点数转换为整数进行插值计算, 提供与整数插值类似的效果.\n * 取最大的小数位数作为插值个数. 但不超过30.\n */\n // const maxDecimalPlaces = Number.isInteger(from - to)\n // ? 0\n // : Math.max(new Decimal(from).dp(), new Decimal(to).dp());\n // const multiplier = Math.pow(10, maxDecimalPlaces);\n // const count = Math.min(\n // Math.abs(Math.floor(from * multiplier) - Math.floor(to * multiplier)) + 1,\n // 30\n // );\n\n if (na.eq(from, to)) _count = 1;\n // [0, 1/count, 2/count, ..., 1]\n // const percents = range(count).map((d) => d / Math.max(count - 1, 1));\n\n const result: V[] = [];\n for (let i = 0; i < _count; i++) {\n const percent = na.div(na.create(i), na.create(Math.max(_count - 1, 1)));\n result.push(interpolateFunc(percent));\n }\n\n return result;\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function uuid(): string;
@@ -0,0 +1,7 @@
1
+ function uuidPart() {
2
+ return Math.random().toString(36).slice(2, 10);
3
+ }
4
+ export function uuid() {
5
+ return [uuidPart(), uuidPart(), uuidPart(), uuidPart()].join('-');
6
+ }
7
+ //# sourceMappingURL=uuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../../src/utils/uuid.ts"],"names":[],"mappings":"AAAA,SAAS,QAAQ;IACf,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpE,CAAC","sourcesContent":["function uuidPart() {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport function uuid() {\n return [uuidPart(), uuidPart(), uuidPart(), uuidPart()].join('-');\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { StoryObj } from '@storybook/web-components';
2
+ import { TimeredCounter } from '../../src/index.js';
3
+ import { NoUndefinedField } from '../utils/index.js';
4
+ export declare function animationEvents<T, TC extends TimeredCounter>(context: Parameters<NoUndefinedField<StoryObj>['play']>[0], { counter, list, setBy, equal, }: {
5
+ counter: TC;
6
+ list?: T[];
7
+ setBy: (counter: TC, key: string, value: T) => void;
8
+ equal?: (counter: TimeredCounter, a: any, b: any) => Promise<void>;
9
+ }): Promise<void>;
@@ -0,0 +1,35 @@
1
+ import { expect, fn, waitFor } from '@storybook/test';
2
+ import { range } from 'remeda';
3
+ import { equal as _equal, sleep } from '../utils/index.js';
4
+ export async function animationEvents(context, { counter, list = range(0, 5).map(v => v * 10), setBy, equal = _equal, }) {
5
+ const { step, args } = context;
6
+ setBy(counter, 'value', list[0]);
7
+ await sleep((args.animationOptions.duration ?? 100) + 10);
8
+ const timeredCounterAnimationStartListener = fn();
9
+ const timeredCounterAnimationEndListener = fn();
10
+ counter.addEventListener('timered-counter-animation-start', timeredCounterAnimationStartListener);
11
+ counter.addEventListener('timered-counter-animation-end', timeredCounterAnimationEndListener);
12
+ await step('Incrementing the value and watching the events', async () => {
13
+ for await (const [index, value] of list.entries()) {
14
+ setBy(counter, 'value', value);
15
+ await waitFor(() => expect(timeredCounterAnimationStartListener).toHaveBeenCalledTimes(index), { timeout: (args.animationOptions.duration ?? 100) + 1000 });
16
+ await waitFor(() => expect(timeredCounterAnimationEndListener).toHaveBeenCalledTimes(index), { timeout: (args.animationOptions.duration ?? 100) + 1000 });
17
+ await equal(counter, counter.value, value);
18
+ }
19
+ });
20
+ timeredCounterAnimationStartListener.mockReset();
21
+ timeredCounterAnimationEndListener.mockReset();
22
+ await step('Decrementing the value and watching the events', async () => {
23
+ for await (const [index, value] of list.slice().reverse().entries()) {
24
+ setBy(counter, 'value', value);
25
+ await waitFor(() => expect(timeredCounterAnimationStartListener).toHaveBeenCalledTimes(index), { timeout: (args.animationOptions.duration ?? 100) + 1000 });
26
+ await waitFor(() => expect(timeredCounterAnimationEndListener).toHaveBeenCalledTimes(index), { timeout: (args.animationOptions.duration ?? 100) + 1000 });
27
+ await equal(counter, counter.value, value);
28
+ }
29
+ });
30
+ timeredCounterAnimationStartListener.mockReset();
31
+ timeredCounterAnimationEndListener.mockReset();
32
+ counter.removeEventListener('timered-counter-animation-start', timeredCounterAnimationStartListener);
33
+ counter.removeEventListener('timered-counter-animation-end', timeredCounterAnimationEndListener);
34
+ }
35
+ //# sourceMappingURL=animation-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation-events.js","sourceRoot":"","sources":["../../../stories/story-parts/animation-events.ts"],"names":[],"mappings":"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","sourcesContent":["import { StoryObj } from '@storybook/web-components';\nimport { expect, fn, waitFor } from '@storybook/test';\nimport { range } from 'remeda';\nimport { TimeredCounter } from '../../src/index.js';\nimport { equal as _equal, NoUndefinedField, sleep } from '../utils/index.js';\n\nexport async function animationEvents<T, TC extends TimeredCounter>(\n context: Parameters<NoUndefinedField<StoryObj>['play']>[0],\n {\n counter,\n list = range(0, 5).map(v => v * 10) as T[],\n setBy,\n equal = _equal,\n }: {\n counter: TC;\n list?: T[];\n setBy: (counter: TC, key: string, value: T) => void;\n equal?: (counter: TimeredCounter, a: any, b: any) => Promise<void>;\n },\n) {\n const { step, args } = context;\n\n setBy(counter, 'value', list[0]);\n await sleep((args.animationOptions.duration ?? 100) + 10);\n\n const timeredCounterAnimationStartListener = fn();\n const timeredCounterAnimationEndListener = fn();\n counter.addEventListener(\n 'timered-counter-animation-start',\n timeredCounterAnimationStartListener,\n );\n counter.addEventListener(\n 'timered-counter-animation-end',\n timeredCounterAnimationEndListener,\n );\n\n await step('Incrementing the value and watching the events', async () => {\n for await (const [index, value] of list.entries()) {\n setBy(counter, 'value', value);\n\n await waitFor(\n () =>\n expect(timeredCounterAnimationStartListener).toHaveBeenCalledTimes(\n index,\n ),\n { timeout: (args.animationOptions.duration ?? 100) + 1000 },\n );\n await waitFor(\n () =>\n expect(timeredCounterAnimationEndListener).toHaveBeenCalledTimes(\n index,\n ),\n { timeout: (args.animationOptions.duration ?? 100) + 1000 },\n );\n\n await equal(counter, counter.value, value);\n }\n });\n timeredCounterAnimationStartListener.mockReset();\n timeredCounterAnimationEndListener.mockReset();\n\n await step('Decrementing the value and watching the events', async () => {\n for await (const [index, value] of list.slice().reverse().entries()) {\n setBy(counter, 'value', value);\n\n await waitFor(\n () =>\n expect(timeredCounterAnimationStartListener).toHaveBeenCalledTimes(\n index,\n ),\n { timeout: (args.animationOptions.duration ?? 100) + 1000 },\n );\n await waitFor(\n () =>\n expect(timeredCounterAnimationEndListener).toHaveBeenCalledTimes(\n index,\n ),\n { timeout: (args.animationOptions.duration ?? 100) + 1000 },\n );\n\n await equal(counter, counter.value, value);\n }\n });\n timeredCounterAnimationStartListener.mockReset();\n timeredCounterAnimationEndListener.mockReset();\n\n counter.removeEventListener(\n 'timered-counter-animation-start',\n timeredCounterAnimationStartListener,\n );\n counter.removeEventListener(\n 'timered-counter-animation-end',\n timeredCounterAnimationEndListener,\n );\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { StoryObj } from '@storybook/web-components';
2
+ import { TimeredCounter } from '../../src/index.js';
3
+ import { NoUndefinedField } from '../utils/index.js';
4
+ export declare function animationOptions<T, TC extends TimeredCounter>(context: Parameters<NoUndefinedField<StoryObj>['play']>[0], { counter, list, setBy, }: {
5
+ counter: TC;
6
+ list?: T[];
7
+ setBy: (counter: TC, key: string, value: T) => void;
8
+ }): Promise<void>;
@@ -0,0 +1,25 @@
1
+ import { expect, fn, waitFor } from '@storybook/test';
2
+ export async function animationOptions(context, { counter, list = [114514], setBy, }) {
3
+ const { step, args } = context;
4
+ const timeredCounterAnimationEndListener = fn();
5
+ counter.addEventListener('timered-counter-animation-end', timeredCounterAnimationEndListener);
6
+ await step('Delaying each part by 100ms', async () => {
7
+ counter.animationOptionsDynamic = ({ preprocessData }) => {
8
+ let count = 0;
9
+ return preprocessData.map(part => part.map(() => ({
10
+ delay: count++ * (args.animationOptions.duration ?? 100),
11
+ })));
12
+ };
13
+ setBy(counter, 'value', list[0]);
14
+ // 等待 parts 更新
15
+ await Promise.resolve();
16
+ await waitFor(() => expect(timeredCounterAnimationEndListener).toHaveBeenCalledTimes(1), {
17
+ timeout: (counter.parts.map(({ digits }) => digits).flat().length + 1) *
18
+ (args.animationOptions.duration ?? 100),
19
+ });
20
+ counter.animationOptionsDynamic = undefined;
21
+ });
22
+ timeredCounterAnimationEndListener.mockReset();
23
+ counter.removeEventListener('timered-counter-animation-end', timeredCounterAnimationEndListener);
24
+ }
25
+ //# sourceMappingURL=animation-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation-options.js","sourceRoot":"","sources":["../../../stories/story-parts/animation-options.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAItD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA0D,EAC1D,EACE,OAAO,EACP,IAAI,GAAG,CAAC,MAAM,CAAQ,EACtB,KAAK,GAKN;IAED,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAE/B,MAAM,kCAAkC,GAAG,EAAE,EAAE,CAAC;IAChD,OAAO,CAAC,gBAAgB,CACtB,+BAA+B,EAC/B,kCAAkC,CACnC,CAAC;IAEF,MAAM,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QACnD,OAAO,CAAC,uBAAuB,GAAG,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;YACvD,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;gBACd,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,IAAI,GAAG,CAAC;aACzD,CAAC,CAAC,CACJ,CAAC;QACJ,CAAC,CAAC;QAEF,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjC,cAAc;QACd,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAExB,MAAM,OAAO,CACX,GAAG,EAAE,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EACzE;YACE,OAAO,EACL,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC7D,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,IAAI,GAAG,CAAC;SAC1C,CACF,CAAC;QAEF,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,kCAAkC,CAAC,SAAS,EAAE,CAAC;IAE/C,OAAO,CAAC,mBAAmB,CACzB,+BAA+B,EAC/B,kCAAkC,CACnC,CAAC;AACJ,CAAC","sourcesContent":["import { StoryObj } from '@storybook/web-components';\nimport { expect, fn, waitFor } from '@storybook/test';\nimport { TimeredCounter } from '../../src/index.js';\nimport { NoUndefinedField } from '../utils/index.js';\n\nexport async function animationOptions<T, TC extends TimeredCounter>(\n context: Parameters<NoUndefinedField<StoryObj>['play']>[0],\n {\n counter,\n list = [114514] as T[],\n setBy,\n }: {\n counter: TC;\n list?: T[];\n setBy: (counter: TC, key: string, value: T) => void;\n },\n) {\n const { step, args } = context;\n\n const timeredCounterAnimationEndListener = fn();\n counter.addEventListener(\n 'timered-counter-animation-end',\n timeredCounterAnimationEndListener,\n );\n\n await step('Delaying each part by 100ms', async () => {\n counter.animationOptionsDynamic = ({ preprocessData }) => {\n let count = 0;\n return preprocessData.map(part =>\n part.map(() => ({\n delay: count++ * (args.animationOptions.duration ?? 100),\n })),\n );\n };\n\n setBy(counter, 'value', list[0]);\n\n // 等待 parts 更新\n await Promise.resolve();\n\n await waitFor(\n () => expect(timeredCounterAnimationEndListener).toHaveBeenCalledTimes(1),\n {\n timeout:\n (counter.parts.map(({ digits }) => digits).flat().length + 1) *\n (args.animationOptions.duration ?? 100),\n },\n );\n\n counter.animationOptionsDynamic = undefined;\n });\n timeredCounterAnimationEndListener.mockReset();\n\n counter.removeEventListener(\n 'timered-counter-animation-end',\n timeredCounterAnimationEndListener,\n );\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { StoryObj } from '@storybook/web-components';
2
+ import { TimeredCounter } from '../../src/index.js';
3
+ import { NoUndefinedField } from '../utils/index.js';
4
+ export declare function bigNumber<TC extends TimeredCounter>(context: Parameters<NoUndefinedField<StoryObj>['play']>[0], { counter, setBy, equal, }: {
5
+ counter: TC;
6
+ setBy: (counter: TC, key: string, value: string) => void;
7
+ equal?: (counter: TimeredCounter, a: any, b: any) => Promise<void>;
8
+ }): Promise<void>;