@mks2508/mks-ui 0.5.7 → 0.5.8

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 (262) hide show
  1. package/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts +2 -0
  2. package/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts.map +1 -1
  3. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts +1 -1
  4. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts.map +1 -1
  5. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.js +173 -43
  6. package/dist/react-ui/ui/DynamicToggle/{DynamicToggle-DOR3Ld-k.css → DynamicToggle-DJLwEkHr.css} +12 -19
  7. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.css +12 -20
  8. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts +1 -0
  9. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts.map +1 -1
  10. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.js +7 -1
  11. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts +55 -31
  12. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts.map +1 -1
  13. package/dist/react-ui/ui/DynamicToggle/index.d.ts +9 -3
  14. package/dist/react-ui/ui/DynamicToggle/index.d.ts.map +1 -1
  15. package/dist/react-ui/ui/DynamicToggle/index.js +47 -34
  16. package/package.json +52 -13
  17. package/src/assets/react.svg +0 -1
  18. package/src/core/index.ts +0 -7
  19. package/src/core/types.ts +0 -82
  20. package/src/css.d.ts +0 -7
  21. package/src/index.css +0 -129
  22. package/src/index.ts +0 -29
  23. package/src/react-ui/blocks/Terminal/ResttyAdapter.ts +0 -278
  24. package/src/react-ui/blocks/Terminal/Terminal.adapter.ts +0 -97
  25. package/src/react-ui/blocks/Terminal/Terminal.theme.restty.ts +0 -155
  26. package/src/react-ui/blocks/Terminal/Terminal.theme.ts +0 -80
  27. package/src/react-ui/blocks/Terminal/Terminal.types.ts +0 -438
  28. package/src/react-ui/blocks/Terminal/TerminalDisplay.styles.ts +0 -38
  29. package/src/react-ui/blocks/Terminal/TerminalDisplay.tsx +0 -254
  30. package/src/react-ui/blocks/Terminal/TerminalDisplay.types.ts +0 -73
  31. package/src/react-ui/blocks/Terminal/TerminalPanel.tsx +0 -269
  32. package/src/react-ui/blocks/Terminal/TerminalRestty.tsx +0 -326
  33. package/src/react-ui/blocks/Terminal/TerminalXterm.tsx +0 -230
  34. package/src/react-ui/blocks/Terminal/XTermAdapter.ts +0 -163
  35. package/src/react-ui/blocks/Terminal/chrome.ts +0 -25
  36. package/src/react-ui/blocks/Terminal/components/LogLineBadges.tsx +0 -316
  37. package/src/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.tsx +0 -218
  38. package/src/react-ui/blocks/Terminal/components/SyntaxHighlight.tsx +0 -386
  39. package/src/react-ui/blocks/Terminal/components/TerminalLogBadge.tsx +0 -67
  40. package/src/react-ui/blocks/Terminal/components/index.ts +0 -10
  41. package/src/react-ui/blocks/Terminal/display.ts +0 -46
  42. package/src/react-ui/blocks/Terminal/hooks/index.ts +0 -22
  43. package/src/react-ui/blocks/Terminal/hooks/useTerminalSettings.ts +0 -229
  44. package/src/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.ts +0 -292
  45. package/src/react-ui/blocks/Terminal/index.ts +0 -111
  46. package/src/react-ui/blocks/Terminal/panel/LogLinesViewer.tsx +0 -330
  47. package/src/react-ui/blocks/Terminal/panel/TerminalDebugPanel.tsx +0 -242
  48. package/src/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.tsx +0 -202
  49. package/src/react-ui/blocks/Terminal/panel/TerminalFilterTabs.tsx +0 -140
  50. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx +0 -68
  51. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.ts +0 -85
  52. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx +0 -383
  53. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.tsx +0 -439
  54. package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.tsx +0 -550
  55. package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.ts +0 -259
  56. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.ts +0 -75
  57. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.tsx +0 -266
  58. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.ts +0 -82
  59. package/src/react-ui/blocks/Terminal/panel/TerminalPanelFooter.tsx +0 -112
  60. package/src/react-ui/blocks/Terminal/panel/TerminalPanelHeader.tsx +0 -178
  61. package/src/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.tsx +0 -203
  62. package/src/react-ui/blocks/Terminal/panel/TerminalSessionControl.tsx +0 -252
  63. package/src/react-ui/blocks/Terminal/panel/TerminalSessionTabs.tsx +0 -334
  64. package/src/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.tsx +0 -261
  65. package/src/react-ui/blocks/Terminal/panel/TerminalThemeSelector.tsx +0 -248
  66. package/src/react-ui/blocks/Terminal/panel/index.ts +0 -72
  67. package/src/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.css +0 -59
  68. package/src/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.css +0 -59
  69. package/src/react-ui/blocks/Terminal/parsing/BadgeFormatter.ts +0 -180
  70. package/src/react-ui/blocks/Terminal/parsing/HttpLogParser.ts +0 -248
  71. package/src/react-ui/blocks/Terminal/parsing/LogParser.types.ts +0 -283
  72. package/src/react-ui/blocks/Terminal/parsing/LogParserService.ts +0 -686
  73. package/src/react-ui/blocks/Terminal/parsing/MultilineAggregator.ts +0 -466
  74. package/src/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.ts +0 -343
  75. package/src/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.ts +0 -167
  76. package/src/react-ui/blocks/Terminal/parsing/TableParser.ts +0 -348
  77. package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.ts +0 -251
  78. package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.ts +0 -390
  79. package/src/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.ts +0 -320
  80. package/src/react-ui/blocks/Terminal/parsing/ansi/index.ts +0 -20
  81. package/src/react-ui/blocks/Terminal/parsing/index.ts +0 -69
  82. package/src/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.ts +0 -68
  83. package/src/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.ts +0 -436
  84. package/src/react-ui/blocks/Terminal/parsing/levels/index.ts +0 -14
  85. package/src/react-ui/blocks/index.ts +0 -11
  86. package/src/react-ui/components/MorphingPopover/MorphingPopover.types.ts +0 -49
  87. package/src/react-ui/components/MorphingPopover/index.tsx +0 -186
  88. package/src/react-ui/components/MorphingPopover/morphing-popover.module.css +0 -153
  89. package/src/react-ui/components/index.ts +0 -9
  90. package/src/react-ui/hooks/Animation/UseAutoHeight.tsx +0 -123
  91. package/src/react-ui/hooks/DOM/UseIsInView.tsx +0 -44
  92. package/src/react-ui/hooks/Formatting/UseListFormat.ts +0 -134
  93. package/src/react-ui/hooks/State/UseControlledState.tsx +0 -57
  94. package/src/react-ui/hooks/State/UseDataState.tsx +0 -76
  95. package/src/react-ui/hooks/index.ts +0 -20
  96. package/src/react-ui/icons/index.ts +0 -12
  97. package/src/react-ui/icons/lucide-animated/activity.tsx +0 -109
  98. package/src/react-ui/icons/lucide-animated/arrow-down-to-line.tsx +0 -51
  99. package/src/react-ui/icons/lucide-animated/arrow-up.tsx +0 -50
  100. package/src/react-ui/icons/lucide-animated/bell-electric.tsx +0 -124
  101. package/src/react-ui/icons/lucide-animated/bell.tsx +0 -93
  102. package/src/react-ui/icons/lucide-animated/bot.tsx +0 -122
  103. package/src/react-ui/icons/lucide-animated/box.tsx +0 -117
  104. package/src/react-ui/icons/lucide-animated/check.tsx +0 -21
  105. package/src/react-ui/icons/lucide-animated/circle-check.tsx +0 -107
  106. package/src/react-ui/icons/lucide-animated/delete.tsx +0 -133
  107. package/src/react-ui/icons/lucide-animated/download.tsx +0 -99
  108. package/src/react-ui/icons/lucide-animated/edit-2.tsx +0 -21
  109. package/src/react-ui/icons/lucide-animated/globe.tsx +0 -23
  110. package/src/react-ui/icons/lucide-animated/home.tsx +0 -103
  111. package/src/react-ui/icons/lucide-animated/index.ts +0 -38
  112. package/src/react-ui/icons/lucide-animated/layers.tsx +0 -23
  113. package/src/react-ui/icons/lucide-animated/layout-panel-top.tsx +0 -143
  114. package/src/react-ui/icons/lucide-animated/list.tsx +0 -54
  115. package/src/react-ui/icons/lucide-animated/package.tsx +0 -24
  116. package/src/react-ui/icons/lucide-animated/palette.tsx +0 -25
  117. package/src/react-ui/icons/lucide-animated/plus.tsx +0 -92
  118. package/src/react-ui/icons/lucide-animated/refresh-cw.tsx +0 -24
  119. package/src/react-ui/icons/lucide-animated/rocket.tsx +0 -24
  120. package/src/react-ui/icons/lucide-animated/save.tsx +0 -23
  121. package/src/react-ui/icons/lucide-animated/search.tsx +0 -94
  122. package/src/react-ui/icons/lucide-animated/settings.tsx +0 -92
  123. package/src/react-ui/icons/lucide-animated/terminal.tsx +0 -46
  124. package/src/react-ui/icons/lucide-animated/trash-2.tsx +0 -25
  125. package/src/react-ui/icons/lucide-animated/trending-down.tsx +0 -151
  126. package/src/react-ui/icons/lucide-animated/trending-up.tsx +0 -150
  127. package/src/react-ui/icons/lucide-animated/type.tsx +0 -23
  128. package/src/react-ui/icons/lucide-animated/upload.tsx +0 -23
  129. package/src/react-ui/icons/lucide-animated/x.tsx +0 -102
  130. package/src/react-ui/index.ts +0 -30
  131. package/src/react-ui/lib/get-strict-context.tsx +0 -56
  132. package/src/react-ui/lib/icon-wrapper.tsx +0 -70
  133. package/src/react-ui/lib/index.ts +0 -9
  134. package/src/react-ui/lib/utils.ts +0 -24
  135. package/src/react-ui/primitives/AutoHeight/index.tsx +0 -74
  136. package/src/react-ui/primitives/CountingNumber/index.tsx +0 -147
  137. package/src/react-ui/primitives/Highlight/Highlight.types.ts +0 -136
  138. package/src/react-ui/primitives/Highlight/index.tsx +0 -577
  139. package/src/react-ui/primitives/Slot/index.tsx +0 -128
  140. package/src/react-ui/primitives/index.ts +0 -16
  141. package/src/react-ui/primitives/waapi/Gooey/Gooey.types.ts +0 -141
  142. package/src/react-ui/primitives/waapi/Gooey/GooeyCanvas.tsx +0 -217
  143. package/src/react-ui/primitives/waapi/Gooey/GooeyFilter.tsx +0 -77
  144. package/src/react-ui/primitives/waapi/Gooey/MorphPath.tsx +0 -58
  145. package/src/react-ui/primitives/waapi/Gooey/gooey-utils.ts +0 -253
  146. package/src/react-ui/primitives/waapi/Gooey/index.ts +0 -50
  147. package/src/react-ui/primitives/waapi/Gooey/useMorphPath.ts +0 -48
  148. package/src/react-ui/primitives/waapi/Morph/Morph.types.ts +0 -106
  149. package/src/react-ui/primitives/waapi/Morph/MorphContext.tsx +0 -21
  150. package/src/react-ui/primitives/waapi/Morph/index.tsx +0 -56
  151. package/src/react-ui/primitives/waapi/Morph/techniques/index.ts +0 -12
  152. package/src/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.ts +0 -89
  153. package/src/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.ts +0 -176
  154. package/src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts +0 -87
  155. package/src/react-ui/primitives/waapi/Morph/useMorph.ts +0 -101
  156. package/src/react-ui/primitives/waapi/Reorder/Reorder.types.ts +0 -177
  157. package/src/react-ui/primitives/waapi/Reorder/index.tsx +0 -260
  158. package/src/react-ui/primitives/waapi/Reorder/useReorder.ts +0 -47
  159. package/src/react-ui/primitives/waapi/Reorder/useReorderPresence.ts +0 -209
  160. package/src/react-ui/primitives/waapi/Reorder/utils/separatorCoordination.ts +0 -104
  161. package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.styles.ts +0 -14
  162. package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.types.ts +0 -84
  163. package/src/react-ui/primitives/waapi/SlidingNumber/index.tsx +0 -474
  164. package/src/react-ui/primitives/waapi/SlidingText/SlidingText.styles.ts +0 -32
  165. package/src/react-ui/primitives/waapi/SlidingText/SlidingText.types.ts +0 -69
  166. package/src/react-ui/primitives/waapi/SlidingText/index.tsx +0 -140
  167. package/src/react-ui/primitives/waapi/core/animationConstants.ts +0 -215
  168. package/src/react-ui/primitives/waapi/core/index.ts +0 -53
  169. package/src/react-ui/primitives/waapi/core/types.ts +0 -200
  170. package/src/react-ui/primitives/waapi/core/useAnimationOrchestrator.ts +0 -430
  171. package/src/react-ui/primitives/waapi/core/useElementRegistry.ts +0 -81
  172. package/src/react-ui/primitives/waapi/core/useFLIPAnimation.ts +0 -138
  173. package/src/react-ui/primitives/waapi/core/usePositionCapture.ts +0 -106
  174. package/src/react-ui/primitives/waapi/index.ts +0 -139
  175. package/src/react-ui/styles/animations.css +0 -369
  176. package/src/react-ui/ui/Accordion/Accordion.styles.ts +0 -72
  177. package/src/react-ui/ui/Accordion/Accordion.types.ts +0 -199
  178. package/src/react-ui/ui/Accordion/index.tsx +0 -362
  179. package/src/react-ui/ui/AlertDialog/AlertDialog.styles.ts +0 -38
  180. package/src/react-ui/ui/AlertDialog/AlertDialog.types.ts +0 -296
  181. package/src/react-ui/ui/AlertDialog/index.tsx +0 -540
  182. package/src/react-ui/ui/Badge/Badge.styles.ts +0 -43
  183. package/src/react-ui/ui/Badge/Badge.types.ts +0 -26
  184. package/src/react-ui/ui/Badge/index.tsx +0 -34
  185. package/src/react-ui/ui/Button/Button.styles.ts +0 -57
  186. package/src/react-ui/ui/Button/Button.types.ts +0 -63
  187. package/src/react-ui/ui/Button/index.tsx +0 -155
  188. package/src/react-ui/ui/Card/Card.styles.ts +0 -32
  189. package/src/react-ui/ui/Card/Card.types.ts +0 -39
  190. package/src/react-ui/ui/Card/index.tsx +0 -130
  191. package/src/react-ui/ui/Checkbox/Checkbox.styles.ts +0 -40
  192. package/src/react-ui/ui/Checkbox/Checkbox.types.ts +0 -98
  193. package/src/react-ui/ui/Checkbox/index.tsx +0 -233
  194. package/src/react-ui/ui/Combobox/Combobox.styles.ts +0 -34
  195. package/src/react-ui/ui/Combobox/Combobox.types.ts +0 -89
  196. package/src/react-ui/ui/Combobox/index.tsx +0 -331
  197. package/src/react-ui/ui/CornerBracket/CornerBracket.styles.ts +0 -38
  198. package/src/react-ui/ui/CornerBracket/CornerBracket.types.ts +0 -15
  199. package/src/react-ui/ui/CornerBracket/index.tsx +0 -49
  200. package/src/react-ui/ui/DataCard/DataCard.styles.ts +0 -94
  201. package/src/react-ui/ui/DataCard/DataCard.types.ts +0 -125
  202. package/src/react-ui/ui/DataCard/index.tsx +0 -340
  203. package/src/react-ui/ui/Dialog/Dialog.styles.ts +0 -59
  204. package/src/react-ui/ui/Dialog/Dialog.types.ts +0 -284
  205. package/src/react-ui/ui/Dialog/index.tsx +0 -452
  206. package/src/react-ui/ui/DropdownMenu/DropdownMenu.styles.ts +0 -35
  207. package/src/react-ui/ui/DropdownMenu/DropdownMenu.types.ts +0 -81
  208. package/src/react-ui/ui/DropdownMenu/index.tsx +0 -300
  209. package/src/react-ui/ui/DynamicToggle/DynamicToggle.css +0 -376
  210. package/src/react-ui/ui/DynamicToggle/DynamicToggle.styles.ts +0 -85
  211. package/src/react-ui/ui/DynamicToggle/DynamicToggle.types.ts +0 -180
  212. package/src/react-ui/ui/DynamicToggle/index.tsx +0 -316
  213. package/src/react-ui/ui/DynamicToggle/prototype-v7-ios.html +0 -413
  214. package/src/react-ui/ui/DynamicToggle/prototype-v7.html +0 -615
  215. package/src/react-ui/ui/DynamicToggle/prototype-v8-gooey-safari.html +0 -560
  216. package/src/react-ui/ui/DynamicToggle/prototype-v8b-react-structure.html +0 -227
  217. package/src/react-ui/ui/DynamicToggle/prototype.html +0 -419
  218. package/src/react-ui/ui/Field/Field.styles.ts +0 -47
  219. package/src/react-ui/ui/Field/Field.types.ts +0 -60
  220. package/src/react-ui/ui/Field/index.tsx +0 -254
  221. package/src/react-ui/ui/Input/Input.styles.ts +0 -11
  222. package/src/react-ui/ui/Input/Input.types.ts +0 -10
  223. package/src/react-ui/ui/Input/index.tsx +0 -32
  224. package/src/react-ui/ui/InputGroup/InputGroup.styles.ts +0 -53
  225. package/src/react-ui/ui/InputGroup/InputGroup.types.ts +0 -44
  226. package/src/react-ui/ui/InputGroup/index.tsx +0 -149
  227. package/src/react-ui/ui/Label/Label.styles.ts +0 -10
  228. package/src/react-ui/ui/Label/Label.types.ts +0 -9
  229. package/src/react-ui/ui/Label/index.tsx +0 -27
  230. package/src/react-ui/ui/Menu/Menu.styles.ts +0 -71
  231. package/src/react-ui/ui/Menu/Menu.types.ts +0 -425
  232. package/src/react-ui/ui/Menu/index.tsx +0 -900
  233. package/src/react-ui/ui/Popover/Popover.styles.ts +0 -55
  234. package/src/react-ui/ui/Popover/Popover.types.ts +0 -261
  235. package/src/react-ui/ui/Popover/index.tsx +0 -422
  236. package/src/react-ui/ui/Progress/Progress.styles.ts +0 -36
  237. package/src/react-ui/ui/Progress/Progress.types.ts +0 -162
  238. package/src/react-ui/ui/Progress/index.tsx +0 -254
  239. package/src/react-ui/ui/Select/Select.styles.ts +0 -30
  240. package/src/react-ui/ui/Select/Select.types.ts +0 -51
  241. package/src/react-ui/ui/Select/index.tsx +0 -225
  242. package/src/react-ui/ui/Separator/Separator.styles.ts +0 -10
  243. package/src/react-ui/ui/Separator/Separator.types.ts +0 -10
  244. package/src/react-ui/ui/Separator/index.tsx +0 -37
  245. package/src/react-ui/ui/Switch/Switch.styles.ts +0 -50
  246. package/src/react-ui/ui/Switch/Switch.types.ts +0 -155
  247. package/src/react-ui/ui/Switch/index.tsx +0 -253
  248. package/src/react-ui/ui/Tabs/Tabs.css +0 -39
  249. package/src/react-ui/ui/Tabs/Tabs.styles.ts +0 -148
  250. package/src/react-ui/ui/Tabs/Tabs.types.ts +0 -255
  251. package/src/react-ui/ui/Tabs/index.tsx +0 -529
  252. package/src/react-ui/ui/TextFlow/TextFlow.styles.ts +0 -36
  253. package/src/react-ui/ui/TextFlow/TextFlow.types.ts +0 -118
  254. package/src/react-ui/ui/TextFlow/index.tsx +0 -276
  255. package/src/react-ui/ui/Textarea/Textarea.styles.ts +0 -10
  256. package/src/react-ui/ui/Textarea/Textarea.types.ts +0 -9
  257. package/src/react-ui/ui/Textarea/index.tsx +0 -27
  258. package/src/react-ui/ui/Tooltip/Tooltip.styles.ts +0 -43
  259. package/src/react-ui/ui/Tooltip/Tooltip.types.ts +0 -253
  260. package/src/react-ui/ui/Tooltip/index.tsx +0 -394
  261. package/src/react-ui/ui/index.ts +0 -41
  262. package/src/types/css-modules.d.ts +0 -18
