asterui 0.12.61 → 0.12.63

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 (179) hide show
  1. package/dist/components/Affix.d.ts +2 -0
  2. package/dist/components/Affix.js.map +1 -1
  3. package/dist/components/Alert.d.ts +2 -0
  4. package/dist/components/Alert.js.map +1 -1
  5. package/dist/components/Anchor.d.ts +2 -0
  6. package/dist/components/Anchor.js +79 -75
  7. package/dist/components/Anchor.js.map +1 -1
  8. package/dist/components/Autocomplete.d.ts +1 -0
  9. package/dist/components/Autocomplete.js +115 -110
  10. package/dist/components/Autocomplete.js.map +1 -1
  11. package/dist/components/Avatar.d.ts +4 -0
  12. package/dist/components/Avatar.js.map +1 -1
  13. package/dist/components/Breadcrumb.d.ts +4 -2
  14. package/dist/components/Breadcrumb.js +54 -29
  15. package/dist/components/Breadcrumb.js.map +1 -1
  16. package/dist/components/Browser.d.ts +2 -0
  17. package/dist/components/Browser.js.map +1 -1
  18. package/dist/components/Button.d.ts +5 -1
  19. package/dist/components/Button.js +117 -107
  20. package/dist/components/Button.js.map +1 -1
  21. package/dist/components/Chart.d.ts +1 -0
  22. package/dist/components/Chart.js +31 -30
  23. package/dist/components/Chart.js.map +1 -1
  24. package/dist/components/Chat.d.ts +1 -0
  25. package/dist/components/Chat.js +39 -28
  26. package/dist/components/Chat.js.map +1 -1
  27. package/dist/components/Code.d.ts +2 -0
  28. package/dist/components/Code.js.map +1 -1
  29. package/dist/components/Command.d.ts +5 -2
  30. package/dist/components/Command.js +262 -233
  31. package/dist/components/Command.js.map +1 -1
  32. package/dist/components/Container.d.ts +2 -0
  33. package/dist/components/Container.js.map +1 -1
  34. package/dist/components/ContextMenu.d.ts +4 -0
  35. package/dist/components/ContextMenu.js +157 -122
  36. package/dist/components/ContextMenu.js.map +1 -1
  37. package/dist/components/CopyButton.d.ts +2 -0
  38. package/dist/components/CopyButton.js +9 -8
  39. package/dist/components/CopyButton.js.map +1 -1
  40. package/dist/components/Countdown.d.ts +3 -3
  41. package/dist/components/Countdown.js +49 -47
  42. package/dist/components/Countdown.js.map +1 -1
  43. package/dist/components/Diff.d.ts +3 -3
  44. package/dist/components/Diff.js +14 -10
  45. package/dist/components/Diff.js.map +1 -1
  46. package/dist/components/Divider.d.ts +2 -0
  47. package/dist/components/Divider.js.map +1 -1
  48. package/dist/components/Dock.d.ts +6 -0
  49. package/dist/components/Dock.js +75 -38
  50. package/dist/components/Dock.js.map +1 -1
  51. package/dist/components/Dropdown.js +110 -110
  52. package/dist/components/Dropdown.js.map +1 -1
  53. package/dist/components/Fieldset.d.ts +2 -0
  54. package/dist/components/Fieldset.js.map +1 -1
  55. package/dist/components/FileInput.d.ts +1 -0
  56. package/dist/components/FileInput.js +26 -26
  57. package/dist/components/FileInput.js.map +1 -1
  58. package/dist/components/Filter.d.ts +1 -0
  59. package/dist/components/Filter.js +43 -40
  60. package/dist/components/Filter.js.map +1 -1
  61. package/dist/components/Flex.d.ts +1 -0
  62. package/dist/components/Flex.js +43 -42
  63. package/dist/components/Flex.js.map +1 -1
  64. package/dist/components/FloatButton.d.ts +9 -0
  65. package/dist/components/FloatButton.js +211 -136
  66. package/dist/components/FloatButton.js.map +1 -1
  67. package/dist/components/Footer.d.ts +2 -0
  68. package/dist/components/Footer.js.map +1 -1
  69. package/dist/components/Grid.d.ts +4 -0
  70. package/dist/components/Grid.js.map +1 -1
  71. package/dist/components/Hero.d.ts +2 -0
  72. package/dist/components/Hero.js.map +1 -1
  73. package/dist/components/HoverGallery.d.ts +3 -3
  74. package/dist/components/HoverGallery.js +12 -10
  75. package/dist/components/HoverGallery.js.map +1 -1
  76. package/dist/components/Input.d.ts +1 -0
  77. package/dist/components/Input.js +201 -184
  78. package/dist/components/Input.js.map +1 -1
  79. package/dist/components/Join.d.ts +2 -0
  80. package/dist/components/Join.js.map +1 -1
  81. package/dist/components/Kbd.d.ts +2 -0
  82. package/dist/components/Kbd.js.map +1 -1
  83. package/dist/components/Loading.d.ts +3 -0
  84. package/dist/components/Loading.js +58 -35
  85. package/dist/components/Loading.js.map +1 -1
  86. package/dist/components/Mask.d.ts +2 -2
  87. package/dist/components/Mask.js.map +1 -1
  88. package/dist/components/Masonry.d.ts +1 -0
  89. package/dist/components/Masonry.js +45 -42
  90. package/dist/components/Masonry.js.map +1 -1
  91. package/dist/components/Mention.d.ts +1 -0
  92. package/dist/components/Mention.js +95 -91
  93. package/dist/components/Mention.js.map +1 -1
  94. package/dist/components/MonthCalendar.d.ts +1 -0
  95. package/dist/components/MonthCalendar.js +104 -97
  96. package/dist/components/MonthCalendar.js.map +1 -1
  97. package/dist/components/Navbar.d.ts +2 -0
  98. package/dist/components/Navbar.js.map +1 -1
  99. package/dist/components/Notification.js +32 -18
  100. package/dist/components/Notification.js.map +1 -1
  101. package/dist/components/Phone.d.ts +3 -2
  102. package/dist/components/Phone.js +10 -8
  103. package/dist/components/Phone.js.map +1 -1
  104. package/dist/components/Popconfirm.js +110 -92
  105. package/dist/components/Popconfirm.js.map +1 -1
  106. package/dist/components/Popover.d.ts +2 -0
  107. package/dist/components/Popover.js.map +1 -1
  108. package/dist/components/Progress.d.ts +2 -0
  109. package/dist/components/Progress.js.map +1 -1
  110. package/dist/components/QRCode.d.ts +1 -0
  111. package/dist/components/QRCode.js +84 -55
  112. package/dist/components/QRCode.js.map +1 -1
  113. package/dist/components/RadialProgress.d.ts +1 -0
  114. package/dist/components/RadialProgress.js +19 -17
  115. package/dist/components/RadialProgress.js.map +1 -1
  116. package/dist/components/Radio.d.ts +6 -3
  117. package/dist/components/Radio.js +9 -9
  118. package/dist/components/Radio.js.map +1 -1
  119. package/dist/components/Range.d.ts +1 -0
  120. package/dist/components/Range.js +45 -43
  121. package/dist/components/Range.js.map +1 -1
  122. package/dist/components/Rating.d.ts +4 -2
  123. package/dist/components/Rating.js +83 -79
  124. package/dist/components/Rating.js.map +1 -1
  125. package/dist/components/Responsive.d.ts +4 -2
  126. package/dist/components/Responsive.js +10 -9
  127. package/dist/components/Responsive.js.map +1 -1
  128. package/dist/components/Result.d.ts +1 -0
  129. package/dist/components/Result.js +24 -22
  130. package/dist/components/Result.js.map +1 -1
  131. package/dist/components/Select.d.ts +1 -0
  132. package/dist/components/Select.js +72 -62
  133. package/dist/components/Select.js.map +1 -1
  134. package/dist/components/Skeleton.d.ts +2 -0
  135. package/dist/components/Skeleton.js.map +1 -1
  136. package/dist/components/Space.d.ts +2 -0
  137. package/dist/components/Space.js.map +1 -1
  138. package/dist/components/Splitter.d.ts +2 -0
  139. package/dist/components/Splitter.js +137 -131
  140. package/dist/components/Splitter.js.map +1 -1
  141. package/dist/components/Stat.d.ts +4 -2
  142. package/dist/components/Stat.js +19 -18
  143. package/dist/components/Stat.js.map +1 -1
  144. package/dist/components/Status.d.ts +3 -3
  145. package/dist/components/Status.js +27 -25
  146. package/dist/components/Status.js.map +1 -1
  147. package/dist/components/Steps.d.ts +4 -2
  148. package/dist/components/Steps.js +56 -52
  149. package/dist/components/Steps.js.map +1 -1
  150. package/dist/components/TextRotate.d.ts +1 -0
  151. package/dist/components/TextRotate.js +14 -12
  152. package/dist/components/TextRotate.js.map +1 -1
  153. package/dist/components/Textarea.d.ts +1 -0
  154. package/dist/components/Textarea.js +31 -30
  155. package/dist/components/Textarea.js.map +1 -1
  156. package/dist/components/ThemeController.d.ts +6 -3
  157. package/dist/components/ThemeController.js +101 -92
  158. package/dist/components/ThemeController.js.map +1 -1
  159. package/dist/components/Toggle.d.ts +2 -0
  160. package/dist/components/Toggle.js.map +1 -1
  161. package/dist/components/Tooltip.d.ts +2 -0
  162. package/dist/components/Tooltip.js +38 -32
  163. package/dist/components/Tooltip.js.map +1 -1
  164. package/dist/components/Typography.d.ts +10 -5
  165. package/dist/components/Typography.js +84 -81
  166. package/dist/components/Typography.js.map +1 -1
  167. package/dist/components/VirtualList.d.ts +2 -1
  168. package/dist/components/VirtualList.js +40 -36
  169. package/dist/components/VirtualList.js.map +1 -1
  170. package/dist/components/Watermark.d.ts +1 -0
  171. package/dist/components/Watermark.js +74 -71
  172. package/dist/components/Watermark.js.map +1 -1
  173. package/dist/components/WeekCalendar.d.ts +1 -0
  174. package/dist/components/WeekCalendar.js +91 -76
  175. package/dist/components/WeekCalendar.js.map +1 -1
  176. package/dist/components/Window.d.ts +3 -2
  177. package/dist/components/Window.js +9 -7
  178. package/dist/components/Window.js.map +1 -1
  179. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualList.js","sources":["../../src/components/VirtualList.tsx"],"sourcesContent":["import React, { useRef } from 'react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\n\nexport interface VirtualListProps<T> {\n /** Array of items to render */\n items: T[]\n /** Height of the scrollable container */\n height: number | string\n /** Height of each item, or function returning estimated height per item */\n itemHeight: number | ((item: T, index: number) => number)\n /** Render function for each item */\n renderItem: (item: T, index: number) => React.ReactNode\n /** Number of items to render outside visible area */\n overscan?: number\n /** Additional class for the scroll container */\n className?: string\n /** Additional class for the inner container */\n innerClassName?: string\n /** Additional class for each item wrapper */\n itemClassName?: string\n /** Width of the container */\n width?: number | string\n /** Gap between items */\n gap?: number\n /** Callback when scroll position changes */\n onScroll?: (scrollTop: number) => void\n}\n\nexport function VirtualList<T>({\n items,\n height,\n itemHeight,\n renderItem,\n overscan = 5,\n className = '',\n innerClassName = '',\n itemClassName = '',\n width,\n gap = 0,\n onScroll,\n}: VirtualListProps<T>) {\n const parentRef = useRef<HTMLDivElement>(null)\n const itemHeightRef = useRef(itemHeight)\n const itemsRef = useRef(items)\n itemHeightRef.current = itemHeight\n itemsRef.current = items\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => parentRef.current,\n estimateSize: (index) => {\n const h = typeof itemHeightRef.current === 'function'\n ? itemHeightRef.current(itemsRef.current[index], index)\n : itemHeightRef.current\n return h + gap\n },\n overscan,\n })\n\n const virtualItems = virtualizer.getVirtualItems()\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n onScroll?.(e.currentTarget.scrollTop)\n }\n\n return (\n <div\n ref={parentRef}\n className={`overflow-auto ${className}`}\n style={{ height, width }}\n onScroll={handleScroll}\n >\n <div\n className={innerClassName}\n style={{\n height: virtualizer.getTotalSize(),\n width: '100%',\n position: 'relative',\n }}\n >\n {virtualItems.map((virtualItem) => (\n <div\n key={virtualItem.key}\n className={itemClassName}\n data-index={virtualItem.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: virtualItem.size - gap,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n {renderItem(items[virtualItem.index], virtualItem.index)}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nVirtualList.displayName = 'VirtualList'\n"],"names":["VirtualList","items","height","itemHeight","renderItem","overscan","className","innerClassName","itemClassName","width","gap","onScroll","parentRef","useRef","itemHeightRef","itemsRef","virtualizer","useVirtualizer","index","virtualItems","handleScroll","e","jsx","virtualItem"],"mappings":";;;AA4BO,SAASA,EAAe;AAAA,EAC7B,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,gBAAAC,IAAiB;AAAA,EACjB,eAAAC,IAAgB;AAAA,EAChB,OAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,UAAAC;AACF,GAAwB;AACtB,QAAMC,IAAYC,EAAuB,IAAI,GACvCC,IAAgBD,EAAOV,CAAU,GACjCY,IAAWF,EAAOZ,CAAK;AAC7B,EAAAa,EAAc,UAAUX,GACxBY,EAAS,UAAUd;AAEnB,QAAMe,IAAcC,EAAe;AAAA,IACjC,OAAOhB,EAAM;AAAA,IACb,kBAAkB,MAAMW,EAAU;AAAA,IAClC,cAAc,CAACM,OACH,OAAOJ,EAAc,WAAY,aACvCA,EAAc,QAAQC,EAAS,QAAQG,CAAK,GAAGA,CAAK,IACpDJ,EAAc,WACPJ;AAAA,IAEb,UAAAL;AAAA,EAAA,CACD,GAEKc,IAAeH,EAAY,gBAAA,GAE3BI,IAAe,CAACC,MAAqC;AACzD,IAAAV,IAAWU,EAAE,cAAc,SAAS;AAAA,EACtC;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKV;AAAA,MACL,WAAW,iBAAiBN,CAAS;AAAA,MACrC,OAAO,EAAE,QAAAJ,GAAQ,OAAAO,EAAA;AAAA,MACjB,UAAUW;AAAA,MAEV,UAAA,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWf;AAAA,UACX,OAAO;AAAA,YACL,QAAQS,EAAY,aAAA;AAAA,YACpB,OAAO;AAAA,YACP,UAAU;AAAA,UAAA;AAAA,UAGX,UAAAG,EAAa,IAAI,CAACI,MACjB,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAWd;AAAA,cACX,cAAYe,EAAY;AAAA,cACxB,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,QAAQA,EAAY,OAAOb;AAAA,gBAC3B,WAAW,cAAca,EAAY,KAAK;AAAA,cAAA;AAAA,cAG3C,YAAWtB,EAAMsB,EAAY,KAAK,GAAGA,EAAY,KAAK;AAAA,YAAA;AAAA,YAZlDA,EAAY;AAAA,UAAA,CAcpB;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN;AAEAvB,EAAY,cAAc;"}
