@hina-ui/vue 1.7.5 → 1.7.6

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 (528) hide show
  1. package/README.md +37 -0
  2. package/dist/index.js +2222 -987
  3. package/dist/index.js.map +1 -1
  4. package/dist/shared/behavior/anchor-follow.ts +95 -0
  5. package/dist/shared/behavior/form.ts +187 -0
  6. package/dist/shared/behavior/ripple.ts +222 -0
  7. package/dist/shared/behavior/spoiler/painter.ts +197 -0
  8. package/dist/shared/behavior/spoiler/worklet.ts +199 -0
  9. package/dist/shared/behavior/toast.ts +243 -0
  10. package/dist/shared/lib/anchor.ts +83 -0
  11. package/dist/shared/lib/banner.ts +10 -0
  12. package/dist/shared/lib/calendar/format.ts +23 -0
  13. package/dist/shared/lib/caret.ts +48 -0
  14. package/dist/shared/lib/collapse.ts +29 -0
  15. package/dist/shared/lib/command-palette/hotkey.ts +27 -0
  16. package/dist/shared/lib/command-palette/match.ts +92 -0
  17. package/dist/shared/lib/data-list.ts +40 -0
  18. package/dist/shared/lib/data-table/column-sizing-styles.ts +41 -0
  19. package/dist/shared/lib/data-table/column-sizing.ts +101 -0
  20. package/dist/shared/lib/data-table/csv.ts +51 -0
  21. package/dist/shared/lib/data-table/layout.ts +199 -0
  22. package/dist/shared/lib/data-table/resize.ts +66 -0
  23. package/dist/shared/lib/data-table/state.ts +226 -0
  24. package/dist/shared/lib/data-table/utils.ts +80 -0
  25. package/dist/shared/lib/date-range-field/validity.ts +21 -0
  26. package/dist/shared/lib/date.ts +111 -0
  27. package/dist/shared/lib/field-focus.ts +36 -0
  28. package/dist/shared/lib/file-upload/select.ts +58 -0
  29. package/dist/shared/lib/file-upload/size.ts +16 -0
  30. package/dist/shared/lib/form/errors.ts +48 -0
  31. package/dist/shared/lib/form/focus.ts +10 -0
  32. package/dist/shared/lib/form/standard-schema.ts +26 -0
  33. package/dist/shared/lib/form/values.ts +23 -0
  34. package/dist/shared/lib/highlighter.ts +98 -0
  35. package/dist/shared/lib/iris-origin.ts +40 -0
  36. package/dist/shared/lib/lightbox/clip.ts +117 -0
  37. package/dist/shared/lib/lightbox/download.ts +29 -0
  38. package/dist/shared/lib/lightbox/gesture.ts +54 -0
  39. package/dist/shared/lib/lightbox/paging.ts +33 -0
  40. package/dist/shared/lib/lightbox/pose.ts +142 -0
  41. package/dist/shared/lib/lightbox/source.ts +17 -0
  42. package/dist/shared/lib/lightbox/types.ts +14 -0
  43. package/dist/shared/lib/lightbox/zoom.ts +127 -0
  44. package/dist/shared/lib/meter-group.ts +16 -0
  45. package/dist/shared/lib/overlay-anchor.ts +42 -0
  46. package/dist/shared/lib/pagination.ts +16 -0
  47. package/dist/shared/lib/pointer-corridor.ts +26 -0
  48. package/dist/shared/lib/qr-code-export.ts +68 -0
  49. package/dist/shared/lib/range-calendar/limit.ts +11 -0
  50. package/dist/shared/lib/rating.ts +4 -0
  51. package/dist/shared/lib/relative-time.ts +20 -0
  52. package/dist/shared/lib/scroll-area.ts +77 -0
  53. package/dist/shared/lib/scroll-restore.ts +148 -0
  54. package/dist/shared/lib/toast-layout.ts +42 -0
  55. package/dist/shared/lib/tree/selection.ts +131 -0
  56. package/dist/shared/lib/tree-select/filter.ts +19 -0
  57. package/dist/shared/lib/virtual/choices.ts +193 -0
  58. package/dist/shared/lib/virtual/collection.ts +71 -0
  59. package/dist/shared/lib/virtual/filter.ts +26 -0
  60. package/dist/shared/lib/virtual/flow.ts +32 -0
  61. package/dist/shared/lib/virtual/list.ts +63 -0
  62. package/dist/shared/lib/virtual/navigation.ts +26 -0
  63. package/dist/shared/lib/virtual/tree.ts +98 -0
  64. package/dist/shared/locale/en-US.ts +220 -0
  65. package/dist/shared/locale/index.ts +52 -0
  66. package/dist/shared/locale/types.ts +225 -0
  67. package/dist/shared/locale/zh-CN.ts +215 -0
  68. package/dist/shared/primitives/number-field/LICENSE +21 -0
  69. package/dist/shared/primitives/number-field/index.ts +407 -0
  70. package/dist/shared/styles/semantic.css +10 -2
  71. package/dist/shared/types/autocomplete.ts +16 -0
  72. package/dist/shared/types/data-table.ts +170 -0
  73. package/dist/shared/types/pagination.ts +19 -0
  74. package/dist/shared/types/select.ts +23 -0
  75. package/dist/shared/types/tree-select.ts +34 -0
  76. package/dist/shared/types/tree.ts +20 -0
  77. package/dist/types/shared/src/behavior/anchor-follow.d.ts +13 -0
  78. package/dist/types/shared/src/behavior/anchor-follow.d.ts.map +1 -0
  79. package/dist/types/shared/src/behavior/form.d.ts +24 -0
  80. package/dist/types/shared/src/behavior/form.d.ts.map +1 -0
  81. package/dist/types/shared/src/behavior/ripple.d.ts +11 -0
  82. package/dist/types/shared/src/behavior/ripple.d.ts.map +1 -0
  83. package/dist/types/shared/src/behavior/spoiler/painter.d.ts +35 -0
  84. package/dist/types/shared/src/behavior/spoiler/painter.d.ts.map +1 -0
  85. package/dist/types/shared/src/behavior/spoiler/worklet.d.ts +2 -0
  86. package/dist/types/shared/src/behavior/spoiler/worklet.d.ts.map +1 -0
  87. package/dist/types/shared/src/behavior/toast.d.ts +72 -0
  88. package/dist/types/shared/src/behavior/toast.d.ts.map +1 -0
  89. package/dist/types/shared/src/lib/anchor.d.ts +31 -0
  90. package/dist/types/shared/src/lib/anchor.d.ts.map +1 -0
  91. package/dist/types/shared/src/lib/banner.d.ts +3 -0
  92. package/dist/types/shared/src/lib/banner.d.ts.map +1 -0
  93. package/dist/types/shared/src/lib/calendar/format.d.ts +7 -0
  94. package/dist/types/shared/src/lib/calendar/format.d.ts.map +1 -0
  95. package/dist/types/shared/src/lib/caret.d.ts +2 -0
  96. package/dist/types/shared/src/lib/caret.d.ts.map +1 -0
  97. package/dist/types/shared/src/lib/collapse.d.ts +9 -0
  98. package/dist/types/shared/src/lib/collapse.d.ts.map +1 -0
  99. package/dist/types/shared/src/lib/command-palette/hotkey.d.ts +9 -0
  100. package/dist/types/shared/src/lib/command-palette/hotkey.d.ts.map +1 -0
  101. package/dist/types/shared/src/lib/command-palette/match.d.ts +21 -0
  102. package/dist/types/shared/src/lib/command-palette/match.d.ts.map +1 -0
  103. package/dist/types/shared/src/lib/data-list.d.ts +7 -0
  104. package/dist/types/shared/src/lib/data-list.d.ts.map +1 -0
  105. package/dist/types/shared/src/lib/data-table/column-sizing-styles.d.ts +8 -0
  106. package/dist/types/shared/src/lib/data-table/column-sizing-styles.d.ts.map +1 -0
  107. package/dist/types/shared/src/lib/data-table/column-sizing.d.ts +22 -0
  108. package/dist/types/shared/src/lib/data-table/column-sizing.d.ts.map +1 -0
  109. package/dist/types/shared/src/lib/data-table/csv.d.ts +5 -0
  110. package/dist/types/shared/src/lib/data-table/csv.d.ts.map +1 -0
  111. package/dist/types/shared/src/lib/data-table/layout.d.ts +28 -0
  112. package/dist/types/shared/src/lib/data-table/layout.d.ts.map +1 -0
  113. package/dist/types/shared/src/lib/data-table/resize.d.ts +15 -0
  114. package/dist/types/shared/src/lib/data-table/resize.d.ts.map +1 -0
  115. package/dist/types/shared/src/lib/data-table/state.d.ts +103 -0
  116. package/dist/types/shared/src/lib/data-table/state.d.ts.map +1 -0
  117. package/dist/types/shared/src/lib/data-table/utils.d.ts +11 -0
  118. package/dist/types/shared/src/lib/data-table/utils.d.ts.map +1 -0
  119. package/dist/types/shared/src/lib/date-range-field/validity.d.ts +12 -0
  120. package/dist/types/shared/src/lib/date-range-field/validity.d.ts.map +1 -0
  121. package/dist/types/shared/src/lib/date.d.ts +28 -0
  122. package/dist/types/shared/src/lib/date.d.ts.map +1 -0
  123. package/dist/types/shared/src/lib/field-focus.d.ts +2 -0
  124. package/dist/types/shared/src/lib/field-focus.d.ts.map +1 -0
  125. package/dist/types/shared/src/lib/file-upload/select.d.ts +17 -0
  126. package/dist/types/shared/src/lib/file-upload/select.d.ts.map +1 -0
  127. package/dist/types/shared/src/lib/file-upload/size.d.ts +2 -0
  128. package/dist/types/shared/src/lib/file-upload/size.d.ts.map +1 -0
  129. package/dist/types/shared/src/lib/form/errors.d.ts +7 -0
  130. package/dist/types/shared/src/lib/form/errors.d.ts.map +1 -0
  131. package/dist/types/shared/src/lib/form/focus.d.ts +2 -0
  132. package/dist/types/shared/src/lib/form/focus.d.ts.map +1 -0
  133. package/dist/types/shared/src/lib/form/standard-schema.d.ts +23 -0
  134. package/dist/types/shared/src/lib/form/standard-schema.d.ts.map +1 -0
  135. package/dist/types/shared/src/lib/form/values.d.ts +3 -0
  136. package/dist/types/shared/src/lib/form/values.d.ts.map +1 -0
  137. package/dist/types/shared/src/lib/highlighter.d.ts +4 -0
  138. package/dist/types/shared/src/lib/highlighter.d.ts.map +1 -0
  139. package/dist/types/shared/src/lib/iris-origin.d.ts +6 -0
  140. package/dist/types/shared/src/lib/iris-origin.d.ts.map +1 -0
  141. package/dist/types/shared/src/lib/lightbox/clip.d.ts +16 -0
  142. package/dist/types/shared/src/lib/lightbox/clip.d.ts.map +1 -0
  143. package/dist/types/shared/src/lib/lightbox/download.d.ts +3 -0
  144. package/dist/types/shared/src/lib/lightbox/download.d.ts.map +1 -0
  145. package/dist/types/shared/src/lib/lightbox/gesture.d.ts +26 -0
  146. package/dist/types/shared/src/lib/lightbox/gesture.d.ts.map +1 -0
  147. package/dist/types/shared/src/lib/lightbox/paging.d.ts +9 -0
  148. package/dist/types/shared/src/lib/lightbox/paging.d.ts.map +1 -0
  149. package/dist/types/shared/src/lib/lightbox/pose.d.ts +38 -0
  150. package/dist/types/shared/src/lib/lightbox/pose.d.ts.map +1 -0
  151. package/dist/types/shared/src/lib/lightbox/source.d.ts +4 -0
  152. package/dist/types/shared/src/lib/lightbox/source.d.ts.map +1 -0
  153. package/dist/types/shared/src/lib/lightbox/types.d.ts +16 -0
  154. package/dist/types/shared/src/lib/lightbox/types.d.ts.map +1 -0
  155. package/dist/types/shared/src/lib/lightbox/zoom.d.ts +40 -0
  156. package/dist/types/shared/src/lib/lightbox/zoom.d.ts.map +1 -0
  157. package/dist/types/shared/src/lib/meter-group.d.ts +5 -0
  158. package/dist/types/shared/src/lib/meter-group.d.ts.map +1 -0
  159. package/dist/types/shared/src/lib/overlay-anchor.d.ts +10 -0
  160. package/dist/types/shared/src/lib/overlay-anchor.d.ts.map +1 -0
  161. package/dist/types/shared/src/lib/pagination.d.ts +4 -0
  162. package/dist/types/shared/src/lib/pagination.d.ts.map +1 -0
  163. package/dist/types/shared/src/lib/pointer-corridor.d.ts +7 -0
  164. package/dist/types/shared/src/lib/pointer-corridor.d.ts.map +1 -0
  165. package/dist/types/shared/src/lib/qr-code-export.d.ts +6 -0
  166. package/dist/types/shared/src/lib/qr-code-export.d.ts.map +1 -0
  167. package/dist/types/shared/src/lib/range-calendar/limit.d.ts +3 -0
  168. package/dist/types/shared/src/lib/range-calendar/limit.d.ts.map +1 -0
  169. package/dist/types/shared/src/lib/rating.d.ts +2 -0
  170. package/dist/types/shared/src/lib/rating.d.ts.map +1 -0
  171. package/dist/types/shared/src/lib/relative-time.d.ts +2 -0
  172. package/dist/types/shared/src/lib/relative-time.d.ts.map +1 -0
  173. package/dist/types/shared/src/lib/scroll-area.d.ts +50 -0
  174. package/dist/types/shared/src/lib/scroll-area.d.ts.map +1 -0
  175. package/dist/types/shared/src/lib/scroll-restore.d.ts +34 -0
  176. package/dist/types/shared/src/lib/scroll-restore.d.ts.map +1 -0
  177. package/dist/types/shared/src/lib/toast-layout.d.ts +13 -0
  178. package/dist/types/shared/src/lib/toast-layout.d.ts.map +1 -0
  179. package/dist/types/shared/src/lib/tree/selection.d.ts +23 -0
  180. package/dist/types/shared/src/lib/tree/selection.d.ts.map +1 -0
  181. package/dist/types/shared/src/lib/tree-select/filter.d.ts +7 -0
  182. package/dist/types/shared/src/lib/tree-select/filter.d.ts.map +1 -0
  183. package/dist/types/shared/src/lib/virtual/choices.d.ts +59 -0
  184. package/dist/types/shared/src/lib/virtual/choices.d.ts.map +1 -0
  185. package/dist/types/shared/src/lib/virtual/collection.d.ts +25 -0
  186. package/dist/types/shared/src/lib/virtual/collection.d.ts.map +1 -0
  187. package/dist/types/shared/src/lib/virtual/flow.d.ts +18 -0
  188. package/dist/types/shared/src/lib/virtual/flow.d.ts.map +1 -0
  189. package/dist/types/shared/src/lib/virtual/list.d.ts +46 -0
  190. package/dist/types/shared/src/lib/virtual/list.d.ts.map +1 -0
  191. package/dist/types/shared/src/lib/virtual/navigation.d.ts +3 -0
  192. package/dist/types/shared/src/lib/virtual/navigation.d.ts.map +1 -0
  193. package/dist/types/shared/src/lib/virtual/tree.d.ts +31 -0
  194. package/dist/types/shared/src/lib/virtual/tree.d.ts.map +1 -0
  195. package/dist/types/shared/src/locale/en-US.d.ts +3 -0
  196. package/dist/types/shared/src/locale/en-US.d.ts.map +1 -0
  197. package/dist/types/shared/src/locale/index.d.ts +6 -0
  198. package/dist/types/shared/src/locale/index.d.ts.map +1 -0
  199. package/dist/types/shared/src/locale/types.d.ts +235 -0
  200. package/dist/types/shared/src/locale/types.d.ts.map +1 -0
  201. package/dist/types/shared/src/locale/zh-CN.d.ts +3 -0
  202. package/dist/types/shared/src/locale/zh-CN.d.ts.map +1 -0
  203. package/dist/types/shared/src/primitives/number-field/index.d.ts +155 -0
  204. package/dist/types/shared/src/primitives/number-field/index.d.ts.map +1 -0
  205. package/dist/types/shared/src/types/autocomplete.d.ts +14 -0
  206. package/dist/types/shared/src/types/autocomplete.d.ts.map +1 -0
  207. package/dist/types/shared/src/types/data-table.d.ts +169 -0
  208. package/dist/types/shared/src/types/data-table.d.ts.map +1 -0
  209. package/dist/types/shared/src/types/pagination.d.ts +23 -0
  210. package/dist/types/shared/src/types/pagination.d.ts.map +1 -0
  211. package/dist/types/shared/src/types/select.d.ts +14 -0
  212. package/dist/types/shared/src/types/select.d.ts.map +1 -0
  213. package/dist/types/shared/src/types/tree-select.d.ts +10 -0
  214. package/dist/types/shared/src/types/tree-select.d.ts.map +1 -0
  215. package/dist/types/shared/src/types/tree.d.ts +18 -0
  216. package/dist/types/shared/src/types/tree.d.ts.map +1 -0
  217. package/dist/types/shared/src/variants/autocomplete.d.ts +3 -0
  218. package/dist/types/shared/src/variants/autocomplete.d.ts.map +1 -0
  219. package/dist/types/shared/src/variants/editable.d.ts +52 -0
  220. package/dist/types/shared/src/variants/editable.d.ts.map +1 -0
  221. package/dist/types/shared/src/variants/float-button.d.ts +74 -0
  222. package/dist/types/shared/src/variants/float-button.d.ts.map +1 -0
  223. package/dist/types/shared/src/variants/split-button.d.ts +18 -0
  224. package/dist/types/shared/src/variants/split-button.d.ts.map +1 -0
  225. package/dist/types/vue/src/components/accordion/AccordionTrigger.vue.d.ts.map +1 -1
  226. package/dist/types/vue/src/components/anchor/composables/useAnchor.d.ts +2 -7
  227. package/dist/types/vue/src/components/anchor/composables/useAnchor.d.ts.map +1 -1
  228. package/dist/types/vue/src/components/anchor/composables/useAnchorFollow.d.ts.map +1 -1
  229. package/dist/types/vue/src/components/anchor/composables/useScrollSpy.d.ts +2 -5
  230. package/dist/types/vue/src/components/anchor/composables/useScrollSpy.d.ts.map +1 -1
  231. package/dist/types/vue/src/components/anchor/types.d.ts +1 -8
  232. package/dist/types/vue/src/components/anchor/types.d.ts.map +1 -1
  233. package/dist/types/vue/src/components/autocomplete/autocomplete.variants.d.ts +1 -1
  234. package/dist/types/vue/src/components/autocomplete/autocomplete.variants.d.ts.map +1 -1
  235. package/dist/types/vue/src/components/autocomplete/types.d.ts +1 -13
  236. package/dist/types/vue/src/components/autocomplete/types.d.ts.map +1 -1
  237. package/dist/types/vue/src/components/banner/utils/direction.d.ts +1 -2
  238. package/dist/types/vue/src/components/banner/utils/direction.d.ts.map +1 -1
  239. package/dist/types/vue/src/components/calendar/utils/format.d.ts +1 -6
  240. package/dist/types/vue/src/components/calendar/utils/format.d.ts.map +1 -1
  241. package/dist/types/vue/src/components/code-block/highlighter.d.ts +1 -3
  242. package/dist/types/vue/src/components/code-block/highlighter.d.ts.map +1 -1
  243. package/dist/types/vue/src/components/collapsible/CollapsibleTrigger.vue.d.ts.map +1 -1
  244. package/dist/types/vue/src/components/command-palette/composables/useCommandItems.d.ts +1 -1
  245. package/dist/types/vue/src/components/command-palette/utils/hotkey.d.ts +1 -8
  246. package/dist/types/vue/src/components/command-palette/utils/hotkey.d.ts.map +1 -1
  247. package/dist/types/vue/src/components/command-palette/utils/match.d.ts +5 -12
  248. package/dist/types/vue/src/components/command-palette/utils/match.d.ts.map +1 -1
  249. package/dist/types/vue/src/components/data-list/composables/useDataList.d.ts.map +1 -1
  250. package/dist/types/vue/src/components/data-list/utils/scroll.d.ts +1 -2
  251. package/dist/types/vue/src/components/data-list/utils/scroll.d.ts.map +1 -1
  252. package/dist/types/vue/src/components/data-table/column-sizing-styles.d.ts +1 -3
  253. package/dist/types/vue/src/components/data-table/column-sizing-styles.d.ts.map +1 -1
  254. package/dist/types/vue/src/components/data-table/column-sizing.d.ts +1 -21
  255. package/dist/types/vue/src/components/data-table/column-sizing.d.ts.map +1 -1
  256. package/dist/types/vue/src/components/data-table/composables/useDataTable.d.ts.map +1 -1
  257. package/dist/types/vue/src/components/data-table/composables/useTableColumns.d.ts.map +1 -1
  258. package/dist/types/vue/src/components/data-table/composables/useTableDrag.d.ts.map +1 -1
  259. package/dist/types/vue/src/components/data-table/composables/useTableExport.d.ts.map +1 -1
  260. package/dist/types/vue/src/components/data-table/composables/useTableResize.d.ts.map +1 -1
  261. package/dist/types/vue/src/components/data-table/composables/useTableResizeHandles.d.ts.map +1 -1
  262. package/dist/types/vue/src/components/data-table/composables/useTableVirtual.d.ts.map +1 -1
  263. package/dist/types/vue/src/components/data-table/types.d.ts +3 -153
  264. package/dist/types/vue/src/components/data-table/types.d.ts.map +1 -1
  265. package/dist/types/vue/src/components/data-table/utils.d.ts +1 -9
  266. package/dist/types/vue/src/components/data-table/utils.d.ts.map +1 -1
  267. package/dist/types/vue/src/components/date-range-field/utils/validity.d.ts +1 -11
  268. package/dist/types/vue/src/components/date-range-field/utils/validity.d.ts.map +1 -1
  269. package/dist/types/vue/src/components/editable/editable.variants.d.ts +1 -1
  270. package/dist/types/vue/src/components/editable/editable.variants.d.ts.map +1 -1
  271. package/dist/types/vue/src/components/file-upload/utils/select.d.ts +1 -16
  272. package/dist/types/vue/src/components/file-upload/utils/select.d.ts.map +1 -1
  273. package/dist/types/vue/src/components/file-upload/utils/size.d.ts +1 -1
  274. package/dist/types/vue/src/components/file-upload/utils/size.d.ts.map +1 -1
  275. package/dist/types/vue/src/components/float-button/float-button.variants.d.ts +1 -1
  276. package/dist/types/vue/src/components/float-button/float-button.variants.d.ts.map +1 -1
  277. package/dist/types/vue/src/components/form/Form.vue.d.ts +1 -1
  278. package/dist/types/vue/src/components/form/composables/useForm.d.ts +9 -15
  279. package/dist/types/vue/src/components/form/composables/useForm.d.ts.map +1 -1
  280. package/dist/types/vue/src/components/form/standard-schema.d.ts +1 -22
  281. package/dist/types/vue/src/components/form/standard-schema.d.ts.map +1 -1
  282. package/dist/types/vue/src/components/form/utils/errors.d.ts +1 -6
  283. package/dist/types/vue/src/components/form/utils/errors.d.ts.map +1 -1
  284. package/dist/types/vue/src/components/form/utils/focus.d.ts +1 -1
  285. package/dist/types/vue/src/components/form/utils/focus.d.ts.map +1 -1
  286. package/dist/types/vue/src/components/form/utils/values.d.ts +1 -2
  287. package/dist/types/vue/src/components/form/utils/values.d.ts.map +1 -1
  288. package/dist/types/vue/src/components/form-field/FormField.vue.d.ts.map +1 -1
  289. package/dist/types/vue/src/components/lightbox/types.d.ts +1 -15
  290. package/dist/types/vue/src/components/lightbox/types.d.ts.map +1 -1
  291. package/dist/types/vue/src/components/lightbox/utils/clip.d.ts +1 -15
  292. package/dist/types/vue/src/components/lightbox/utils/clip.d.ts.map +1 -1
  293. package/dist/types/vue/src/components/lightbox/utils/download.d.ts +1 -2
  294. package/dist/types/vue/src/components/lightbox/utils/download.d.ts.map +1 -1
  295. package/dist/types/vue/src/components/lightbox/utils/gesture.d.ts +1 -25
  296. package/dist/types/vue/src/components/lightbox/utils/gesture.d.ts.map +1 -1
  297. package/dist/types/vue/src/components/lightbox/utils/paging.d.ts +1 -8
  298. package/dist/types/vue/src/components/lightbox/utils/paging.d.ts.map +1 -1
  299. package/dist/types/vue/src/components/lightbox/utils/pose.d.ts +1 -37
  300. package/dist/types/vue/src/components/lightbox/utils/pose.d.ts.map +1 -1
  301. package/dist/types/vue/src/components/lightbox/utils/source.d.ts +1 -3
  302. package/dist/types/vue/src/components/lightbox/utils/source.d.ts.map +1 -1
  303. package/dist/types/vue/src/components/lightbox/utils/zoom.d.ts +1 -39
  304. package/dist/types/vue/src/components/lightbox/utils/zoom.d.ts.map +1 -1
  305. package/dist/types/vue/src/components/meter-group/utils/tones.d.ts +1 -3
  306. package/dist/types/vue/src/components/meter-group/utils/tones.d.ts.map +1 -1
  307. package/dist/types/vue/src/components/month-grid/MonthGrid.vue.d.ts +1 -1
  308. package/dist/types/vue/src/components/multi-select/MultiSelect.vue.d.ts.map +1 -1
  309. package/dist/types/vue/src/components/pagination/composables/usePagination.d.ts +2 -2
  310. package/dist/types/vue/src/components/pagination/composables/usePagination.d.ts.map +1 -1
  311. package/dist/types/vue/src/components/pagination/types.d.ts +1 -22
  312. package/dist/types/vue/src/components/pagination/types.d.ts.map +1 -1
  313. package/dist/types/vue/src/components/pagination/utils/ranges.d.ts +1 -2
  314. package/dist/types/vue/src/components/pagination/utils/ranges.d.ts.map +1 -1
  315. package/dist/types/vue/src/components/password-input/PasswordInput.vue.d.ts +4 -1
  316. package/dist/types/vue/src/components/password-input/PasswordInput.vue.d.ts.map +1 -1
  317. package/dist/types/vue/src/components/qr-code/export.d.ts +1 -2
  318. package/dist/types/vue/src/components/qr-code/export.d.ts.map +1 -1
  319. package/dist/types/vue/src/components/range-calendar/utils/limit.d.ts +1 -2
  320. package/dist/types/vue/src/components/range-calendar/utils/limit.d.ts.map +1 -1
  321. package/dist/types/vue/src/components/range-slider/RangeSlider.vue.d.ts +2 -2
  322. package/dist/types/vue/src/components/rating/utils/fill.d.ts +1 -1
  323. package/dist/types/vue/src/components/rating/utils/fill.d.ts.map +1 -1
  324. package/dist/types/vue/src/components/ripple/useRipple.d.ts.map +1 -1
  325. package/dist/types/vue/src/components/scroll-area/ScrollArea.vue.d.ts.map +1 -1
  326. package/dist/types/vue/src/components/scroll-area/composables/useEdgeShadow.d.ts +2 -1
  327. package/dist/types/vue/src/components/scroll-area/composables/useEdgeShadow.d.ts.map +1 -1
  328. package/dist/types/vue/src/components/scroll-area/composables/useLayerLock.d.ts.map +1 -1
  329. package/dist/types/vue/src/components/scroll-area/composables/useWheelRedirect.d.ts.map +1 -1
  330. package/dist/types/vue/src/components/scroll-area/scroll-restore.d.ts +1 -33
  331. package/dist/types/vue/src/components/scroll-area/scroll-restore.d.ts.map +1 -1
  332. package/dist/types/vue/src/components/search-input/SearchInput.vue.d.ts +4 -1
  333. package/dist/types/vue/src/components/search-input/SearchInput.vue.d.ts.map +1 -1
  334. package/dist/types/vue/src/components/select/types.d.ts +1 -13
  335. package/dist/types/vue/src/components/select/types.d.ts.map +1 -1
  336. package/dist/types/vue/src/components/slider/Slider.vue.d.ts +2 -2
  337. package/dist/types/vue/src/components/split-button/split-button.variants.d.ts +1 -1
  338. package/dist/types/vue/src/components/split-button/split-button.variants.d.ts.map +1 -1
  339. package/dist/types/vue/src/components/spoiler/SpoilerPainter.d.ts +1 -34
  340. package/dist/types/vue/src/components/spoiler/SpoilerPainter.d.ts.map +1 -1
  341. package/dist/types/vue/src/components/spoiler/utils/irisOrigin.d.ts +1 -5
  342. package/dist/types/vue/src/components/spoiler/utils/irisOrigin.d.ts.map +1 -1
  343. package/dist/types/vue/src/components/spoiler/worklet.d.ts +1 -1
  344. package/dist/types/vue/src/components/spoiler/worklet.d.ts.map +1 -1
  345. package/dist/types/vue/src/components/table/Table.vue.d.ts +6 -3
  346. package/dist/types/vue/src/components/table/Table.vue.d.ts.map +1 -1
  347. package/dist/types/vue/src/components/tabs/TabsList.vue.d.ts +6 -3
  348. package/dist/types/vue/src/components/tabs/TabsList.vue.d.ts.map +1 -1
  349. package/dist/types/vue/src/components/time/utils/relativeTime.d.ts +1 -1
  350. package/dist/types/vue/src/components/time/utils/relativeTime.d.ts.map +1 -1
  351. package/dist/types/vue/src/components/toast/composables/useToastLayout.d.ts +4 -11
  352. package/dist/types/vue/src/components/toast/composables/useToastLayout.d.ts.map +1 -1
  353. package/dist/types/vue/src/components/toast/store.d.ts +14 -62
  354. package/dist/types/vue/src/components/toast/store.d.ts.map +1 -1
  355. package/dist/types/vue/src/components/tree/composables/useTree.d.ts.map +1 -1
  356. package/dist/types/vue/src/components/tree/types.d.ts +1 -17
  357. package/dist/types/vue/src/components/tree/types.d.ts.map +1 -1
  358. package/dist/types/vue/src/components/tree/utils/selection.d.ts +1 -15
  359. package/dist/types/vue/src/components/tree/utils/selection.d.ts.map +1 -1
  360. package/dist/types/vue/src/components/tree-select/types.d.ts +1 -9
  361. package/dist/types/vue/src/components/tree-select/types.d.ts.map +1 -1
  362. package/dist/types/vue/src/components/tree-select/utils/filterTree.d.ts +1 -6
  363. package/dist/types/vue/src/components/tree-select/utils/filterTree.d.ts.map +1 -1
  364. package/dist/types/vue/src/components/virtual-list/composables/useVirtualList.d.ts +1 -1
  365. package/dist/types/vue/src/components/virtual-list/composables/useVirtualList.d.ts.map +1 -1
  366. package/dist/types/vue/src/components/visually-hidden/VisuallyHidden.vue.d.ts +4 -1
  367. package/dist/types/vue/src/components/visually-hidden/VisuallyHidden.vue.d.ts.map +1 -1
  368. package/dist/types/vue/src/lib/caret.d.ts +1 -1
  369. package/dist/types/vue/src/lib/caret.d.ts.map +1 -1
  370. package/dist/types/vue/src/lib/collapse.d.ts +2 -8
  371. package/dist/types/vue/src/lib/collapse.d.ts.map +1 -1
  372. package/dist/types/vue/src/lib/date.d.ts +1 -27
  373. package/dist/types/vue/src/lib/date.d.ts.map +1 -1
  374. package/dist/types/vue/src/lib/field-focus.d.ts +1 -1
  375. package/dist/types/vue/src/lib/field-focus.d.ts.map +1 -1
  376. package/dist/types/vue/src/lib/overlay-anchor.d.ts +2 -7
  377. package/dist/types/vue/src/lib/overlay-anchor.d.ts.map +1 -1
  378. package/dist/types/vue/src/lib/pointer-corridor.d.ts +1 -6
  379. package/dist/types/vue/src/lib/pointer-corridor.d.ts.map +1 -1
  380. package/dist/types/vue/src/lib/reka/useVirtualChoices.d.ts +3 -11
  381. package/dist/types/vue/src/lib/reka/useVirtualChoices.d.ts.map +1 -1
  382. package/dist/types/vue/src/lib/reka/useVirtualTree.d.ts +1 -1
  383. package/dist/types/vue/src/lib/reka/useVirtualTree.d.ts.map +1 -1
  384. package/dist/types/vue/src/lib/virtual/navigation.d.ts +1 -2
  385. package/dist/types/vue/src/lib/virtual/navigation.d.ts.map +1 -1
  386. package/dist/types/vue/src/lib/virtual/useVirtualCollection.d.ts +1 -1
  387. package/dist/types/vue/src/lib/virtual/useVirtualCollection.d.ts.map +1 -1
  388. package/dist/types/vue/src/lib/virtual/useVirtualWindow.d.ts +2 -15
  389. package/dist/types/vue/src/lib/virtual/useVirtualWindow.d.ts.map +1 -1
  390. package/dist/types/vue/src/locale/en-US.d.ts +1 -2
  391. package/dist/types/vue/src/locale/en-US.d.ts.map +1 -1
  392. package/dist/types/vue/src/locale/index.d.ts +3 -4
  393. package/dist/types/vue/src/locale/index.d.ts.map +1 -1
  394. package/dist/types/vue/src/locale/types.d.ts +1 -234
  395. package/dist/types/vue/src/locale/types.d.ts.map +1 -1
  396. package/dist/types/vue/src/locale/zh-CN.d.ts +1 -2
  397. package/dist/types/vue/src/locale/zh-CN.d.ts.map +1 -1
  398. package/dist/types/vue/src/primitives/number-field/NumberFieldDecrement.vue.d.ts +17 -0
  399. package/dist/types/vue/src/primitives/number-field/NumberFieldDecrement.vue.d.ts.map +1 -0
  400. package/dist/types/vue/src/primitives/number-field/NumberFieldIncrement.vue.d.ts +17 -0
  401. package/dist/types/vue/src/primitives/number-field/NumberFieldIncrement.vue.d.ts.map +1 -0
  402. package/dist/types/vue/src/primitives/number-field/NumberFieldInput.vue.d.ts +16 -0
  403. package/dist/types/vue/src/primitives/number-field/NumberFieldInput.vue.d.ts.map +1 -0
  404. package/dist/types/vue/src/primitives/number-field/NumberFieldRoot.vue.d.ts +47 -0
  405. package/dist/types/vue/src/primitives/number-field/NumberFieldRoot.vue.d.ts.map +1 -0
  406. package/dist/types/vue/src/primitives/number-field/context.d.ts +41 -0
  407. package/dist/types/vue/src/primitives/number-field/context.d.ts.map +1 -0
  408. package/dist/types/vue/src/primitives/number-field/index.d.ts +5 -0
  409. package/dist/types/vue/src/primitives/number-field/index.d.ts.map +1 -0
  410. package/dist/types/vue/src/primitives/utils/timers.d.ts +6 -0
  411. package/dist/types/vue/src/primitives/utils/timers.d.ts.map +1 -0
  412. package/dist/types/vue/src/primitives/utils/usePrimitiveElement.d.ts +6 -0
  413. package/dist/types/vue/src/primitives/utils/usePrimitiveElement.d.ts.map +1 -0
  414. package/dist/types/vue/src/primitives/utils/useVModel.d.ts +7 -0
  415. package/dist/types/vue/src/primitives/utils/useVModel.d.ts.map +1 -0
  416. package/dist/types/vue/src/primitives/visually-hidden/VisuallyHiddenInput.d.ts +66 -0
  417. package/dist/types/vue/src/primitives/visually-hidden/VisuallyHiddenInput.d.ts.map +1 -0
  418. package/dist/types/vue/src/primitives/visually-hidden/VisuallyHiddenInputBubble.vue.d.ts +28 -0
  419. package/dist/types/vue/src/primitives/visually-hidden/VisuallyHiddenInputBubble.vue.d.ts.map +1 -0
  420. package/package.json +3 -2
  421. package/src/components/accordion/AccordionTrigger.vue +9 -1
  422. package/src/components/anchor/composables/useAnchor.ts +3 -12
  423. package/src/components/anchor/composables/useAnchorFollow.ts +8 -76
  424. package/src/components/anchor/composables/useScrollSpy.ts +22 -38
  425. package/src/components/anchor/types.ts +1 -8
  426. package/src/components/autocomplete/autocomplete.variants.ts +1 -1
  427. package/src/components/autocomplete/composables/useAutocomplete.ts +1 -1
  428. package/src/components/autocomplete/types.ts +1 -16
  429. package/src/components/banner/utils/direction.ts +1 -10
  430. package/src/components/calendar/utils/format.ts +1 -23
  431. package/src/components/code-block/highlighter.ts +1 -98
  432. package/src/components/collapsible/CollapsibleTrigger.vue +8 -1
  433. package/src/components/command-palette/utils/hotkey.ts +1 -27
  434. package/src/components/command-palette/utils/match.ts +5 -75
  435. package/src/components/data-list/composables/useDataList.ts +2 -4
  436. package/src/components/data-list/utils/scroll.ts +1 -26
  437. package/src/components/data-table/column-sizing-styles.ts +1 -40
  438. package/src/components/data-table/column-sizing.ts +1 -101
  439. package/src/components/data-table/composables/useDataTable.ts +103 -123
  440. package/src/components/data-table/composables/useTableColumns.ts +38 -113
  441. package/src/components/data-table/composables/useTableDrag.ts +21 -11
  442. package/src/components/data-table/composables/useTableExport.ts +8 -32
  443. package/src/components/data-table/composables/useTableResize.ts +13 -17
  444. package/src/components/data-table/composables/useTableResizeHandles.ts +6 -21
  445. package/src/components/data-table/types.ts +15 -155
  446. package/src/components/data-table/utils.ts +1 -75
  447. package/src/components/date-range-field/utils/validity.ts +1 -21
  448. package/src/components/editable/editable.variants.ts +1 -1
  449. package/src/components/file-upload/utils/select.ts +1 -58
  450. package/src/components/file-upload/utils/size.ts +1 -16
  451. package/src/components/float-button/float-button.variants.ts +1 -1
  452. package/src/components/form/composables/useForm.ts +24 -135
  453. package/src/components/form/standard-schema.ts +1 -26
  454. package/src/components/form/utils/errors.ts +1 -48
  455. package/src/components/form/utils/focus.ts +1 -10
  456. package/src/components/form/utils/values.ts +1 -23
  457. package/src/components/form-field/FormField.vue +3 -2
  458. package/src/components/lightbox/types.ts +1 -14
  459. package/src/components/lightbox/utils/clip.ts +1 -117
  460. package/src/components/lightbox/utils/download.ts +1 -29
  461. package/src/components/lightbox/utils/gesture.ts +1 -54
  462. package/src/components/lightbox/utils/paging.ts +1 -33
  463. package/src/components/lightbox/utils/pose.ts +1 -142
  464. package/src/components/lightbox/utils/source.ts +1 -17
  465. package/src/components/lightbox/utils/zoom.ts +1 -127
  466. package/src/components/meter-group/utils/tones.ts +1 -14
  467. package/src/components/multi-select/MultiSelect.vue +1 -2
  468. package/src/components/number-input/NumberInput.vue +2 -2
  469. package/src/components/pagination/composables/usePagination.ts +2 -3
  470. package/src/components/pagination/types.ts +1 -19
  471. package/src/components/pagination/utils/ranges.ts +1 -12
  472. package/src/components/password-input/PasswordInput.vue +6 -0
  473. package/src/components/qr-code/export.ts +1 -65
  474. package/src/components/range-calendar/utils/limit.ts +1 -11
  475. package/src/components/rating/utils/fill.ts +1 -4
  476. package/src/components/ripple/useRipple.ts +10 -198
  477. package/src/components/scroll-area/ScrollArea.vue +6 -18
  478. package/src/components/scroll-area/composables/useEdgeShadow.ts +7 -16
  479. package/src/components/scroll-area/composables/useLayerLock.ts +2 -9
  480. package/src/components/scroll-area/composables/useWheelRedirect.ts +2 -10
  481. package/src/components/scroll-area/scroll-restore.ts +1 -148
  482. package/src/components/search-input/SearchInput.vue +6 -0
  483. package/src/components/select/types.ts +1 -23
  484. package/src/components/split-button/split-button.variants.ts +1 -1
  485. package/src/components/spoiler/SpoilerPainter.ts +1 -197
  486. package/src/components/spoiler/utils/irisOrigin.ts +1 -40
  487. package/src/components/spoiler/worklet.ts +1 -199
  488. package/src/components/table/Table.vue +9 -0
  489. package/src/components/tabs/TabsList.vue +9 -0
  490. package/src/components/time/utils/relativeTime.ts +1 -20
  491. package/src/components/toast/composables/useToastLayout.ts +12 -24
  492. package/src/components/toast/store.ts +16 -228
  493. package/src/components/tree/composables/useTree.ts +17 -33
  494. package/src/components/tree/types.ts +1 -20
  495. package/src/components/tree/utils/selection.ts +1 -78
  496. package/src/components/tree-select/types.ts +1 -34
  497. package/src/components/tree-select/utils/filterTree.ts +1 -19
  498. package/src/components/virtual-list/composables/useVirtualList.ts +16 -42
  499. package/src/components/visually-hidden/VisuallyHidden.vue +21 -3
  500. package/src/lib/caret.ts +1 -48
  501. package/src/lib/collapse.ts +6 -29
  502. package/src/lib/date.ts +1 -111
  503. package/src/lib/field-focus.ts +1 -36
  504. package/src/lib/overlay-anchor.ts +11 -37
  505. package/src/lib/pointer-corridor.ts +1 -26
  506. package/src/lib/reka/useVirtualChoices.ts +55 -133
  507. package/src/lib/reka/useVirtualTree.ts +22 -65
  508. package/src/lib/virtual/navigation.ts +1 -26
  509. package/src/lib/virtual/useVirtualCollection.ts +28 -47
  510. package/src/lib/virtual/useVirtualWindow.ts +15 -25
  511. package/src/locale/en-US.ts +1 -220
  512. package/src/locale/index.ts +9 -53
  513. package/src/locale/types.ts +1 -225
  514. package/src/locale/zh-CN.ts +1 -215
  515. package/src/primitives/number-field/LICENSE +21 -0
  516. package/src/primitives/number-field/NumberFieldDecrement.vue +21 -0
  517. package/src/primitives/number-field/NumberFieldIncrement.vue +21 -0
  518. package/src/primitives/number-field/NumberFieldInput.vue +114 -0
  519. package/src/primitives/number-field/NumberFieldRoot.vue +169 -0
  520. package/src/primitives/number-field/context.ts +111 -0
  521. package/src/primitives/number-field/index.ts +14 -0
  522. package/src/primitives/utils/LICENSE +44 -0
  523. package/src/primitives/utils/timers.ts +6 -0
  524. package/src/primitives/utils/usePrimitiveElement.ts +12 -0
  525. package/src/primitives/utils/useVModel.ts +37 -0
  526. package/src/primitives/visually-hidden/LICENSE +21 -0
  527. package/src/primitives/visually-hidden/VisuallyHiddenInput.ts +97 -0
  528. package/src/primitives/visually-hidden/VisuallyHiddenInputBubble.vue +49 -0