@@ -1,260 +0,0 @@
1
- "use client";
2
-
3
- import React, { useMemo, useState, useEffect, useRef, useCallback, useImperativeHandle, Children, isValidElement, cloneElement, forwardRef, type CSSProperties, type ReactNode, type ReactElement } from 'react';
4
- import { useReorder } from './useReorder';
5
- import type { IReorderProps, ReorderLayout, DurationConfig } from './Reorder.types';
6
- import { cn } from '@/react-ui/lib/utils';
7
-
8
- function getDuration(config: DurationConfig | undefined, type: 'enter' | 'exit'): number | undefined {
9
- if (config === undefined) return undefined;
10
- if (typeof config === 'number') return config;
11
- return config[type];
12
- }
13
-
14
- const layoutStyles: Record<ReorderLayout, CSSProperties> = {
15
- auto: { position: 'relative' },
16
- horizontal: { display: 'flex', flexDirection: 'row', flexWrap: 'wrap', alignItems: 'center', position: 'relative' },
17
- 'inline-horizontal': { display: 'inline-flex', flexDirection: 'row', flexWrap: 'nowrap', alignItems: 'center', position: 'relative' },
18
- vertical: { display: 'flex', flexDirection: 'column', position: 'relative' },
19
- grid: { display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(100px, 1fr))', gap: '8px', position: 'relative' }
20
- };
21
-
22
- interface IChildRecord {
23
- key: string;
24
- element: ReactElement;
25
- }
26
-
27
- /**
28
- * Reorder - Agnostic container for reorderable items with FLIP animations
29
- *
30
- * @example
31
- * ```tsx
32
- * <Reorder
33
- * layout="horizontal"
34
- * onItemExit={(id) => handleRemove(id)}
35
- * >
36
- * {items.map(item => (
37
- * <div key={item.id}>{item.name}</div>
38
- * ))}
39
- * </Reorder>
40
- * ```
41
- */
42
- const ReorderRoot = forwardRef<{
43
- startItemExit: (id: string) => Promise<void>;
44
- startItemEnter: (id: string) => Promise<void>;
45
- isAnimating: (id?: string) => boolean;
46
- }, IReorderProps>(({
47
- children,
48
- stagger,
49
- duration,
50
- layout = 'auto',
51
- className = '',
52
- flipBehavior,
53
- exitPositionStrategy,
54
- onItemExit,
55
- onItemEnter
56
- }, ref) => {
57
- // Completion handler - removes from displayChildren
58
- const handleAnimationComplete = useCallback((id: string) => {
59
- setDisplayChildren(prev => prev.filter(child => child.key !== id));
60
- }, []);
61
-
62
- // Reorder hook — delegates to full FLIP orchestrator
63
- const reorder = useReorder({
64
- enterDuration: getDuration(duration, 'enter'),
65
- exitDuration: getDuration(duration, 'exit'),
66
- flipBehavior,
67
- exitPositionStrategy,
68
- onComplete: handleAnimationComplete
69
- });
70
-
71
- // Expose reorder methods via ref
72
- useImperativeHandle(ref, () => ({
73
- startItemExit: reorder.startItemExit,
74
- startItemEnter: reorder.startItemEnter,
75
- isAnimating: reorder.isAnimating
76
- }), [reorder.startItemExit, reorder.startItemEnter, reorder.isAnimating]);
77
-
78
- // Store reorder functions in refs for stable callbacks
79
- const startExitRef = useRef(reorder.startItemExit);
80
- const startEnterRef = useRef(reorder.startItemEnter);
81
- useEffect(() => {
82
- startExitRef.current = reorder.startItemExit;
83
- startEnterRef.current = reorder.startItemEnter;
84
- }, [reorder.startItemExit, reorder.startItemEnter]);
85
-
86
- // Extract current children as records
87
- const currentChildren = useMemo<IChildRecord[]>(() => {
88
- const records: IChildRecord[] = [];
89
- Children.forEach(children, child => {
90
- if (isValidElement(child) && child.key != null) {
91
- records.push({
92
- key: String(child.key),
93
- element: child as ReactElement
94
- });
95
- }
96
- });
97
- return records;
98
- }, [children]);
99
-
100
- // Internal display state
101
- const [displayChildren, setDisplayChildren] = useState<IChildRecord[]>(currentChildren);
102
-
103
- // Track which keys are currently exiting
104
- const exitingKeysRef = useRef<Set<string>>(new Set());
105
-
106
- // Calculate stagger delay
107
- const getStaggerDelay = useCallback((index: number, type: 'enter' | 'exit'): number => {
108
- if (!stagger) return 0;
109
- if (typeof stagger === 'number') return stagger * index;
110
- return (stagger[type] ?? 0) * index;
111
- }, [stagger]);
112
-
113
- // Detect changes and sync displayChildren
114
- useEffect(() => {
115
- const currentKeys = new Set(currentChildren.map(c => c.key));
116
- const displayKeys = new Set(displayChildren.map(c => c.key));
117
-
118
- // Removals: in display but not in current, and not already exiting
119
- const removed = displayChildren.filter(c =>
120
- !currentKeys.has(c.key) && !exitingKeysRef.current.has(c.key)
121
- );
122
-
123
- // Additions: in current but not in display
124
- const added = currentChildren.filter(c => !displayKeys.has(c.key));
125
-
126
- // No structural changes
127
- if (removed.length === 0 && added.length === 0) {
128
- const hasUpdates = currentChildren.some((c) => {
129
- const displayChild = displayChildren.find(dc => dc.key === c.key);
130
- return displayChild && displayChild.element !== c.element;
131
- });
132
-
133
- if (hasUpdates) {
134
- setDisplayChildren(prev => prev.map(dc => {
135
- if (exitingKeysRef.current.has(dc.key)) return dc;
136
- const currentChild = currentChildren.find(c => c.key === dc.key);
137
- return currentChild ?? dc;
138
- }));
139
- }
140
- return;
141
- }
142
-
143
- // Handle removals - start exit animations
144
- removed.forEach((child, index) => {
145
- const delay = getStaggerDelay(index, 'exit');
146
- exitingKeysRef.current.add(child.key);
147
-
148
- const processExit = () => {
149
- onItemExit?.(child.key);
150
-
151
- // Start exit animation
152
- startExitRef.current(child.key).finally(() => {
153
- exitingKeysRef.current.delete(child.key);
154
- });
155
- };
156
-
157
- if (delay > 0) {
158
- setTimeout(processExit, delay);
159
- } else {
160
- processExit();
161
- }
162
- });
163
-
164
- // Handle additions - merge into display
165
- if (added.length > 0) {
166
- const exitingChildren = displayChildren.filter(c => !currentKeys.has(c.key));
167
- let result = [...currentChildren];
168
-
169
- exitingChildren.forEach(ec => {
170
- const oldIdx = displayChildren.findIndex(c => c.key === ec.key);
171
- if (oldIdx !== -1 && oldIdx <= result.length) {
172
- result.splice(oldIdx, 0, ec);
173
- }
174
- });
175
-
176
- setDisplayChildren(result);
177
-
178
- added.forEach((child, index) => {
179
- const delay = getStaggerDelay(index, 'enter');
180
-
181
- const processEnter = () => {
182
- onItemEnter?.(child.key);
183
- };
184
-
185
- if (delay > 0) {
186
- setTimeout(processEnter, delay);
187
- } else {
188
- processEnter();
189
- }
190
- });
191
- }
192
- }, [currentChildren, displayChildren, getStaggerDelay, onItemExit, onItemEnter]);
193
-
194
- // Build present children with data attributes and ref registration
195
- const presentChildren = useMemo<ReactNode[]>(() => {
196
- const currentKeys = new Set(currentChildren.map(c => c.key));
197
-
198
- return displayChildren.map(({ key, element }) => {
199
- const isNewElement = currentKeys.has(key);
200
- const isExiting = exitingKeysRef.current.has(key);
201
-
202
- const elementWithRef = cloneElement(element as ReactElement<any>, {
203
- ref: (el: HTMLElement | null) => {
204
- if (el) {
205
- reorder.registerElement(key, el);
206
-
207
- const currentState = el.dataset.reorderState;
208
-
209
- if (!currentState && isNewElement && !isExiting) {
210
- el.dataset.reorderState = 'entering';
211
- startEnterRef.current(key);
212
- }
213
- } else {
214
- reorder.registerElement(key, null);
215
- }
216
-
217
- // Preserve original ref
218
- const originalRef = (element as any).ref;
219
- if (typeof originalRef === 'function') {
220
- originalRef(el);
221
- } else if (originalRef && typeof originalRef === 'object') {
222
- (originalRef as React.MutableRefObject<HTMLElement | null>).current = el;
223
- }
224
- },
225
- 'data-reorder-id': key
226
- });
227
-
228
- return elementWithRef;
229
- });
230
- }, [displayChildren, currentChildren, reorder.registerElement]);
231
-
232
- const layoutClass = layout !== 'auto' ? `reorder--${layout}` : '';
233
-
234
- return (
235
- <div
236
- className={cn('waapi-reorder-container', 'reorder', layoutClass, className)}
237
- style={layoutStyles[layout]}
238
- >
239
- {presentChildren}
240
- </div>
241
- );
242
- });
243
-
244
- ReorderRoot.displayName = 'Reorder';
245
-
246
- export { ReorderRoot as Reorder };
247
- export type {
248
- IReorderProps,
249
- ReorderLayout,
250
- DurationConfig,
251
- StaggerConfig,
252
- IUseReorderReturn,
253
- IUseReorderConfig,
254
- IReorderItemState,
255
- IReorderContextValue,
256
- IUseReorderPresenceConfig,
257
- IUseReorderPresenceReturn,
258
- FLIPBehavior,
259
- ExitPositionStrategy,
260
- } from './Reorder.types';
@@ -1,47 +0,0 @@
1
- 'use client';
2
- import { useAnimationOrchestrator } from '../core/useAnimationOrchestrator';
3
- import type { IUseReorderReturn, IUseReorderConfig } from './Reorder.types';
4
-
5
- /**
6
- * Hook for managing reorderable lists with FLIP animations.
7
- *
8
- * Architecture: Thin wrapper around useAnimationOrchestrator.
9
- * Delegates all animation logic to the orchestrator and provides
10
- * a stable API surface for the Reorder component.
11
- *
12
- * @param config - Optional reorder configuration (timing, easing, callbacks)
13
- * @returns Reorder API with register, exit, enter, and query methods
14
- *
15
- * @example
16
- * ```tsx
17
- * const reorder = useReorder({
18
- * onComplete: (id) => removeFromList(id)
19
- * });
20
- *
21
- * <div ref={el => reorder.registerElement('item-1', el)}>
22
- * Item 1
23
- * </div>
24
- *
25
- * await reorder.startItemExit('item-1');
26
- * ```
27
- */
28
- export function useReorder(config?: IUseReorderConfig): IUseReorderReturn {
29
- const orchestrator = useAnimationOrchestrator({
30
- enterDuration: config?.enterDuration,
31
- exitDuration: config?.exitDuration,
32
- flipDuration: config?.flipDuration,
33
- enterEasing: config?.enterEasing,
34
- exitEasing: config?.exitEasing,
35
- flipEasing: config?.flipEasing,
36
- flipBehavior: config?.flipBehavior,
37
- exitPositionStrategy: config?.exitPositionStrategy,
38
- onExitComplete: config?.onComplete
39
- });
40
-
41
- return {
42
- ...orchestrator,
43
- registerElement: orchestrator.registerElement,
44
- startItemExit: orchestrator.startExit,
45
- startItemEnter: orchestrator.startEnter
46
- };
47
- }
@@ -1,209 +0,0 @@
1
- 'use client';
2
- import {
3
- useRef,
4
- useCallback,
5
- useMemo,
6
- useLayoutEffect,
7
- useEffect,
8
- Children,
9
- isValidElement,
10
- cloneElement,
11
- type ReactNode,
12
- type ReactElement
13
- } from 'react';
14
- import { useReorder } from './useReorder';
15
- import type {
16
- IUseReorderPresenceConfig,
17
- IUseReorderPresenceReturn
18
- } from './Reorder.types';
19
-
20
- /**
21
- * Hook for managing presence animations in reorderable lists.
22
- *
23
- * Follows the pattern where elements stay in DOM until animation completes.
24
- * Consumer must keep items in their state until onAnimationComplete fires.
25
- * No "ghost" cloning — animations run on actual DOM elements.
26
- *
27
- * @param children - React children with unique keys
28
- * @param config - Presence animation configuration
29
- * @returns Presence API with presentChildren, triggerExit, and state queries
30
- *
31
- * @example
32
- * ```tsx
33
- * const [items, setItems] = useState(INITIAL_ITEMS);
34
- *
35
- * const { presentChildren, triggerExit } = useReorderPresence(
36
- * items.map(item => <div key={item.id}>{item.name}</div>),
37
- * {
38
- * onAnimationComplete: (id) => {
39
- * setItems(prev => prev.filter(item => item.id !== id));
40
- * }
41
- * }
42
- * );
43
- *
44
- * const handleDelete = (id: string) => {
45
- * triggerExit(id);
46
- * };
47
- * ```
48
- */
49
- export function useReorderPresence(
50
- children: ReactNode,
51
- config: IUseReorderPresenceConfig = {}
52
- ): IUseReorderPresenceReturn {
53
- const {
54
- autoAnimate = true,
55
- stagger,
56
- enterDuration,
57
- exitDuration,
58
- flipDuration,
59
- enterEasing,
60
- exitEasing,
61
- flipEasing
62
- } = config;
63
-
64
- const configRef = useRef(config);
65
- useEffect(() => {
66
- configRef.current = config;
67
- }, [config]);
68
-
69
- // Track animating IDs via REF (not state) — like AnimatedTokens
70
- const exitingIdsRef = useRef<Set<string>>(new Set());
71
- const enteringIdsRef = useRef<Set<string>>(new Set());
72
-
73
- // Track previous children keys for change detection
74
- const prevKeysRef = useRef<Set<string>>(new Set());
75
-
76
- const getStaggerDelay = useCallback((index: number, type: 'enter' | 'exit'): number => {
77
- if (!stagger) return 0;
78
- if (typeof stagger === 'number') return stagger * index;
79
- return (stagger[type] ?? 0) * index;
80
- }, [stagger]);
81
-
82
- const handleAnimationComplete = useCallback((id: string) => {
83
- exitingIdsRef.current.delete(id);
84
- configRef.current.onAnimationComplete?.(id);
85
- }, []);
86
-
87
- const reorder = useReorder({
88
- enterDuration,
89
- exitDuration,
90
- flipDuration,
91
- enterEasing,
92
- exitEasing,
93
- flipEasing,
94
- onComplete: handleAnimationComplete
95
- });
96
-
97
- const currentKeys = useMemo(() => {
98
- const keys = new Set<string>();
99
- Children.forEach(children, child => {
100
- if (isValidElement(child) && child.key != null) {
101
- keys.add(String(child.key));
102
- }
103
- });
104
- return keys;
105
- }, [children]);
106
-
107
- // Detect and process changes
108
- useLayoutEffect(() => {
109
- const prevKeys = prevKeysRef.current;
110
-
111
- // Detect additions (in current but not in prev)
112
- const added: string[] = [];
113
- currentKeys.forEach(key => {
114
- if (!prevKeys.has(key) && !enteringIdsRef.current.has(key)) {
115
- added.push(key);
116
- }
117
- });
118
-
119
- // Process additions
120
- if (added.length > 0) {
121
- added.forEach((key, index) => {
122
- const delay = getStaggerDelay(index, 'enter');
123
-
124
- const processEnter = () => {
125
- enteringIdsRef.current.add(key);
126
- configRef.current.onItemEnter?.(key);
127
-
128
- requestAnimationFrame(() => {
129
- reorder.startItemEnter(key).then(() => {
130
- enteringIdsRef.current.delete(key);
131
- });
132
- });
133
- };
134
-
135
- if (delay > 0) {
136
- setTimeout(processEnter, delay);
137
- } else {
138
- processEnter();
139
- }
140
- });
141
- }
142
-
143
- prevKeysRef.current = new Set(currentKeys);
144
- }, [currentKeys, autoAnimate, reorder, getStaggerDelay]);
145
-
146
- // Manual exit trigger
147
- const triggerExit = useCallback((id: string) => {
148
- if (exitingIdsRef.current.has(id)) return;
149
- if (!reorder.registry.has(id)) return;
150
-
151
- exitingIdsRef.current.add(id);
152
- configRef.current.onItemExit?.(id);
153
-
154
- reorder.startItemExit(id);
155
- }, [reorder]);
156
-
157
- const isExiting = useCallback((id: string): boolean => {
158
- return exitingIdsRef.current.has(id);
159
- }, []);
160
-
161
- const isEntering = useCallback((id: string): boolean => {
162
- return enteringIdsRef.current.has(id);
163
- }, []);
164
-
165
- const getExitingIds = useCallback((): string[] => {
166
- return Array.from(exitingIdsRef.current);
167
- }, []);
168
-
169
- const getEnteringIds = useCallback((): string[] => {
170
- return Array.from(enteringIdsRef.current);
171
- }, []);
172
-
173
- // presentChildren — children as-is with data attribute for exiting
174
- const presentChildren = useMemo(() => {
175
- const result: ReactNode[] = [];
176
-
177
- Children.forEach(children, child => {
178
- if (!isValidElement(child)) {
179
- result.push(child);
180
- return;
181
- }
182
-
183
- const key = child.key != null ? String(child.key) : null;
184
- const isCurrentlyExiting = key != null && exitingIdsRef.current.has(key);
185
-
186
- if (isCurrentlyExiting) {
187
- result.push(
188
- cloneElement(child as ReactElement<{ 'data-reorder-state'?: string }>, {
189
- 'data-reorder-state': 'exiting'
190
- })
191
- );
192
- } else {
193
- result.push(child);
194
- }
195
- });
196
-
197
- return result;
198
- }, [children]);
199
-
200
- return {
201
- presentChildren,
202
- triggerExit,
203
- isExiting,
204
- isEntering,
205
- exitingIds: getExitingIds(),
206
- enteringIds: getEnteringIds(),
207
- reorder
208
- };
209
- }
@@ -1,104 +0,0 @@
1
- /**
2
- * Utility functions for separator animation coordination.
3
- *
4
- * When a token exits, determines which separators should animate:
5
- * 1. The exiting token's own separator (if it has one)
6
- * 2. If the exiting token is the last visible, the previous token's separator
7
- *
8
- * @module primitives/waapi/Reorder/utils/separatorCoordination
9
- */
10
-
11
- /**
12
- * Calculate which separator IDs should animate along with an exiting item.
13
- *
14
- * Logic:
15
- * - If the exiting item is NOT the last in the list, animate its own separator
16
- * - If the exiting item IS the last in the list, animate the previous item's separator
17
- * (because the previous item will become the new last and shouldn't have a separator)
18
- *
19
- * @param exitingId - The ID of the item being removed
20
- * @param currentKeys - Set of all current (non-exiting) item keys
21
- * @param exitingIds - Set of all currently exiting item IDs
22
- * @param orderedKeys - Array of keys in render order
23
- * @returns Array of separator IDs to animate
24
- *
25
- * @example
26
- * ```ts
27
- * // Items: [A, B, C, D] with separators after A, B, C
28
- * // Removing C (not last):
29
- * calculateSeparatorCoordination('C', {'A','B','D'}, {'C'}, ['A','B','C','D'])
30
- * // Returns: ['C'] - animate C's separator
31
- *
32
- * // Removing D (last item):
33
- * calculateSeparatorCoordination('D', {'A','B','C'}, {'D'}, ['A','B','C','D'])
34
- * // Returns: ['C'] - animate C's separator (C becomes new last)
35
- * ```
36
- */
37
- export function calculateSeparatorCoordination(
38
- exitingId: string,
39
- currentKeys: Set<string>,
40
- exitingIds: Set<string>,
41
- orderedKeys: string[]
42
- ): string[] {
43
- const additionalSeparators: string[] = [];
44
-
45
- const visibleKeys = orderedKeys.filter(
46
- key => currentKeys.has(key) || exitingIds.has(key)
47
- );
48
-
49
- const indexInVisible = visibleKeys.indexOf(exitingId);
50
- if (indexInVisible === -1) {
51
- return additionalSeparators;
52
- }
53
-
54
- const isLastVisible = indexInVisible === visibleKeys.length - 1;
55
- const isNotLastVisible = indexInVisible < visibleKeys.length - 1;
56
-
57
- if (isNotLastVisible) {
58
- additionalSeparators.push(exitingId);
59
- }
60
-
61
- if (isLastVisible && indexInVisible > 0) {
62
- const previousKey = visibleKeys[indexInVisible - 1];
63
- if (previousKey && !exitingIds.has(previousKey)) {
64
- additionalSeparators.push(previousKey);
65
- }
66
- }
67
-
68
- return additionalSeparators;
69
- }
70
-
71
- /**
72
- * Determine if a separator should be visible based on position and animation state.
73
- *
74
- * @param _tokenId - The token ID to check (unused, kept for API compatibility)
75
- * @param tokenIndex - Index of the token in the visible list
76
- * @param totalVisible - Total number of visible tokens
77
- * @param separatorPhase - Current animation phase of the separator
78
- * @returns Whether the separator should be rendered
79
- */
80
- export function shouldShowSeparator(
81
- _tokenId: string,
82
- tokenIndex: number,
83
- totalVisible: number,
84
- separatorPhase?: 'idle' | 'exit-coordinated' | 'flip-coordinated' | 'completed'
85
- ): boolean {
86
- if (tokenIndex >= totalVisible - 1) {
87
- return false;
88
- }
89
-
90
- if (!separatorPhase) {
91
- return true;
92
- }
93
-
94
- switch (separatorPhase) {
95
- case 'idle':
96
- case 'exit-coordinated':
97
- case 'flip-coordinated':
98
- return true;
99
- case 'completed':
100
- return false;
101
- default:
102
- return true;
103
- }
104
- }
@@ -1,14 +0,0 @@
1
- import { cva, type VariantProps } from 'class-variance-authority';
2
- import type { StyleSlots } from '@/core/types';
3
-
4
- /**
5
- * Style slots for SlidingNumber component
6
- */
7
- export type SlidingNumberSlot = 'root';
8
-
9
- /**
10
- * Base styles for SlidingNumber component
11
- */
12
- export const slidingNumberBaseStyles: StyleSlots<SlidingNumberSlot> = {
13
- root: 'waapi-sliding-number',
14
- };