1
+ {"version":3,"file":"VirtualList.js","sources":["../../src/components/VirtualList.tsx"],"sourcesContent":["import React, { useRef } from 'react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\n\nexport interface VirtualListProps<T> {\n /** Array of items to render */\n items: T[]\n /** Height of the scrollable container */\n height: number | string\n /** Height of each item, or function returning estimated height per item */\n itemHeight: number | ((item: T, index: number) => number)\n /** Render function for each item */\n renderItem: (item: T, index: number) => React.ReactNode\n /** Number of items to render outside visible area */\n overscan?: number\n /** Additional class for the scroll container */\n className?: string\n /** Additional class for the inner container */\n innerClassName?: string\n /** Additional class for each item wrapper */\n itemClassName?: string\n /** Width of the container */\n width?: number | string\n /** Gap between items */\n gap?: number\n /** Callback when scroll position changes */\n onScroll?: (scrollTop: number) => void\n 'data-testid'?: string\n}\n\nexport function VirtualList<T>({\n items,\n height,\n itemHeight,\n renderItem,\n overscan = 5,\n className = '',\n innerClassName = '',\n itemClassName = '',\n width,\n gap = 0,\n onScroll,\n 'data-testid': testId,\n}: VirtualListProps<T>) {\n const parentRef = useRef<HTMLDivElement>(null)\n const itemHeightRef = useRef(itemHeight)\n const itemsRef = useRef(items)\n itemHeightRef.current = itemHeight\n itemsRef.current = items\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => parentRef.current,\n estimateSize: (index) => {\n const h = typeof itemHeightRef.current === 'function'\n ? itemHeightRef.current(itemsRef.current[index], index)\n : itemHeightRef.current\n return h + gap\n },\n overscan,\n })\n\n const virtualItems = virtualizer.getVirtualItems()\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n onScroll?.(e.currentTarget.scrollTop)\n }\n\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n return (\n <div\n ref={parentRef}\n className={`overflow-auto ${className}`}\n style={{ height, width }}\n onScroll={handleScroll}\n data-testid={testId}\n >\n <div\n className={innerClassName}\n style={{\n height: virtualizer.getTotalSize(),\n width: '100%',\n position: 'relative',\n }}\n data-testid={getTestId('inner')}\n >\n {virtualItems.map((virtualItem) => (\n <div\n key={virtualItem.key}\n className={itemClassName}\n data-index={virtualItem.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: virtualItem.size - gap,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n data-testid={getTestId(`item-${virtualItem.index}`)}\n >\n {renderItem(items[virtualItem.index], virtualItem.index)}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nVirtualList.displayName = 'VirtualList'\n"],"names":["VirtualList","items","height","itemHeight","renderItem","overscan","className","innerClassName","itemClassName","width","gap","onScroll","testId","parentRef","useRef","itemHeightRef","itemsRef","virtualizer","useVirtualizer","index","virtualItems","handleScroll","e","getTestId","suffix","jsx","virtualItem"],"mappings":";;;AA6BO,SAASA,EAAe;AAAA,EAC7B,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,gBAAAC,IAAiB;AAAA,EACjB,eAAAC,IAAgB;AAAA,EAChB,OAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,UAAAC;AAAA,EACA,eAAeC;AACjB,GAAwB;AACtB,QAAMC,IAAYC,EAAuB,IAAI,GACvCC,IAAgBD,EAAOX,CAAU,GACjCa,IAAWF,EAAOb,CAAK;AAC7B,EAAAc,EAAc,UAAUZ,GACxBa,EAAS,UAAUf;AAEnB,QAAMgB,IAAcC,EAAe;AAAA,IACjC,OAAOjB,EAAM;AAAA,IACb,kBAAkB,MAAMY,EAAU;AAAA,IAClC,cAAc,CAACM,OACH,OAAOJ,EAAc,WAAY,aACvCA,EAAc,QAAQC,EAAS,QAAQG,CAAK,GAAGA,CAAK,IACpDJ,EAAc,WACPL;AAAA,IAEb,UAAAL;AAAA,EAAA,CACD,GAEKe,IAAeH,EAAY,gBAAA,GAE3BI,IAAe,CAACC,MAAqC;AACzD,IAAAX,IAAWW,EAAE,cAAc,SAAS;AAAA,EACtC,GAEMC,IAAY,CAACC,MAAoBZ,IAAS,GAAGA,CAAM,IAAIY,CAAM,KAAK;AAExE,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKZ;AAAA,MACL,WAAW,iBAAiBP,CAAS;AAAA,MACrC,OAAO,EAAE,QAAAJ,GAAQ,OAAAO,EAAA;AAAA,MACjB,UAAUY;AAAA,MACV,eAAaT;AAAA,MAEb,UAAA,gBAAAa;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWlB;AAAA,UACX,OAAO;AAAA,YACL,QAAQU,EAAY,aAAA;AAAA,YACpB,OAAO;AAAA,YACP,UAAU;AAAA,UAAA;AAAA,UAEZ,eAAaM,EAAU,OAAO;AAAA,UAE7B,UAAAH,EAAa,IAAI,CAACM,MACjB,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAWjB;AAAA,cACX,cAAYkB,EAAY;AAAA,cACxB,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,QAAQA,EAAY,OAAOhB;AAAA,gBAC3B,WAAW,cAAcgB,EAAY,KAAK;AAAA,cAAA;AAAA,cAE5C,eAAaH,EAAU,QAAQG,EAAY,KAAK,EAAE;AAAA,cAEjD,YAAWzB,EAAMyB,EAAY,KAAK,GAAGA,EAAY,KAAK;AAAA,YAAA;AAAA,YAblDA,EAAY;AAAA,UAAA,CAepB;AAAA,QAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAGN;AAEA1B,EAAY,cAAc;"}
@@ -36,5 +36,6 @@ export interface WatermarkProps extends Omit<React.HTMLAttributes<HTMLDivElement
36
36
  font?: WatermarkFontOptions;