@@ -0,0 +1,98 @@
1
+ import type { HighlighterCore, ThemedToken } from 'shiki/core'
2
+
3
+ const langLoaders: Record<string, () => Promise<{ default: unknown }>> = {
4
+ typescript: () => import('shiki/langs/typescript.mjs'),
5
+ tsx: () => import('shiki/langs/tsx.mjs'),
6
+ javascript: () => import('shiki/langs/javascript.mjs'),
7
+ jsx: () => import('shiki/langs/jsx.mjs'),
8
+ vue: () => import('shiki/langs/vue.mjs'),
9
+ html: () => import('shiki/langs/html.mjs'),
10
+ css: () => import('shiki/langs/css.mjs'),
11
+ json: () => import('shiki/langs/json.mjs'),
12
+ bash: () => import('shiki/langs/bash.mjs'),
13
+ markdown: () => import('shiki/langs/markdown.mjs'),
14
+ yaml: () => import('shiki/langs/yaml.mjs'),
15
+ sql: () => import('shiki/langs/sql.mjs'),
16
+ prisma: () => import('shiki/langs/prisma.mjs'),
17
+ diff: () => import('shiki/langs/diff.mjs'),
18
+ }
19
+
20
+ const langAliases: Record<string, string> = {
21
+ ts: 'typescript',
22
+ js: 'javascript',
23
+ sh: 'bash',
24
+ shell: 'bash',
25
+ zsh: 'bash',
26
+ md: 'markdown',
27
+ yml: 'yaml',
28
+ }
29
+
30
+ let core: Promise<HighlighterCore> | undefined
31
+ const loadedLangs = new Set<string>()
32
+
33
+ function getCore() {
34
+ core ??= (async () => {
35
+ const [{ createHighlighterCore }, { createJavaScriptRegexEngine }, light, dark] =
36
+ await Promise.all([
37
+ import('shiki/core'),
38
+ import('shiki/engine/javascript'),
39
+ import('shiki/themes/vitesse-light.mjs'),
40
+ import('shiki/themes/vitesse-dark.mjs'),
41
+ ])
42
+ return createHighlighterCore({
43
+ themes: [light.default, dark.default],
44
+ langs: [],
45
+ engine: createJavaScriptRegexEngine({ forgiving: true }),
46
+ })
47
+ })()
48
+ return core
49
+ }
50
+
51
+ function escape(text: string): string {
52
+ return text
53
+ .replace(/&/g, '&amp;')
54
+ .replace(/</g, '&lt;')
55
+ .replace(/>/g, '&gt;')
56
+ .replace(/"/g, '&quot;')
57
+ }
58
+
59
+ function inlineStyle(style: ThemedToken['htmlStyle']): string {
60
+ if (!style) return ''
61
+ if (typeof style === 'string') return style
62
+ return Object.entries(style)
63
+ .map(([key, value]) => `${key}:${value}`)
64
+ .join(';')
65
+ }
66
+
67
+ export function tokensToHtml(lines: ThemedToken[][]): string {
68
+ return lines
69
+ .map(line =>
70
+ line
71
+ .map(
72
+ token =>
73
+ `<span style="${escape(inlineStyle(token.htmlStyle))}">${escape(token.content)}</span>`,
74
+ )
75
+ .join(''),
76
+ )
77
+ .join('\n')
78
+ }
79
+
80
+ export async function tokenize(code: string, lang: string): Promise<ThemedToken[][] | null> {
81
+ const resolved = langAliases[lang] ?? lang
82
+ const load = langLoaders[resolved]
83
+ if (!load) return null
84
+
85
+ const highlighter = await getCore()
86
+ if (!loadedLangs.has(resolved)) {
87
+ await highlighter.loadLanguage(
88
+ (await load()).default as Parameters<HighlighterCore['loadLanguage']>[0],
89
+ )
90
+ loadedLangs.add(resolved)
91
+ }
92
+
93
+ return highlighter.codeToTokens(code, {
94
+ lang: resolved,
95
+ themes: { light: 'vitesse-light', dark: 'vitesse-dark' },
96
+ defaultColor: false,
97
+ }).tokens
98
+ }
@@ -0,0 +1,40 @@
1
+ export interface IrisOrigin {
2
+ x: number
3
+ y: number
4
+ }
5
+
6
+ export function irisOrigin(
7
+ rects: readonly DOMRect[],
8
+ clientX: number,
9
+ clientY: number,
10
+ ): IrisOrigin | null {
11
+ const valid = rects.filter(r => r.width > 0 && r.height > 0)
12
+ if (valid.length === 0) return null
13
+
14
+ const totalWidth = valid.reduce((sum, r) => sum + r.width, 0)
15
+ const lineHeight = valid[0]!.height
16
+
17
+ let virtualX: number | null = null
18
+ let virtualY = 0
19
+ let walked = 0
20
+ for (const r of valid) {
21
+ const inside =
22
+ clientY >= r.top - 2 &&
23
+ clientY <= r.bottom + 2 &&
24
+ clientX >= r.left - 2 &&
25
+ clientX <= r.right + 2
26
+ if (inside) {
27
+ virtualX = walked + (clientX - r.left)
28
+ virtualY = clientY - r.top
29
+ break
30
+ }
31
+ walked += r.width
32
+ }
33
+
34
+ if (virtualX === null || totalWidth === 0 || lineHeight === 0) return null
35
+
36
+ return {
37
+ x: (virtualX / totalWidth) * 100,
38
+ y: (virtualY / lineHeight) * 100,
39
+ }
40
+ }
@@ -0,0 +1,117 @@
1
+ import type { Rect } from './pose'
2
+
3
+ export interface Corner {
4
+ x: number
5
+ y: number
6
+ }
7
+
8
+ export type Corners = [Corner, Corner, Corner, Corner]
9
+
10
+ function emptyCorners(): Corners {
11
+ return [
12
+ { x: 0, y: 0 },
13
+ { x: 0, y: 0 },
14
+ { x: 0, y: 0 },
15
+ { x: 0, y: 0 },
16
+ ]
17
+ }
18
+
19
+ function length(value: string, size: number): number {
20
+ const number = Number.parseFloat(value) || 0
21
+ return value.endsWith('%') ? (number * size) / 100 : number
22
+ }
23
+
24
+ function cornersOf(style: CSSStyleDeclaration, width: number, height: number): Corners {
25
+ const corners = [
26
+ style.borderTopLeftRadius,
27
+ style.borderTopRightRadius,
28
+ style.borderBottomRightRadius,
29
+ style.borderBottomLeftRadius,
30
+ ].map(value => {
31
+ const [x = '0', y = x] = value.split(/\s+/)
32
+ return { x: length(x, width), y: length(y, height) }
33
+ }) as Corners
34
+ const [tl, tr, br, bl] = corners
35
+ const factor = Math.min(
36
+ 1,
37
+ width / (tl.x + tr.x || 1),
38
+ width / (bl.x + br.x || 1),
39
+ height / (tl.y + bl.y || 1),
40
+ height / (tr.y + br.y || 1),
41
+ )
42
+ return corners.map(corner => ({ x: corner.x * factor, y: corner.y * factor })) as Corners
43
+ }
44
+
45
+ function paddingBox(node: Element, style: CSSStyleDeclaration) {
46
+ const box = node.getBoundingClientRect()
47
+ const width = node instanceof HTMLElement ? node.offsetWidth : box.width
48
+ const height = node instanceof HTMLElement ? node.offsetHeight : box.height
49
+ const sx = width ? box.width / width : 1
50
+ const sy = height ? box.height / height : 1
51
+ const left = Number.parseFloat(style.borderLeftWidth) || 0
52
+ const right = Number.parseFloat(style.borderRightWidth) || 0
53
+ const top = Number.parseFloat(style.borderTopWidth) || 0
54
+ const bottom = Number.parseFloat(style.borderBottomWidth) || 0
55
+ const corners = cornersOf(style, width, height)
56
+ const borders = [
57
+ [left, top],
58
+ [right, top],
59
+ [right, bottom],
60
+ [left, bottom],
61
+ ]
62
+ return {
63
+ rect: {
64
+ x: box.x + left * sx,
65
+ y: box.y + top * sy,
66
+ width: Math.max(0, box.width - (left + right) * sx),
67
+ height: Math.max(0, box.height - (top + bottom) * sy),
68
+ },
69
+ corners: corners.map((corner, index) => ({
70
+ x: Math.max(0, corner.x - borders[index]![0]!) * sx,
71
+ y: Math.max(0, corner.y - borders[index]![1]!) * sy,
72
+ })) as Corners,
73
+ }
74
+ }
75
+
76
+ function points(rect: Rect) {
77
+ return [
78
+ [rect.x, rect.y],
79
+ [rect.x + rect.width, rect.y],
80
+ [rect.x + rect.width, rect.y + rect.height],
81
+ [rect.x, rect.y + rect.height],
82
+ ]
83
+ }
84
+
85
+ export function clipOf(el: Element | null | undefined, box: Rect) {
86
+ let rect = { x: box.x, y: box.y, width: box.width, height: box.height }
87
+ const clips: ReturnType<typeof paddingBox>[] = []
88
+ for (let node = el; node; node = node.parentElement) {
89
+ const style = getComputedStyle(node)
90
+ const clipX = node === el || /^(hidden|clip|scroll|auto)$/.test(style.overflowX)
91
+ const clipY = node === el || /^(hidden|clip|scroll|auto)$/.test(style.overflowY)
92
+ if (!clipX && !clipY) continue
93
+ const clip = paddingBox(node, style)
94
+ const x = clipX ? Math.max(rect.x, clip.rect.x) : rect.x
95
+ const y = clipY ? Math.max(rect.y, clip.rect.y) : rect.y
96
+ const right = clipX
97
+ ? Math.min(rect.x + rect.width, clip.rect.x + clip.rect.width)
98
+ : rect.x + rect.width
99
+ const bottom = clipY
100
+ ? Math.min(rect.y + rect.height, clip.rect.y + clip.rect.height)
101
+ : rect.y + rect.height
102
+ rect = { x, y, width: Math.max(0, right - x), height: Math.max(0, bottom - y) }
103
+ if (clipX && clipY) clips.push(clip)
104
+ }
105
+ const corners = emptyCorners()
106
+ const visible = points(rect)
107
+ for (const clip of clips) {
108
+ const edges = points(clip.rect)
109
+ for (let index = 0; index < 4; index += 1) {
110
+ if (visible[index]!.some((value, axis) => Math.abs(value - edges[index]![axis]!) > 0.5))
111
+ continue
112
+ corners[index]!.x = Math.max(corners[index]!.x, clip.corners[index]!.x)
113
+ corners[index]!.y = Math.max(corners[index]!.y, clip.corners[index]!.y)
114
+ }
115
+ }
116
+ return { rect, corners }
117
+ }
@@ -0,0 +1,29 @@
1
+ export function fileNameOf(url: string, fallback = 'image'): string {
2
+ try {
3
+ const parsed = new URL(url, 'http://localhost')
4
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return fallback
5
+ const name = decodeURIComponent(parsed.pathname.split('/').filter(Boolean).pop() ?? '')
6
+ return name || fallback
7
+ } catch {
8
+ return fallback
9
+ }
10
+ }
11
+
12
+ export async function saveImage(url: string): Promise<'saved' | 'opened'> {
13
+ try {
14
+ const response = await fetch(url, { mode: 'cors' })
15
+ if (!response.ok) throw new Error(String(response.status))
16
+ const blob = await response.blob()
17
+ const href = URL.createObjectURL(blob)
18
+ const anchor = Object.assign(document.createElement('a'), {
19
+ href,
20
+ download: fileNameOf(url),
21
+ })
22
+ anchor.click()
23
+ setTimeout(() => URL.revokeObjectURL(href), 0)
24
+ return 'saved'
25
+ } catch {
26
+ window.open(url, '_blank', 'noopener')
27
+ return 'opened'
28
+ }
29
+ }
@@ -0,0 +1,54 @@
1
+ import type { Point } from './zoom'
2
+
3
+ export interface Touch extends Point {
4
+ time: number
5
+ }
6
+
7
+ export const DRAG_THRESHOLD = 4
8
+ export const TAP_MAX_DISTANCE = 10
9
+ export const TAP_MAX_MS = 300
10
+ export const DOUBLE_TAP_MS = 300
11
+ export const DOUBLE_TAP_DISTANCE = 25
12
+ export const WHEEL_LINE = 16
13
+ export const TRACKPAD_INTENSITY = 0.01
14
+
15
+ export const FLING = {
16
+ power: 0.8,
17
+ timeConstant: 750,
18
+ bounceStiffness: 200,
19
+ bounceDamping: 40,
20
+ restDelta: 1,
21
+ restSpeed: 10,
22
+ } as const
23
+
24
+ export function midpoint(a: Point, b: Point): Point {
25
+ return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }
26
+ }
27
+
28
+ export function distance(a: Point, b: Point): number {
29
+ return Math.hypot(b.x - a.x, b.y - a.y)
30
+ }
31
+
32
+ export function dragAxis(start: Point, current: Point): 'x' | 'y' | null {
33
+ const dx = Math.abs(current.x - start.x)
34
+ const dy = Math.abs(current.y - start.y)
35
+ if (Math.max(dx, dy) < DRAG_THRESHOLD) return null
36
+ return dx > dy ? 'x' : 'y'
37
+ }
38
+
39
+ export function isTap(start: Touch, end: Touch): boolean {
40
+ return distance(start, end) <= TAP_MAX_DISTANCE && end.time - start.time <= TAP_MAX_MS
41
+ }
42
+
43
+ export function isDoubleTap(previous: Touch | null, next: Touch): boolean {
44
+ if (!previous) return false
45
+ return (
46
+ next.time - previous.time <= DOUBLE_TAP_MS && distance(previous, next) <= DOUBLE_TAP_DISTANCE
47
+ )
48
+ }
49
+
50
+ export function wheelDelta(deltaY: number, deltaMode: number, stageHeight: number): number {
51
+ if (deltaMode === 1) return deltaY * WHEEL_LINE
52
+ if (deltaMode === 2) return deltaY * stageHeight
53
+ return deltaY
54
+ }
@@ -0,0 +1,33 @@
1
+ import { rubberBand } from './zoom'
2
+
3
+ export const PAGE_COMMIT = 0.2
4
+ export const PAGE_VELOCITY = 400
5
+ export const PAGE_PROJECTION = 0.25
6
+
7
+ export function pageSteps(offset: number, velocity: number, width: number): number {
8
+ if (width <= 0) return 0
9
+ if (Math.abs(offset) < width * PAGE_COMMIT && Math.abs(velocity) < PAGE_VELOCITY) return 0
10
+ const projected = offset + velocity * PAGE_PROJECTION
11
+ if (projected === 0) return 0
12
+ return projected < 0 ? 1 : -1
13
+ }
14
+
15
+ export function clampIndex(index: number, count: number): number {
16
+ if (count <= 0) return 0
17
+ return Math.min(Math.max(index, 0), count - 1)
18
+ }
19
+
20
+ export function wrapIndex(index: number, count: number): number {
21
+ if (count <= 0) return 0
22
+ return ((index % count) + count) % count
23
+ }
24
+
25
+ export function shortestDelta(delta: number, count: number): number {
26
+ if (count <= 0) return 0
27
+ const forward = wrapIndex(delta, count)
28
+ return forward > count / 2 ? forward - count : forward
29
+ }
30
+
31
+ export function edgePosition(raw: number, count: number, width: number): number {
32
+ return rubberBand(raw, -Math.max(0, count - 1) * width, 0, width)
33
+ }
@@ -0,0 +1,142 @@
1
+ import type { ImageVariants } from '../../variants/image'
2
+ import type { Corners } from './clip'
3
+ import { fitSize, rotatedSize, type Size } from './zoom'
4
+
5
+ export interface Rect {
6
+ x: number
7
+ y: number
8
+ width: number
9
+ height: number
10
+ }
11
+
12
+ export interface Pose {
13
+ x: number
14
+ y: number
15
+ scale: number
16
+ rotate: number
17
+ clipPath: string
18
+ }
19
+
20
+ export const REST_POSE: Pose = {
21
+ x: 0,
22
+ y: 0,
23
+ scale: 1,
24
+ rotate: 0,
25
+ clipPath: 'inset(0px 0px 0px 0px round 0px 0px 0px 0px / 0px 0px 0px 0px)',
26
+ }
27
+ export const TRAVEL_SPRING = { type: 'spring', visualDuration: 0.3, bounce: 0 } as const
28
+ export const RETURN_SPRING = { ...TRAVEL_SPRING, visualDuration: 0.22 } as const
29
+ export const DISMISS_SCALE = 0.7
30
+ export const DISMISS_TRAVEL = 0.3
31
+ export const DISMISS_COMMIT = 0.5
32
+ export const DISMISS_VELOCITY = 600
33
+
34
+ function px(value: number): string {
35
+ return `${Math.round(value * 100) / 100}px`
36
+ }
37
+
38
+ export function fitRect(
39
+ natural: Size,
40
+ stage: Size & Partial<Pick<Rect, 'x' | 'y'>>,
41
+ rotation = 0,
42
+ ): Rect {
43
+ const size = fitSize(natural, stage, rotation)
44
+ return {
45
+ x: (stage.x ?? 0) + (stage.width - size.width) / 2,
46
+ y: (stage.y ?? 0) + (stage.height - size.height) / 2,
47
+ width: size.width,
48
+ height: size.height,
49
+ }
50
+ }
51
+
52
+ export function renderedRect(box: Rect, natural: Size, fit: ImageVariants['fit'] = 'cover'): Rect {
53
+ if (fit === 'fill' || natural.width <= 0 || natural.height <= 0) return { ...box }
54
+ const contain = Math.min(box.width / natural.width, box.height / natural.height)
55
+ const cover = Math.max(box.width / natural.width, box.height / natural.height)
56
+ const scale =
57
+ fit === 'cover'
58
+ ? cover
59
+ : fit === 'contain'
60
+ ? contain
61
+ : fit === 'none'
62
+ ? 1
63
+ : Math.min(contain, 1)
64
+ const width = natural.width * scale
65
+ const height = natural.height * scale
66
+ return {
67
+ x: box.x + (box.width - width) / 2,
68
+ y: box.y + (box.height - height) / 2,
69
+ width,
70
+ height,
71
+ }
72
+ }
73
+
74
+ function intersect(a: Rect, b: Rect): Rect {
75
+ const x = Math.max(a.x, b.x)
76
+ const y = Math.max(a.y, b.y)
77
+ const right = Math.min(a.x + a.width, b.x + b.width)
78
+ const bottom = Math.min(a.y + a.height, b.y + b.height)
79
+ return { x, y, width: Math.max(0, right - x), height: Math.max(0, bottom - y) }
80
+ }
81
+
82
+ export function openPose(
83
+ frame: Rect,
84
+ box: Rect,
85
+ natural: Size,
86
+ fit?: ImageVariants['fit'],
87
+ radius: number | Corners = 0,
88
+ clipBox = box,
89
+ ): Pose {
90
+ const rendered = renderedRect(box, natural, fit)
91
+ if (frame.width <= 0 || frame.height <= 0 || rendered.width <= 0) return REST_POSE
92
+ const scale = rendered.width / frame.width
93
+ const visible = intersect(intersect(box, clipBox), rendered)
94
+ const top = (visible.y - rendered.y) / scale
95
+ const left = (visible.x - rendered.x) / scale
96
+ const right = (rendered.x + rendered.width - visible.x - visible.width) / scale
97
+ const bottom = (rendered.y + rendered.height - visible.y - visible.height) / scale
98
+ const corners =
99
+ typeof radius === 'number'
100
+ ? Array.from({ length: 4 }, () => ({ x: radius, y: radius }))
101
+ : radius
102
+ const leftEdge = Math.abs(visible.x - clipBox.x) <= 0.5
103
+ const topEdge = Math.abs(visible.y - clipBox.y) <= 0.5
104
+ const rightEdge = Math.abs(visible.x + visible.width - clipBox.x - clipBox.width) <= 0.5
105
+ const bottomEdge = Math.abs(visible.y + visible.height - clipBox.y - clipBox.height) <= 0.5
106
+ const touches = [
107
+ leftEdge && topEdge,
108
+ rightEdge && topEdge,
109
+ rightEdge && bottomEdge,
110
+ leftEdge && bottomEdge,
111
+ ]
112
+ const clipped = corners.map((corner, index) => (touches[index] ? corner : { x: 0, y: 0 }))
113
+ const horizontal = clipped.map(corner => px(Math.max(0, corner.x) / scale)).join(' ')
114
+ const vertical = clipped.map(corner => px(Math.max(0, corner.y) / scale)).join(' ')
115
+ return {
116
+ x: rendered.x + rendered.width / 2 - (frame.x + frame.width / 2),
117
+ y: rendered.y + rendered.height / 2 - (frame.y + frame.height / 2),
118
+ scale,
119
+ rotate: 0,
120
+ clipPath: `inset(${px(top)} ${px(right)} ${px(bottom)} ${px(left)} round ${horizontal} / ${vertical})`,
121
+ }
122
+ }
123
+
124
+ export function baseScale(frame: Size, stage: Size, rotation: number, natural: Size): number {
125
+ const visual = rotatedSize(frame, rotation)
126
+ if (visual.width <= 0 || visual.height <= 0) return 1
127
+ return Math.min(
128
+ stage.width / visual.width,
129
+ stage.height / visual.height,
130
+ natural.width / frame.width,
131
+ )
132
+ }
133
+
134
+ export function dismissProgress(offsetY: number, stageHeight: number): number {
135
+ if (stageHeight <= 0) return 0
136
+ return Math.min(1, Math.max(0, offsetY) / (stageHeight * DISMISS_TRAVEL))
137
+ }
138
+
139
+ export function shouldDismiss(offsetY: number, velocityY: number, stageHeight: number): boolean {
140
+ if (offsetY <= 0) return false
141
+ return dismissProgress(offsetY, stageHeight) >= DISMISS_COMMIT || velocityY >= DISMISS_VELOCITY
142
+ }
@@ -0,0 +1,17 @@
1
+ import type { LightboxSource } from './types'
2
+ import type { Rect } from './pose'
3
+
4
+ export function sourceRect(source: LightboxSource | null | undefined): Rect | null {
5
+ if (!source) return null
6
+ const isElement = 'getBoundingClientRect' in source
7
+ if (isElement && !source.isConnected) return null
8
+ const rect = isElement ? source.getBoundingClientRect() : source
9
+ if (
10
+ ![rect.x, rect.y, rect.width, rect.height].every(Number.isFinite) ||
11
+ rect.width <= 0 ||
12
+ rect.height <= 0
13
+ ) {
14
+ return null
15
+ }
16
+ return { x: rect.x, y: rect.y, width: rect.width, height: rect.height }
17
+ }
@@ -0,0 +1,14 @@
1
+ import type { ImageVariants } from '../../variants/image'
2
+ import type { Rect } from './pose'
3
+
4
+ export type LightboxSource = HTMLImageElement | Rect
5
+
6
+ export interface LightboxItem {
7
+ id: string
8
+ src: string
9
+ preview?: string
10
+ previewSize?: { width: number; height: number }
11
+ alt: string
12
+ fit?: ImageVariants['fit']
13
+ source?: () => LightboxSource | null | undefined
14
+ }
@@ -0,0 +1,127 @@
1
+ export interface Size {
2
+ width: number
3
+ height: number
4
+ }
5
+
6
+ export interface Point {
7
+ x: number
8
+ y: number
9
+ }
10
+
11
+ export interface Bounds {
12
+ minX: number
13
+ maxX: number
14
+ minY: number
15
+ maxY: number
16
+ }
17
+
18
+ export const ZOOM_MIN = 1
19
+ export const ZOOM_MAX = 2
20
+ export const ZOOM_STEP = 1.5
21
+ export const OVERSHOOT = 0.55
22
+ export const WHEEL_INTENSITY = 0.002
23
+
24
+ export const ZOOM_EPSILON = 0.001
25
+
26
+ export function isZoomed(zoom: number): boolean {
27
+ return zoom > ZOOM_MIN + ZOOM_EPSILON
28
+ }
29
+
30
+ export function rotatedSize(size: Size, rotation: number): Size {
31
+ const quarter = Math.round(rotation / 90) % 2
32
+ return quarter === 0 ? size : { width: size.height, height: size.width }
33
+ }
34
+
35
+ export function fitSize(natural: Size, stage: Size, rotation = 0): Size {
36
+ const upright = rotatedSize(natural, rotation)
37
+ if (upright.width <= 0 || upright.height <= 0) return { width: 0, height: 0 }
38
+ const scale = Math.min(1, stage.width / upright.width, stage.height / upright.height)
39
+ return { width: upright.width * scale, height: upright.height * scale }
40
+ }
41
+
42
+ export function panBounds(displayed: Size, stage: Size): Bounds {
43
+ const x = Math.max(0, (displayed.width - stage.width) / 2)
44
+ const y = Math.max(0, (displayed.height - stage.height) / 2)
45
+ return { minX: x ? -x : 0, maxX: x, minY: y ? -y : 0, maxY: y }
46
+ }
47
+
48
+ export function clampOffset(offset: Point, bounds: Bounds): Point {
49
+ return {
50
+ x: Math.min(Math.max(offset.x, bounds.minX), bounds.maxX),
51
+ y: Math.min(Math.max(offset.y, bounds.minY), bounds.maxY),
52
+ }
53
+ }
54
+
55
+ export function zoomAbout(offset: Point, zoom: number, next: number, focal: Point): Point {
56
+ const ratio = next / zoom
57
+ return {
58
+ x: focal.x - (focal.x - offset.x) * ratio,
59
+ y: focal.y - (focal.y - offset.y) * ratio,
60
+ }
61
+ }
62
+
63
+ function resist(over: number, span: number, coefficient: number): number {
64
+ return (1 - 1 / ((over * coefficient) / span + 1)) * span
65
+ }
66
+
67
+ export function rubberBand(
68
+ value: number,
69
+ min: number,
70
+ max: number,
71
+ span: number,
72
+ coefficient = OVERSHOOT,
73
+ ): number {
74
+ if (span <= 0) return Math.min(Math.max(value, min), max)
75
+ if (value > max) return max + resist(value - max, span, coefficient)
76
+ if (value < min) return min - resist(min - value, span, coefficient)
77
+ return value
78
+ }
79
+
80
+ export function elasticOffset(offset: Point, bounds: Bounds, stage: Size): Point {
81
+ return {
82
+ x: rubberBand(offset.x, bounds.minX, bounds.maxX, stage.width),
83
+ y: rubberBand(offset.y, bounds.minY, bounds.maxY, stage.height),
84
+ }
85
+ }
86
+
87
+ export function clampZoom(zoom: number, min = ZOOM_MIN, max = ZOOM_MAX): number {
88
+ return Math.min(Math.max(zoom, min), max)
89
+ }
90
+
91
+ export function elasticZoom(zoom: number, min = ZOOM_MIN, max = ZOOM_MAX): number {
92
+ const lo = Math.log(min)
93
+ const hi = Math.log(max)
94
+ return Math.exp(rubberBand(Math.log(zoom), lo, hi, hi - lo))
95
+ }
96
+
97
+ export function pinchZoom(startZoom: number, startDistance: number, distance: number): number {
98
+ if (startDistance <= 0) return startZoom
99
+ return startZoom * (distance / startDistance)
100
+ }
101
+
102
+ export function wheelZoom(zoom: number, deltaY: number, intensity = WHEEL_INTENSITY): number {
103
+ return zoom * Math.exp(-deltaY * intensity)
104
+ }
105
+
106
+ export function zoomLevels(natural: Size, fit: Size, stage: Size) {
107
+ const original = fit.width > 0 ? Math.max(ZOOM_MIN, natural.width / fit.width) : ZOOM_MIN
108
+ const secondary =
109
+ natural.height > natural.width * 2
110
+ ? Math.min(original, stage.width / fit.width)
111
+ : natural.width > natural.height * 2
112
+ ? Math.min(original, stage.height / fit.height)
113
+ : original
114
+ return {
115
+ original,
116
+ secondary: Number.isFinite(secondary) ? Math.max(ZOOM_MIN, secondary) : ZOOM_MIN,
117
+ max: original * ZOOM_MAX,
118
+ }
119
+ }
120
+
121
+ export function doubleTapZoom(zoom: number, secondary: number): number {
122
+ return isZoomed(zoom) ? ZOOM_MIN : secondary
123
+ }
124
+
125
+ export function stepZoom(zoom: number, direction: 1 | -1, max = ZOOM_MAX): number {
126
+ return clampZoom(zoom * ZOOM_STEP ** direction, ZOOM_MIN, max)
127
+ }
@@ -0,0 +1,16 @@
1
+ import type { IndicatorVariants } from '../variants/indicator'
2
+
3
+ export type MeterTone = NonNullable<IndicatorVariants['tone']>
4
+
5
+ export const METER_TONES: MeterTone[] = [
6
+ 'accent',
7
+ 'info',
8
+ 'success',
9
+ 'warning',
10
+ 'danger',
11
+ 'neutral',
12
+ ]
13
+
14
+ export function toneAt(index: number): MeterTone {
15
+ return METER_TONES[index % METER_TONES.length]!
16
+ }