37
37
  /** Content to protect with the watermark */
38
38
  children?: React.ReactNode;
39
+ 'data-testid'?: string;
39
40
  }
40
41
  export declare const Watermark: React.FC<WatermarkProps>;
@@ -1,121 +1,124 @@
1
- import { jsxs as R, jsx as Y } from "react/jsx-runtime";
2
- import { useState as D, useMemo as A, useEffect as M } from "react";
3
- import { useTheme as U } from "../hooks/useTheme.js";
4
- const B = "asterui", X = 0.22;
5
- function _(r, l) {
6
- const n = Math.round(l * 255).toString(16).padStart(2, "0");
1
+ import { jsxs as D, jsx as M } from "react/jsx-runtime";
2
+ import { useState as U, useMemo as F, useEffect as B } from "react";
3
+ import { useTheme as X } from "../hooks/useTheme.js";
4
+ const _ = "asterui", K = 0.22;
5
+ function q(r, c) {
6
+ const n = Math.round(c * 255).toString(16).padStart(2, "0");
7
7
  return r + n;
8
8
  }
9
- const K = (r, l) => {
9
+ const G = (r, c) => {
10
10
  const n = r?.fontSize ?? 16;
11
11
  return {
12
- color: l,
12
+ color: c,
13
13
  fontSize: n,
14
14
  fontWeight: r?.fontWeight ?? 600,
15
15
  fontStyle: r?.fontStyle ?? "normal",
16
16
  fontFamily: r?.fontFamily ?? "sans-serif",
17
17
  lineHeight: r?.lineHeight ?? n * 1.2
18
18
  };
19
- }, q = ({
19
+ }, J = ({
20
20
  children: r,
21
- className: l = "",
21
+ className: c = "",
22
22
  style: n,
23
- content: c,
24
- image: v,
25
- width: a = 120,
23
+ content: d,
24
+ image: x,
25
+ width: s = 120,
26
26
  height: i = 64,
27
- gap: E,
27
+ gap: $,
28
28
  offset: k,
29
- rotate: F = -22,
30
- zIndex: I = 1e3,
29
+ rotate: b = -22,
30
+ zIndex: H = 1e3,
31
31
  font: y,
32
- ...b
32
+ "data-testid": h,
33
+ ...I
33
34
  }) => {
34
- const [m, L] = D(null), d = E?.[0] ?? 120, f = E?.[1] ?? 120, H = k?.[0] ?? d / 2, N = k?.[1] ?? f / 2, { colors: P } = U(), h = A(
35
- () => typeof c == "string" ? [c] : Array.isArray(c) ? c : [B],
36
- [c]
37
- ), W = y?.color ?? _(P.foreground, X), s = A(
38
- () => K(y, W),
39
- [y, W]
40
- ), S = Math.PI / 180 * F, j = h.join("|");
41
- M(() => {
35
+ const [u, L] = U(null), f = $?.[0] ?? 120, m = $?.[1] ?? 120, N = k?.[0] ?? f / 2, P = k?.[1] ?? m / 2, { colors: j } = X(), S = F(
36
+ () => typeof d == "string" ? [d] : Array.isArray(d) ? d : [_],
37
+ [d]
38
+ ), T = y?.color ?? q(j.foreground, K), a = F(
39
+ () => G(y, T),
40
+ [y, T]
41
+ ), E = Math.PI / 180 * b, z = S.join("|");
42
+ B(() => {
42
43
  if (typeof window > "u") return;
43
- let u = !1;
44
- const o = window.devicePixelRatio || 1, $ = a + d, T = i + f, g = document.createElement("canvas");
45
- g.width = $ * o, g.height = T * o;
46
- const e = g.getContext("2d");
47
- if (!e) return;
48
- const w = () => {
49
- const t = g.toDataURL();
50
- u || L({ url: t, width: $, height: T });
51
- }, C = () => {
52
- e.save(), e.translate((d / 2 + a / 2) * o, (f / 2 + i / 2) * o), e.rotate(S), e.fillStyle = s.color, e.textAlign = "center", e.textBaseline = "middle", e.font = `${s.fontStyle} normal ${s.fontWeight} ${s.fontSize * o}px ${s.fontFamily}`;
53
- const t = s.lineHeight * o, p = -((h.length - 1) * t) / 2;
54
- h.forEach((x, O) => {
55
- e.fillText(x, 0, p + O * t);
56
- }), e.restore();
44
+ let l = !1;
45
+ const o = window.devicePixelRatio || 1, W = s + f, w = i + m, g = document.createElement("canvas");
46
+ g.width = W * o, g.height = w * o;
47
+ const t = g.getContext("2d");
48
+ if (!t) return;
49
+ const A = () => {
50
+ const e = g.toDataURL();
51
+ l || L({ url: e, width: W, height: w });
52
+ }, R = () => {
53
+ t.save(), t.translate((f / 2 + s / 2) * o, (m / 2 + i / 2) * o), t.rotate(E), t.fillStyle = a.color, t.textAlign = "center", t.textBaseline = "middle", t.font = `${a.fontStyle} normal ${a.fontWeight} ${a.fontSize * o}px ${a.fontFamily}`;
54
+ const e = a.lineHeight * o, p = -((S.length - 1) * e) / 2;
55
+ S.forEach((v, Y) => {
56
+ t.fillText(v, 0, p + Y * e);
57
+ }), t.restore();
57
58
  };
58
- if (v) {
59
- const t = new Image();
60
- t.crossOrigin = "anonymous", t.referrerPolicy = "no-referrer";
59
+ if (x) {
60
+ const e = new Image();
61
+ e.crossOrigin = "anonymous", e.referrerPolicy = "no-referrer";
61
62
  const p = () => {
62
- e.save(), e.translate((d / 2 + a / 2) * o, (f / 2 + i / 2) * o), e.rotate(S), e.drawImage(
63
- t,
64
- -a / 2 * o,
63
+ t.save(), t.translate((f / 2 + s / 2) * o, (m / 2 + i / 2) * o), t.rotate(E), t.drawImage(
64
+ e,
65
+ -s / 2 * o,
65
66
  -i / 2 * o,
66
- a * o,
67
+ s * o,
67
68
  i * o
68
- ), e.restore(), w();
69
- }, x = () => {
70
- u || L(null);
69
+ ), t.restore(), A();
70
+ }, v = () => {
71
+ l || L(null);
71
72
  };
72
- return t.addEventListener("load", p), t.addEventListener("error", x), t.src = v, () => {
73
- u = !0, t.removeEventListener("load", p), t.removeEventListener("error", x);
73
+ return e.addEventListener("load", p), e.addEventListener("error", v), e.src = x, () => {
74
+ l = !0, e.removeEventListener("load", p), e.removeEventListener("error", v);
74
75
  };
75
76
  } else
76
- C(), w();
77
+ R(), A();
77
78
  return () => {
78
- u = !0;
79
+ l = !0;
79
80
  };
80
81
  }, [
81
- s,
82
- d,
82
+ a,
83
83
  f,
84
+ m,
84
85
  i,
85
- v,
86
- S,
87
- j,
88
- a
86
+ x,
87
+ E,
88
+ z,
89
+ s
89
90
  ]);
90
- const z = ["relative", l].filter(Boolean).join(" ");
91
- return /* @__PURE__ */ R(
91
+ const C = ["relative", c].filter(Boolean).join(" "), O = (l) => h ? `${h}-${l}` : void 0;
92
+ return /* @__PURE__ */ D(
92
93
  "div",
93
94
  {
94
- className: z,
95
+ className: C,
95
96
  style: { position: n?.position ?? "relative", ...n },
96
- ...b,
97
+ "data-testid": h,
98
+ ...I,
97
99
  children: [
98
100
  r,
99
- m && /* @__PURE__ */ Y(
101
+ u && /* @__PURE__ */ M(
100
102
  "div",
101
103
  {
102
104
  "aria-hidden": !0,
103
105
  className: "pointer-events-none absolute inset-0",
104
106
  style: {
105
- zIndex: I,
106
- backgroundImage: `url(${m.url})`,
107
+ zIndex: H,
108
+ backgroundImage: `url(${u.url})`,
107
109
  backgroundRepeat: "repeat",
108
- backgroundSize: `${m.width}px ${m.height}px`,
109
- backgroundPosition: `${H}px ${N}px`
110
- }
110
+ backgroundSize: `${u.width}px ${u.height}px`,
111
+ backgroundPosition: `${N}px ${P}px`
112
+ },
113
+ "data-testid": O("overlay")
111
114
  }
112
115
  )
113
116
  ]
114
117
  }
115
118
  );
116
119
  };
117
- q.displayName = "Watermark";
120
+ J.displayName = "Watermark";
118
121
  export {
119
- q as Watermark
122
+ J as Watermark
120
123
  };
121
124
  //# sourceMappingURL=Watermark.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Watermark.js","sources":["../../src/components/Watermark.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react'\nimport { useTheme } from '../hooks/useTheme'\n\nexport type WatermarkGap = [number, number]\nexport type WatermarkOffset = [number, number]\n\nexport interface WatermarkFontOptions {\n /** Text color for watermark content */\n color?: string\n /** Font size in pixels */\n fontSize?: number\n /** Font weight for watermark text */\n fontWeight?: number | 'normal' | 'bold' | 'bolder' | 'lighter'\n /** Font style for watermark text */\n fontStyle?: 'normal' | 'italic' | 'oblique'\n /** Font family for watermark text */\n fontFamily?: string\n /** Line height in pixels for multi-line content */\n lineHeight?: number\n}\n\nexport interface WatermarkProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'content'> {\n /** Text to render inside the watermark; falls back to \"asterui\" */\n content?: string | string[]\n /** Image source (URL or base64) to render instead of text */\n image?: string\n /** Width of a single watermark tile in pixels */\n width?: number\n /** Height of a single watermark tile in pixels */\n height?: number\n /** Horizontal/vertical gap between watermarks in pixels */\n gap?: WatermarkGap\n /** Offset for the first watermark tile from the top-left corner */\n offset?: WatermarkOffset\n /** Rotation angle in degrees */\n rotate?: number\n /** z-index for the overlay layer */\n zIndex?: number\n /** Font settings for text watermarks */\n font?: WatermarkFontOptions\n /** Content to protect with the watermark */\n children?: React.ReactNode\n}\n\ntype WatermarkImage = {\n url: string\n width: number\n height: number\n}\n\nconst DEFAULT_CONTENT = 'asterui'\nconst DEFAULT_OPACITY = 0.22\n\n// Add opacity to a hex color (returns #rrggbbaa format)\nfunction hexWithOpacity(hex: string, opacity: number): string {\n const alpha = Math.round(opacity * 255).toString(16).padStart(2, '0')\n return hex + alpha\n}\n\nconst getFontSettings = (font: WatermarkFontOptions | undefined, resolvedColor: string) => {\n const fontSize = font?.fontSize ?? 16\n\n return {\n color: resolvedColor,\n fontSize,\n fontWeight: font?.fontWeight ?? 600,\n fontStyle: font?.fontStyle ?? 'normal',\n fontFamily: font?.fontFamily ?? 'sans-serif',\n lineHeight: font?.lineHeight ?? fontSize * 1.2,\n }\n}\n\nexport const Watermark: React.FC<WatermarkProps> = ({\n children,\n className = '',\n style,\n content,\n image,\n width = 120,\n height = 64,\n gap,\n offset,\n rotate = -22,\n zIndex = 1000,\n font,\n ...rest\n}) => {\n const [watermark, setWatermark] = useState<WatermarkImage | null>(null)\n\n const gapX = gap?.[0] ?? 120\n const gapY = gap?.[1] ?? 120\n const offsetX = offset?.[0] ?? gapX / 2\n const offsetY = offset?.[1] ?? gapY / 2\n const { colors } = useTheme()\n const textLines = useMemo(\n () =>\n typeof content === 'string'\n ? [content]\n : Array.isArray(content)\n ? content\n : [DEFAULT_CONTENT],\n [content]\n )\n // Use provided color or theme foreground with opacity\n const resolvedColor = font?.color ?? hexWithOpacity(colors.foreground, DEFAULT_OPACITY)\n const fontSettings = useMemo(\n () => getFontSettings(font, resolvedColor),\n [font, resolvedColor]\n )\n const rotationInRadians = (Math.PI / 180) * rotate\n const textKey = textLines.join('|')\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n let cancelled = false\n const ratio = window.devicePixelRatio || 1\n const tileWidth = width + gapX\n const tileHeight = height + gapY\n const canvas = document.createElement('canvas')\n canvas.width = tileWidth * ratio\n canvas.height = tileHeight * ratio\n const ctx = canvas.getContext('2d')\n\n if (!ctx) return\n\n const commitWatermark = () => {\n const url = canvas.toDataURL()\n if (!cancelled) {\n setWatermark({ url, width: tileWidth, height: tileHeight })\n }\n }\n\n const drawText = () => {\n ctx.save()\n ctx.translate((gapX / 2 + width / 2) * ratio, (gapY / 2 + height / 2) * ratio)\n ctx.rotate(rotationInRadians)\n ctx.fillStyle = fontSettings.color\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.font = `${fontSettings.fontStyle} normal ${fontSettings.fontWeight} ${fontSettings.fontSize * ratio}px ${fontSettings.fontFamily}`\n\n const lineHeight = fontSettings.lineHeight * ratio\n const startY = -((textLines.length - 1) * lineHeight) / 2\n\n textLines.forEach((line, index) => {\n ctx.fillText(line, 0, startY + index * lineHeight)\n })\n\n ctx.restore()\n }\n\n if (image) {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.referrerPolicy = 'no-referrer'\n\n const handleLoad = () => {\n ctx.save()\n ctx.translate((gapX / 2 + width / 2) * ratio, (gapY / 2 + height / 2) * ratio)\n ctx.rotate(rotationInRadians)\n ctx.drawImage(\n img,\n (-width / 2) * ratio,\n (-height / 2) * ratio,\n width * ratio,\n height * ratio\n )\n ctx.restore()\n commitWatermark()\n }\n\n const handleError = () => {\n if (!cancelled) setWatermark(null)\n }\n\n img.addEventListener('load', handleLoad)\n img.addEventListener('error', handleError)\n img.src = image\n\n return () => {\n cancelled = true\n img.removeEventListener('load', handleLoad)\n img.removeEventListener('error', handleError)\n }\n } else {\n drawText()\n commitWatermark()\n }\n\n return () => {\n cancelled = true\n }\n }, [\n fontSettings,\n gapX,\n gapY,\n height,\n image,\n rotationInRadians,\n textKey,\n width,\n ])\n\n const classes = ['relative', className].filter(Boolean).join(' ')\n\n return (\n <div\n className={classes}\n style={{ position: style?.position ?? 'relative', ...style }}\n {...rest}\n >\n {children}\n {watermark && (\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-0\"\n style={{\n zIndex,\n backgroundImage: `url(${watermark.url})`,\n backgroundRepeat: 'repeat',\n backgroundSize: `${watermark.width}px ${watermark.height}px`,\n backgroundPosition: `${offsetX}px ${offsetY}px`,\n }}\n />\n )}\n </div>\n )\n}\n\nWatermark.displayName = 'Watermark'\n"],"names":["DEFAULT_CONTENT","DEFAULT_OPACITY","hexWithOpacity","hex","opacity","alpha","getFontSettings","font","resolvedColor","fontSize","Watermark","children","className","style","content","image","width","height","gap","offset","rotate","zIndex","rest","watermark","setWatermark","useState","gapX","gapY","offsetX","offsetY","colors","useTheme","textLines","useMemo","fontSettings","rotationInRadians","textKey","useEffect","cancelled","ratio","tileWidth","tileHeight","canvas","ctx","commitWatermark","url","drawText","lineHeight","startY","line","index","img","handleLoad","handleError","classes","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Watermark.js","sources":["../../src/components/Watermark.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react'\nimport { useTheme } from '../hooks/useTheme'\n\nexport type WatermarkGap = [number, number]\nexport type WatermarkOffset = [number, number]\n\nexport interface WatermarkFontOptions {\n /** Text color for watermark content */\n color?: string\n /** Font size in pixels */\n fontSize?: number\n /** Font weight for watermark text */\n fontWeight?: number | 'normal' | 'bold' | 'bolder' | 'lighter'\n /** Font style for watermark text */\n fontStyle?: 'normal' | 'italic' | 'oblique'\n /** Font family for watermark text */\n fontFamily?: string\n /** Line height in pixels for multi-line content */\n lineHeight?: number\n}\n\nexport interface WatermarkProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'content'> {\n /** Text to render inside the watermark; falls back to \"asterui\" */\n content?: string | string[]\n /** Image source (URL or base64) to render instead of text */\n image?: string\n /** Width of a single watermark tile in pixels */\n width?: number\n /** Height of a single watermark tile in pixels */\n height?: number\n /** Horizontal/vertical gap between watermarks in pixels */\n gap?: WatermarkGap\n /** Offset for the first watermark tile from the top-left corner */\n offset?: WatermarkOffset\n /** Rotation angle in degrees */\n rotate?: number\n /** z-index for the overlay layer */\n zIndex?: number\n /** Font settings for text watermarks */\n font?: WatermarkFontOptions\n /** Content to protect with the watermark */\n children?: React.ReactNode\n 'data-testid'?: string\n}\n\ntype WatermarkImage = {\n url: string\n width: number\n height: number\n}\n\nconst DEFAULT_CONTENT = 'asterui'\nconst DEFAULT_OPACITY = 0.22\n\n// Add opacity to a hex color (returns #rrggbbaa format)\nfunction hexWithOpacity(hex: string, opacity: number): string {\n const alpha = Math.round(opacity * 255).toString(16).padStart(2, '0')\n return hex + alpha\n}\n\nconst getFontSettings = (font: WatermarkFontOptions | undefined, resolvedColor: string) => {\n const fontSize = font?.fontSize ?? 16\n\n return {\n color: resolvedColor,\n fontSize,\n fontWeight: font?.fontWeight ?? 600,\n fontStyle: font?.fontStyle ?? 'normal',\n fontFamily: font?.fontFamily ?? 'sans-serif',\n lineHeight: font?.lineHeight ?? fontSize * 1.2,\n }\n}\n\nexport const Watermark: React.FC<WatermarkProps> = ({\n children,\n className = '',\n style,\n content,\n image,\n width = 120,\n height = 64,\n gap,\n offset,\n rotate = -22,\n zIndex = 1000,\n font,\n 'data-testid': testId,\n ...rest\n}) => {\n const [watermark, setWatermark] = useState<WatermarkImage | null>(null)\n\n const gapX = gap?.[0] ?? 120\n const gapY = gap?.[1] ?? 120\n const offsetX = offset?.[0] ?? gapX / 2\n const offsetY = offset?.[1] ?? gapY / 2\n const { colors } = useTheme()\n const textLines = useMemo(\n () =>\n typeof content === 'string'\n ? [content]\n : Array.isArray(content)\n ? content\n : [DEFAULT_CONTENT],\n [content]\n )\n // Use provided color or theme foreground with opacity\n const resolvedColor = font?.color ?? hexWithOpacity(colors.foreground, DEFAULT_OPACITY)\n const fontSettings = useMemo(\n () => getFontSettings(font, resolvedColor),\n [font, resolvedColor]\n )\n const rotationInRadians = (Math.PI / 180) * rotate\n const textKey = textLines.join('|')\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n let cancelled = false\n const ratio = window.devicePixelRatio || 1\n const tileWidth = width + gapX\n const tileHeight = height + gapY\n const canvas = document.createElement('canvas')\n canvas.width = tileWidth * ratio\n canvas.height = tileHeight * ratio\n const ctx = canvas.getContext('2d')\n\n if (!ctx) return\n\n const commitWatermark = () => {\n const url = canvas.toDataURL()\n if (!cancelled) {\n setWatermark({ url, width: tileWidth, height: tileHeight })\n }\n }\n\n const drawText = () => {\n ctx.save()\n ctx.translate((gapX / 2 + width / 2) * ratio, (gapY / 2 + height / 2) * ratio)\n ctx.rotate(rotationInRadians)\n ctx.fillStyle = fontSettings.color\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.font = `${fontSettings.fontStyle} normal ${fontSettings.fontWeight} ${fontSettings.fontSize * ratio}px ${fontSettings.fontFamily}`\n\n const lineHeight = fontSettings.lineHeight * ratio\n const startY = -((textLines.length - 1) * lineHeight) / 2\n\n textLines.forEach((line, index) => {\n ctx.fillText(line, 0, startY + index * lineHeight)\n })\n\n ctx.restore()\n }\n\n if (image) {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.referrerPolicy = 'no-referrer'\n\n const handleLoad = () => {\n ctx.save()\n ctx.translate((gapX / 2 + width / 2) * ratio, (gapY / 2 + height / 2) * ratio)\n ctx.rotate(rotationInRadians)\n ctx.drawImage(\n img,\n (-width / 2) * ratio,\n (-height / 2) * ratio,\n width * ratio,\n height * ratio\n )\n ctx.restore()\n commitWatermark()\n }\n\n const handleError = () => {\n if (!cancelled) setWatermark(null)\n }\n\n img.addEventListener('load', handleLoad)\n img.addEventListener('error', handleError)\n img.src = image\n\n return () => {\n cancelled = true\n img.removeEventListener('load', handleLoad)\n img.removeEventListener('error', handleError)\n }\n } else {\n drawText()\n commitWatermark()\n }\n\n return () => {\n cancelled = true\n }\n }, [\n fontSettings,\n gapX,\n gapY,\n height,\n image,\n rotationInRadians,\n textKey,\n width,\n ])\n\n const classes = ['relative', className].filter(Boolean).join(' ')\n\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n return (\n <div\n className={classes}\n style={{ position: style?.position ?? 'relative', ...style }}\n data-testid={testId}\n {...rest}\n >\n {children}\n {watermark && (\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-0\"\n style={{\n zIndex,\n backgroundImage: `url(${watermark.url})`,\n backgroundRepeat: 'repeat',\n backgroundSize: `${watermark.width}px ${watermark.height}px`,\n backgroundPosition: `${offsetX}px ${offsetY}px`,\n }}\n data-testid={getTestId('overlay')}\n />\n )}\n </div>\n )\n}\n\nWatermark.displayName = 'Watermark'\n"],"names":["DEFAULT_CONTENT","DEFAULT_OPACITY","hexWithOpacity","hex","opacity","alpha","getFontSettings","font","resolvedColor","fontSize","Watermark","children","className","style","content","image","width","height","gap","offset","rotate","zIndex","testId","rest","watermark","setWatermark","useState","gapX","gapY","offsetX","offsetY","colors","useTheme","textLines","useMemo","fontSettings","rotationInRadians","textKey","useEffect","cancelled","ratio","tileWidth","tileHeight","canvas","ctx","commitWatermark","url","drawText","lineHeight","startY","line","index","img","handleLoad","handleError","classes","getTestId","suffix","jsxs","jsx"],"mappings":"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"}
@@ -29,6 +29,7 @@ export interface WeekCalendarProps<T extends CalendarEvent = CalendarEvent> exte
29
29
  startHour?: number;
30
30
  /** End hour for the time grid (0-23) */
31
31
  endHour?: number;
32
+ 'data-testid'?: string;
32
33
  }
33
34
  export declare const WeekCalendar: <T extends CalendarEvent = CalendarEvent>(props: WeekCalendarProps<T> & {
34
35
  ref?: React.ForwardedRef<HTMLDivElement>;
@@ -1,6 +1,6 @@
1
- import { jsxs as d, jsx as i } from "react/jsx-runtime";
2
- import { forwardRef as L, useRef as M, useEffect as R, useMemo as C } from "react";
3
- const F = {
1
+ import { jsxs as m, jsx as d } from "react/jsx-runtime";
2
+ import { forwardRef as C, useRef as k, useEffect as F, useMemo as _ } from "react";
3
+ const J = {
4
4
  locale: "en",
5
5
  daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
6
6
  monthsLong: [
@@ -22,91 +22,95 @@ const F = {
22
22
  const t = s.getHours();
23
23
  return `${t === 0 ? 12 : t > 12 ? t - 12 : t}:00 ${t < 12 ? "AM" : "PM"}`.replace(" ", "").toLowerCase().replace(":00", "");
24
24
  }
25
- }, $ = (s) => _(s, /* @__PURE__ */ new Date()), _ = (s, t) => {
26
- const n = new Date(s), c = new Date(t);
27
- return n.setHours(0, 0, 0, 0), c.setHours(0, 0, 0, 0), c.getTime() === n.getTime();
28
- }, k = (s) => {
25
+ }, N = (s) => O(s, /* @__PURE__ */ new Date()), O = (s, t) => {
26
+ const n = new Date(s), i = new Date(t);
27
+ return n.setHours(0, 0, 0, 0), i.setHours(0, 0, 0, 0), i.getTime() === n.getTime();
28
+ }, T = (s) => {
29
29
  const t = /* @__PURE__ */ new Date(), n = new Date(s);
30
30
  return t.setHours(0, 0, 0, 0), n.setHours(0, 0, 0, 0), n < t;
31
- }, J = (s) => {
32
- const t = new Date(s), n = t.getDay(), c = t.getDate() - n;
33
- return new Date(t.setDate(c));
34
- }, O = (s, t) => {
31
+ }, P = (s) => {
32
+ const t = new Date(s), n = t.getDay(), i = t.getDate() - n;
33
+ return new Date(t.setDate(i));
34
+ }, z = (s, t) => {
35
35
  const n = new Date(s);
36
36
  return n.setDate(n.getDate() + t), n;
37
- }, u = (s, t) => {
38
- const n = s.getDate(), c = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][s.getDay()];
39
- return t === "YYYY-MM-DD" ? s.toISOString().split("T")[0] : t === "ddd" ? c : t === "D" ? n.toString() : s.toISOString();
40
- }, P = L(
37
+ }, f = (s, t) => {
38
+ const n = s.getDate(), i = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][s.getDay()];
39
+ return t === "YYYY-MM-DD" ? s.toISOString().split("T")[0] : t === "ddd" ? i : t === "D" ? n.toString() : s.toISOString();
40
+ }, q = C(
41
41
  ({
42
42
  date: s = /* @__PURE__ */ new Date(),
43
43
  events: t = [],
44
- locale: n = F,
45
- onEventClick: c,
46
- onDayClick: N,
47
- onSelectSlot: x,
48
- allowPastInteraction: m = !1,
49
- fitContainer: f = !1,
50
- startHour: y = 9,
51
- endHour: Y = 17,
52
- className: T = "",
53
- ...S
54
- }, E) => {
55
- const g = M(null), D = M(null);
56
- R(() => {
44
+ locale: n = J,
45
+ onEventClick: i,
46
+ onDayClick: Y,
47
+ onSelectSlot: w,
48
+ allowPastInteraction: b = !1,
49
+ fitContainer: p = !1,
50
+ startHour: v = 9,
51
+ endHour: S = 17,
52
+ className: E = "",
53
+ "data-testid": D,
54
+ ...H
55
+ }, W) => {
56
+ const x = k(null), y = k(null);
57
+ F(() => {
57
58
  const e = () => {
58
- if (g.current && D.current) {
59
- const r = g.current, o = D.current, l = r.offsetWidth - r.clientWidth;
60
- o.style.paddingRight = `${l}px`;
59
+ if (x.current && y.current) {
60
+ const r = x.current, o = y.current, c = r.offsetWidth - r.clientWidth;
61
+ o.style.paddingRight = `${c}px`;
61
62
  }
62
63
  };
63
64
  return e(), window.addEventListener("resize", e), () => window.removeEventListener("resize", e);
64
65
  }, []);
65
- const H = J(s), w = Array.from({ length: 7 }, (e, r) => O(H, r)), W = C(() => {
66
+ const A = P(s), $ = Array.from({ length: 7 }, (e, r) => z(A, r)), l = (e) => D ? `${D}-${e}` : void 0, j = _(() => {
66
67
  const e = {};
67
68
  return t.forEach((r) => {
68
- const o = u(r.date, "YYYY-MM-DD");
69
+ const o = f(r.date, "YYYY-MM-DD");
69
70
  e[o] || (e[o] = []), e[o].push(r);
70
71
  }), e;
71
- }, [t]), v = Array.from({ length: Y - y + 1 }, (e, r) => r + y), A = (e) => n.formatTime ? n.formatTime(new Date(2e3, 0, 1, e, 0)) : `${e === 0 ? 12 : e > 12 ? e - 12 : e}:00 ${e < 12 ? "AM" : "PM"}`, j = (e, r) => (W[e] || []).filter((l) => l.date.getHours() === r);
72
- return /* @__PURE__ */ d(
72
+ }, [t]), M = Array.from({ length: S - v + 1 }, (e, r) => r + v), L = (e) => n.formatTime ? n.formatTime(new Date(2e3, 0, 1, e, 0)) : `${e === 0 ? 12 : e > 12 ? e - 12 : e}:00 ${e < 12 ? "AM" : "PM"}`, R = (e, r) => (j[e] || []).filter((c) => c.date.getHours() === r);
73
+ return /* @__PURE__ */ m(
73
74
  "div",
74
75
  {
75
- ref: E,
76
- className: `flex h-full flex-col overflow-hidden border-b border-base-200 bg-base-100 ${T}`,
77
- ...S,
76
+ ref: W,
77
+ className: `flex h-full flex-col overflow-hidden border-b border-base-200 bg-base-100 ${E}`,
78
+ "data-testid": D,
79
+ ...H,
78
80
  children: [
79
- /* @__PURE__ */ d(
81
+ /* @__PURE__ */ m(
80
82
  "div",
81
83
  {
82
- ref: D,
84
+ ref: y,
83
85
  className: "grid grid-cols-[80px_repeat(7,1fr)] border-b border-base-200 bg-base-100",
86
+ "data-testid": l("header"),
84
87
  children: [
85
- /* @__PURE__ */ i("div", { className: "week-calendar-time-column" }),
86
- w.map((e) => {
87
- const r = k(e), o = $(e);
88
- return /* @__PURE__ */ d(
88
+ /* @__PURE__ */ d("div", { className: "week-calendar-time-column" }),
89
+ $.map((e) => {
90
+ const r = T(e), o = N(e), c = f(e, "YYYY-MM-DD");
91
+ return /* @__PURE__ */ m(
89
92
  "div",
90
93
  {
91
94
  className: `
92
95
  cursor-pointer px-2 py-0.5 text-center transition-colors hover:bg-primary/5
93
- ${r && !m ? "cursor-not-allowed" : ""}
96
+ ${r && !b ? "cursor-not-allowed" : ""}
94
97
  `,
98
+ "data-testid": l(`header-day-${c}`),
95
99
  onClick: () => {
96
- r && !m || N?.(e);
100
+ r && !b || Y?.(e);
97
101
  },
98
102
  children: [
99
- /* @__PURE__ */ i(
103
+ /* @__PURE__ */ d(
100
104
  "div",
101
105
  {
102
106
  className: `
103
107
  text-xs font-medium uppercase
104
108
  ${r ? "text-base-content/40" : "text-base-content/60"}
105
109
  `,
106
- children: u(e, "ddd")
110
+ children: f(e, "ddd")
107
111
  }
108
112
  ),
109
- /* @__PURE__ */ i(
113
+ /* @__PURE__ */ d(
110
114
  "div",
111
115
  {
112
116
  className: `
@@ -114,49 +118,59 @@ const F = {
114
118
  ${o ? "font-bold text-primary" : ""}
115
119
  ${r && !o ? "text-base-content/40" : "text-base-content"}
116
120
  `,
117
- children: u(e, "D")
121
+ children: f(e, "D")
118
122
  }
119
123
  )
120
124
  ]
121
125
  },
122
- u(e, "YYYY-MM-DD")
126
+ c
123
127
  );
124
128
  })
125
129
  ]
126
130
  }
127
131
  ),
128
- /* @__PURE__ */ i(
132
+ /* @__PURE__ */ d(
129
133
  "div",
130
134
  {
131
- ref: g,
132
- className: f ? "grid flex-1" : "flex-1 overflow-y-auto",
133
- style: f ? { gridTemplateRows: `repeat(${v.length}, 1fr)` } : void 0,
134
- children: v.map((e) => /* @__PURE__ */ d(
135
+ ref: x,
136
+ className: p ? "grid flex-1" : "flex-1 overflow-y-auto",
137
+ style: p ? { gridTemplateRows: `repeat(${M.length}, 1fr)` } : void 0,
138
+ "data-testid": l("grid"),
139
+ children: M.map((e) => /* @__PURE__ */ m(
135
140
  "div",
136
141
  {
137
- className: `grid grid-cols-[80px_repeat(7,1fr)] border-b border-base-200 last:border-b-0 ${f ? "min-h-10" : "h-20"}`,
142
+ className: `grid grid-cols-[80px_repeat(7,1fr)] border-b border-base-200 last:border-b-0 ${p ? "min-h-10" : "h-20"}`,
143
+ "data-testid": l(`row-${e}`),
138
144
  children: [
139
- /* @__PURE__ */ i("div", { className: "flex items-start justify-end border-l border-r border-base-200 bg-base-200/50 p-2 pt-1 text-xs text-base-content/50", children: A(e) }),
140
- w.map((r) => {
141
- const o = u(r, "YYYY-MM-DD"), l = j(o, e), h = k(r) && !$(r);
142
- return /* @__PURE__ */ i(
145
+ /* @__PURE__ */ d(
146
+ "div",
147
+ {
148
+ className: "flex items-start justify-end border-l border-r border-base-200 bg-base-200/50 p-2 pt-1 text-xs text-base-content/50",
149
+ "data-testid": l(`time-${e}`),
150
+ children: L(e)
151
+ }
152
+ ),
153
+ $.map((r) => {
154
+ const o = f(r, "YYYY-MM-DD"), c = R(o, e), h = T(r) && !N(r);
155
+ return /* @__PURE__ */ d(
143
156
  "div",
144
157
  {
145
158
  className: `
146
159
  relative flex cursor-pointer flex-col justify-start overflow-y-auto border-r border-base-200 p-1 last:border-r-0
147
160
  hover:bg-primary/5
148
- ${f ? "" : "h-20"}
149
- ${h && !m ? "cursor-not-allowed hover:cursor-not-allowed" : ""}
161
+ ${p ? "" : "h-20"}
162
+ ${h && !b ? "cursor-not-allowed hover:cursor-not-allowed" : ""}
150
163
  `,
164
+ "data-testid": l(`cell-${o}-${e}`),
151
165
  onClick: (a) => {
152
- if (!(h && !m) && x && (a.target === a.currentTarget || a.target.classList.contains("week-calendar-time-cell"))) {
153
- const b = new Date(r);
154
- b.setHours(e, 0, 0, 0);
155
- const p = new Date(r);
156
- p.setHours(e + 1, 0, 0, 0), x({ start: b, end: p });
166
+ if (!(h && !b) && w && (a.target === a.currentTarget || a.target.classList.contains("week-calendar-time-cell"))) {
167
+ const u = new Date(r);
168
+ u.setHours(e, 0, 0, 0);
169
+ const g = new Date(r);
170
+ g.setHours(e + 1, 0, 0, 0), w({ start: u, end: g });
157
171
  }
158
172
  },
159
- children: l.map((a, b) => /* @__PURE__ */ d(
173
+ children: c.map((a, u) => /* @__PURE__ */ m(
160
174
  "div",
161
175
  {
162
176
  className: `
@@ -166,21 +180,22 @@ const F = {
166
180
  `,
167
181
  style: a.style,
168
182
  title: a.title,
169
- onClick: (p) => {
170
- p.stopPropagation(), c?.(a);
183
+ "data-testid": l(`event-${o}-${e}-${u}`),
184
+ onClick: (g) => {
185
+ g.stopPropagation(), i?.(a);
171
186
  },
172
187
  children: [
173
- /* @__PURE__ */ i(
188
+ /* @__PURE__ */ d(
174
189
  "div",
175
190
  {
176
191
  className: "mr-1.5 inline-block h-2 w-2 shrink-0 rounded-full",
177
192
  style: { backgroundColor: a.color || "#bfbfbf" }
178
193
  }
179
194
  ),
180
- /* @__PURE__ */ i("div", { className: "min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap", children: a.title })
195
+ /* @__PURE__ */ d("div", { className: "min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap", children: a.title })
181
196
  ]
182
197
  },
183
- b
198
+ u
184
199
  ))
185
200
  },
186
201
  `${o}-${e}`
@@ -197,8 +212,8 @@ const F = {
197
212
  );
198
213
  }
199
214
  );
200
- P.displayName = "WeekCalendar";
215
+ q.displayName = "WeekCalendar";
201
216
  export {
202
- P as WeekCalendar
217
+ q as WeekCalendar
203
218
  };
204
219
  //# sourceMappingURL=WeekCalendar.js.map